@@ -45,6 +45,7 @@ void Arduino_Alvik::reset_hw(){
45
45
}
46
46
47
47
void Arduino_Alvik::wait_for_ack (){
48
+ waiting_ack = 0x00 ;
48
49
while (last_ack != 0x00 ){
49
50
delay (20 );
50
51
}
@@ -57,6 +58,7 @@ int Arduino_Alvik::begin(const bool verbose, const uint8_t core){
57
58
verbose_output = verbose;
58
59
59
60
last_ack = 0 ;
61
+ waiting_ack = NO_ACK;
60
62
61
63
version[0 ] = 0 ;
62
64
version[1 ] = 0 ;
@@ -238,7 +240,12 @@ int Arduino_Alvik::parse_message(){
238
240
switch (code){
239
241
// get ack code
240
242
case ' x' :
241
- packeter->unpacketC1B (code, last_ack);
243
+ if (waiting_ack == NO_ACK){
244
+ packeter->unpacketC1B (code, last_ack);
245
+ last_ack = 0x00 ;
246
+ } else {
247
+ packeter->unpacketC1B (code, last_ack);
248
+ }
242
249
break ;
243
250
244
251
@@ -406,35 +413,54 @@ void Arduino_Alvik::reset_pose(const float x, const float y, const float theta,
406
413
}
407
414
408
415
bool Arduino_Alvik::is_target_reached (){
409
- if ((last_ack != ' M' ) && (last_ack != ' R' )){
416
+
417
+ if (waiting_ack == NO_ACK){
418
+ return true ;
419
+ }
420
+
421
+ if (last_ack != waiting_ack){
410
422
delay (50 );
411
423
return false ;
412
424
}
413
425
msg_size = packeter->packetC1B (' X' , ' K' );
414
426
uart->write (packeter->msg , msg_size);
427
+ waiting_ack = NO_ACK;
428
+ last_ack = 0x00 ;
415
429
delay (200 );
416
430
return true ;
417
431
}
418
432
419
- void Arduino_Alvik::wait_for_target (){ // it is private
420
- while (!is_target_reached ()){}
433
+ void Arduino_Alvik::wait_for_target (const int idle_time){ // it is private
434
+ int start_t = millis ();
435
+
436
+ while (true ){
437
+ if (((millis () - start_t ) >= idle_time*1000 ) && is_target_reached ()) {
438
+ break ;
439
+ } else
440
+ {
441
+ delay (100 );
442
+ }
443
+
444
+ }
421
445
}
422
446
423
447
void Arduino_Alvik::rotate (const float angle, const uint8_t unit, const bool blocking){
424
448
delay (200 );
425
449
msg_size = packeter->packetC1F (' R' , convert_angle (angle, unit, DEG));
426
450
uart->write (packeter->msg , msg_size);
451
+ waiting_ack = ' R' ;
427
452
if (blocking){
428
- wait_for_target ();
453
+ wait_for_target (round (angle/MOTOR_CONTROL_DEG_S) );
429
454
}
430
455
}
431
456
432
457
void Arduino_Alvik::move (const float distance, const uint8_t unit, const bool blocking){
433
458
delay (200 );
434
459
msg_size = packeter->packetC1F (' G' , convert_distance (distance, unit, MM));
435
460
uart->write (packeter->msg , msg_size);
461
+ waiting_ack = ' M' ;
436
462
if (blocking){
437
- wait_for_target ();
463
+ wait_for_target (round (distance/MOTOR_CONTROL_MM_S) );
438
464
}
439
465
}
440
466
0 commit comments