Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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)
Beispiel #5
0
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)
Beispiel #6
0
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()
Beispiel #7
0
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)
Beispiel #8
0
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)