158 self.getCoordAct = QtGui.QAction(self.tr("Get coord"), self) |
158 self.getCoordAct = QtGui.QAction(self.tr("Get coord"), self) |
159 self.getCoordAct.setCheckable(True) |
159 self.getCoordAct.setCheckable(True) |
160 self.getCoordAct.setStatusTip(self.tr("Retrieve Coord from GPIB device")) |
160 self.getCoordAct.setStatusTip(self.tr("Retrieve Coord from GPIB device")) |
161 self.connect(self.getCoordAct, QtCore.SIGNAL("triggered()"), |
161 self.connect(self.getCoordAct, QtCore.SIGNAL("triggered()"), |
162 self.getCoord) |
162 self.getCoord) |
|
163 |
|
164 self.channelActGroups = QtGui.QActionGroup(self) |
|
165 self.channelActGroups.setExclusive(True) |
|
166 self.channelAAct = QtGui.QAction(self.tr("Channel A"), self) |
|
167 self.channelAAct.setCheckable(True) |
|
168 self.channelAAct.setChecked(True) |
|
169 self.channelAAct.setStatusTip(self.tr("Retrieve from channel A")) |
|
170 self.channelActGroups.addAction(self.channelAAct) |
|
171 self.channelBAct = QtGui.QAction(self.tr("Channel B"), self) |
|
172 self.channelBAct.setCheckable(True) |
|
173 self.channelBAct.setStatusTip(self.tr("Retrieve from channel B")) |
|
174 self.channelActGroups.addAction(self.channelBAct) |
|
175 |
163 |
176 |
164 def setupUi(self): |
177 def setupUi(self): |
165 self.connect(self.actionPreferences, SIGNAL('triggered(bool)'), |
178 self.connect(self.actionPreferences, SIGNAL('triggered(bool)'), |
166 self.preferencesTriggered) |
179 self.preferencesTriggered) |
167 self.connect(self.actionQuit, SIGNAL('triggered(bool)'), |
180 self.connect(self.actionQuit, SIGNAL('triggered(bool)'), |
227 self.fileMenu = self.menuBar().addMenu(self.tr("&File")) |
240 self.fileMenu = self.menuBar().addMenu(self.tr("&File")) |
228 self.fileMenu.addAction(self.openAct) |
241 self.fileMenu.addAction(self.openAct) |
229 self.fileMenu.addAction(self.saveAsAct) |
242 self.fileMenu.addAction(self.saveAsAct) |
230 self.fileMenu.addSeparator() |
243 self.fileMenu.addSeparator() |
231 self.fileMenu.addAction(self.exitAct) |
244 self.fileMenu.addAction(self.exitAct) |
232 |
245 |
|
246 self.deviceMenu = self.menuBar().addMenu(self.tr("&Device")) |
|
247 self.deviceMenu.addAction(self.channelAAct) |
|
248 self.deviceMenu.addAction(self.channelBAct) |
|
249 self.deviceMenu.addSeparator() |
|
250 self.deviceMenu.addAction(self.getStateAct) |
|
251 self.deviceMenu.addAction(self.getTraceAct) |
|
252 self.deviceMenu.addAction(self.getCoordAct) |
|
253 |
233 self.windowMenu = self.menuBar().addMenu(self.tr("&Window")) |
254 self.windowMenu = self.menuBar().addMenu(self.tr("&Window")) |
234 self.connect(self.windowMenu, QtCore.SIGNAL("aboutToShow()"), |
255 self.connect(self.windowMenu, QtCore.SIGNAL("aboutToShow()"), |
235 self.updateWindowMenu) |
256 self.updateWindowMenu) |
236 |
257 |
237 |
|
238 |
|
239 self.deviceMenu = self.menuBar().addMenu(self.tr("&Device")) |
|
240 self.deviceMenu.addAction(self.getStateAct) |
|
241 self.deviceMenu.addAction(self.getTraceAct) |
|
242 self.deviceMenu.addAction(self.getCoordAct) |
|
243 |
|
244 self.menuBar().addSeparator() |
258 self.menuBar().addSeparator() |
245 self.helpMenu = self.menuBar().addMenu(self.tr("&Help")) |
259 self.helpMenu = self.menuBar().addMenu(self.tr("&Help")) |
246 self.helpMenu.addAction(self.aboutAct) |
260 self.helpMenu.addAction(self.aboutAct) |
247 self.helpMenu.addAction(self.aboutQtAct) |
261 self.helpMenu.addAction(self.aboutQtAct) |
248 |
262 |
250 self.fileToolBar = self.addToolBar(self.tr("File")) |
264 self.fileToolBar = self.addToolBar(self.tr("File")) |
251 self.fileToolBar.setObjectName('filetoolbar') |
265 self.fileToolBar.setObjectName('filetoolbar') |
252 self.fileToolBar.addAction(self.openAct) |
266 self.fileToolBar.addAction(self.openAct) |
253 self.fileToolBar.addAction(self.saveAsAct) |
267 self.fileToolBar.addAction(self.saveAsAct) |
254 self.fileToolBar.addSeparator() |
268 self.fileToolBar.addSeparator() |
255 self.fileToolBar.addAction(self.getStateAct) |
269 |
256 self.fileToolBar.addAction(self.getTraceAct) |
270 self.deviceToolBar = self.addToolBar(self.tr("Device")) |
257 self.fileToolBar.addAction(self.getCoordAct) |
271 self.deviceToolBar.setObjectName('devicetoolbar') |
|
272 self.deviceToolBar.addAction(self.channelAAct) |
|
273 self.deviceToolBar.addAction(self.channelBAct) |
|
274 self.deviceToolBar.addSeparator() |
|
275 self.deviceToolBar.addAction(self.getStateAct) |
|
276 self.deviceToolBar.addAction(self.getTraceAct) |
|
277 self.deviceToolBar.addAction(self.getCoordAct) |
258 |
278 |
259 def createStatusBar(self): |
279 def createStatusBar(self): |
260 self.statusBar().showMessage(self.tr("Ready")) |
280 self.statusBar().showMessage(self.tr("Ready")) |
261 |
281 |
262 def preferencesTriggered(self, checked=False): |
282 def preferencesTriggered(self, checked=False): |
330 self.getTraceAct.setChecked(False) |
350 self.getTraceAct.setChecked(False) |
331 self.getCoordAct.setChecked(False) |
351 self.getCoordAct.setChecked(False) |
332 self.statusBar().showMessage(self.tr("Received data block"), 2000) |
352 self.statusBar().showMessage(self.tr("Received data block"), 2000) |
333 self._receiving = False |
353 self._receiving = False |
334 |
354 |
|
355 def selectChannel(self): |
|
356 if self.channelAAct.isEnabled(): |
|
357 self.captureThread.sendCommand("A") |
|
358 else: |
|
359 self.captureThread.sendCommand("B") |
|
360 |
335 def getState(self): |
361 def getState(self): |
336 if self._receiving: |
362 if self._receiving: |
337 return |
363 return |
338 self._receiving = True |
364 self._receiving = True |
339 self.statusBar().showMessage(self.tr("Waiting for a %1 data block").arg(self.tr('state'))) |
365 self.statusBar().showMessage(self.tr("Waiting for a %1 data block").arg(self.tr('state'))) |
340 self.getStateAct.setChecked(True) |
366 self.getStateAct.setChecked(True) |
341 self.captureThread.startCapture(mode="state") |
367 self.captureThread.startCapture(mode="state") |
342 |
368 |
343 def getTrace(self): |
369 def getTrace(self): |
344 if self._receiving: |
370 if self._receiving: |
345 return |
371 return |
346 self._receiving = True |
372 self._receiving = True |
347 self.statusBar().showMessage(self.tr("Waiting for a %1 data block").arg(self.tr('trace'))) |
373 self.statusBar().showMessage(self.tr("Waiting for a %1 data block").arg(self.tr('trace'))) |
348 self.getTraceAct.setChecked(True) |
374 self.getTraceAct.setChecked(True) |
|
375 self.selectChannel() |
349 self.captureThread.startCapture(mode="trace") |
376 self.captureThread.startCapture(mode="trace") |
350 |
377 |
351 def getCoord(self): |
378 def getCoord(self): |
352 if self._receiving: |
379 if self._receiving: |
353 return |
380 return |
354 self._receiving = True |
381 self._receiving = True |
355 self.statusBar().showMessage(self.tr("Waiting for a %1 data block").arg(self.tr('coord'))) |
382 self.statusBar().showMessage(self.tr("Waiting for a %1 data block").arg(self.tr('coord'))) |
356 self.getCoordAct.setChecked(True) |
383 self.getCoordAct.setChecked(True) |
|
384 self.selectChannel() |
357 self.captureThread.startCapture(mode="coord") |
385 self.captureThread.startCapture(mode="coord") |
358 |
386 |
359 class GPIBReceiver(QtCore.QThread): |
387 class GPIBConnection(QtCore.QThread): |
360 def __init__(self, cnx): |
388 def __init__(self, cnx): |
361 QtCore.QThread.__init__(self) |
389 QtCore.QThread.__init__(self) |
362 self.gpibdumper = cnx |
390 self.gpibdumper = cnx |
363 |
391 |
364 self._cancelmutex = QtCore.QMutex() |
392 self._cancelmutex = QtCore.QMutex() |
373 def cancel(self): |
401 def cancel(self): |
374 self._cancelmutex.lock() |
402 self._cancelmutex.lock() |
375 self._cancel = True |
403 self._cancel = True |
376 self._cancelmutex.unlock() |
404 self._cancelmutex.unlock() |
377 |
405 |
|
406 def sendCommand(self, cmd): |
|
407 if self._capturing: |
|
408 return |
|
409 return self.gpibdumper.send_command(cmd) |
|
410 |
378 def startCapture(self, mode): |
411 def startCapture(self, mode): |
379 self._modemutex.lock() |
412 self._modemutex.lock() |
380 self._mode = mode |
413 self._mode = mode |
381 self._modemutex.unlock() |
414 self._modemutex.unlock() |
382 self._startstop.wakeOne() |
415 self._startstop.wakeOne() |