diff -r 8becd52c2171 -r 1bbea188a7e5 plotter/qgpib_plotter.py
--- a/plotter/qgpib_plotter.py Mon Feb 04 19:49:48 2008 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,347 +0,0 @@
-#
-
-import os, sys
-import time
-import glob
-
-from PyQt4 import QtGui, QtCore, uic
-from PyQt4.QtCore import SIGNAL, Qt
-
-if "-m" in sys.argv:
- from gpib_plotter_mockup import GPIBplotter
-else:
- from gpib_plotter import GPIBplotter
-from hpgl_qt import QHPGLPlotterWidget
-import hpgl_plotter_rc
-
-ldir = os.path.abspath(os.path.dirname(__file__))
-sys.path.append(ldir)
-form_class, base_class = uic.loadUiType(os.path.join(ldir, "qhpgl_plotter.ui"))
-
-from qpreferences import BaseItem, IntItem, UnicodeItem, ColorItem
-from qpreferences import PointItem, SizeItem, ByteArrayItem
-from qpreferences import AbstractPreferences
-from qpreferenceseditor import PreferencesEditor
-
-from tools import str_num_cmp
-
-class Preferences(AbstractPreferences):
- ORGANISATION="Logilab"
- APPLICATION="qgpib_plotter"
-
- _pos = PointItem()
- _size = SizeItem()
- _appState = ByteArrayItem()
-
- device = UnicodeItem(default='/dev/ttyUSB0',
- name=u'device',
- description=u'GPIB device',
- group="GPIB settings")
- address = IntItem(default=5, min=0, max=16,
- name=u'GPIB address',
- group="GPIB settings")
-
- background = ColorItem(default=QtGui.QColor("white"),
- name="Background",
- group="Colors")
- color0 = ColorItem(default=QtGui.QColor("black"),
- name="Pen #0",
- group="Colors")
- color1 = ColorItem(default=QtGui.QColor("green"),
- name="Pen #1",
- group="Colors")
- color2 = ColorItem(default=QtGui.QColor("red"),
- name="Pen #2",
- group="Colors")
- color3 = ColorItem(default=QtGui.QColor("blue"),
- name="Pen #3",
- group="Colors")
- color4 = ColorItem(default=QtGui.QColor("yellow"),
- name="Pen #4",
- group="Colors")
- color5 = ColorItem(default=QtGui.QColor("cyan"),
- name="Pen #5",
- group="Colors")
- color6 = ColorItem(default=QtGui.QColor("magenta"),
- name="Pen #6",
- group="Colors")
- color7 = ColorItem(default=QtGui.QColor("darkred"),
- name="Pen #7",
- group="Colors")
-
-class QtHPGLPlotter(QtGui.QMainWindow, form_class):
- def __init__(self, parent=None):
- QtGui.QMainWindow.__init__(self, parent)
- self._plots = {}
- self._prefs = Preferences()
- self.setupUi()
- self.initializeGPIB()
- if self._prefs._pos:
- self.move(self._prefs._pos)
- if self._prefs._size:
- self.resize(self._prefs._size)
- if self._prefs._appState:
- self.restoreState(self._prefs._appState)
- self.readPreferences()
-
- def readPreferences(self):
- bg = self._prefs.background
- if bg and bg.isValid():
- self.plotterWidget.qview.setBackgroundBrush(QtGui.QBrush(bg))
- pen_colors = [self._prefs["color%d"%i] for i in range(8)]
- self.plotterWidget.pen_colors = pen_colors
-
- def replotCurrent(self):
- self.currentPlotChanged(self.plotsView.currentIndex())
-
- def setupUi(self):
- form_class.setupUi(self, self) # call qtdesigner generated form creation
- # actions defined in designer
- self.connect(self.actionPreferences, SIGNAL('triggered(bool)'),
- self.preferencesTriggered)
- self.connect(self.actionQuit, SIGNAL('triggered(bool)'),
- self.quitTriggered)
- self.actionQuit.setShortcut(QtGui.QKeySequence(u'Ctrl+Q'))
- self.connect(self.actionOpen, SIGNAL('triggered(bool)'),
- self.openTriggered)
- self.actionOpen.setShortcut(QtGui.QKeySequence(u'Ctrl+O'))
- self.connect(self.actionSave, SIGNAL('triggered(bool)'),
- self.saveTriggered)
- self.actionSave.setShortcut(QtGui.QKeySequence(u'Ctrl+S'))
- self.connect(self.actionSaveAs, SIGNAL('triggered(bool)'),
- self.saveAsTriggered)
-
- self.plotterWidget = QHPGLPlotterWidget(self)
- self.setCentralWidget(self.plotterWidget)
-
- self.connect(self.captureButton, SIGNAL("toggled(bool)"),
- self.captureToggled)
-
- self._plots_list = QtGui.QStringListModel()
- self.plotsView.setModel(self._plots_list)
- self.connect(self.plotsView, SIGNAL('activated(const QModelIndex&)'),
- self.currentPlotChanged)
- self.connect(self.plotsView.selectionModel(),
- SIGNAL('currentChanged(const QModelIndex&, const QModelIndex&)'),
- self.currentPlotChanged)
-
- def currentPlotChanged(self, index, old_index=None):
- if index.isValid():
- value = unicode(self.plotsView.model().data(index, Qt.DisplayRole).toString())
-
- self.plotterWidget.clear()
- self.plotterWidget.parse(self._plots[value])
-
- def preferencesTriggered(self, checked=False):
- PreferencesEditor(self._prefs, self).exec_()
- self.readPreferences()
- self.replotCurrent()
-
- def quitTriggered(self, checked=False):
- self.close()
-
- def closeEvent(self, event):
- if 1:
- #if self.promptForSave():
- self._prefs._pos = self.pos()
- self._prefs._size = self.size()
- self._prefs._appState = self.saveState()
- event.accept()
- else:
- event.ignore()
-
- def openTriggered(self, checked=False):
- filenames = QtGui.QFileDialog.getOpenFileNames(self, "Open a HPGL file to display", '.', 'HPGL files (*.plt)\nAll files (*)')
- self.openFiles(filenames)
- self.displayFirst()
-
- def displayFirst(self):
- if not self.plotsView.currentIndex().isValid():
- self.plotsView.setCurrentIndex(self.plotsView.model().index(0, 0))
-
- def openFiles(self, filenames):
- ok = False
- for filename in filenames:
- filename = str(filename)
- if os.path.exists(filename):
- data = open(filename).read()
- name = os.path.basename(filename)
- name = os.path.splitext(name)[0]
- lst = self.plotsView.model().stringList()
- lst.append(name)
- self._plots[name] = data
- self.plotsView.model().setStringList(lst)
- ok = True
- return ok
-
- def plotReceived(self, num):
- self._receiving = False
- self.setReceivingLed()
- plot, timestamp = self.captureThread.getPlot(num)
- name = "plot_%s"%(num)
- lst = self.plotsView.model().stringList()
- lst.append(name)
- self._plots[name] = plot
- self.plotsView.model().setStringList(lst)
-
- def plotStarted(self):
- self._receiving = True
- self.setReceivingLed()
-
- def saveTriggered(self, checked=False):
- print "save"
-
- def saveAsTriggered(self, checked=False):
- index = self.plotsView.selectionModel().currentIndex()
- if index.isValid():
- filename = QtGui.QFileDialog.getSaveFileName(self, "Selecte a file name to save HPGL file", '.', 'HPGL files (*.plt)\nAll files (*)')
- n = index.row()
- value = unicode(self.plotsView.model().data(index, Qt.DisplayRole).toString())
- open(filename, 'w').write(self._plots[value])
-
-
- def initializeGPIB(self):
- self._online = False
- try:
- self.gpib_plotter = QGPIBplotter(device=self._prefs.device,
- address=self._prefs.address,
- )
- self.captureThread = GPIBReceiver(self.gpib_plotter)
- self.connect(self.captureThread, SIGNAL('plotReceived(int)'),
- self.plotReceived)
- self.connect(self.captureThread, SIGNAL('plotStarted()'),
- self.plotStarted)
- self.captureThread.start()
- except Exception, e:
- #print e
- self.gpib_plotter = None
- self.setCaptureLed()
-
- def captureToggled(self, state):
- if state:
- if self.gpib_plotter is None:
- self.initializeGPIB()
- if self.gpib_plotter is None:
- QtGui.QMessageBox.critical(self, self.tr("GPIB error"),
- self.tr("Unable to initialize GPIB connection.
Please check your GPIB dongle and settings."))
- self._online = False
- self.setCaptureLed()
- return
- self._online = True
- self.captureThread.startCapture()
- else:
- if self.captureThread:
- self.captureThread.stopCapture()
- self._online = False
- self.setCaptureLed()
-
- def setCaptureLed(self):
- if self._online:
- icn = QtGui.QIcon(':/icons/led_green.svg')
- else:
- icn = QtGui.QIcon(':/icons/led_green_off.svg')
- self.captureButton.setIcon(icn)
- self.captureButton.setChecked(self._online)
-
- def setReceivingLed(self):
- if self._receiving:
- icn = QtGui.QIcon(':/icons/led_red.svg')
- else:
- icn = QtGui.QIcon(':/icons/led_red_off.svg')
- self.receivingButton.setIcon(icn)
-
-class QGPIBplotter(GPIBplotter):
- def __init__(self, device="/dev/ttyUSB0", baudrate=115200, timeout=0.1,
- address=5):
- GPIBplotter.__init__(self, device, baudrate, timeout, address)
- self.emitter = None
-
- def plotStarted(self):
- if self.emitter:
- self.emitter.emit(SIGNAL('plotStarted()'))
- #self.emitter.msleep(1)
-
-class GPIBReceiver(QtCore.QThread):
- def __init__(self, cnx):
- QtCore.QThread.__init__(self)
- self.gpibplotter = cnx
- self.gpibplotter.emitter = self
-
- self._cancelmutex = QtCore.QMutex()
- self._cancel = False
- #self._nreceived = 0
- self._plotsmutex = QtCore.QMutex()
- self._plots = []
- self._startstopmutex = QtCore.QMutex()
- self._startstop = QtCore.QWaitCondition()
- self._capturing = False
-
- def cancel(self):
- self._cancelmutex.lock()
- self._cancel = True
- self._cancelmutex.unlock()
-
- def startCapture(self):
- self._startstop.wakeOne()
-
- def stopCapture(self):
- self._startstopmutex.lock()
- self._capturing = False
- self._startstopmutex.unlock()
-
- def run(self):
- while 1:
- self._cancelmutex.lock()
- if self._cancel:
- return
- self._cancelmutex.unlock()
- self._startstopmutex.lock()
- if not self._capturing:
- self._startstop.wait(self._startstopmutex)
- self._capturing = True
- self._startstopmutex.unlock()
-
- plot = self.gpibplotter.load_plot(wait_timeout=0.1)
- timestamp = time.time()
- if plot:
- self._plotsmutex.lock()
- self._plots.append((plot, timestamp))
- n = len(self._plots)
- self._plotsmutex.unlock()
- self.emit(SIGNAL('plotReceived(int)'), n-1)
- self.msleep(10)
-
- def getPlot(self, num):
- self._plotsmutex.lock()
- try:
- return self._plots[num]
- finally:
- self._plotsmutex.unlock()
-
-def main():
- import optparse
- opt = optparse.OptionParser('A simple PyQt4 HP7470A GPIB plotter emulator for USB-GPIB bundle (ProLogix)')
- opt.add_option('-m', '--mockup', default=False,
- action="store_true",
- dest='mockup',
- help='Use a pseudo GPIB connection (for test purpose)',
- )
- opt.add_option('-v', '--verbose', default=False,
- action="store_true",
- dest="verbose",
- help="Verbose mode",)
-
- options, argv = opt.parse_args(sys.argv)
-
- a = QtGui.QApplication(argv)
- w = QtHPGLPlotter()
- files = [f for f in argv[1:] if os.path.isfile(f)]
- files.sort(cmp=str_num_cmp)
- if w.openFiles(files):
- w.displayFirst()
-
- w.show()
- a.exec_()
-
-if __name__ == '__main__':
- main()