3
3
import struct
4
4
from machine import I2C
5
5
import _thread
6
- from time import sleep_ms
6
+ from time import sleep_ms , ticks_ms , ticks_diff
7
7
8
8
from ucPack import ucPack
9
9
@@ -67,7 +67,8 @@ def __init__(self):
67
67
self ._bottom_tof = None
68
68
self ._linear_velocity = None
69
69
self ._angular_velocity = None
70
- self ._last_ack = ''
70
+ self ._last_ack = None
71
+ self ._waiting_ack = None
71
72
self ._version = [None , None , None ]
72
73
self ._touch_events = _ArduinoAlvikTouchEvents ()
73
74
@@ -199,6 +200,7 @@ def _wait_for_ack(self) -> None:
199
200
Waits until receives 0x00 ack from robot
200
201
:return:
201
202
"""
203
+ self ._waiting_ack = 0x00
202
204
while self ._last_ack != 0x00 :
203
205
sleep_ms (20 )
204
206
@@ -229,24 +231,31 @@ def _stop_update_thread(cls):
229
231
"""
230
232
cls ._update_thread_running = False
231
233
232
- def _wait_for_target (self ):
233
- while not self .is_target_reached ():
234
- pass
234
+ def _wait_for_target (self , idle_time ):
235
+ start = ticks_ms ()
236
+ while True :
237
+ if ticks_diff (ticks_ms (), start ) >= idle_time * 1000 and self .is_target_reached ():
238
+ break
239
+ else :
240
+ # print(self._last_ack)
241
+ sleep_ms (100 )
235
242
236
243
def is_target_reached (self ) -> bool :
237
244
"""
238
245
Returns True if robot has sent an M or R acknowledgment.
239
246
It also responds with an ack received message
240
247
:return:
241
248
"""
242
- if self ._last_ack != ord ('M' ) and self ._last_ack != ord ('R' ):
243
- sleep_ms (50 )
244
- return False
245
- else :
249
+ if self ._waiting_ack is None :
250
+ return True
251
+ if self ._last_ack == self ._waiting_ack :
246
252
self ._packeter .packetC1B (ord ('X' ), ord ('K' ))
247
253
uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
248
- sleep_ms (200 )
254
+ sleep_ms (100 )
255
+ self ._last_ack = 0x00
256
+ self ._waiting_ack = None
249
257
return True
258
+ return False
250
259
251
260
def set_behaviour (self , behaviour : int ):
252
261
"""
@@ -269,8 +278,9 @@ def rotate(self, angle: float, unit: str = 'deg', blocking: bool = True):
269
278
sleep_ms (200 )
270
279
self ._packeter .packetC1F (ord ('R' ), angle )
271
280
uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
281
+ self ._waiting_ack = ord ('R' )
272
282
if blocking :
273
- self ._wait_for_target ()
283
+ self ._wait_for_target (idle_time = ( angle / MOTOR_CONTROL_DEG_S ) )
274
284
275
285
def move (self , distance : float , unit : str = 'cm' , blocking : bool = True ):
276
286
"""
@@ -284,8 +294,9 @@ def move(self, distance: float, unit: str = 'cm', blocking: bool = True):
284
294
sleep_ms (200 )
285
295
self ._packeter .packetC1F (ord ('G' ), distance )
286
296
uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
297
+ self ._waiting_ack = ord ('M' )
287
298
if blocking :
288
- self ._wait_for_target ()
299
+ self ._wait_for_target (idle_time = ( distance / MOTOR_CONTROL_MM_S ) )
289
300
290
301
def stop (self ):
291
302
"""
@@ -610,7 +621,11 @@ def _parse_message(self) -> int:
610
621
_ , self ._linear_velocity , self ._angular_velocity = self ._packeter .unpacketC2F ()
611
622
elif code == ord ('x' ):
612
623
# robot ack
613
- _ , self ._last_ack = self ._packeter .unpacketC1B ()
624
+ if self ._waiting_ack is not None :
625
+ _ , self ._last_ack = self ._packeter .unpacketC1B ()
626
+ else :
627
+ self ._packeter .unpacketC1B ()
628
+ self ._last_ack = 0x00
614
629
elif code == ord ('z' ):
615
630
# robot ack
616
631
_ , self ._x , self ._y , self ._theta = self ._packeter .unpacketC3F ()
0 commit comments