GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( 95c1a7...d523b4 )
by Benjamin
01:23
created

SpeedAndCadenceProfileMessage.totalDistance()   A

Complexity

Conditions 1

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 6
rs 9.4285
cc 1
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
        self.totalRevolutions = previous.totalRevolutions + self.cadenceRevCountDiff if previous is not None else 0
13
        self.totalSpeedRevolutions = previous.totalSpeedRevolutions + self.speedRevCountDiff if previous is not None else 0
14
15
        if self.previous is not None:
16
            if self.speedEventTime == self.previous.speedEventTime:
17
                self.staleSpeedCounter += 1
18
            else:
19
                self.staleSpeedCounter = 0
20
21
            if self.cadenceEventTime == self.previous.cadenceEventTime:
22
                self.staleCadenceCounter += 1
23
            else:
24
                self.staleCadenceCounter = 0
25
26
    maxCadenceEventTime = 65536
27
    maxSpeedEventTime = 65536
28
    maxSpeedRevCount = 65536
29
    maxCadenceRevCount = 65536
30
    maxstaleSpeedCounter = 7
31
    maxstaleCadenceCounter = 7
32
33
    def __str__(self):
34
        ret = '{} Speed: {:.2f}m/s (avg: {:.2f}m/s)\n'.format(super().__str__(), self.speed(2096),
35
                                                              self.averageSpeed(2096))
36
        ret += '{} Cadence: {:.2f}rpm (avg: {:.2f}rpm)\n'.format(super().__str__(), self.cadence, self.averageCadence)
37
        ret += '{} Total Distance: {:.2f}m\n'.format(super().__str__(), self.totalDistance(2096))
38
        ret += '{} Total Revolutions: {:d}'.format(super().__str__(), self.totalRevolutions)
39
        return ret
40
41
    @lazyproperty
42
    def cadenceEventTime(self):
43
        """ Represents the time of the last valid bike cadence event (1/1024 sec) """
44
        return (self.msg.content[1] << 8) | self.msg.content[0]
45
46
    @lazyproperty
47
    def cumulativeCadenceRevolutionCount(self):
48
        """ Represents the total number of pedal revolutions """
49
        return (self.msg.content[3] << 8) | self.msg.content[2]
50
51
    @lazyproperty
52
    def speedEventTime(self):
53
        """ Represents the time of the last valid bike speed event (1/1024 sec) """
54
        return (self.msg.content[5] << 8) | self.msg.content[4]
55
56
    @lazyproperty
57
    def cumulativeSpeedRevolutionCount(self):
58
        """ Represents the total number of wheel revolutions """
59
        return (self.msg.content[7] << 8) | self.msg.content[6]
60
61
    @lazyproperty
62
    def speedEventTimeDiff(self):
63
        if self.previous is None:
64
            return 0
65
        elif self.speedEventTime < self.previous.speedEventTime:
66
            # Rollover
67
            return (self.speedEventTime - self.previous.speedEventTime) + self.maxSpeedEventTime
68
        else:
69
            return self.speedEventTime - self.previous.speedEventTime
70
71
    @lazyproperty
72
    def cadenceEventTimeDiff(self):
73
        if self.previous is None:
74
            return 0
75
        elif self.cadenceEventTime < self.previous.cadenceEventTime:
76
            # Rollover
77
            return (self.cadenceEventTime - self.previous.cadenceEventTime) + self.maxCadenceEventTime
78
        else:
79
            return self.cadenceEventTime - self.previous.cadenceEventTime
80
81
    @lazyproperty
82
    def speedRevCountDiff(self):
83
        if self.previous is None:
84
            return 0
85
        elif self.cumulativeSpeedRevolutionCount < self.previous.cumulativeSpeedRevolutionCount:
86
            # Rollover
87
            return (
88
                       self.cumulativeSpeedRevolutionCount - self.previous.cumulativeSpeedRevolutionCount) + self.maxSpeedRevCount
89
        else:
90
            return self.cumulativeSpeedRevolutionCount - self.previous.cumulativeSpeedRevolutionCount
91
92
    @lazyproperty
93
    def cadenceRevCountDiff(self):
94
        if self.previous is None:
95
            return 0
96
        elif self.cumulativeCadenceRevolutionCount < self.previous.cumulativeCadenceRevolutionCount:
97
            # Rollover
98
            return (
99
                       self.cumulativeCadenceRevolutionCount - self.previous.cumulativeCadenceRevolutionCount) + self.maxCadenceRevCount
100
        else:
101
            return self.cumulativeCadenceRevolutionCount - self.previous.cumulativeCadenceRevolutionCount
102
103
    def speed(self, c):
104
        """
105
        :param c: circumference of the wheel (mm)
106
        :return: The current speed (m/sec)
107
        """
108
        if self.previous is None:
109
            return 0
110
        if self.speedEventTime == self.previous.speedEventTime:
111
            if self.staleSpeedCounter > self.maxstaleSpeedCounter:
112
                return 0
113
            return self.previous.speed(c)
114
        return self.speedRevCountDiff * 1.024 * c / self.speedEventTimeDiff
115
116
    def distance(self, c):
117
        """
118
        :param c: circumference of the wheel (mm)
119
        :return: The distance since the last message (m)
120
        """
121
        return self.speedRevCountDiff * 1.024 * c
122
123
    def totalDistance(self, c):
124
        """
125
        :param c: circumference of the wheel (mm)
126
        :return: The total distance since the first message (m)
127
        """
128
        return self.totalSpeedRevolutions * c / 1000
129
130
    @lazyproperty
131
    def cadence(self):
132
        """
133
        :return: RPM
134
        """
135
        if self.previous is None:
136
            return 0
137
        if self.cadenceEventTime == self.previous.cadenceEventTime:
138
            if self.staleCadenceCounter > self.maxstaleCadenceCounter:
139
                return 0
140
            return self.previous.cadence
141
        return self.cadenceRevCountDiff * 1024 * 60 / self.cadenceEventTimeDiff
142
143
    @lazyproperty
144
    def averageCadence(self):
145
        """
146
        Returns the average cadence since the first message
147
        :return: RPM
148
        """
149
        if self.firstTimestamp == self.timestamp:
150
            return self.cadence
151
        return self.totalRevolutions * 60 / (self.timestamp - self.firstTimestamp)
152
153
    def averageSpeed(self, c):
154
        """
155
        Returns the average speed since the first message
156
        :param c: circumference of the wheel (mm)
157
        :return: m/s
158
        """
159
        if self.firstTimestamp == self.timestamp:
160
            return self.speed(c)
161
        return self.totalDistance(c) / (self.timestamp - self.firstTimestamp)
162