Skip to content

Commit 5ffbbe8

Browse files
committed
mod: revert to multiple acks. accepts acks only if waiting one. uses an idle_time to wait on target
1 parent 3dfee9f commit 5ffbbe8

File tree

1 file changed

+22
-26
lines changed

1 file changed

+22
-26
lines changed

arduino_alvik/arduino_alvik.py

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,9 @@ def __init__(self):
6868
self._linear_velocity = None
6969
self._angular_velocity = None
7070
self._last_ack = ''
71+
self._waiting_ack = None
7172
self._version = [None, None, None]
7273
self._touch_events = _ArduinoAlvikTouchEvents()
73-
self._time_skip = ticks_ms()
74-
self._TIMEOUT = 0
7574

7675
@staticmethod
7776
def is_on() -> bool:
@@ -231,33 +230,28 @@ def _stop_update_thread(cls):
231230
"""
232231
cls._update_thread_running = False
233232

234-
def _wait_for_target(self, timeout):
233+
def _wait_for_target(self, idle_time):
235234
start = ticks_ms()
236235
while True:
237-
sleep_ms(2)
238-
if self.is_target_reached():
239-
print("ACK received")
240-
break
241-
if ticks_diff(ticks_ms(), start) >= timeout*1000:
242-
print('timeout reached')
236+
if ticks_diff(ticks_ms(), start) >= idle_time*1000 and self.is_target_reached():
243237
break
238+
else:
239+
print(self._last_ack)
240+
sleep_ms(100)
244241

245242
def is_target_reached(self) -> bool:
246243
"""
247244
Returns True if robot has sent an M or R acknowledgment.
248245
It also responds with an ack received message
249246
:return:
250247
"""
251-
if ticks_diff(ticks_ms(), self._time_skip) > self._TIMEOUT:
252-
253-
if self._last_ack != ord('M') and self._last_ack != ord('R'):
254-
sleep_ms(50)
255-
return False
256-
else:
257-
# self._packeter.packetC1B(ord('X'), ord('K'))
258-
# uart.write(self._packeter.msg[0:self._packeter.msg_size])
259-
sleep_ms(200)
260-
return True
248+
if self._last_ack == self._waiting_ack:
249+
self._packeter.packetC1B(ord('X'), ord('K'))
250+
uart.write(self._packeter.msg[0:self._packeter.msg_size])
251+
sleep_ms(100)
252+
self._last_ack = ''
253+
self._waiting_ack = None
254+
return True
261255
return False
262256

263257
def set_behaviour(self, behaviour: int):
@@ -279,12 +273,11 @@ def rotate(self, angle: float, unit: str = 'deg', blocking: bool = True):
279273
"""
280274
angle = convert_angle(angle, unit, 'deg')
281275
sleep_ms(200)
282-
self._time_skip = ticks_ms()
283276
self._packeter.packetC1F(ord('R'), angle)
284277
uart.write(self._packeter.msg[0:self._packeter.msg_size])
278+
self._waiting_ack = ord('R')
285279
if blocking:
286-
self._TIMEOUT = 1000*(angle/MOTOR_CONTROL_DEG_S)*1.05
287-
self._wait_for_target(timeout=(angle/MOTOR_CONTROL_DEG_S)*1.05)
280+
self._wait_for_target(idle_time=(angle/MOTOR_CONTROL_DEG_S))
288281

289282
def move(self, distance: float, unit: str = 'cm', blocking: bool = True):
290283
"""
@@ -296,12 +289,11 @@ def move(self, distance: float, unit: str = 'cm', blocking: bool = True):
296289
"""
297290
distance = convert_distance(distance, unit, 'mm')
298291
sleep_ms(200)
299-
self._time_skip = ticks_ms()
300292
self._packeter.packetC1F(ord('G'), distance)
301293
uart.write(self._packeter.msg[0:self._packeter.msg_size])
294+
self._waiting_ack = ord('M')
302295
if blocking:
303-
self._TIMEOUT = 1000*(distance/MOTOR_CONTROL_MM_S)*1.05
304-
self._wait_for_target(timeout=(distance/MOTOR_CONTROL_MM_S)*1.05)
296+
self._wait_for_target(idle_time=(distance/MOTOR_CONTROL_MM_S))
305297

306298
def stop(self):
307299
"""
@@ -626,7 +618,11 @@ def _parse_message(self) -> int:
626618
_, self._linear_velocity, self._angular_velocity = self._packeter.unpacketC2F()
627619
elif code == ord('x'):
628620
# robot ack
629-
_, self._last_ack = self._packeter.unpacketC1B()
621+
_, ack = self._packeter.unpacketC1B()
622+
if self._waiting_ack is not None:
623+
self._last_ack = ack
624+
else:
625+
self._last_ack = 0x00
630626
elif code == ord('z'):
631627
# robot ack
632628
_, self._x, self._y, self._theta = self._packeter.unpacketC3F()

0 commit comments

Comments
 (0)