Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/plugins/rfid/tis2000.py
diff options
context:
space:
mode:
authorWalter Bender <walter.bender@gmail.com>2011-04-07 14:51:40 (GMT)
committer Walter Bender <walter.bender@gmail.com>2011-04-07 14:51:40 (GMT)
commitc3f0e8e2bfa09e2043016e808673a8c0779e4886 (patch)
tree2829dcc2cdf269c2a36f27afa69256286238f892 /plugins/rfid/tis2000.py
parent7e6d1757a3d6a23e446bf0f7875a98633a041295 (diff)
reorganizing plugins into separate directories; adding support for plugin palette icons in plugin directory
Diffstat (limited to 'plugins/rfid/tis2000.py')
-rw-r--r--plugins/rfid/tis2000.py252
1 files changed, 252 insertions, 0 deletions
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()