Advertisement
Guest User

Marin Purgar

a guest
Mar 17th, 2010
853
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.75 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. # Author: Marin Purgar - marin.purgar@gmail.com
  4. # This code is freeware, do whatever you want with it!
  5.  
  6. # Imports
  7.  
  8. import sys
  9. import usb
  10.  
  11. from PyQt4 import QtCore, QtGui
  12.  
  13. # Classes
  14.  
  15. # AnalogMultimeter
  16.  
  17. class AnalogMultimeter(QtGui.QWidget):
  18.   needlePosition = 0
  19.   needlePolygon = QtGui.QPolygon([QtCore.QPoint(2, -8), QtCore.QPoint(-2, -8), QtCore.QPoint(-1, 96), QtCore.QPoint(1, 96), ])
  20.  
  21.   def __init__(self, parent=None):
  22.     super(AnalogMultimeter, self).__init__(parent)
  23.     self.setWindowTitle("Analog Multimeter")
  24.     self.resize(220, 140)
  25.  
  26.   def paintEvent(self, event):
  27.     width = self.width()
  28.     height = self.height()
  29.     painter = QtGui.QPainter(self)
  30.     painter.setRenderHint(QtGui.QPainter.Antialiasing)
  31.     painter.translate(width / 2, height * 0.85)
  32.     painter.scale(width / 220.0, height / 140.0)
  33. # paint arc
  34.     painter.setPen(QtGui.QPen(QtCore.Qt.gray, 1, QtCore.Qt.SolidLine))
  35.     painter.drawArc(-88, -88, 176, 176, 20 * 16, 140 * 16)
  36. # paint big ticks
  37.     painter.setPen(QtGui.QPen(QtCore.Qt.black, 1, QtCore.Qt.SolidLine))
  38.     painter.setFont(QtGui.QFont('Arial', 8))
  39.     painter.rotate(200);
  40.     for i in range(11):
  41.       painter.drawLine(88, 0, 96, 0)
  42.       if (i % 2) == 0:
  43.         painter.save()
  44.         painter.translate(98, -15)
  45.         painter.rotate(90);
  46.         painter.drawText(0, -10, 30, 10, QtCore.Qt.AlignCenter, str(i / 2))
  47.         painter.restore()
  48.       painter.rotate(14)
  49. # paint small ticks
  50.     painter.setPen(QtCore.Qt.gray)
  51.     painter.rotate(206);
  52.     for i in range(50):
  53.       if (i % 5) != 0:
  54.         painter.drawLine(88, 0, 92, 0)
  55.       painter.rotate(2.8)
  56. # paint needle
  57.     painter.rotate(130 + self.needlePosition)
  58.     painter.setPen(QtCore.Qt.NoPen)
  59.     painter.setBrush(QtCore.Qt.red)
  60.     painter.drawConvexPolygon(AnalogMultimeter.needlePolygon)
  61.     painter.end()
  62.  
  63.   def updatePosition(self, position):
  64.     if position != self.needlePosition:
  65.       self.needlePosition = position
  66.       self.repaint()
  67.  
  68. # Pinguino
  69.  
  70. class Pinguino():
  71.   VENDOR = 0x04D8
  72.   PRODUCT = 0xFEAA
  73.   CONFIGURATION = 3
  74.   INTERFACE = 0
  75.   ENDPOINT_IN = 0x82
  76.   ENDPOINT_OUT = 0x01
  77.  
  78.   device = None
  79.   handle = None
  80.  
  81.   def __init__(self,):
  82.     for bus in usb.busses():
  83.       for dev in bus.devices:
  84.         if dev.idVendor == self.VENDOR and dev.idProduct == self.PRODUCT:
  85.           self.device = dev
  86.     return None
  87.  
  88.   def open(self):
  89.     if not self.device:
  90.       print >> sys.stderr, "Unable to find device!"
  91.       return None
  92.     try:
  93.       self.handle = self.device.open()
  94.       self.handle.setConfiguration(self.CONFIGURATION)
  95.       self.handle.claimInterface(self.INTERFACE)
  96.     except usb.USBError, err:
  97.       print >> sys.stderr, err
  98.       self.handle = None
  99.     return self.handle
  100.  
  101.   def close(self):
  102.     try:
  103.       self.handle.releaseInterface()
  104.     except Exception, err:
  105.       print >> sys.stderr, err
  106.     self.handle, self.device = None, None
  107.  
  108.   def read(self, length, timeout = 0):
  109.     return self.handle.bulkRead(self.ENDPOINT_IN, length, timeout)
  110.  
  111.   def write(self, buffer, timeout = 0):
  112.     return self.handle.bulkWrite(self.ENDPOINT_OUT, buffer, timeout)
  113.  
  114. # Main methods
  115.  
  116. def updateMeter():
  117.   usb_in = ''
  118.   try:
  119.     usb_in = pinguino.read(2, 1);
  120.   except usb.USBError as err:
  121.     pass
  122.   if len(usb_in) > 0:
  123.     i = usb_in[0] * 256 + usb_in[1];
  124.     j = int(i * 140 / 1023.0 * 100) / 100.0
  125.     meter.updatePosition(j)
  126.  
  127. # Main
  128.  
  129. app = QtGui.QApplication(sys.argv)
  130.  
  131. meter = AnalogMultimeter()
  132. meter.show()
  133.  
  134. pinguino = Pinguino()
  135.  
  136. if pinguino.open() == None:
  137.   print "Unable to open Pinguino device!"
  138.   sys.exit()
  139.  
  140. timer = QtCore.QTimer()
  141. timer.timeout.connect(updateMeter)
  142. timer.start(10)
  143.  
  144. sys.exit(app.exec_())
  145.  
  146. # EOF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement