From 572aad546bb8ee9ccd095a2098e1b292176c53da Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Sat, 8 Apr 2017 16:16:51 -0400 Subject: re-implement polling using "devicer" library --- dexcom_reader/devicer.py | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 dexcom_reader/devicer.py (limited to 'dexcom_reader/devicer.py') 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 @@ +import pyudev +import threading + +class DevicePoller: + def __init__(self, dev): + self.device_added = threading.Event() + self.device_removed = threading.Event() + self.device = dev + self.wait_add = self.device_added.wait + self.wait_remove = self.device_removed.wait + self.have = self.device_added.is_set + + if dev: + self.device_added.set() + + def launch_observer(self, monitor, device_match): + + if not monitor: + monitor = pyudev.Monitor.from_netlink(pyudev.Context()) + + def handle_event(action, device): + if action == 'add' and device_match(device): + self.device = device + self.device_removed.clear() + self.device_added.set() + elif action == 'remove' and device == self.device: + self.device = None + self.device_added.clear() + self.device_removed.set() + + self.observer = pyudev.MonitorObserver(monitor, handle_event) + self.observer.start() + + def stop_observer(): + self.observer.stop() + +def simple_devicer(subsystem, predicate): + dev = None + context = pyudev.Context() + for try_dev in context.list_devices(subsystem=subsystem): + if predicate(try_dev): + dev = try_dev + break + + monitor = pyudev.Monitor.from_netlink(context) + monitor.filter_by(subsystem) + + devicer = DevicePoller(dev) + devicer.launch_observer(monitor, predicate) + + return devicer + +if __name__ == '__main__': + + dexcom_g5_product = '22a3/47/100' + + def is_dexcom_g5(dev): + try: return dev.parent.get('PRODUCT') == dexcom_g5_product + except: return False + + devicer = simple_devicer('tty', is_dexcom_g5) + + while True: + print("waiting for device") + devicer.wait_add() + while devicer.have(): + print("poll device {0}".format(devicer.device)) + print("sleep(5)") + if devicer.wait_remove(5): + print("device removed") + + devicer.stop_observer() -- cgit v1.2.3