From 73bfda54ed79cb0faa6dc7843722ec6a440f0813 Mon Sep 17 00:00:00 2001 From: Steve Karg Date: Tue, 12 Oct 2021 10:32:41 -0500 Subject: [PATCH] Add --retry C option for repeating Who-Is or I-Am C number of times (#199) Co-authored-by: Steve Karg --- apps/iam/main.c | 19 +++++++++++++++++-- apps/whois/main.c | 17 ++++++++++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/apps/iam/main.c b/apps/iam/main.c index fc4970e6..38c4b193 100644 --- a/apps/iam/main.c +++ b/apps/iam/main.c @@ -128,6 +128,10 @@ static void print_help(char *filename) "Send the message repeatedly until signalled to quit.\n" "Default is to not repeat, sending only a single message.\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, in milliseconds, between repeated messages.\n" "Default delay is 100ms.\n" @@ -160,6 +164,7 @@ int main(int argc, char *argv[]) int argi = 0; unsigned int target_args = 0; char *filename = NULL; + long retry_count = 0; filename = filename_remove_path(argv[0]); for (argi = 1; argi < argc; argi++) { @@ -198,6 +203,13 @@ int main(int argc, char *argv[]) } } else if (strcmp(argv[argi], "--repeat") == 0) { 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) { if (++argi < argc) { timeout = strtol(argv[argi], NULL, 0); @@ -265,7 +277,7 @@ int main(int argc, char *argv[]) do { Send_I_Am_To_Network(&dest, Target_Device_ID, Target_Max_APDU, Target_Segmentation, Target_Vendor_ID); - if (repeat_forever) { + if (repeat_forever || retry_count) { /* returns 0 bytes on timeout */ pdu_len = datalink_receive(&src, &Rx_Buf[0], MAX_MPDU, timeout); /* process */ @@ -275,8 +287,11 @@ int main(int argc, char *argv[]) if (Error_Detected) { break; } + if (retry_count > 0) { + retry_count--; + } } - } while (repeat_forever); + } while (repeat_forever || retry_count); return 0; } diff --git a/apps/whois/main.c b/apps/whois/main.c index 8699aea4..20e78ee1 100644 --- a/apps/whois/main.c +++ b/apps/whois/main.c @@ -306,6 +306,10 @@ static void print_help(char *filename) "Send the message repeatedly until signalled to quit.\n" "Default is disabled, using the APDU timeout as time to quit.\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, in milliseconds, between repeated messages.\n" "Default delay is 100ms.\n" @@ -352,6 +356,7 @@ int main(int argc, char *argv[]) unsigned int target_args = 0; char *filename = NULL; bool repeat_forever = false; + long retry_count = 0; /* check for local environment settings */ if (getenv("BACNET_DEBUG")) { @@ -395,6 +400,13 @@ int main(int argc, char *argv[]) } } else if (strcmp(argv[argi], "--repeat") == 0) { 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) { if (++argi < argc) { timeout = strtol(argv[argi], NULL, 0); @@ -488,10 +500,13 @@ int main(int argc, char *argv[]) datalink_maintenance_timer(elapsed_seconds); } total_seconds += elapsed_seconds; - if (repeat_forever) { + if (repeat_forever || retry_count) { Send_WhoIs_To_Network( &dest, Target_Object_Instance_Min, Target_Object_Instance_Max); + if (retry_count > 0) { + retry_count--; + } } else { if (total_seconds > timeout_seconds) { break;