Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- # Author: Marin Purgar - marin.purgar@gmail.com
- # This code is freeware, do whatever you want with it!
- # Imports
- import sys
- import usb
- from PyQt4 import QtCore, QtGui
- # Classes
- # AnalogMultimeter
- class AnalogMultimeter(QtGui.QWidget):
- needlePosition = 0
- needlePolygon = QtGui.QPolygon([QtCore.QPoint(2, -8), QtCore.QPoint(-2, -8), QtCore.QPoint(-1, 96), QtCore.QPoint(1, 96), ])
- def __init__(self, parent=None):
- super(AnalogMultimeter, self).__init__(parent)
- self.setWindowTitle("Analog Multimeter")
- self.resize(220, 140)
- def paintEvent(self, event):
- width = self.width()
- height = self.height()
- painter = QtGui.QPainter(self)
- painter.setRenderHint(QtGui.QPainter.Antialiasing)
- painter.translate(width / 2, height * 0.85)
- painter.scale(width / 220.0, height / 140.0)
- # paint arc
- painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1, QtCore.Qt.SolidLine))
- painter.drawArc(-88, -88, 176, 176, 20 * 16, 140 * 16)
- # paint big ticks
- painter.setPen(QtGui.QPen(QtCore.Qt.black, 1, QtCore.Qt.SolidLine))
- painter.setFont(QtGui.QFont('Arial', 8))
- painter.rotate(200);
- for i in range(11):
- painter.drawLine(88, 0, 96, 0)
- if (i % 2) == 0:
- painter.save()
- painter.translate(98, -15)
- painter.rotate(90);
- painter.drawText(0, -10, 30, 10, QtCore.Qt.AlignCenter, str(i / 2))
- painter.restore()
- painter.rotate(14)
- # paint small ticks
- painter.setPen(QtCore.Qt.gray)
- painter.rotate(206);
- for i in range(50):
- if (i % 5) != 0:
- painter.drawLine(88, 0, 92, 0)
- painter.rotate(2.8)
- # paint needle
- painter.rotate(130 + self.needlePosition)
- painter.setPen(QtCore.Qt.NoPen)
- painter.setBrush(QtCore.Qt.red)
- painter.drawConvexPolygon(AnalogMultimeter.needlePolygon)
- painter.end()
- def updatePosition(self, position):
- if position != self.needlePosition:
- self.needlePosition = position
- self.repaint()
- # Pinguino
- class Pinguino():
- VENDOR = 0x04D8
- PRODUCT = 0xFEAA
- CONFIGURATION = 3
- INTERFACE = 0
- ENDPOINT_IN = 0x82
- ENDPOINT_OUT = 0x01
- device = None
- handle = None
- def __init__(self,):
- for bus in usb.busses():
- for dev in bus.devices:
- if dev.idVendor == self.VENDOR and dev.idProduct == self.PRODUCT:
- self.device = dev
- return None
- def open(self):
- if not self.device:
- print >> sys.stderr, "Unable to find device!"
- return None
- try:
- self.handle = self.device.open()
- self.handle.setConfiguration(self.CONFIGURATION)
- self.handle.claimInterface(self.INTERFACE)
- except usb.USBError, err:
- print >> sys.stderr, err
- self.handle = None
- return self.handle
- def close(self):
- try:
- self.handle.releaseInterface()
- except Exception, err:
- print >> sys.stderr, err
- self.handle, self.device = None, None
- def read(self, length, timeout = 0):
- return self.handle.bulkRead(self.ENDPOINT_IN, length, timeout)
- def write(self, buffer, timeout = 0):
- return self.handle.bulkWrite(self.ENDPOINT_OUT, buffer, timeout)
- # Main methods
- def updateMeter():
- usb_in = ''
- try:
- usb_in = pinguino.read(2, 1);
- except usb.USBError as err:
- pass
- if len(usb_in) > 0:
- i = usb_in[0] * 256 + usb_in[1];
- j = int(i * 140 / 1023.0 * 100) / 100.0
- meter.updatePosition(j)
- # Main
- app = QtGui.QApplication(sys.argv)
- meter = AnalogMultimeter()
- meter.show()
- pinguino = Pinguino()
- if pinguino.open() == None:
- print "Unable to open Pinguino device!"
- sys.exit()
- timer = QtCore.QTimer()
- timer.timeout.connect(updateMeter)
- timer.start(10)
- sys.exit(app.exec_())
- # EOF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement