Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/plugins/rfid/rfidrweusb.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/rfidrweusb.py
parent7e6d1757a3d6a23e446bf0f7875a98633a041295 (diff)
reorganizing plugins into separate directories; adding support for plugin palette icons in plugin directory
Diffstat (limited to 'plugins/rfid/rfidrweusb.py')
-rw-r--r--plugins/rfid/rfidrweusb.py200
1 files changed, 200 insertions, 0 deletions
diff --git a/plugins/rfid/rfidrweusb.py b/plugins/rfid/rfidrweusb.py
new file mode 100644
index 0000000..bd12631
--- /dev/null
+++ b/plugins/rfid/rfidrweusb.py
@@ -0,0 +1,200 @@
+from device import RFIDDevice
+from serial import Serial
+import dbus
+from dbus.mainloop.glib import DBusGMainLoop
+import gobject
+from time import sleep
+import utils
+
+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]'
+
+VERSIONS = ['301']
+
+class RFIDReader(RFIDDevice):
+ """
+ RFIDRW-E-W interface.
+ """
+
+ def __init__(self):
+
+ RFIDDevice.__init__(self)
+ self.last_tag = ""
+ self.tags = []
+ self.ser = Serial()
+ self.device = ''
+ self.device_path = ''
+ self._connected = False
+
+ 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 RFID-RW-USB 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)
+ serialusb_devices = set(hmgr_if.FindDeviceStringMatch('serial.type',
+ 'usb')) & set(hmgr_if.FindDeviceStringMatch(
+ 'info.subsystem', 'tty'))
+ for i in serialusb_devices:
+ serialusb_if = dbus.Interface(self.bus.get_object(HAL_SERVICE, i),
+ HAL_DEV_IFACE)
+ if serialusb_if.PropertyExists('info.parent'):
+ parent_udi = str(serialusb_if.GetProperty('info.parent'))
+ parent = dbus.Interface(self.bus.get_object(HAL_SERVICE,
+ parent_udi), HAL_DEV_IFACE)
+ if parent.PropertyExists('info.linux.driver') and \
+ str(parent.GetProperty('info.linux.driver')) == 'ftdi_sio':
+ device = str(serialusb_if.GetProperty('linux.device_file'))
+ ser = Serial(device, 9600, timeout=0.1)
+ ser.read(100)
+ ser.write('v')
+ ser.write('e')
+ ser.write('r')
+ ser.write('\x0D')
+ resp = ser.read(4)
+ if resp[0:-1] in VERSIONS:
+ self.device = device
+ 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
+ if self._select_animal_tag:
+ #gobject.idle_add(self._loop)
+ gobject.timeout_add(1000, 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 _select_animal_tag(self):
+ """
+ Sends the "Select Tag 2" (animal tag) command to the device.
+ """
+ self.ser.read(100)
+ self.ser.write('s')
+ self.ser.write('t')
+ self.ser.write('2')
+ self.ser.write('\x0d')
+ resp = self.ser.read(3)[0:-1]
+ if resp == 'OK':
+ return True
+ return False
+
+ def get_version(self):
+ """
+ Sends the version command to the device and returns
+ a string with the device version.
+ """
+ #self.ser.flushInput()
+ ver = "???"
+ self.ser.read(100)
+ self.ser.write('v')
+ self.ser.write('e')
+ self.ser.write('r')
+ self.ser.write('\x0d')
+ resp = self.ser.read(4)[0:-1]
+ if resp in VERSIONS:
+ return "RFIDRW-E-USB " + resp
+ return ver
+
+ 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.tags = []
+ self.emit("disconnected","RFID-RW-USB")
+
+ def _loop(self):
+ """
+ Threaded loop for reading data from the device.
+ """
+ if not self._connected:
+ return False
+
+ self.ser.read(100)
+ self.ser.write('r')
+ self.ser.write('a')
+ self.ser.write('t')
+ self.ser.write('\x0d')
+ resp = self.ser.read(33)[0:-1].split('_')
+ if resp.__len__() is not 6 or resp in self.tags:
+ return True
+
+ self.tags.append(resp)
+ anbit_bin = utils.dec2bin(int(resp[2]))
+ reserved_bin = '00000000000000'
+ databit_bin = utils.dec2bin(int(resp[3]))
+ country_bin = utils.dec2bin(int(resp[0]))
+ while country_bin.__len__() < 10:
+ country_bin = '0' + country_bin
+ id_bin = utils.dec2bin(int(resp[1]))
+ while id_bin.__len__() < 10:
+ id_bin = '0' + id_bin
+
+ tag_bin = anbit_bin + reserved_bin + databit_bin + country_bin + id_bin
+ data = utils.bin2hex(tag_bin)
+ self.emit("tag-read", data)
+ self.last_tag = data
+ #sleep(1)
+ 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():
+# print "SIPI!"
+# dev.do_connect()
+# dev.connect('tag-read', handler)
+# else:
+# print "Not connected"
+#
+# mloop = gobject.MainLoop()
+# mloop.run()