def __init__(self, udp=False, ip='127.0.0.1', port=12012, interval = 100):
     self.init_time = time.time()
     super(MouseController, self).__init__()
     self.udp = udp
     self.ip = ip
     self.port = port
     self.interval = interval
     self.red = QtGui.QColor(255, 0, 0)
     self.blue = QtGui.QColor(0,0,255)
     self.black = QtGui.QColor(0,0,0)
     self.white = QtGui.QColor(255,255,255,0)
     
     self.initUI()
     self.dy = 0
     self.dx = 0
     self.yPos = 0
     self.xPos = 0
     #the mouse reader
     self.mr= MouseReader(dev='/dev/input/mouse0')
     self.mr.start()
     
     #the timer
     timer = QtCore.QTimer(self)
     timer.timeout.connect(self.updateStatusBar)
     
     timer.start(500)
     if self.udp:
         self.sock = socket.socket( socket.AF_INET, # Internet
             socket.SOCK_DGRAM ) # UDP
         timer1 = QtCore.QTimer(self)
         timer1.timeout.connect(self.sendData)
         timer1.start(self.interval)
class MouseController(QtGui.QWidget):
    '''
    A qWidget to visualize mouse input.
    If udp is enabled, udp packages are sent to the specified address and port in interval ms
    Message format: init_time (time of instantiation) time passed since init_time (xPos,yPos)
    
    '''
    
    def __init__(self, udp=False, ip='127.0.0.1', port=12012, interval = 100):
        self.init_time = time.time()
        super(MouseController, self).__init__()
        self.udp = udp
        self.ip = ip
        self.port = port
        self.interval = interval
        self.red = QtGui.QColor(255, 0, 0)
        self.blue = QtGui.QColor(0,0,255)
        self.black = QtGui.QColor(0,0,0)
        self.white = QtGui.QColor(255,255,255,0)
        
        self.initUI()
        self.dy = 0
        self.dx = 0
        self.yPos = 0
        self.xPos = 0
        #the mouse reader
        self.mr= MouseReader(dev='/dev/input/mouse0')
        self.mr.start()
        
        #the timer
        timer = QtCore.QTimer(self)
        timer.timeout.connect(self.updateStatusBar)
        
        timer.start(500)
        if self.udp:
            self.sock = socket.socket( socket.AF_INET, # Internet
                socket.SOCK_DGRAM ) # UDP
            timer1 = QtCore.QTimer(self)
            timer1.timeout.connect(self.sendData)
            timer1.start(self.interval)

        
    def initUI(self):      

        self.setGeometry(300, 300, 512, 512)
        self.setWindowTitle('Mouse Controller')
        self.show()

    def paintEvent(self, e):

        qp = QtGui.QPainter()
        qp.begin(self)
        self.drawStatusBar(qp,self.dy)
        self.drawStatusBar(qp,self.dx,y=300)
        self.displayValues(qp,'y Position',self.yPos)
        self.displayValues(qp,'x Position',self.xPos,y=80)
        qp.end()

    

    def drawStatusBar(self,qp,value,x=20,y=400,w=470,h=50,maxvalue=10,title=None):
        unit=int(w/(maxvalue+maxvalue))
        x_mid = (x+w)*.5
        
        
        #the value box
        if value == 0:
            pass
        
        elif value >0:
            qp.setPen(self.blue)
            qp.setBrush(self.blue)
            qp.drawRect(x_mid+1, y,value*unit, h)
        
        elif value < 0:
            qp.setPen(self.red)
            qp.setBrush(self.red)
            qp.drawRect(x_mid,y,value*unit-1,h)
        
        #the bounding box
        qp.setPen(self.black)
        qp.setBrush(self.white)
        qp.drawRect(x,y,w,h)
        #the midline
        x_mid = (x+w)*.5
        qp.setPen(self.black)
        qp.drawLine(x_mid,y,x_mid,y+h)
        return

    def displayValues(self,qp,name,value,x=20,y=40):
        text = str(name) + ':\t' + str(value) 
        qp.drawText(x,y,text)
        return

    def updateStatusBar(self):
        self.dy,self.dx = self.mr.getLastDeltas()
        self.xPos,self.yPos = self.mr.getPos()
        self.update()
        return

    def sendData(self):
        delta_time = time.time() - self.init_time
        msg=str(self.init_time)+'\t' + '%3.2f\t'%(delta_time)+str(self.mr.getPos())
        self.sendMsg(msg)

    def sendMsg(self, msg):
        self.sock.sendto(msg, (self.ip, self.port))
        return