Skip to content

Commit cb8adf7

Browse files
committed
waiting ack and idle_time
1 parent 3246c65 commit cb8adf7

File tree

3 files changed

+38
-8
lines changed

3 files changed

+38
-8
lines changed

src/Arduino_Alvik.cpp

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ void Arduino_Alvik::reset_hw(){
4545
}
4646

4747
void Arduino_Alvik::wait_for_ack(){
48+
waiting_ack = 0x00;
4849
while(last_ack != 0x00){
4950
delay(20);
5051
}
@@ -57,6 +58,7 @@ int Arduino_Alvik::begin(const bool verbose, const uint8_t core){
5758
verbose_output = verbose;
5859

5960
last_ack = 0;
61+
waiting_ack = NO_ACK;
6062

6163
version[0] = 0;
6264
version[1] = 0;
@@ -238,7 +240,12 @@ int Arduino_Alvik::parse_message(){
238240
switch(code){
239241
// get ack code
240242
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+
}
242249
break;
243250

244251

@@ -406,35 +413,54 @@ void Arduino_Alvik::reset_pose(const float x, const float y, const float theta,
406413
}
407414

408415
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){
410422
delay(50);
411423
return false;
412424
}
413425
msg_size = packeter->packetC1B('X', 'K');
414426
uart->write(packeter->msg, msg_size);
427+
waiting_ack = NO_ACK;
428+
last_ack = 0x00;
415429
delay(200);
416430
return true;
417431
}
418432

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+
}
421445
}
422446

423447
void Arduino_Alvik::rotate(const float angle, const uint8_t unit, const bool blocking){
424448
delay(200);
425449
msg_size = packeter->packetC1F('R', convert_angle(angle, unit, DEG));
426450
uart->write(packeter->msg, msg_size);
451+
waiting_ack = 'R';
427452
if (blocking){
428-
wait_for_target();
453+
wait_for_target(round(angle/MOTOR_CONTROL_DEG_S));
429454
}
430455
}
431456

432457
void Arduino_Alvik::move(const float distance, const uint8_t unit, const bool blocking){
433458
delay(200);
434459
msg_size = packeter->packetC1F('G', convert_distance(distance, unit, MM));
435460
uart->write(packeter->msg, msg_size);
461+
waiting_ack = 'M';
436462
if (blocking){
437-
wait_for_target();
463+
wait_for_target(round(distance/MOTOR_CONTROL_MM_S));
438464
}
439465
}
440466

src/Arduino_Alvik.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class Arduino_Alvik{
3636
uint8_t msg_size;
3737

3838
uint8_t last_ack;
39+
uint8_t waiting_ack;
3940

4041
float converted_angular;
4142

@@ -96,7 +97,7 @@ class Arduino_Alvik{
9697

9798
void get_touch(); // service function to parse touch
9899
void set_leds(); // service function to set leds by a byte
99-
void wait_for_target(); // service function that wait for ack
100+
void wait_for_target(const int idle_time); // service function that wait for ack
100101

101102
float limit(float value, const float min, const float max); // limit a value
102103
float normalize(float value, const float min, const float max); // normalize a value

src/definitions.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,14 @@
2929

3030
#define CHARGE_THRESHOLD 97
3131

32+
#define NO_ACK 0xFF
33+
3234
const float WHEEL_DIAMETER_MM = 34.0;
3335
const float WHEEL_TRACK_MM = 89.0;
3436
const float MOTOR_MAX_RPM = 70.0;
3537
const float ROBOT_MAX_DEG_S = 6*(2*MOTOR_MAX_RPM*WHEEL_DIAMETER_MM)/WHEEL_TRACK_MM;
36-
38+
const float MOTOR_CONTROL_MM_S = 100.0;
39+
const float MOTOR_CONTROL_DEG_S = 100.0;
3740

3841
// unit conversion constants
3942

0 commit comments

Comments
 (0)