Viewing file: mouseman.py (2.81 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
# Copyright (c) 2001-2004 Twisted Matrix Laboratories. # See LICENSE for details.
# """Logictech MouseMan serial protocol.
http://www.softnco.demon.co.uk/SerialMouse.txt """
from twisted.internet import protocol
class MouseMan(protocol.Protocol): """
Parser for Logitech MouseMan serial mouse protocol (compatible with Microsoft Serial Mouse).
"""
state = 'initial'
leftbutton=None rightbutton=None middlebutton=None
leftold=None rightold=None middleold=None
horiz=None vert=None horizold=None vertold=None
def down_left(self): pass
def up_left(self): pass
def down_middle(self): pass
def up_middle(self): pass
def down_right(self): pass
def up_right(self): pass
def move(self, x, y): pass
horiz=None vert=None
def state_initial(self, byte): if byte & 1<<6: self.word1=byte self.leftbutton = byte & 1<<5 self.rightbutton = byte & 1<<4 return 'horiz' else: return 'initial'
def state_horiz(self, byte): if byte & 1<<6: return self.state_initial(byte) else: x=(self.word1 & 0x03)<<6 | (byte & 0x3f) if x>=128: x=-256+x self.horiz = x return 'vert'
def state_vert(self, byte): if byte & 1<<6: # short packet return self.state_initial(byte) else: x = (self.word1 & 0x0c)<<4 | (byte & 0x3f) if x>=128: x=-256+x self.vert = x self.snapshot() return 'maybemiddle'
def state_maybemiddle(self, byte): if byte & 1<<6: self.snapshot() return self.state_initial(byte) else: self.middlebutton=byte & 1<<5 self.snapshot() return 'initial'
def snapshot(self): if self.leftbutton and not self.leftold: self.down_left() self.leftold=1 if not self.leftbutton and self.leftold: self.up_left() self.leftold=0
if self.middlebutton and not self.middleold: self.down_middle() self.middleold=1 if not self.middlebutton and self.middleold: self.up_middle() self.middleold=0
if self.rightbutton and not self.rightold: self.down_right() self.rightold=1 if not self.rightbutton and self.rightold: self.up_right() self.rightold=0
if self.horiz or self.vert: self.move(self.horiz, self.vert)
def dataReceived(self, data): for c in data: byte = ord(c) self.state = getattr(self, 'state_'+self.state)(byte)
|