class Canvas(QGraphicsView): def __init__(self): self._scene = QGraphicsScene() QGraphicsView.__init__(self, self._scene) self._document = Document() self._document.changed.connect(self._update_scene) self.use_tool(PenTool) self.setMouseTracking(True) def use_tool(self, tool_class): """Instantiates tool_class and uses it as the current tool.""" self._tool = tool_class(self._document) self._tool.needs_repaint.connect(self._update) def new_shape(self): self._document.new_shape() def delete_selection(self): self._document.delete_selection() if not self._document.current_shape: self._document.delete_current_shape() def _update(self): self.update() def _update_scene(self): self._scene.clear() for shape in self._document.shapes: self._scene.addPath(shape.make_painter_path()) def _call_tool(self, method_name, *args): method = getattr(self._tool, method_name, None) if method: method(*args) def _map_event(self, qt_event): """Take a QMouseEvent and return a MouseEvent in scene space.""" point = self.mapToScene(qt_event.x(), qt_event.y()) return MouseEvent((_round_to_half(point.x()), _round_to_half(point.y()))) def mouseMoveEvent(self, event): self._call_tool("mouse_move_event", self._map_event(event)) def mousePressEvent(self, event): self._call_tool("mouse_press_event", self._map_event(event)) def mouseReleaseEvent(self, event): self._call_tool("mouse_release_event", self._map_event(event)) def paintEvent(self, event): QGraphicsView.paintEvent(self, event) self._call_tool("paint_event", self)
class ModuleAWidget(QWidget): def __init__(self): QWidget.__init__(self) self.ui = Ui_ModuleA() self.ui.setupUi(self) self.timer = QTimer() QObject.connect(self.timer, SIGNAL("timeout()"), self.read_inputs) self.data = 200*[0.0] def read_inputs(self): r = self.dev.read() u = r[1]/1023.0 * 3.3 self.dev.pwm(1, int(u*65536.0/3.3)) self.ui.labelU.setText('%0.3f V' % u) self.ui.progressU.setValue(1000*u) self.data.pop(0) self.data.append(u) self.scene = QGraphicsScene() self.scene.addLine(-10, 400-0, 610, 400-0) self.scene.addLine(0, 400+10, 0, 400-410) self.scene.addLine(-10, 400- 50, 10, 400- 50) self.scene.addLine(-10, 400-100, 10, 400-100) self.scene.addLine(-10, 400-150, 10, 400-150) self.scene.addLine(-10, 400-200, 10, 400-200) self.scene.addLine(-10, 400-250, 10, 400-250) self.scene.addLine(-10, 400-300, 10, 400-300) self.scene.addLine(-10, 400-350, 10, 400-350) self.scene.addLine(-10, 400-400, 10, 400-400) self.scene.addSimpleText('4.0').moveBy(-40, 0-10) self.scene.addSimpleText('3.5').moveBy(-40, 50-10) self.scene.addSimpleText('3.0').moveBy(-40, 100-10) self.scene.addSimpleText('2.5').moveBy(-40, 150-10) self.scene.addSimpleText('2.0').moveBy(-40, 200-10) self.scene.addSimpleText('1.5').moveBy(-40, 250-10) self.scene.addSimpleText('1.0').moveBy(-40, 300-10) self.scene.addSimpleText('0.5').moveBy(-40, 350-10) self.scene.addSimpleText('0.0').moveBy(-40, 400-10) self.scene.addSimpleText('[U/V]').moveBy(-39, 430-10) path = QPainterPath() path.moveTo(0,400-self.data[0]*100) for i in xrange(1,200): path.lineTo(3*(i+1), 400-self.data[i]*100) self.scene.addPath(path, QPen(QColor(0,0,255), 3)) self.ui.graphU.setScene(self.scene)
class ModuleAWidget(QWidget): def __init__(self): QWidget.__init__(self) self.ui = Ui_ModuleA() self.ui.setupUi(self) self.timer = QTimer() QObject.connect(self.timer, SIGNAL("timeout()"), self.read_inputs) self.data = 200 * [0.0] def read_inputs(self): r = self.dev.read() u = r[1] / 1023.0 * 3.3 self.dev.pwm(1, int(u * 65536.0 / 3.3)) self.ui.labelU.setText('%0.3f V' % u) self.ui.progressU.setValue(1000 * u) self.data.pop(0) self.data.append(u) self.scene = QGraphicsScene() self.scene.addLine(-10, 400 - 0, 610, 400 - 0) self.scene.addLine(0, 400 + 10, 0, 400 - 410) self.scene.addLine(-10, 400 - 50, 10, 400 - 50) self.scene.addLine(-10, 400 - 100, 10, 400 - 100) self.scene.addLine(-10, 400 - 150, 10, 400 - 150) self.scene.addLine(-10, 400 - 200, 10, 400 - 200) self.scene.addLine(-10, 400 - 250, 10, 400 - 250) self.scene.addLine(-10, 400 - 300, 10, 400 - 300) self.scene.addLine(-10, 400 - 350, 10, 400 - 350) self.scene.addLine(-10, 400 - 400, 10, 400 - 400) self.scene.addSimpleText('4.0').moveBy(-40, 0 - 10) self.scene.addSimpleText('3.5').moveBy(-40, 50 - 10) self.scene.addSimpleText('3.0').moveBy(-40, 100 - 10) self.scene.addSimpleText('2.5').moveBy(-40, 150 - 10) self.scene.addSimpleText('2.0').moveBy(-40, 200 - 10) self.scene.addSimpleText('1.5').moveBy(-40, 250 - 10) self.scene.addSimpleText('1.0').moveBy(-40, 300 - 10) self.scene.addSimpleText('0.5').moveBy(-40, 350 - 10) self.scene.addSimpleText('0.0').moveBy(-40, 400 - 10) self.scene.addSimpleText('[U/V]').moveBy(-39, 430 - 10) path = QPainterPath() path.moveTo(0, 400 - self.data[0] * 100) for i in xrange(1, 200): path.lineTo(3 * (i + 1), 400 - self.data[i] * 100) self.scene.addPath(path, QPen(QColor(0, 0, 255), 3)) self.ui.graphU.setScene(self.scene)
class ModuleCWidget(QWidget): def __init__(self): QWidget.__init__(self) self.ui = Ui_ModuleC() self.ui.setupUi(self) self.timer = QTimer() QObject.connect(self.timer, SIGNAL("timeout()"), self.read_inputs) self.datau = 200*[0.0] self.datai = 200*[0.0] self.current = 0 self.mode = ['DC', 'C'] @pyqtSlot() def on_radioAC_clicked(self): self.mode[0] = 'AC' self.setup_hw() @pyqtSlot() def on_radioDC_clicked(self): self.mode[0] = 'DC' self.setup_hw() @pyqtSlot() def on_radioL_clicked(self): self.mode[1] = 'L' self.setup_hw() @pyqtSlot() def on_radioC_clicked(self): self.mode[1] = 'C' self.setup_hw() @pyqtSlot() def on_radioLC_clicked(self): self.mode[1] = 'LC' self.setup_hw() @pyqtSlot(bool) def on_btnPower_clicked(self, checked): if checked: self.current = 3.3 self.ui.btnPower.setText('ON') else: self.current = 0.0 self.ui.btnPower.setText('OFF') if self.mode == ['DC', 'L']: self.dev.setout(1, checked and 1 or 0) if self.mode == ['DC', 'C']: self.dev.setout(2, checked and 1 or 0) if self.mode == ['DC', 'LC']: self.dev.setout(3, checked and 1 or 1) def setup_hw(self): if self.mode == ['DC', 'L']: # AD6 self.dev.switches(1<<5) self.dev.opamp(2, 5, 0) if self.mode == ['DC', 'C']: # AD5 self.dev.switches(1<<4) self.dev.opamp(2, 4, 0) if self.mode == ['DC', 'LC']: # AD3 self.dev.switches(1<<2) self.dev.opamp(2, 2, 0) def setup_scene(self, scene): scene.addLine(-5, 100-0, 605, 100-0) scene.addLine(0, 200+5, 0, 200-205) scene.addLine(-5, 200- 0, 5, 200- 0) scene.addLine(-5, 200- 50, 5, 200- 50) scene.addLine(-5, 200-100, 5, 200-100) scene.addLine(-5, 200-150, 5, 200-150) scene.addLine(-5, 200-200, 5, 200-200) def tick_DC(self, u, i): self.datau.pop(0) self.datai.pop(0) self.datau.append(u) self.datai.append(i) self.scene1 = QGraphicsScene() self.scene2 = QGraphicsScene() self.setup_scene(self.scene1) self.setup_scene(self.scene2) self.scene1.addSimpleText('[U/V]').moveBy(-39, 220-10) self.scene2.addSimpleText('[I/mA]').moveBy(-39, 220-10) self.scene1.addSimpleText('+4.0').moveBy(-40, 0-10) self.scene1.addSimpleText('+2.0').moveBy(-40, 50-10) self.scene1.addSimpleText(' 0.0').moveBy(-40, 100-10) self.scene1.addSimpleText('-2.0').moveBy(-40, 150-10) self.scene1.addSimpleText('-4.0').moveBy(-40, 200-10) self.scene2.addSimpleText('+0.4').moveBy(-40, 0-10) self.scene2.addSimpleText('+0.2').moveBy(-40, 50-10) self.scene2.addSimpleText(' 0.0').moveBy(-40, 100-10) self.scene2.addSimpleText('-0.2').moveBy(-40, 150-10) self.scene2.addSimpleText('-0.4').moveBy(-40, 200-10) path = QPainterPath() path.moveTo(0,100-self.datau[0]*25) for i in xrange(1,200): path.lineTo(3*(i+1), 100-self.datau[i]*25) self.scene1.addPath(path, QPen(QColor(0,0,255), 3)) path = QPainterPath() path.moveTo(0,100-self.datai[0]*25) for i in xrange(1,200): path.lineTo(3*(i+1), 100-self.datai[i]*25) self.scene2.addPath(path, QPen(QColor(0,0,255), 3)) self.ui.graph1.setScene(self.scene1) self.ui.graph2.setScene(self.scene2) def read_inputs(self): r = self.dev.read() if self.mode[0] == 'DC': u = r[0]/1023.0 * 3.3 # TODO: change this if we change opamp i = self.current - r[0]/1023.0 * 3.3 self.tick_DC(u, i)
class ModuleDebugWidget(QWidget): def __init__(self): QWidget.__init__(self) self.ui = Ui_ModuleDebug() self.ui.setupUi(self) QObject.connect(self.ui.comboAMP1c, SIGNAL("currentIndexChanged(int)"), self.on_comboAMP1_changed) QObject.connect(self.ui.comboAMP1g, SIGNAL("currentIndexChanged(int)"), self.on_comboAMP1_changed) QObject.connect(self.ui.comboAMP2c, SIGNAL("currentIndexChanged(int)"), self.on_comboAMP2_changed) QObject.connect(self.ui.comboAMP2g, SIGNAL("currentIndexChanged(int)"), self.on_comboAMP2_changed) QObject.connect(self.ui.pushSwitch1, SIGNAL("clicked(bool)"), self.on_switches_changed) QObject.connect(self.ui.pushSwitch2, SIGNAL("clicked(bool)"), self.on_switches_changed) QObject.connect(self.ui.pushSwitch3, SIGNAL("clicked(bool)"), self.on_switches_changed) QObject.connect(self.ui.pushSwitch4, SIGNAL("clicked(bool)"), self.on_switches_changed) QObject.connect(self.ui.pushSwitch5, SIGNAL("clicked(bool)"), self.on_switches_changed) QObject.connect(self.ui.pushSwitch6, SIGNAL("clicked(bool)"), self.on_switches_changed) QObject.connect(self.ui.pushPin1, SIGNAL("clicked(bool)"), self.on_pins_changed) QObject.connect(self.ui.pushPin2, SIGNAL("clicked(bool)"), self.on_pins_changed) QObject.connect(self.ui.pushPin3, SIGNAL("clicked(bool)"), self.on_pins_changed) self.log = None self.timer = QTimer() QObject.connect(self.timer, SIGNAL("timeout()"), self.read_inputs) self.data1 = 100*[0.0] self.data2 = 100*[0.0] @pyqtSlot(int) def on_dialPWM1_valueChanged(self, val): self.dev.pwm(1, val) @pyqtSlot(int) def on_dialPWM2_valueChanged(self, val): self.dev.pwm(2, val) @pyqtSlot(int) def on_dialAMP1_valueChanged(self, val): self.dev.opamp(1, val) @pyqtSlot(int) def on_dialAMP2_valueChanged(self, val): self.dev.opamp(2, val) @pyqtSlot(bool) def on_radioSine_clicked(self, checked): self.dev.ddswave(0) @pyqtSlot(bool) def on_radioSquare_clicked(self, checked): self.dev.ddswave(1) @pyqtSlot(bool) def on_radioSaw_clicked(self, checked): self.dev.ddswave(2) @pyqtSlot(bool) def on_radioInvSaw_clicked(self, checked): self.dev.ddswave(3) @pyqtSlot(int) def on_dialDDS_valueChanged(self, val): self.dev.ddsfreq(val) @pyqtSlot() def on_comboAMP1_changed(self): c = self.ui.comboAMP1c.currentIndex() g = self.ui.comboAMP1g.currentIndex() self.dev.opamp(1, c, g) @pyqtSlot() def on_comboAMP2_changed(self): c = self.ui.comboAMP2c.currentIndex() g = self.ui.comboAMP2g.currentIndex() self.dev.opamp(2, c, g) @pyqtSlot() def on_switches_changed(self): s = (self.ui.pushSwitch1.isChecked() and 1 or 0, self.ui.pushSwitch2.isChecked() and 1 or 0, self.ui.pushSwitch3.isChecked() and 1 or 0, self.ui.pushSwitch4.isChecked() and 1 or 0, self.ui.pushSwitch5.isChecked() and 1 or 0, self.ui.pushSwitch6.isChecked() and 1 or 0) self.dev.switches(s[0] + (s[1]<<1) + (s[2]<<2) + (s[3]<<3) + (s[4]<<4) + (s[5]<<5)) @pyqtSlot() def on_pins_changed(self): s = (self.ui.pushPin1.isChecked() and 1 or 0, self.ui.pushPin2.isChecked() and 1 or 0, self.ui.pushPin3.isChecked() and 1 or 0) self.ui.pushOut1.setEnabled(not s[0]) self.ui.pushOut2.setEnabled(not s[1]) self.ui.pushOut3.setEnabled(not s[2]) self.dev.setpins(s[0] + (s[1]<<1) + (s[2]<<2)) @pyqtSlot(bool) def on_pushOut1_clicked(self, checked): self.dev.setout(1, checked and 1 or 0) @pyqtSlot(bool) def on_pushOut2_clicked(self, checked): self.dev.setout(2, checked and 1 or 0) @pyqtSlot(bool) def on_pushOut3_clicked(self, checked): self.dev.setout(3, checked and 1 or 0) @pyqtSlot(int) def on_dialInputFreq_valueChanged(self, val): self.timer.stop() self.ui.pushLog.setEnabled(val > 0) if val > 0: self.timer.start(1000.0/val) else: self.ui.labelAD0.setText('AD0: -') self.ui.labelAD1.setText('AD1: -') self.ui.labelAD2.setText('AD2: -') self.ui.labelAD3.setText('AD3: -') self.ui.labelAD4.setText('AD4: -') self.ui.labelAD5.setText('AD5: -') self.ui.labelAD6.setText('AD6: -') self.ui.labelIO1.setText('IO1: -') self.ui.labelIO2.setText('IO2: -') self.ui.labelIO3.setText('IO3: -') @pyqtSlot(bool) def on_pushLog_clicked(self, checked): if checked: self.log = open('edubrm.log', 'w') else: self.log.close() self.log = None def read_inputs(self): r = self.dev.read() if self.log: self.log.write('%0.6f;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d\n' % (time(), r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9])) self.ui.labelAD0.setText('AD0: ' + str(r[0])) self.ui.labelAD1.setText('AD1: ' + str(r[1])) self.ui.labelAD2.setText('AD2: ' + str(r[2])) self.ui.labelAD3.setText('AD3: ' + str(r[3])) self.ui.labelAD4.setText('AD4: ' + str(r[4])) self.ui.labelAD5.setText('AD5: ' + str(r[5])) self.ui.labelAD6.setText('AD6: ' + str(r[6])) self.ui.labelIO1.setText('IO1: ' + str(r[7])) self.ui.labelIO2.setText('IO2: ' + str(r[8])) self.ui.labelIO3.setText('IO3: ' + str(r[9])) v1 = -1 if self.ui.comboChart1.currentIndex() > 0: v1 = r[self.ui.comboChart1.currentIndex() - 1] v2 = -1 if self.ui.comboChart2.currentIndex() > 0: v2 = r[self.ui.comboChart2.currentIndex() - 1] if v1 != -1 or v2 != -1: self.chart(v1, v2) def setup_scene(self, scene): scene.addLine(-5, 0, 205, 0) scene.addLine(-5, -512/6, 205, -512/6) scene.addLine(-5, -1023/6, 205, -1023/6) scene.addSimpleText('0').moveBy(-40, -10) scene.addSimpleText('512').moveBy(-40, -512/6-10) scene.addSimpleText('1023').moveBy(-40, -1023/6-10) def chart(self, v1, v2): self.data1.pop(0) self.data2.pop(0) self.data1.append(v1) self.data2.append(v2) self.scene1 = QGraphicsScene() self.scene2 = QGraphicsScene() self.setup_scene(self.scene1) self.setup_scene(self.scene2) path = QPainterPath() path.moveTo(0,-self.data1[0]/6) for i in xrange(1,100): path.lineTo(2*(i+1), -self.data1[i]/6) self.scene1.addPath(path, QPen(QColor(0,0,255), 3)) path = QPainterPath() path.moveTo(0,-self.data2[0]/6) for i in xrange(1,100): path.lineTo(2*(i+1), -self.data2[i]/6) self.scene2.addPath(path, QPen(QColor(0,0,255), 3)) self.ui.chart1.setScene(self.scene1) self.ui.chart2.setScene(self.scene2)
class ElevationScene(object): def __init__(self, dialog, view): self.dialog = dialog self.view = view self.scene = None self.line = None self.path = None self.zone = None self.pts = {} self.y_delta = { PT1: 0., PT2: 0. } self.fresnel_visible = False self.frequency = 2400 @staticmethod def path_for(points): path = QPainterPath(points[0]) for point in points[1:]: path.lineTo(point) path.lineTo(points[-1].x(), 0) path.lineTo(points[0].x(), 0) path.lineTo(points[0]) return path @staticmethod def overlay_for(pt1, pt2, frequency): # Construct the line-geometry, we'll use this to construct the ellipsoid line = QLineF(pt1, pt2) # Determine the radius for the ellipsoid radius = fresnel_radius(line.length(), frequency) # Draw the ellipsoid zone = QPainterPath() zone.addEllipse(QPointF(0., 0.), line.length() / 2, radius) # Rotate the ellipsoid - same angle as the line transform = QTransform() transform.rotate(-line.angle()) zone = transform.map(zone) # Center the zone over the line lc = QRectF(pt1, pt2).center() zc = zone.boundingRect().center() zone.translate(lc.x() - zc.x(), lc.y() - zc.y()) return line, zone def initialize(self, points, show_fresnel, frequency): self.pts = { PT1: points[0], PT2: points[-1] } self.fresnel_visible = show_fresnel self.frequency = frequency # Construct static geometry to be included in the scene path = self.path_for(points) height = path.boundingRect().height() gradient = QLinearGradient(QPointF(0., height), QPointF(0., 0.)) gradient.setColorAt(0, QColor(0x00b300)) gradient.setColorAt(1, QColor(0x331a00)) # Create the scene self.scene = QGraphicsScene(self.dialog) # Add geometries to the scene, keeping a reference to each self.path = self.scene.addPath(path, QPen(Qt.blue, 1), QBrush(gradient)) # Update the scene; i.e. correct pen-colours etc. self.update_scene(add_geometries=True) # Set up the view with the constructed scene self.view.setScene(self.scene) self.view.ensureVisible(self.scene.sceneRect()) self.view.scale(1., -1.) def update_scene(self, add_geometries=False): # Get new geometries line, zone = self.overlay_for( self.pts[PT1] + QPointF(0., self.y_delta[PT1]), self.pts[PT2] + QPointF(0., self.y_delta[PT2]), self.frequency ) # And update the line geometry - this shall be reflected in the scene if add_geometries: self.line = self.scene.addLine(line) self.zone = self.scene.addPath(zone) else: self.line.setLine(line) self.zone.setPath(zone) # Colour the line & zone as appropriate for item in (self.line, self.zone): item.setPen(RPEN if item.collidesWithItem(self.path) else GPEN) # Show/hide the fresnel zone as requested self.zone.setVisible(self.fresnel_visible) def zoom_event(self, pos, delta): # Save the scene pos old_pos = self.view.mapToScene(pos) # Zoom zoom_factor = ZOOM_IN_FACTOR if delta > 0 else ZOOM_OUT_FACTOR self.view.scale(zoom_factor, zoom_factor) # Translate scene such that zoom appears to center on mouse pointer pos new_pos = self.view.mapToScene(pos) delta = new_pos - old_pos self.view.translate(delta.x(), delta.y()) def slider_event(self, point, value): self.y_delta[point] = value self.update_scene() def fresnel_event(self, show_fresnel, value): self.fresnel_visible = show_fresnel self.frequency = value self.update_scene()
class ModuleCWidget(QWidget): def __init__(self): QWidget.__init__(self) self.ui = Ui_ModuleC() self.ui.setupUi(self) self.timer = QTimer() QObject.connect(self.timer, SIGNAL("timeout()"), self.read_inputs) self.datau = 200 * [0.0] self.datai = 200 * [0.0] self.current = 0 self.mode = ['DC', 'C'] @pyqtSlot() def on_radioAC_clicked(self): self.mode[0] = 'AC' self.setup_hw() @pyqtSlot() def on_radioDC_clicked(self): self.mode[0] = 'DC' self.setup_hw() @pyqtSlot() def on_radioL_clicked(self): self.mode[1] = 'L' self.setup_hw() @pyqtSlot() def on_radioC_clicked(self): self.mode[1] = 'C' self.setup_hw() @pyqtSlot() def on_radioLC_clicked(self): self.mode[1] = 'LC' self.setup_hw() @pyqtSlot(bool) def on_btnPower_clicked(self, checked): if checked: self.current = 3.3 self.ui.btnPower.setText('ON') else: self.current = 0.0 self.ui.btnPower.setText('OFF') if self.mode == ['DC', 'L']: self.dev.setout(1, checked and 1 or 0) if self.mode == ['DC', 'C']: self.dev.setout(2, checked and 1 or 0) if self.mode == ['DC', 'LC']: self.dev.setout(3, checked and 1 or 1) def setup_hw(self): if self.mode == ['DC', 'L']: # AD6 self.dev.switches(1 << 5) self.dev.opamp(2, 5, 0) if self.mode == ['DC', 'C']: # AD5 self.dev.switches(1 << 4) self.dev.opamp(2, 4, 0) if self.mode == ['DC', 'LC']: # AD3 self.dev.switches(1 << 2) self.dev.opamp(2, 2, 0) def setup_scene(self, scene): scene.addLine(-5, 100 - 0, 605, 100 - 0) scene.addLine(0, 200 + 5, 0, 200 - 205) scene.addLine(-5, 200 - 0, 5, 200 - 0) scene.addLine(-5, 200 - 50, 5, 200 - 50) scene.addLine(-5, 200 - 100, 5, 200 - 100) scene.addLine(-5, 200 - 150, 5, 200 - 150) scene.addLine(-5, 200 - 200, 5, 200 - 200) def tick_DC(self, u, i): self.datau.pop(0) self.datai.pop(0) self.datau.append(u) self.datai.append(i) self.scene1 = QGraphicsScene() self.scene2 = QGraphicsScene() self.setup_scene(self.scene1) self.setup_scene(self.scene2) self.scene1.addSimpleText('[U/V]').moveBy(-39, 220 - 10) self.scene2.addSimpleText('[I/mA]').moveBy(-39, 220 - 10) self.scene1.addSimpleText('+4.0').moveBy(-40, 0 - 10) self.scene1.addSimpleText('+2.0').moveBy(-40, 50 - 10) self.scene1.addSimpleText(' 0.0').moveBy(-40, 100 - 10) self.scene1.addSimpleText('-2.0').moveBy(-40, 150 - 10) self.scene1.addSimpleText('-4.0').moveBy(-40, 200 - 10) self.scene2.addSimpleText('+0.4').moveBy(-40, 0 - 10) self.scene2.addSimpleText('+0.2').moveBy(-40, 50 - 10) self.scene2.addSimpleText(' 0.0').moveBy(-40, 100 - 10) self.scene2.addSimpleText('-0.2').moveBy(-40, 150 - 10) self.scene2.addSimpleText('-0.4').moveBy(-40, 200 - 10) path = QPainterPath() path.moveTo(0, 100 - self.datau[0] * 25) for i in xrange(1, 200): path.lineTo(3 * (i + 1), 100 - self.datau[i] * 25) self.scene1.addPath(path, QPen(QColor(0, 0, 255), 3)) path = QPainterPath() path.moveTo(0, 100 - self.datai[0] * 25) for i in xrange(1, 200): path.lineTo(3 * (i + 1), 100 - self.datai[i] * 25) self.scene2.addPath(path, QPen(QColor(0, 0, 255), 3)) self.ui.graph1.setScene(self.scene1) self.ui.graph2.setScene(self.scene2) def read_inputs(self): r = self.dev.read() if self.mode[0] == 'DC': u = r[0] / 1023.0 * 3.3 # TODO: change this if we change opamp i = self.current - r[0] / 1023.0 * 3.3 self.tick_DC(u, i)
class ModuleDebugWidget(QWidget): def __init__(self): QWidget.__init__(self) self.ui = Ui_ModuleDebug() self.ui.setupUi(self) QObject.connect(self.ui.comboAMP1c, SIGNAL("currentIndexChanged(int)"), self.on_comboAMP1_changed) QObject.connect(self.ui.comboAMP1g, SIGNAL("currentIndexChanged(int)"), self.on_comboAMP1_changed) QObject.connect(self.ui.comboAMP2c, SIGNAL("currentIndexChanged(int)"), self.on_comboAMP2_changed) QObject.connect(self.ui.comboAMP2g, SIGNAL("currentIndexChanged(int)"), self.on_comboAMP2_changed) QObject.connect(self.ui.pushSwitch1, SIGNAL("clicked(bool)"), self.on_switches_changed) QObject.connect(self.ui.pushSwitch2, SIGNAL("clicked(bool)"), self.on_switches_changed) QObject.connect(self.ui.pushSwitch3, SIGNAL("clicked(bool)"), self.on_switches_changed) QObject.connect(self.ui.pushSwitch4, SIGNAL("clicked(bool)"), self.on_switches_changed) QObject.connect(self.ui.pushSwitch5, SIGNAL("clicked(bool)"), self.on_switches_changed) QObject.connect(self.ui.pushSwitch6, SIGNAL("clicked(bool)"), self.on_switches_changed) QObject.connect(self.ui.pushPin1, SIGNAL("clicked(bool)"), self.on_pins_changed) QObject.connect(self.ui.pushPin2, SIGNAL("clicked(bool)"), self.on_pins_changed) QObject.connect(self.ui.pushPin3, SIGNAL("clicked(bool)"), self.on_pins_changed) self.log = None self.timer = QTimer() QObject.connect(self.timer, SIGNAL("timeout()"), self.read_inputs) self.data1 = 100 * [0.0] self.data2 = 100 * [0.0] @pyqtSlot(int) def on_dialPWM1_valueChanged(self, val): self.dev.pwm(1, val) @pyqtSlot(int) def on_dialPWM2_valueChanged(self, val): self.dev.pwm(2, val) @pyqtSlot(int) def on_dialAMP1_valueChanged(self, val): self.dev.opamp(1, val) @pyqtSlot(int) def on_dialAMP2_valueChanged(self, val): self.dev.opamp(2, val) @pyqtSlot(bool) def on_radioSine_clicked(self, checked): self.dev.ddswave(0) @pyqtSlot(bool) def on_radioSquare_clicked(self, checked): self.dev.ddswave(1) @pyqtSlot(bool) def on_radioSaw_clicked(self, checked): self.dev.ddswave(2) @pyqtSlot(bool) def on_radioInvSaw_clicked(self, checked): self.dev.ddswave(3) @pyqtSlot(int) def on_dialDDS_valueChanged(self, val): self.dev.ddsfreq(val) @pyqtSlot() def on_comboAMP1_changed(self): c = self.ui.comboAMP1c.currentIndex() g = self.ui.comboAMP1g.currentIndex() self.dev.opamp(1, c, g) @pyqtSlot() def on_comboAMP2_changed(self): c = self.ui.comboAMP2c.currentIndex() g = self.ui.comboAMP2g.currentIndex() self.dev.opamp(2, c, g) @pyqtSlot() def on_switches_changed(self): s = (self.ui.pushSwitch1.isChecked() and 1 or 0, self.ui.pushSwitch2.isChecked() and 1 or 0, self.ui.pushSwitch3.isChecked() and 1 or 0, self.ui.pushSwitch4.isChecked() and 1 or 0, self.ui.pushSwitch5.isChecked() and 1 or 0, self.ui.pushSwitch6.isChecked() and 1 or 0) self.dev.switches(s[0] + (s[1] << 1) + (s[2] << 2) + (s[3] << 3) + (s[4] << 4) + (s[5] << 5)) @pyqtSlot() def on_pins_changed(self): s = (self.ui.pushPin1.isChecked() and 1 or 0, self.ui.pushPin2.isChecked() and 1 or 0, self.ui.pushPin3.isChecked() and 1 or 0) self.ui.pushOut1.setEnabled(not s[0]) self.ui.pushOut2.setEnabled(not s[1]) self.ui.pushOut3.setEnabled(not s[2]) self.dev.setpins(s[0] + (s[1] << 1) + (s[2] << 2)) @pyqtSlot(bool) def on_pushOut1_clicked(self, checked): self.dev.setout(1, checked and 1 or 0) @pyqtSlot(bool) def on_pushOut2_clicked(self, checked): self.dev.setout(2, checked and 1 or 0) @pyqtSlot(bool) def on_pushOut3_clicked(self, checked): self.dev.setout(3, checked and 1 or 0) @pyqtSlot(int) def on_dialInputFreq_valueChanged(self, val): self.timer.stop() self.ui.pushLog.setEnabled(val > 0) if val > 0: self.timer.start(1000.0 / val) else: self.ui.labelAD0.setText('AD0: -') self.ui.labelAD1.setText('AD1: -') self.ui.labelAD2.setText('AD2: -') self.ui.labelAD3.setText('AD3: -') self.ui.labelAD4.setText('AD4: -') self.ui.labelAD5.setText('AD5: -') self.ui.labelAD6.setText('AD6: -') self.ui.labelIO1.setText('IO1: -') self.ui.labelIO2.setText('IO2: -') self.ui.labelIO3.setText('IO3: -') @pyqtSlot(bool) def on_pushLog_clicked(self, checked): if checked: self.log = open('edubrm.log', 'w') else: self.log.close() self.log = None def read_inputs(self): r = self.dev.read() if self.log: self.log.write('%0.6f;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d\n' % (time(), r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9])) self.ui.labelAD0.setText('AD0: ' + str(r[0])) self.ui.labelAD1.setText('AD1: ' + str(r[1])) self.ui.labelAD2.setText('AD2: ' + str(r[2])) self.ui.labelAD3.setText('AD3: ' + str(r[3])) self.ui.labelAD4.setText('AD4: ' + str(r[4])) self.ui.labelAD5.setText('AD5: ' + str(r[5])) self.ui.labelAD6.setText('AD6: ' + str(r[6])) self.ui.labelIO1.setText('IO1: ' + str(r[7])) self.ui.labelIO2.setText('IO2: ' + str(r[8])) self.ui.labelIO3.setText('IO3: ' + str(r[9])) v1 = -1 if self.ui.comboChart1.currentIndex() > 0: v1 = r[self.ui.comboChart1.currentIndex() - 1] v2 = -1 if self.ui.comboChart2.currentIndex() > 0: v2 = r[self.ui.comboChart2.currentIndex() - 1] if v1 != -1 or v2 != -1: self.chart(v1, v2) def setup_scene(self, scene): scene.addLine(-5, 0, 205, 0) scene.addLine(-5, -512 / 6, 205, -512 / 6) scene.addLine(-5, -1023 / 6, 205, -1023 / 6) scene.addSimpleText('0').moveBy(-40, -10) scene.addSimpleText('512').moveBy(-40, -512 / 6 - 10) scene.addSimpleText('1023').moveBy(-40, -1023 / 6 - 10) def chart(self, v1, v2): self.data1.pop(0) self.data2.pop(0) self.data1.append(v1) self.data2.append(v2) self.scene1 = QGraphicsScene() self.scene2 = QGraphicsScene() self.setup_scene(self.scene1) self.setup_scene(self.scene2) path = QPainterPath() path.moveTo(0, -self.data1[0] / 6) for i in xrange(1, 100): path.lineTo(2 * (i + 1), -self.data1[i] / 6) self.scene1.addPath(path, QPen(QColor(0, 0, 255), 3)) path = QPainterPath() path.moveTo(0, -self.data2[0] / 6) for i in xrange(1, 100): path.lineTo(2 * (i + 1), -self.data2[i] / 6) self.scene2.addPath(path, QPen(QColor(0, 0, 255), 3)) self.ui.chart1.setScene(self.scene1) self.ui.chart2.setScene(self.scene2)