| 1 |  |  | from libAnt.core import lazyproperty | 
            
                                                                                                            
                            
            
                                    
            
            
                | 2 |  |  | from libAnt.profiles.profile import ProfileMessage | 
            
                                                                                                            
                            
            
                                    
            
            
                | 3 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 4 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 5 |  |  | class SpeedAndCadenceProfileMessage(ProfileMessage): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 6 |  |  |     """ Message from Speed & Cadence sensor """ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 7 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 8 |  |  |     def __init__(self, msg, previous): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 9 |  |  |         super().__init__(msg, previous) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 10 |  |  |         self.staleSpeedCounter = previous.staleSpeedCounter if previous is not None else 0 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 11 |  |  |         self.staleCadenceCounter = previous.staleCadenceCounter if previous is not None else 0 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 12 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 13 |  |  |         if self.previous is not None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 14 |  |  |             if self.speedEventTime == self.previous.speedEventTime: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 15 |  |  |                 self.staleSpeedCounter += 1 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 16 |  |  |             else: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 17 |  |  |                 self.staleSpeedCounter = 0 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 18 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 19 |  |  |             if self.cadenceEventTime == self.previous.cadenceEventTime: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 20 |  |  |                 self.staleCadenceCounter += 1 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 21 |  |  |             else: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 22 |  |  |                 self.staleCadenceCounter = 0 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 23 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 24 |  |  |     maxCadenceEventTime = 65536 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 25 |  |  |     maxSpeedEventTime = 65536 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 26 |  |  |     maxSpeedRevCount = 65536 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 27 |  |  |     maxCadenceRevCount = 65536 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 28 |  |  |     maxstaleSpeedCounter = 7 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 29 |  |  |     maxstaleCadenceCounter = 7 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 30 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 31 |  |  |     def __str__(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 32 |  |  |         return super().__str__() + ' Speed: ' + str(self.speed(2096)) + ' Cadence: ' + str(self.cadence) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 33 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 34 |  |  |     @lazyproperty | 
            
                                                                                                            
                            
            
                                    
            
            
                | 35 |  |  |     def cadenceEventTime(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 36 |  |  |         """ Represents the time of the last valid bike cadence event (1/1024 sec) """ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 37 |  |  |         return (self.msg.content[1] << 8) | self.msg.content[0] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 38 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 39 |  |  |     @lazyproperty | 
            
                                                                                                            
                            
            
                                    
            
            
                | 40 |  |  |     def cumulativeCadenceRevolutionCount(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 41 |  |  |         """ Represents the total number of pedal revolutions """ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 42 |  |  |         return (self.msg.content[3] << 8) | self.msg.content[2] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 43 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 44 |  |  |     @lazyproperty | 
            
                                                                                                            
                            
            
                                    
            
            
                | 45 |  |  |     def speedEventTime(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 46 |  |  |         """ Represents the time of the last valid bike speed event (1/1024 sec) """ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 47 |  |  |         return (self.msg.content[5] << 8) | self.msg.content[4] | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 48 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 49 |  |  |     @lazyproperty | 
            
                                                                        
                            
            
                                    
            
            
                | 50 |  |  |     def cumulativeSpeedRevolutionCount(self): | 
            
                                                                        
                            
            
                                    
            
            
                | 51 |  |  |         """ Represents the total number of wheel revolutions """ | 
            
                                                                        
                            
            
                                    
            
            
                | 52 |  |  |         return (self.msg.content[7] << 8) | self.msg.content[6] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 53 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 54 |  |  |     @lazyproperty | 
            
                                                                                                            
                            
            
                                    
            
            
                | 55 |  |  |     def speedEventTimeDiff(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 56 |  |  |         if self.previous is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 57 |  |  |             return 0 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 58 |  |  |         elif self.speedEventTime < self.previous.speedEventTime: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 59 |  |  |             # Rollover | 
            
                                                                                                            
                            
            
                                    
            
            
                | 60 |  |  |             return (self.speedEventTime - self.previous.speedEventTime) + self.maxSpeedEventTime | 
            
                                                                                                            
                            
            
                                    
            
            
                | 61 |  |  |         else: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 62 |  |  |             return self.speedEventTime - self.previous.speedEventTime | 
            
                                                                                                            
                            
            
                                    
            
            
                | 63 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 64 |  |  |     @lazyproperty | 
            
                                                                                                            
                            
            
                                    
            
            
                | 65 |  |  |     def cadenceEventTimeDiff(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 66 |  |  |         if self.previous is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 67 |  |  |             return 0 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 68 |  |  |         elif self.cadenceEventTime < self.previous.cadenceEventTime: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 69 |  |  |             # Rollover | 
            
                                                                                                            
                            
            
                                    
            
            
                | 70 |  |  |             return (self.cadenceEventTime - self.previous.cadenceEventTime) + self.maxCadenceEventTime | 
            
                                                                                                            
                            
            
                                    
            
            
                | 71 |  |  |         else: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 72 |  |  |             return self.cadenceEventTime - self.previous.cadenceEventTime | 
            
                                                                                                            
                            
            
                                    
            
            
                | 73 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 74 |  |  |     @lazyproperty | 
            
                                                                                                            
                            
            
                                    
            
            
                | 75 |  |  |     def speedRevCountDiff(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 76 |  |  |         if self.previous is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 77 |  |  |             return None | 
            
                                                                                                            
                            
            
                                    
            
            
                | 78 |  |  |         elif self.cumulativeSpeedRevolutionCount < self.previous.cumulativeSpeedRevolutionCount: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 79 |  |  |             # Rollover | 
            
                                                                                                            
                            
            
                                    
            
            
                | 80 |  |  |             return ( | 
            
                                                                                                            
                            
            
                                    
            
            
                | 81 |  |  |                        self.cumulativeSpeedRevolutionCount - self.previous.cumulativeSpeedRevolutionCount) + self.maxSpeedRevCount | 
            
                                                                                                            
                            
            
                                    
            
            
                | 82 |  |  |         else: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 83 |  |  |             return self.cumulativeSpeedRevolutionCount - self.previous.cumulativeSpeedRevolutionCount | 
            
                                                                                                            
                            
            
                                    
            
            
                | 84 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 85 |  |  |     @lazyproperty | 
            
                                                                                                            
                            
            
                                    
            
            
                | 86 |  |  |     def cadenceRevCountDiff(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 87 |  |  |         if self.previous is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 88 |  |  |             return None | 
            
                                                                                                            
                            
            
                                    
            
            
                | 89 |  |  |         elif self.cumulativeCadenceRevolutionCount < self.previous.cumulativeCadenceRevolutionCount: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 90 |  |  |             # Rollover | 
            
                                                                                                            
                            
            
                                    
            
            
                | 91 |  |  |             return ( | 
            
                                                                                                            
                            
            
                                    
            
            
                | 92 |  |  |                        self.cumulativeCadenceRevolutionCount - self.previous.cumulativeCadenceRevolutionCount) + self.maxCadenceRevCount | 
            
                                                                                                            
                            
            
                                    
            
            
                | 93 |  |  |         else: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 94 |  |  |             return self.cumulativeCadenceRevolutionCount - self.previous.cumulativeCadenceRevolutionCount | 
            
                                                                                                            
                            
            
                                    
            
            
                | 95 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 96 |  |  |     def speed(self, c): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 97 |  |  |         """ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 98 |  |  |         :param c: circumference of the wheel (mm) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 99 |  |  |         :return: The current speed (m/sec) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 100 |  |  |         """ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 101 |  |  |         if self.previous is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 102 |  |  |             return 0 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 103 |  |  |         if self.speedEventTime == self.previous.speedEventTime: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 104 |  |  |             if self.staleSpeedCounter > self.maxstaleSpeedCounter: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 105 |  |  |                 return 0 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 106 |  |  |             return self.previous.speed(c) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 107 |  |  |         return self.speedRevCountDiff * 1.024 * c / self.speedEventTimeDiff | 
            
                                                                                                            
                            
            
                                    
            
            
                | 108 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 109 |  |  |     @lazyproperty | 
            
                                                                                                            
                            
            
                                    
            
            
                | 110 |  |  |     def cadence(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 111 |  |  |         """ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 112 |  |  |         :return: RPM | 
            
                                                                                                            
                            
            
                                    
            
            
                | 113 |  |  |         """ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 114 |  |  |         if self.previous is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 115 |  |  |             return 0 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 116 |  |  |         if self.cadenceEventTime == self.previous.cadenceEventTime: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 117 |  |  |             if self.staleCadenceCounter > self.maxstaleCadenceCounter: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 118 |  |  |                 return 0 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 119 |  |  |             return self.previous.cadence | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 120 |  |  |         return self.cadenceRevCountDiff * 1024 * 60 / self.cadenceEventTimeDiff | 
            
                                                        
            
                                    
            
            
                | 121 |  |  |  |