Add --retry C option for repeating Who-Is or I-Am C number of times (#199)

Co-authored-by: Steve Karg <skarg@users.sourceforge.net>
This commit is contained in:
Steve Karg
2021-10-12 10:32:41 -05:00
committed by GitHub
parent eff691aedd
commit 73bfda54ed
2 changed files with 33 additions and 3 deletions
+17 -2
View File
@@ -128,6 +128,10 @@ static void print_help(char *filename)
"Send the message repeatedly until signalled to quit.\n" "Send the message repeatedly until signalled to quit.\n"
"Default is to not repeat, sending only a single message.\n" "Default is to not repeat, sending only a single message.\n"
"\n" "\n"
"--retry C\n"
"Send the message C number of times\n"
"Default is retry 0, only sending one time.\n"
"\n"
"--delay\n" "--delay\n"
"Delay, in milliseconds, between repeated messages.\n" "Delay, in milliseconds, between repeated messages.\n"
"Default delay is 100ms.\n" "Default delay is 100ms.\n"
@@ -160,6 +164,7 @@ int main(int argc, char *argv[])
int argi = 0; int argi = 0;
unsigned int target_args = 0; unsigned int target_args = 0;
char *filename = NULL; char *filename = NULL;
long retry_count = 0;
filename = filename_remove_path(argv[0]); filename = filename_remove_path(argv[0]);
for (argi = 1; argi < argc; argi++) { for (argi = 1; argi < argc; argi++) {
@@ -198,6 +203,13 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--repeat") == 0) { } else if (strcmp(argv[argi], "--repeat") == 0) {
repeat_forever = true; repeat_forever = true;
} else if (strcmp(argv[argi], "--retry") == 0) {
if (++argi < argc) {
retry_count = strtol(argv[argi], NULL, 0);
if (retry_count < 0) {
retry_count = 0;
}
}
} else if (strcmp(argv[argi], "--delay") == 0) { } else if (strcmp(argv[argi], "--delay") == 0) {
if (++argi < argc) { if (++argi < argc) {
timeout = strtol(argv[argi], NULL, 0); timeout = strtol(argv[argi], NULL, 0);
@@ -265,7 +277,7 @@ int main(int argc, char *argv[])
do { do {
Send_I_Am_To_Network(&dest, Target_Device_ID, Target_Max_APDU, Send_I_Am_To_Network(&dest, Target_Device_ID, Target_Max_APDU,
Target_Segmentation, Target_Vendor_ID); Target_Segmentation, Target_Vendor_ID);
if (repeat_forever) { if (repeat_forever || retry_count) {
/* returns 0 bytes on timeout */ /* returns 0 bytes on timeout */
pdu_len = datalink_receive(&src, &Rx_Buf[0], MAX_MPDU, timeout); pdu_len = datalink_receive(&src, &Rx_Buf[0], MAX_MPDU, timeout);
/* process */ /* process */
@@ -275,8 +287,11 @@ int main(int argc, char *argv[])
if (Error_Detected) { if (Error_Detected) {
break; break;
} }
if (retry_count > 0) {
retry_count--;
}
} }
} while (repeat_forever); } while (repeat_forever || retry_count);
return 0; return 0;
} }
+16 -1
View File
@@ -306,6 +306,10 @@ static void print_help(char *filename)
"Send the message repeatedly until signalled to quit.\n" "Send the message repeatedly until signalled to quit.\n"
"Default is disabled, using the APDU timeout as time to quit.\n" "Default is disabled, using the APDU timeout as time to quit.\n"
"\n" "\n"
"--retry C\n"
"Send the message C number of times\n"
"Default is retry 0, only sending one time.\n"
"\n"
"--delay\n" "--delay\n"
"Delay, in milliseconds, between repeated messages.\n" "Delay, in milliseconds, between repeated messages.\n"
"Default delay is 100ms.\n" "Default delay is 100ms.\n"
@@ -352,6 +356,7 @@ int main(int argc, char *argv[])
unsigned int target_args = 0; unsigned int target_args = 0;
char *filename = NULL; char *filename = NULL;
bool repeat_forever = false; bool repeat_forever = false;
long retry_count = 0;
/* check for local environment settings */ /* check for local environment settings */
if (getenv("BACNET_DEBUG")) { if (getenv("BACNET_DEBUG")) {
@@ -395,6 +400,13 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--repeat") == 0) { } else if (strcmp(argv[argi], "--repeat") == 0) {
repeat_forever = true; repeat_forever = true;
} else if (strcmp(argv[argi], "--retry") == 0) {
if (++argi < argc) {
retry_count = strtol(argv[argi], NULL, 0);
if (retry_count < 0) {
retry_count = 0;
}
}
} else if (strcmp(argv[argi], "--delay") == 0) { } else if (strcmp(argv[argi], "--delay") == 0) {
if (++argi < argc) { if (++argi < argc) {
timeout = strtol(argv[argi], NULL, 0); timeout = strtol(argv[argi], NULL, 0);
@@ -488,10 +500,13 @@ int main(int argc, char *argv[])
datalink_maintenance_timer(elapsed_seconds); datalink_maintenance_timer(elapsed_seconds);
} }
total_seconds += elapsed_seconds; total_seconds += elapsed_seconds;
if (repeat_forever) { if (repeat_forever || retry_count) {
Send_WhoIs_To_Network( Send_WhoIs_To_Network(
&dest, Target_Object_Instance_Min, &dest, Target_Object_Instance_Min,
Target_Object_Instance_Max); Target_Object_Instance_Max);
if (retry_count > 0) {
retry_count--;
}
} else { } else {
if (total_seconds > timeout_seconds) { if (total_seconds > timeout_seconds) {
break; break;