summaryrefslogtreecommitdiff
path: root/dexcom_reader/devicer.py
diff options
context:
space:
mode:
Diffstat (limited to 'dexcom_reader/devicer.py')
-rw-r--r--dexcom_reader/devicer.py72
1 files changed, 72 insertions, 0 deletions
diff --git a/dexcom_reader/devicer.py b/dexcom_reader/devicer.py
new file mode 100644
index 0000000..79a0a72
--- /dev/null
+++ b/dexcom_reader/devicer.py
@@ -0,0 +1,72 @@
1import pyudev
2import threading
3
4class DevicePoller:
5 def __init__(self, dev):
6 self.device_added = threading.Event()
7 self.device_removed = threading.Event()
8 self.device = dev
9 self.wait_add = self.device_added.wait
10 self.wait_remove = self.device_removed.wait
11 self.have = self.device_added.is_set
12
13 if dev:
14 self.device_added.set()
15
16 def launch_observer(self, monitor, device_match):
17
18 if not monitor:
19 monitor = pyudev.Monitor.from_netlink(pyudev.Context())
20
21 def handle_event(action, device):
22 if action == 'add' and device_match(device):
23 self.device = device
24 self.device_removed.clear()
25 self.device_added.set()
26 elif action == 'remove' and device == self.device:
27 self.device = None
28 self.device_added.clear()
29 self.device_removed.set()
30
31 self.observer = pyudev.MonitorObserver(monitor, handle_event)
32 self.observer.start()
33
34 def stop_observer():
35 self.observer.stop()
36
37def simple_devicer(subsystem, predicate):
38 dev = None
39 context = pyudev.Context()
40 for try_dev in context.list_devices(subsystem=subsystem):
41 if predicate(try_dev):
42 dev = try_dev
43 break
44
45 monitor = pyudev.Monitor.from_netlink(context)
46 monitor.filter_by(subsystem)
47
48 devicer = DevicePoller(dev)
49 devicer.launch_observer(monitor, predicate)
50
51 return devicer
52
53if __name__ == '__main__':
54
55 dexcom_g5_product = '22a3/47/100'
56
57 def is_dexcom_g5(dev):
58 try: return dev.parent.get('PRODUCT') == dexcom_g5_product
59 except: return False
60
61 devicer = simple_devicer('tty', is_dexcom_g5)
62
63 while True:
64 print("waiting for device")
65 devicer.wait_add()
66 while devicer.have():
67 print("poll device {0}".format(devicer.device))
68 print("sleep(5)")
69 if devicer.wait_remove(5):
70 print("device removed")
71
72 devicer.stop_observer()