| 1 |  |  | import threading | 
            
                                                                                                            
                            
            
                                    
            
            
                | 2 |  |  | from queue import Queue, Empty | 
            
                                                                                                            
                            
            
                                    
            
            
                | 3 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 4 |  |  | from libAnt.driver import Driver, DriverException | 
            
                                                                                                            
                            
            
                                    
            
            
                | 5 |  |  | from libAnt.message import * | 
            
                                                                                                            
                            
            
                                    
            
            
                | 6 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 7 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 8 |  |  | class Network: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 9 |  |  |     def __init__(self, key: bytes = b'\x00' * 8, name: str = None): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 10 |  |  |         self.key = key | 
            
                                                                                                            
                            
            
                                    
            
            
                | 11 |  |  |         self.name = name | 
            
                                                                                                            
                            
            
                                    
            
            
                | 12 |  |  |         self.number = 0 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 13 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 14 |  |  |     def __str__(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 15 |  |  |         return self.name | 
            
                                                                                                            
                            
            
                                    
            
            
                | 16 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 17 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 18 |  |  | class Pump(threading.Thread): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 19 |  |  |     def __init__(self, driver: Driver, out: Queue, onSucces, onFailure): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 20 |  |  |         super().__init__() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 21 |  |  |         self._stopper = threading.Event() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 22 |  |  |         self._driver = driver | 
            
                                                                                                            
                            
            
                                    
            
            
                | 23 |  |  |         self._out = out | 
            
                                                                                                            
                            
            
                                    
            
            
                | 24 |  |  |         self._waiters = [] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 25 |  |  |         self._onSuccess = onSucces | 
            
                                                                                                            
                            
            
                                    
            
            
                | 26 |  |  |         self._onFailure = onFailure | 
            
                                                                                                            
                            
            
                                    
            
            
                | 27 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 28 |  |  |     def stop(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 29 |  |  |         self._stopper.set() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 30 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 31 |  |  |     def stopped(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 32 |  |  |         return self._stopper.isSet() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 33 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 34 |  |  |     def run(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 35 |  |  |         with self._driver as d: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 36 |  |  |             while not self._stopper.is_set(): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 37 |  |  |                 #  Write | 
            
                                                                                                            
                            
            
                                    
            
            
                | 38 |  |  |                 try: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 39 |  |  |                     outMsg = self._out.get(block=False) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 40 |  |  |                     self._waiters.append(outMsg) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 41 |  |  |                     d.write(outMsg) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 42 |  |  |                 except Empty: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 43 |  |  |                     pass | 
            
                                                                                                            
                            
            
                                    
            
            
                | 44 |  |  |                 except DriverException: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 45 |  |  |                     self._stopper.set() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 46 |  |  |                     break | 
            
                                                                                                            
                            
            
                                    
            
            
                | 47 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 48 |  |  |                 # Read | 
            
                                                                                                            
                            
            
                                    
            
            
                | 49 |  |  |                 try: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 50 |  |  |                     msg = d.read()  # TODO: add timeout to driver | 
            
                                                                                                            
                            
            
                                    
            
            
                | 51 |  |  |                     if msg.type == MESSAGE_CHANNEL_EVENT: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 52 |  |  |                         # This is a response to our outgoing message | 
            
                                                                                                            
                            
            
                                    
            
            
                | 53 |  |  |                         for w in self._waiters: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 54 |  |  |                             if w.type == msg.content[1]:  # ACK | 
            
                                                                                                            
                            
            
                                    
            
            
                | 55 |  |  |                                 self._waiters.remove(w) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 56 |  |  |                                 #  TODO: Call waiter callback from tuple (waiter, callback) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 57 |  |  |                                 break | 
            
                                                                                                            
                            
            
                                    
            
            
                | 58 |  |  |                     elif msg.type == MESSAGE_CHANNEL_BROADCAST_DATA: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 59 |  |  |                         bmsg = BroadcastMessage(msg.type, msg.content).build(msg.content) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 60 |  |  |                         try: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 61 |  |  |                             self._onSuccess(bmsg) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 62 |  |  |                         except Exception as e: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 63 |  |  |                             self._onFailure(e) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 64 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 65 |  |  |                 except DriverException as e: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 66 |  |  |                     self._stopper.set() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 67 |  |  |                     self._onFailure(e) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 68 |  |  |                     break | 
            
                                                                                                            
                            
            
                                    
            
            
                | 69 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 70 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 71 |  |  | class Node: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 72 |  |  |     def __init__(self, driver, name=None): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 73 |  |  |         self._driver = driver | 
            
                                                                                                            
                            
            
                                    
            
            
                | 74 |  |  |         self._name = name | 
            
                                                                                                            
                            
            
                                    
            
            
                | 75 |  |  |         self._out = Queue() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 76 |  |  |         self._pump = None | 
            
                                                                                                            
                            
            
                                    
            
            
                | 77 |  |  |         self._configMessages = Queue() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 78 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 79 |  |  |     def __enter__(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 80 |  |  |         return self | 
            
                                                                                                            
                            
            
                                    
            
            
                | 81 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 82 |  |  |     def __exit__(self, exc_type, exc_val, exc_tb): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 83 |  |  |         self.stop() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 84 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 85 |  |  |     def start(self, onSuccess, onFailure): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 86 |  |  |         if not self.isRunning(): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 87 |  |  |             self._pump = Pump(self._driver, self._out, onSuccess, onFailure) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 88 |  |  |             self._pump.start() | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 89 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 90 |  |  |     def enableRxScanMode(self, networkKey=ANTPLUS_NETWORK_KEY, channelType=CHANNEL_TYPE_ONEWAY_RECEIVE, | 
            
                                                                        
                            
            
                                    
            
            
                | 91 |  |  |                          frequency: int = 2457, rxTimestamp: bool = True, rssi: bool = True, channelId: bool = True): | 
            
                                                                        
                            
            
                                    
            
            
                | 92 |  |  |         self._out.put(SystemResetMessage()) | 
            
                                                                        
                            
            
                                    
            
            
                | 93 |  |  |         self._out.put(SetNetworkKeyMessage(0, networkKey)) | 
            
                                                                        
                            
            
                                    
            
            
                | 94 |  |  |         self._out.put(AssignChannelMessage(0, channelType)) | 
            
                                                                        
                            
            
                                    
            
            
                | 95 |  |  |         self._out.put(SetChannelIdMessage(0)) | 
            
                                                                        
                            
            
                                    
            
            
                | 96 |  |  |         self._out.put(SetChannelRfFrequencyMessage(0, frequency)) | 
            
                                                                        
                            
            
                                    
            
            
                | 97 |  |  |         self._out.put(EnableExtendedMessagesMessage()) | 
            
                                                                        
                            
            
                                    
            
            
                | 98 |  |  |         self._out.put(LibConfigMessage(rxTimestamp, rssi, channelId)) | 
            
                                                                        
                            
            
                                    
            
            
                | 99 |  |  |         self._out.put(OpenRxScanModeMessage()) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 100 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 101 |  |  |     def stop(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 102 |  |  |         if self.isRunning(): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 103 |  |  |             self._pump.stop() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 104 |  |  |             self._pump.join() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 105 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 106 |  |  |     def isRunning(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 107 |  |  |         if self._pump is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 108 |  |  |             return False | 
            
                                                                                                            
                            
            
                                    
            
            
                | 109 |  |  |         return self._pump.is_alive() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 110 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 111 |  |  |     def getCapabilities(self): | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 112 |  |  |         pass | 
            
                                                        
            
                                    
            
            
                | 113 |  |  |  |