edubrm/software/modules/ModuleC.py
2011-05-04 02:24:11 +02:00

145 lines
4.6 KiB
Python

from PyQt4.QtGui import QWidget
from PyQt4.QtGui import QGraphicsScene
from PyQt4.QtGui import QPainterPath
from PyQt4.QtGui import QPen
from PyQt4.QtGui import QColor
from PyQt4.QtCore import pyqtSlot
from PyQt4.QtCore import SIGNAL
from PyQt4.QtCore import QObject
from PyQt4.QtCore import QTimer
from ModuleCUi import Ui_ModuleC
from device import Device
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 ModuleC():
def __init__(self):
self.title = 'L/C/LC circuit'
self.widget = ModuleCWidget()
def start(self):
self.widget.dev = Device()
self.widget.setup_hw()
self.widget.timer.start(25)
self.widget.datau = 200*[0.0]
self.widget.datai = 200*[0.0]
def stop(self):
self.widget.timer.stop()