Skip to content

Commit 5ec85e1

Browse files
committed
Made changes suggested by @dhalbert
1 parent 6061593 commit 5ec85e1

2 files changed

Lines changed: 84 additions & 71 deletions

File tree

CircuitPython_Pyloton/code.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,16 @@
88

99
display = board.DISPLAY
1010

11+
CONNECTION_TIMEOUT = 45
1112

12-
heart = True
13-
speed = True
14-
cad = True
15-
ams = True
16-
debug = False
13+
HEART = True
14+
SPEED = True
15+
CAD = True
16+
AMS = True
17+
DEBUG = False
1718

1819
# 84.229 is wheel circumference (700x23 in my case)
19-
pyloton = pyloton.Pyloton(ble, display, 84.229, heart, speed, cad, ams, debug)
20+
pyloton = pyloton.Pyloton(ble, display, 84.229, HEART, SPEED, CAD, AMS, DEBUG)
2021

2122
pyloton.show_splash()
2223

@@ -28,30 +29,34 @@
2829
speed_cad_connections = []
2930
radio = None
3031
while True:
31-
if heart:
32+
if HEART:
3233
if not hr_connection:
33-
print("Running hr_connection")
34+
print("Attempting to connect to a heart rate monitor")
3435
hr_connection = pyloton.heart_connect()
3536
ble.stop_scan()
36-
if speed or cad:
37+
if SPEED or CAD:
3738
if not speed_cad_connections:
38-
print("Running speed_cad_connection")
39+
print("Attempting to connect to speed and cadence monitors")
3940
speed_cad_connections = pyloton.speed_cad_connect()
4041

41-
if time()-start >= 45:
42+
if time()-start >= CONNECTION_TIMEOUT:
4243
pyloton.timeout()
4344
break
4445
# Stop scanning whether or not we are connected.
4546
ble.stop_scan()
4647

4748
# You may need to remove some parts of the following 2 lines depending on what
4849
# devices you are using.
50+
# For example, remove hr_connection and hr_connection.connected if you aren't using a heart
51+
# rate monitor. Do the same for other sensors you aren't using.
4952
if hr_connection and speed_cad_connections and ams:
5053
if hr_connection.connected and speed_cad_connections[0].connected and ams.connected:
5154
pyloton.setup_display()
5255
break
5356

5457
# You may need to remove some parts of the following line depending on what devices you are using.
58+
# For example, remove hr_connection and hr_connection.connected if you aren't using a heart rate
59+
# monitor. Do the same for other sensors you aren't using.
5560
while hr_connection.connected and speed_cad_connections[0].connected and ams.connected:
5661
pyloton.update_display()
5762
pyloton.ams_remote()

CircuitPython_Pyloton/pyloton.py

Lines changed: 68 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -84,45 +84,15 @@ class Pyloton:
8484
"""
8585
Contains the various functions necessary for doing the Pyloton learn guide.
8686
"""
87-
# pylint: disable=too-many-instance-attributes
88-
_previous_wheel = 0
89-
_previous_crank = 0
90-
_previous_revolutions = 0
91-
_previous_rev = 0
92-
_previous_speed = 0
93-
_previous_cadence = 0
94-
_previous_heart = 0
95-
_i = 0
96-
_j = 0
97-
_setup = 0
98-
_hr_label = None
99-
_sp_label = None
100-
_cad_label = None
101-
_ams_label = None
102-
_hr_service = None
103-
_heart_y = None
104-
_speed_y = None
105-
_cad_y = None
106-
_ams_y = None
107-
108-
ams = None
109-
cyc_connections = None
110-
cyc_services = None
111-
112-
splash = displayio.Group(max_size=25)
113-
loading_group = displayio.Group()
87+
#pylint: disable=too-many-instance-attributes
11488

11589
YELLOW = 0xFCFF00
11690
PURPLE = 0x64337E
11791
WHITE = 0xFFFFFF
11892

119-
start = time.time()
120-
121-
track_artist = True
122-
12393
clue = Clue()
12494

125-
def __init__(self, ble, display, circ, heart=True, speed=True, cad=True, ams=True, debug=False):
95+
def __init__(self, ble, display, circ, heart=True, speed=True, cad=True, ams=True, debug=False): #pylint: disable=too-many-arguments
12696
self.debug = debug
12797

