@@ -68,10 +68,9 @@ def __init__(self):
68
68
self ._linear_velocity = None
69
69
self ._angular_velocity = None
70
70
self ._last_ack = ''
71
+ self ._waiting_ack = None
71
72
self ._version = [None , None , None ]
72
73
self ._touch_events = _ArduinoAlvikTouchEvents ()
73
- self ._time_skip = ticks_ms ()
74
- self ._TIMEOUT = 0
75
74
76
75
@staticmethod
77
76
def is_on () -> bool :
@@ -231,33 +230,28 @@ def _stop_update_thread(cls):
231
230
"""
232
231
cls ._update_thread_running = False
233
232
234
- def _wait_for_target (self , timeout ):
233
+ def _wait_for_target (self , idle_time ):
235
234
start = ticks_ms ()
236
235
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 ():
243
237
break
238
+ else :
239
+ print (self ._last_ack )
240
+ sleep_ms (100 )
244
241
245
242
def is_target_reached (self ) -> bool :
246
243
"""
247
244
Returns True if robot has sent an M or R acknowledgment.
248
245
It also responds with an ack received message
249
246
:return:
250
247
"""
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
261
255
return False
262
256
263
257
def set_behaviour (self , behaviour : int ):
@@ -279,12 +273,11 @@ def rotate(self, angle: float, unit: str = 'deg', blocking: bool = True):
279
273
"""
280
274
angle = convert_angle (angle , unit , 'deg' )
281
275
sleep_ms (200 )
282
- self ._time_skip = ticks_ms ()
283
276
self ._packeter .packetC1F (ord ('R' ), angle )
284
277
uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
278
+ self ._waiting_ack = ord ('R' )
285
279
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 ))
288
281
289
282
def move (self , distance : float , unit : str = 'cm' , blocking : bool = True ):
290
283
"""
@@ -296,12 +289,11 @@ def move(self, distance: float, unit: str = 'cm', blocking: bool = True):
296
289
"""
297
290
distance = convert_distance (distance , unit , 'mm' )
298
291
sleep_ms (200 )
299
- self ._time_skip = ticks_ms ()
300
292
self ._packeter .packetC1F (ord ('G' ), distance )
301
293
uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
294
+ self ._waiting_ack = ord ('M' )
302
295
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 ))
305
297
306
298
def stop (self ):
307
299
"""
@@ -626,7 +618,11 @@ def _parse_message(self) -> int:
626
618
_ , self ._linear_velocity , self ._angular_velocity = self ._packeter .unpacketC2F ()
627
619
elif code == ord ('x' ):
628
620
# 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
630
626
elif code == ord ('z' ):
631
627
# robot ack
632
628
_ , self ._x , self ._y , self ._theta = self ._packeter .unpacketC3F ()
0 commit comments