Skip to content

Commit 18d8a6a

Browse files
author
Dario Cammi
committed
Fixed serveral bugs
1 parent b74eb7a commit 18d8a6a

File tree

6 files changed

+42
-40
lines changed

6 files changed

+42
-40
lines changed

buildhat/devices/colordistancesensor.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ async def get_distance(self) -> int:
124124
self.ensure_connected()
125125
self.select_read_mode(1) # PROX
126126

127-
return await self._wait_for_one_update()
127+
return (await self._wait_for_one_update())[0]
128128

129129
async def get_counter(self) -> int:
130130
"""Return the counted object
@@ -134,7 +134,7 @@ async def get_counter(self) -> int:
134134
self.ensure_connected()
135135
self.select_read_mode(2) # COUNT
136136

137-
return await self._wait_for_one_update()
137+
return (await self._wait_for_one_update())[0]
138138

139139
def set_color(self, color: Color) -> None:
140140
"""Set the led color. No measures performed in this mode
@@ -173,4 +173,5 @@ def on_single_value_update(self, mode: int, value: str) -> None:
173173
"""BuildHat call this function when there is a device value update from a combo mode"""
174174
if mode == self._selected_read_mode:
175175
self._last_read = value
176-
self._read_lock.release()
176+
if self._read_lock.locked():
177+
self._read_lock.release()

buildhat/devices/colorsensor.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,4 +188,5 @@ def on_single_value_update(self, mode: int, value: str) -> None:
188188
"""BuildHat call this function when there is a device value update from a combo mode"""
189189
if mode == self._selected_read_mode:
190190
self._last_read = value
191-
self._read_lock.release()
191+
if self._read_lock.locked():
192+
self._read_lock.release()

buildhat/devices/ultrasonicdistancesensor.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,7 @@
1-
import asyncio
2-
31
import buildhat.hat
42
from ..models.devicetype import DeviceType
53
from ..activedevice import ActiveDevice
64