12898
self.ble = ble
@@ -139,6 +109,37 @@ def __init__(self, ble, display, circ, heart=True, speed=True, cad=True, ams=Tru
139109
self.hr_connection = None
140110

141111
self.num_enabled = heart + speed + cad + ams
112+
113+
self._previous_wheel = 0
114+
self._previous_crank = 0
115+
self._previous_revolutions = 0
116+
self._previous_rev = 0
117+
self._previous_speed = 0
118+
self._previous_cadence = 0
119+
self._previous_heart = 0
120+
self._speed_failed = 0
121+
self._cad_failed = 0
122+
self._setup = 0
123+
self._hr_label = None
124+
self._sp_label = None
125+
self._cad_label = None
126+
self._ams_label = None
127+
self._hr_service = None
128+
self._heart_y = None
129+
self._speed_y = None
130+
self._cad_y = None
131+
self._ams_y = None
132+
133+
self.ams = None
134+
self.cyc_connections = None
135+
self.cyc_services = None
136+
137+
self.start = time.time()
138+
self.track_artist = True
139+
140+
self.splash = displayio.Group(max_size=25)
141+
self.loading_group = displayio.Group()
142+
142143
self._load_fonts()
143144

144145
self.sprite_sheet, self.palette = adafruit_imageload.load("/sprite_sheet.bmp",
@@ -191,28 +192,29 @@ def _status_update(self, message):
191192
print(message)
192193
return
193194

194-
text_group = displayio.Group()
195-
if len(message) > 25:
195+
if len(self.loading_group) == 3:
196+
text_group = displayio.Group()
196197
status = label.Label(font=self.arial12, x=10, y=200,
197-
text=message[:25], color=self.YELLOW)
198+
text='', color=self.YELLOW, max_glyphs=30)
198199
status1 = label.Label(font=self.arial12, x=10, y=220,
199-
text=message[25:], color=self.YELLOW)
200+
text='', color=self.YELLOW, max_glyphs=30)
200201

201202
text_group.append(status)
202203
text_group.append(status1)
203-
else:
204-
status = label.Label(font=self.arial12, x=10, y=200, text=message, color=self.YELLOW)
205-
text_group.append(status)
206-
204+
self.loading_group.append(text_group)
207205

206+
if len(message) > 25:
207+
status.text = message[:25]
208+
status1.text = message[25:]
208209

209-
if len(self.loading_group) < 4:
210-
self.loading_group.append(text_group)
210+
text_group.append(status)
211+
text_group.append(status1)
211212
else:
212-
self.loading_group[3] = text_group
213+
status.text = message
214+
status1.text = ''
215+
text_group.append(status)
213216

214-
self.display.show(self.loading_group)
215-
time.sleep(0.01)
217+
#self.display.show(self.loading_group)
216218

217219

218220
def timeout(self):
@@ -239,7 +241,13 @@ def heart_connect(self):
239241
self._hr_service = self.hr_connection[HeartRateService]
240242
return self.hr_connection
241243

242-
def ams_connect(self):
244+
@staticmethod
245+
def _has_timed_out(start, timeout):
246+
if time.time() - start >= timeout:
247+
return True
248+
return False
249+
250+
def ams_connect(self, start=time.time(), timeout=30):
243251
"""
244252
Connect to an Apple device using the ble_apple_media library
245253
"""
@@ -249,7 +257,7 @@ def ams_connect(self):
249257
a.solicited_services.append(AppleMediaService)
250258
radio.start_advertising(a)
251259

252-
while not radio.connected:
260+
while not radio.connected and not self._has_timed_out(start, timeout):
253261
pass
254262

255263
self._status_update("AppleMediaService: Connected")
@@ -300,7 +308,7 @@ def speed_cad_connect(self):
300308
return self.cyc_connections
301309

302310

303-
def _speed_helper(self, values):
311+
def _compute_speed(self, values):
304312
wheel_diff = values.last_wheel_event_time - self._previous_wheel
305313
rev_diff = values.cumulative_wheel_revolutions - self._previous_revolutions
306314

@@ -314,15 +322,15 @@ def _speed_helper(self, values):
314322
speed = self._previous_speed
315323
self._previous_speed = speed
316324
self._previous_revolutions = values.cumulative_wheel_revolutions
317-
self._i = 0
325+
self._speed_failed = 0
318326
else:
319-
self._i += 1
320-
if self._i >= 3:
327+
self._speed_failed += 1
328+
if self._speed_failed >= 3:
321329
speed = 0
322330
self._previous_wheel = values.last_wheel_event_time
323331

324332

325-
def _cad_helper(self, values):
333+
def _compute_cadence(self, values):
326334
crank_diff = values.last_crank_event_time - self._previous_crank
327335
crank_rev_diff = values.cumulative_crank_revolutions-self._previous_rev
328336

@@ -334,10 +342,10 @@ def _cad_helper(self, values):
334342
cadence = self._previous_cadence
335343
self._previous_cadence = cadence
336344
self._previous_rev = values.cumulative_crank_revolutions
337-
self._j = 0
345+
self._cad_failed = 0
338346
else:
339-
self._j += 1
340-
if self._j >= 3:
347+
self._cad_failed += 1
348+
if self._cad_failed >= 3:
341349
cadence = 0
342350
self._previous_crank = values.last_crank_event_time
343351

@@ -356,23 +364,23 @@ def read_s_and_c(self):
356364
values = svc.measurement_values
357365

358366
if not values:
359-
if self._j >= 3 or self._i >= 3:
360-
if self._j > 3:
367+
if self._cad_failed >= 3 or self._speed_failed >= 3:
368+
if self._cad_failed > 3:
361369
cadence = 0
362-
if self._i > 3:
370+
if self._speed_failed > 3:
363371
speed = 0
364372
continue
365373

366374
if not values.last_wheel_event_time:
367375
continue
368376

369-
self._speed_helper(values)
377+
self._compute_speed(values)
370378

371379

372380
if not values.last_crank_event_time:
373381
continue
374382

375-
self._cad_helper(values)
383+
self._compute_cadence(values)
376384

377385
return speed, cadence
378386

0 commit comments

Comments
 (0)