| 1 |  |  | from threading import Lock | 
            
                                                                                                            
                            
            
                                    
            
            
                | 2 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 3 |  |  | from libAnt.message import BroadcastMessage | 
            
                                                                                                            
                            
            
                                    
            
            
                | 4 |  |  | from libAnt.profiles.power_profile import PowerProfileMessage | 
            
                                                                                                            
                            
            
                                    
            
            
                | 5 |  |  | from libAnt.profiles.speed_cadence_profile import SpeedAndCadenceProfileMessage | 
            
                                                                                                            
                            
            
                                    
            
            
                | 6 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 7 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 8 |  |  | class Factory: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 9 |  |  |     types = { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 10 |  |  |         71: SpeedAndCadenceProfileMessage, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 11 |  |  |         140: PowerProfileMessage | 
            
                                                                                                            
                            
            
                                    
            
            
                | 12 |  |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 13 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 14 |  |  |     def __init__(self, callback=None): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 15 |  |  |         self._filter = None | 
            
                                                                                                            
                            
            
                                    
            
            
                | 16 |  |  |         self._lock = Lock() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 17 |  |  |         self._messages = {} | 
            
                                                                                                            
                            
            
                                    
            
            
                | 18 |  |  |         self._callback = callback | 
            
                                                                                                            
                            
            
                                    
            
            
                | 19 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 20 |  |  |     def getLastMessage(self, deviceNumber, deviceType): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 21 |  |  |         with self._lock: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 22 |  |  |             if (deviceNumber, deviceType) in self._messages: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 23 |  |  |                 return self._messages[(deviceNumber, deviceType)] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 24 |  |  |             return None | 
            
                                                                                                            
                            
            
                                    
            
            
                | 25 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 26 |  |  |     def enableFilter(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 27 |  |  |         with self._lock: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 28 |  |  |             if self._filter is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 29 |  |  |                 self._filter = {} | 
            
                                                                                                            
                            
            
                                    
            
            
                | 30 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 31 |  |  |     def disableFilter(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 32 |  |  |         with self._lock: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 33 |  |  |             if self._filter is not None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 34 |  |  |                 self._filter = None | 
            
                                                                                                            
                            
            
                                    
            
            
                | 35 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 36 |  |  |     def clearFilter(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 37 |  |  |         with self._lock: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 38 |  |  |             if self._filter is not None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 39 |  |  |                 self._filter.clear() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 40 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 41 |  |  |     def addToFilter(self, deviceNumber: int): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 42 |  |  |         with self._lock: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 43 |  |  |             if self._filter is not None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 44 |  |  |                 self._filter[deviceNumber] = True | 
            
                                                                                                            
                            
            
                                    
            
            
                | 45 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 46 |  |  |     def removeFromFilter(self, deviceNumber: int): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 47 |  |  |         with self._lock: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 48 |  |  |             if self._filter is not None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 49 |  |  |                 if deviceNumber in self._filter: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 50 |  |  |                     del self._filter[deviceNumber] | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 51 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 52 |  |  |     def parseMessage(self, msg: BroadcastMessage): | 
            
                                                        
            
                                    
            
            
                | 53 |  |  |         with self._lock: | 
            
                                                        
            
                                    
            
            
                | 54 |  |  |             if self._filter is not None: | 
            
                                                        
            
                                    
            
            
                | 55 |  |  |                 if msg.deviceNumber not in self._filter: | 
            
                                                        
            
                                    
            
            
                | 56 |  |  |                     return | 
            
                                                        
            
                                    
            
            
                | 57 |  |  |             if msg.deviceNumber in self.types: | 
            
                                                        
            
                                    
            
            
                | 58 |  |  |                 num = msg.deviceNumber | 
            
                                                        
            
                                    
            
            
                | 59 |  |  |                 type = msg.deviceType | 
            
                                                        
            
                                    
            
            
                | 60 |  |  |                 pmsg = self.types[num](msg, self._messages[(num, type)] if (num, type) in self._messages else None) | 
            
                                                        
            
                                    
            
            
                | 61 |  |  |                 self._messages[(num, type)] = pmsg | 
            
                                                        
            
                                    
            
            
                | 62 |  |  |                 if callable(self._callback): | 
            
                                                        
            
                                    
            
            
                | 63 |  |  |                     self._callback(pmsg) | 
            
                                                        
            
                                    
            
            
                | 64 |  |  |  |