7-
try:
8-
from typing import List, Tuple
9-
except ImportError:
10-
pass
11-
12-
135
class UltrasonicDistanceSensor(ActiveDevice):
146
"""Distance sensor
157
Part number: 6302968
@@ -27,7 +19,7 @@ def on(self):
2719

2820
@property
2921
def distance(self) -> int:
30-
"""Distance in cm"""
22+
"""Distance in mm"""
3123
return self._distance
3224

3325
def eyes(self, *args: int) -> None:

buildhat/hat.py

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ def debug(self, value: bool) -> None:
136136
def _init_hat(self) -> None:
137137
# Check if we're in the bootloader or the firmware
138138
status = ""
139-
attempt = 2
139+
attempt = 10
140+
self._serial.reset_input_buffer()
140141
self._serial.write(b"version\r")
141142
while not status:
142143
line = self.readline(skip="version")
@@ -359,7 +360,11 @@ def _process_all_incoming_messages(self) -> None:
359360
"""Process all the incoming messages from the hat"""
360361
while self._serial.in_waiting:
361362
line = self.readline()
362-
self._process_message(line)
363+
try:
364+
self._process_message(line)
365+
except:
366+
if self._debug:
367+
print(f"FAILED TO PROCESS INCOMING MESSAGE: {line}")
363368

364369
def _process_message(self, line: str) -> None:
365370
processed = True
@@ -446,21 +451,18 @@ def _process_message(self, line: str) -> None:
446451
processed = False
447452

448453
elif line[0] == "P" and (line[2] == "C" or line[2] == "M"):
449-
try:
450-
header, values = line.split(":")
451-
port = int(header[1])
452-
iscombi = header[2] == "C"
453-
mode = int(header[3:])
454-
device = self._connected_devices[port]
455-
if isinstance(device, buildhat.activedevice.ActiveDevice):
456-
if iscombi:
457-
values = [v for v in values.split(" ") if v]
458-
device.on_combi_value_update(mode, values)
459-
else:
460-
value = values.strip()
461-
device.on_single_value_update(mode, value)
462-
except:
463-
pass
454+
header, values = line.split(":")
455+
port = int(header[1])
456+
iscombi = header[2] == "C"
457+
mode = int(header[3:])
458+
device = self._connected_devices[port]
459+
if isinstance(device, buildhat.activedevice.ActiveDevice):
460+
if iscombi:
461+
values = [v for v in values.split(" ") if v]
462+
device.on_combi_value_update(mode, values)
463+
else:
464+
value = values.strip()
465+
device.on_single_value_update(mode, value)
464466
else:
465467
processed = False
466468

@@ -481,7 +483,8 @@ def _process_message(self, line: str) -> None:
481483
and line.endswith(" V")
482484
):
483485
self._last_vin_read = float(line.split(" ")[0])
484-
self._vin_lock.release()
486+
if self._vin_lock.locked():
487+
self._vin_lock.release()
485488
return
486489

487490
if self._debug:

buildhat/motors/activemotor.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ def __init__(self, hat: buildhat.hat.Hat, port: str, type: DeviceType):
4545

4646
def deinit(self) -> None:
4747
super().deinit()
48-
self._run_lock.release()
48+
if self._read_lock.locked():
49+
self._run_lock.release()
4950

5051
@property
5152
def power_limit(self) -> float:
@@ -159,7 +160,7 @@ def release_after_run(self, value: bool) -> None:
159160
async def run_for_rotations(
160161
self, rotations: int | float, speed: float | None = None, blocking: bool = True
161162
):
162-
"""Run motor for N rotations
163+
"""Run motor for N rotations (position PID close loop)
163164
164165
:param rotations: Number of rotations
165166
:param speed: Speed in run_command_speed_unit
@@ -173,7 +174,7 @@ async def run_for_rotations(
173174
async def run_for_degrees(
174175
self, degrees: int | float, speed: float | None = None, blocking: bool = True
175176
):
176-
"""Run motor for N degrees
177+
"""Run motor for N degrees (position PID close loop)
177178
178179
:param degrees: Number of degrees to rotate
179180
:param speed: Speed in run_command_speed_unit
@@ -200,7 +201,7 @@ async def run_to_position(
200201
speed: float | None = None,
201202
blocking: bool = True,
202203
):
203-
"""Run motor until reach the target position
204+
"""Run motor until reach the target position (position PID close loop)
204205
205206
:param target_position: Position to reach in degrees
206207
:param speed: Speed in run_command_speed_unit
@@ -295,7 +296,7 @@ async def run_to_absolute_angle(
295296
blocking: bool = True,
296297
direction: Direction = Direction.SHORTEST,
297298
):
298-
"""Run motor to an absolute angle
299+
"""Run motor to an absolute angle (position PID close loop)
299300
300301
:param angle: Position in degrees from -180 to 180
301302
:param speed: Speed ranging from 0 to 100
@@ -342,7 +343,7 @@ async def run_to_absolute_angle(
342343
async def run_for_seconds(
343344
self, seconds: float, speed: float | None = None, blocking: bool = True
344345
):
345-
"""Run motor for N seconds
346+
"""Run motor for N seconds (speed PID close loop)
346347
347348
:param seconds: Running time in seconds
348349
:param speed: Speed in run_command_speed_unit
@@ -384,7 +385,7 @@ async def run_for_seconds(
384385
self.coast()
385386

386387
def start(self, speed: float | None = None):
387-
"""Start motor
388+
"""Start motor (speed PID close loop)
388389
389390
:param speed: Speed in run_command_speed_unit
390391
"""
@@ -427,6 +428,10 @@ def pwmparams(self, pwmthresh, minpwm):
427428
self.hat.serial.write(f"port {self._port} ; pwmparams {pwmthresh} {minpwm}\r")
428429

429430
def pwm(self, speed: int | float) -> None:
431+
"""Start the motor (open loop)
432+
433+
:param speed: PWM value. Range -1 to 1
434+
"""
430435
if (
431436
(not isinstance(speed, int) and not isinstance(speed, float))
432437
or speed < -1

buildhat/motors/motor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def _parse_ramp_done_message(self, line: str) -> bool:
1919
When the message is found, release the run lock
2020
"""
2121
msg = f"P{self._port}{_RAMP_DONE}"
22-
if line.startswith(msg):
22+
if line.startswith(msg) and self._run_lock.locked():
2323
self._run_lock.release()
2424
return True
2525

@@ -30,7 +30,7 @@ def _parse_pulse_done_message(self, line: str) -> bool:
3030
When the message is found, release the run lock
3131
"""
3232
msg = f"P{self._port}{_PULSE_DONE}"
33-
if line.startswith(msg):
33+
if line.startswith(msg) and self._run_lock.locked():
3434
self._run_lock.release()
3535
return True
3636

0 commit comments

Comments
 (0)