From c3f0e8e2bfa09e2043016e808673a8c0779e4886 Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Thu, 07 Apr 2011 14:51:40 +0000 Subject: reorganizing plugins into separate directories; adding support for plugin palette icons in plugin directory --- (limited to 'plugins/rfid/tis2000.py') diff --git a/plugins/rfid/tis2000.py b/plugins/rfid/tis2000.py new file mode 100644 index 0000000..91d1991 --- /dev/null +++ b/plugins/rfid/tis2000.py @@ -0,0 +1,252 @@ +from device import RFIDDevice +from serial import Serial +import dbus +from dbus.mainloop.glib import DBusGMainLoop +import gobject +import re +from time import sleep + +HAL_SERVICE = 'org.freedesktop.Hal' +HAL_MGR_PATH = '/org/freedesktop/Hal/Manager' +HAL_MGR_IFACE = 'org.freedesktop.Hal.Manager' +HAL_DEV_IFACE = 'org.freedesktop.Hal.Device' +REGEXP_SERUSB = '\/org\/freedesktop\/Hal\/devices\/usb_device['\ + 'a-z,A-Z,0-9,_]*serial_usb_[0-9]' + +STATE_WAITING = 0 +STATE_WAITING2 = 1 +STATE_READING = 2 + +class RFIDReader(RFIDDevice): + """ + TIS-2000 interface. + """ + + def __init__(self): + + RFIDDevice.__init__(self) + self.last_tag = "" + self.ser = Serial() + self.device = '' + self.device_path = '' + self._connected = False + self._state = STATE_WAITING + + loop = DBusGMainLoop() + self.bus = dbus.SystemBus(mainloop=loop) + hmgr_iface = dbus.Interface(self.bus.get_object(HAL_SERVICE, + HAL_MGR_PATH), HAL_MGR_IFACE) + + hmgr_iface.connect_to_signal('DeviceRemoved', self._device_removed_cb) + + def get_present(self): + """ + Checks if TI-S2000 device is present. + Returns True if so, False otherwise. + """ + hmgr_if = dbus.Interface(self.bus.get_object(HAL_SERVICE, HAL_MGR_PATH), + HAL_MGR_IFACE) + tiusb_devices = set(hmgr_if.FindDeviceStringMatch('serial.type', + 'usb')) & set(hmgr_if.FindDeviceStringMatch( + 'info.product', 'TUSB3410 Microcontroller')) + for i in tiusb_devices: + tiusb_if = dbus.Interface(self.bus.get_object(HAL_SERVICE, i), + HAL_DEV_IFACE) + if tiusb_if.PropertyExists('linux.device_file'): + self.device = str(tiusb_if.GetProperty('linux.device_file')) + self.device_path = i + return True + return False + + def do_connect(self): + """ + Connects to the device. + Returns True if successfull, False otherwise. + """ + retval = False + if self.get_present(): + try: + self.ser = Serial(self.device, 9600, timeout=0.1) + self._connected = True + self._escape() + self._clear() + self._format() + gobject.idle_add(self._loop) + retval = True + except: + self._connected = False + return retval + + def do_disconnect(self): + """ + Disconnect from the device. + """ + self.ser.close() + self._connected = False + + def read_tag(self): + """ + Returns the last read value. + """ + return self.last_tag + + def write_tag(self, hexval): + """ + Usage: write_tag(hexval) + + Writes the hexadecimal string "hexval" into the tag. + Returns True if successfull, False otherwise. + """ + #self.ser.flushInput() + reg = re.compile('([^0-9A-F]+)') + if not (hexval.__len__() == 16 and reg.findall(hexval) == []): + return False + self.ser.read(100) + self.ser.write('P') + for i in hexval: + self.ser.write(i) + sleep(1) + resp = self.ser.read(64) + resp = resp.split()[0] + if resp == "P0": + return True + else: + return False + + def _escape(self): + """ + Sends the scape command to the TIS-2000 device. + """ + try: + #self.ser.flushInput() + self.ser.read(100) + self.ser.write('\x1B') + resp = self.ser.read() + if resp == 'E': + return True + else: + return False + except: + return False + + def _format(self): + """ + Sends the format command to the TIS-2000 device. + """ + try: + #self.ser.flushInput() + self.ser.read(100) + self.ser.write('F') + resp = self.ser.read() + if resp == 'F': + return True + else: + return False + except: + return False + + def _clear(self): + """ + Sends the clear command to the TIS-2000 device. + """ + try: + #self.ser.flushInput() + self.ser.read(100) + self.ser.write('C') + resp = self.ser.read() + if resp == 'C': + return True + else: + return False + except: + return False + + def get_version(self): + """ + Sends the version command to the TIS-2000 device and returns + a string with the device version. + """ + #self.ser.flushInput() + self.ser.read(100) + self.ser.write('V') + version = [] + tver = "" + while 1: + resp = self.ser.read() + if resp == '\x0A' or resp == '': + break + if resp != '\n' and resp != '\r': + version.append(resp) + for i in version: + tver = tver + i + if tver != "": + return tver + return "Unknown" + + def _device_removed_cb(self, path): + """ + Called when a device is removed. + Checks if the removed device is itself and emits the "disconnected" + signal if so. + """ + if path == self.device_path: + self.device_path = '' + self.ser.close() + self._connected = False + self.emit("disconnected","TIS-2000") + + def _loop(self): + """ + Threaded loop for reading data sent from the TIS-2000. + """ + if not self._connected: + return False + + if self._state is STATE_WAITING: + data = self.ser.read() + if data in ['W', 'R']: + self._state = STATE_WAITING2 + return True + + elif self._state is STATE_WAITING2: + data = self.ser.read() + if data.isspace(): + self._state = STATE_READING + else: + self._clear() + self._state = STATE_WAITING + return True + + elif self._state is STATE_READING: + data = self.ser.read(16) + if data.__len__() < 16: + self._clear() + self._state = STATE_WAITING + else: + reg = re.compile('([^0-9A-F]+)') + if reg.findall(data) == []: + self.emit("tag-read", data) + self.last_tag = data + self._clear() + self._state = STATE_WAITING + return True + return True + +# Testing +#if __name__ == '__main__': +# def handler(device, idhex): +# """ +# Handler for "tag-read" signal. +# Prints the tag id. +# """ +# print "ID: ", idhex +# +# dev = RFIDReader() +# if dev.get_present(): +# dev.do_connect() +# dev.connect('tag-read', handler) +# else: +# print "Not connected" +# +# mloop = gobject.MainLoop() +# mloop.run() -- cgit v0.9.1