diff options
Diffstat (limited to 'dexcom_reader/devicer.py')
-rw-r--r-- | dexcom_reader/devicer.py | 72 |
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 @@ | |||
1 | import pyudev | ||
2 | import threading | ||
3 | |||
4 | class 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 | |||
37 | def 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 | |||
53 | if __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() | ||