HP3562A/q3562A.py

Mon, 04 Feb 2008 19:49:48 +0100

author
David Douard <david.douard@logilab.fr>
date
Mon, 04 Feb 2008 19:49:48 +0100
changeset 39
8becd52c2171
permissions
-rw-r--r--

refactoring in progress

39
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
1 #
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
2
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
3 import os, sys
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
4 import time
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
5 import glob
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
6
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
7 from PyQt4 import QtGui, QtCore, uic
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
8 from PyQt4.QtCore import SIGNAL, Qt
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
9
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
10 if "-m" in sys.argv:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
11 from dump_datablock_mockup import HP3562dumper
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
12 else:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
13 from dump_datablock import HP3562dumper
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
14 import q3562A_rc
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
15
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
16 ldir = os.path.abspath(os.path.dirname(__file__))
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
17 sys.path.append(ldir)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
18 form_class, base_class = uic.loadUiType(os.path.join(ldir, "q3562A.ui"))
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
19
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
20 from qpreferences import BaseItem, IntItem, UnicodeItem, ColorItem
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
21 from qpreferences import PointItem, SizeItem, ByteArrayItem
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
22 from qpreferences import AbstractPreferences
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
23 from qpreferenceseditor import PreferencesEditor
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
24
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
25 from tools import str_num_cmp
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
26
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
27 class Preferences(AbstractPreferences):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
28 ORGANISATION="Logilab"
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
29 APPLICATION="qgpib_plotter"
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
30
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
31 _pos = PointItem()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
32 _size = SizeItem()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
33 _appState = ByteArrayItem()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
34
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
35 device = UnicodeItem(default='/dev/ttyUSB0',
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
36 name=u'device',
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
37 description=u'GPIB device',
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
38 group="GPIB settings")
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
39 address = IntItem(default=5, min=0, max=16,
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
40 name=u'GPIB address',
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
41 group="GPIB settings")
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
42
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
43 background = ColorItem(default=QtGui.QColor("white"),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
44 name="Background",
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
45 group="Colors")
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
46 color0 = ColorItem(default=QtGui.QColor("black"),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
47 name="Pen #0",
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
48 group="Colors")
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
49 color1 = ColorItem(default=QtGui.QColor("green"),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
50 name="Pen #1",
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
51 group="Colors")
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
52 color2 = ColorItem(default=QtGui.QColor("red"),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
53 name="Pen #2",
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
54 group="Colors")
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
55 color3 = ColorItem(default=QtGui.QColor("blue"),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
56 name="Pen #3",
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
57 group="Colors")
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
58 color4 = ColorItem(default=QtGui.QColor("yellow"),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
59 name="Pen #4",
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
60 group="Colors")
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
61 color5 = ColorItem(default=QtGui.QColor("cyan"),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
62 name="Pen #5",
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
63 group="Colors")
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
64 color6 = ColorItem(default=QtGui.QColor("magenta"),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
65 name="Pen #6",
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
66 group="Colors")
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
67 color7 = ColorItem(default=QtGui.QColor("darkred"),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
68 name="Pen #7",
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
69 group="Colors")
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
70
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
71 class QtHPGLPlotter(QtGui.QMainWindow, form_class):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
72 def __init__(self, parent=None):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
73 QtGui.QMainWindow.__init__(self, parent)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
74 self._plots = {}
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
75 self._prefs = Preferences()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
76 self.setupUi()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
77 self.initializeGPIB()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
78 if self._prefs._pos:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
79 self.move(self._prefs._pos)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
80 if self._prefs._size:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
81 self.resize(self._prefs._size)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
82 if self._prefs._appState:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
83 self.restoreState(self._prefs._appState)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
84 self.readPreferences()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
85
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
86 def readPreferences(self):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
87 bg = self._prefs.background
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
88 if bg and bg.isValid():
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
89 self.plotterWidget.qview.setBackgroundBrush(QtGui.QBrush(bg))
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
90 pen_colors = [self._prefs["color%d"%i] for i in range(8)]
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
91 self.plotterWidget.pen_colors = pen_colors
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
92
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
93 def replotCurrent(self):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
94 self.currentPlotChanged(self.plotsView.currentIndex())
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
95
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
96 def setupUi(self):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
97 form_class.setupUi(self, self) # call qtdesigner generated form creation
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
98 # actions defined in designer
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
99 self.connect(self.actionPreferences, SIGNAL('triggered(bool)'),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
100 self.preferencesTriggered)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
101 self.connect(self.actionQuit, SIGNAL('triggered(bool)'),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
102 self.quitTriggered)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
103 self.actionQuit.setShortcut(QtGui.QKeySequence(u'Ctrl+Q'))
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
104 self.connect(self.actionOpen, SIGNAL('triggered(bool)'),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
105 self.openTriggered)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
106 self.actionOpen.setShortcut(QtGui.QKeySequence(u'Ctrl+O'))
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
107 self.connect(self.actionSave, SIGNAL('triggered(bool)'),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
108 self.saveTriggered)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
109 self.actionSave.setShortcut(QtGui.QKeySequence(u'Ctrl+S'))
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
110 self.connect(self.actionSaveAs, SIGNAL('triggered(bool)'),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
111 self.saveAsTriggered)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
112
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
113 self.plotterWidget = QHPGLPlotterWidget(self)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
114 self.setCentralWidget(self.plotterWidget)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
115
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
116 self.connect(self.captureButton, SIGNAL("toggled(bool)"),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
117 self.captureToggled)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
118
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
119 self._plots_list = QtGui.QStringListModel()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
120 self.plotsView.setModel(self._plots_list)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
121 self.connect(self.plotsView, SIGNAL('activated(const QModelIndex&)'),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
122 self.currentPlotChanged)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
123 self.connect(self.plotsView.selectionModel(),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
124 SIGNAL('currentChanged(const QModelIndex&, const QModelIndex&)'),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
125 self.currentPlotChanged)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
126
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
127 def currentPlotChanged(self, index, old_index=None):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
128 if index.isValid():
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
129 value = unicode(self.plotsView.model().data(index, Qt.DisplayRole).toString())
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
130
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
131 self.plotterWidget.clear()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
132 self.plotterWidget.parse(self._plots[value])
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
133
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
134 def preferencesTriggered(self, checked=False):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
135 PreferencesEditor(self._prefs, self).exec_()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
136 self.readPreferences()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
137 self.replotCurrent()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
138
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
139 def quitTriggered(self, checked=False):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
140 self.close()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
141
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
142 def closeEvent(self, event):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
143 if 1:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
144 #if self.promptForSave():
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
145 self._prefs._pos = self.pos()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
146 self._prefs._size = self.size()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
147 self._prefs._appState = self.saveState()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
148 event.accept()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
149 else:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
150 event.ignore()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
151
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
152 def openTriggered(self, checked=False):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
153 filenames = QtGui.QFileDialog.getOpenFileNames(self, "Open a HPGL file to display", '.', 'HPGL files (*.plt)\nAll files (*)')
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
154 self.openFiles(filenames)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
155 self.displayFirst()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
156
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
157 def displayFirst(self):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
158 if not self.plotsView.currentIndex().isValid():
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
159 self.plotsView.setCurrentIndex(self.plotsView.model().index(0, 0))
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
160
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
161 def openFiles(self, filenames):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
162 ok = False
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
163 for filename in filenames:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
164 filename = str(filename)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
165 if os.path.exists(filename):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
166 data = open(filename).read()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
167 name = os.path.basename(filename)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
168 name = os.path.splitext(name)[0]
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
169 lst = self.plotsView.model().stringList()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
170 lst.append(name)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
171 self._plots[name] = data
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
172 self.plotsView.model().setStringList(lst)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
173 ok = True
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
174 return ok
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
175
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
176 def plotReceived(self, num):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
177 self._receiving = False
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
178 self.setReceivingLed()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
179 plot, timestamp = self.captureThread.getPlot(num)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
180 name = "plot_%s"%(num)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
181 lst = self.plotsView.model().stringList()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
182 lst.append(name)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
183 self._plots[name] = plot
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
184 self.plotsView.model().setStringList(lst)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
185
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
186 def plotStarted(self):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
187 self._receiving = True
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
188 self.setReceivingLed()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
189
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
190 def saveTriggered(self, checked=False):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
191 print "save"
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
192
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
193 def saveAsTriggered(self, checked=False):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
194 index = self.plotsView.selectionModel().currentIndex()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
195 if index.isValid():
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
196 filename = QtGui.QFileDialog.getSaveFileName(self, "Selecte a file name to save HPGL file", '.', 'HPGL files (*.plt)\nAll files (*)')
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
197 n = index.row()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
198 value = unicode(self.plotsView.model().data(index, Qt.DisplayRole).toString())
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
199 open(filename, 'w').write(self._plots[value])
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
200
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
201
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
202 def initializeGPIB(self):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
203 self._online = False
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
204 try:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
205 self.gpib_plotter = QGPIBplotter(device=self._prefs.device,
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
206 address=self._prefs.address,
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
207 )
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
208 self.captureThread = GPIBReceiver(self.gpib_plotter)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
209 self.connect(self.captureThread, SIGNAL('plotReceived(int)'),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
210 self.plotReceived)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
211 self.connect(self.captureThread, SIGNAL('plotStarted()'),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
212 self.plotStarted)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
213 self.captureThread.start()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
214 except Exception, e:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
215 #print e
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
216 self.gpib_plotter = None
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
217 self.setCaptureLed()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
218
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
219 def captureToggled(self, state):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
220 if state:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
221 if self.gpib_plotter is None:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
222 self.initializeGPIB()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
223 if self.gpib_plotter is None:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
224 QtGui.QMessageBox.critical(self, self.tr("GPIB error"),
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
225 self.tr("<b>Unable to initialize GPIB connection</b>.<br>Please check your GPIB dongle and settings."))
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
226 self._online = False
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
227 self.setCaptureLed()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
228 return
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
229 self._online = True
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
230 self.captureThread.startCapture()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
231 else:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
232 if self.captureThread:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
233 self.captureThread.stopCapture()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
234 self._online = False
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
235 self.setCaptureLed()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
236
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
237 def setCaptureLed(self):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
238 if self._online:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
239 icn = QtGui.QIcon(':/icons/led_green.svg')
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
240 else:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
241 icn = QtGui.QIcon(':/icons/led_green_off.svg')
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
242 self.captureButton.setIcon(icn)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
243 self.captureButton.setChecked(self._online)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
244
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
245 def setReceivingLed(self):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
246 if self._receiving:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
247 icn = QtGui.QIcon(':/icons/led_red.svg')
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
248 else:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
249 icn = QtGui.QIcon(':/icons/led_red_off.svg')
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
250 self.receivingButton.setIcon(icn)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
251
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
252 class QGPIBplotter(GPIBplotter):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
253 def __init__(self, device="/dev/ttyUSB0", baudrate=115200, timeout=0.1,
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
254 address=5):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
255 GPIBplotter.__init__(self, device, baudrate, timeout, address)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
256 self.emitter = None
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
257
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
258 def plotStarted(self):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
259 if self.emitter:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
260 self.emitter.emit(SIGNAL('plotStarted()'))
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
261 #self.emitter.msleep(1)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
262
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
263 class GPIBReceiver(QtCore.QThread):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
264 def __init__(self, cnx):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
265 QtCore.QThread.__init__(self)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
266 self.gpibplotter = cnx
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
267 self.gpibplotter.emitter = self
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
268
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
269 self._cancelmutex = QtCore.QMutex()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
270 self._cancel = False
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
271 #self._nreceived = 0
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
272 self._plotsmutex = QtCore.QMutex()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
273 self._plots = []
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
274 self._startstopmutex = QtCore.QMutex()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
275 self._startstop = QtCore.QWaitCondition()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
276 self._capturing = False
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
277
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
278 def cancel(self):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
279 self._cancelmutex.lock()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
280 self._cancel = True
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
281 self._cancelmutex.unlock()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
282
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
283 def startCapture(self):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
284 self._startstop.wakeOne()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
285
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
286 def stopCapture(self):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
287 self._startstopmutex.lock()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
288 self._capturing = False
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
289 self._startstopmutex.unlock()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
290
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
291 def run(self):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
292 while 1:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
293 self._cancelmutex.lock()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
294 if self._cancel:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
295 return
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
296 self._cancelmutex.unlock()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
297 self._startstopmutex.lock()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
298 if not self._capturing:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
299 self._startstop.wait(self._startstopmutex)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
300 self._capturing = True
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
301 self._startstopmutex.unlock()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
302
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
303 plot = self.gpibplotter.load_plot(wait_timeout=0.1)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
304 timestamp = time.time()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
305 if plot:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
306 self._plotsmutex.lock()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
307 self._plots.append((plot, timestamp))
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
308 n = len(self._plots)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
309 self._plotsmutex.unlock()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
310 self.emit(SIGNAL('plotReceived(int)'), n-1)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
311 self.msleep(10)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
312
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
313 def getPlot(self, num):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
314 self._plotsmutex.lock()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
315 try:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
316 return self._plots[num]
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
317 finally:
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
318 self._plotsmutex.unlock()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
319
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
320 def main():
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
321 import optparse
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
322 opt = optparse.OptionParser('A simple PyQt4 HP7470A GPIB plotter emulator for USB-GPIB bundle (ProLogix)')
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
323 opt.add_option('-m', '--mockup', default=False,
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
324 action="store_true",
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
325 dest='mockup',
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
326 help='Use a pseudo GPIB connection (for test purpose)',
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
327 )
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
328 opt.add_option('-v', '--verbose', default=False,
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
329 action="store_true",
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
330 dest="verbose",
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
331 help="Verbose mode",)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
332
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
333 options, argv = opt.parse_args(sys.argv)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
334
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
335 a = QtGui.QApplication(argv)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
336 w = QtHPGLPlotter()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
337 files = [f for f in argv[1:] if os.path.isfile(f)]
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
338 files.sort(cmp=str_num_cmp)
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
339 if w.openFiles(files):
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
340 w.displayFirst()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
341
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
342 w.show()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
343 a.exec_()
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
344
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
345 if __name__ == '__main__':
8becd52c2171 refactoring in progress
David Douard <david.douard@logilab.fr>
parents:
diff changeset
346 main()

mercurial