Feature/refactor-apps-string-parsing (#1152)

* Added bacnet_str functions for parsing various numeric strings.

* Renamed BACnet string API to be clearer when no stdlib function exists.

* Fixed  incompatible types - from 'BACNET_UNSIGNED_INTEGER *' to 'unsigned long *'  warning

* Changed bacnet-str-to functions to use ERANGE for error detection.

* Refactored some apps to use common string parsing for BACnet data types.

* Refactor bacapp_parse_application_data to use bacnet_string_to_unsigned for better clarity

* Added strtol for BACnetEventType.
This commit is contained in:
Steve Karg
2025-12-02 11:27:19 -06:00
committed by GitHub
parent 73fbb400cb
commit cef68dc079
26 changed files with 904 additions and 662 deletions
+35 -34
View File
@@ -121,6 +121,8 @@ int main(int argc, char *argv[])
BACNET_MAC_ADDRESS mac = { 0 };
BACNET_MAC_ADDRESS adr = { 0 };
BACNET_ADDRESS dest = { 0 };
unsigned long long_value = 0;
bool server = false;
bool specific_address = false;
int argi = 0;
unsigned int target_args = 0;
@@ -150,7 +152,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true;
}
@@ -163,13 +168,37 @@ int main(int argc, char *argv[])
}
} else {
if (target_args == 0) {
Target_Abort_Reason = strtol(argv[argi], NULL, 0);
if (!bacnet_strtoul(argv[argi], &long_value)) {
fprintf(stderr, "abort-reason=%s invalid\n", argv[argi]);
return 1;
}
if (long_value > UINT16_MAX) {
fprintf(
stderr, "abort-reason=%lu exceeds %u\n", long_value,
UINT16_MAX);
return 1;
}
Target_Abort_Reason = (uint16_t)long_value;
target_args++;
} else if (target_args == 1) {
Target_Invoke_ID = strtol(argv[argi], NULL, 0);
if (!bacnet_strtoul(argv[argi], &long_value)) {
fprintf(stderr, "invoke-id=%s invalid\n", argv[argi]);
return 1;
}
if (long_value > UINT8_MAX) {
fprintf(
stderr, "invoke-id=%lu exceeds %u\n", long_value,
UINT8_MAX);
return 1;
}
Target_Invoke_ID = (uint8_t)long_value;
target_args++;
} else if (target_args == 2) {
Target_Server = strtol(argv[argi], NULL, 0);
if (!bacnet_string_to_bool(argv[argi], &server)) {
fprintf(stderr, "server=%s invalid\n", argv[argi]);
return 1;
}
Target_Server = server;
target_args++;
} else {
print_usage(filename);
@@ -177,41 +206,13 @@ int main(int argc, char *argv[])
}
}
}
address_init();
/* setup my info */
if (specific_address) {
if (adr.len && mac.len) {
memcpy(&dest.mac[0], &mac.adr[0], mac.len);
dest.mac_len = mac.len;
memcpy(&dest.adr[0], &adr.adr[0], adr.len);
dest.len = adr.len;
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
dest.net = dnet;
} else {
dest.net = BACNET_BROADCAST_NETWORK;
}
} else if (mac.len) {
memcpy(&dest.mac[0], &mac.adr[0], mac.len);
dest.mac_len = mac.len;
dest.len = 0;
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
dest.net = dnet;
} else {
dest.net = 0;
}
} else {
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
dest.net = dnet;
} else {
dest.net = BACNET_BROADCAST_NETWORK;
}
dest.mac_len = 0;
dest.len = 0;
}
bacnet_address_init(&dest, &mac, dnet, &adr);
}
/* setup my info */
Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
Init_Service_Handlers();
address_init();
dlenv_init();
atexit(datalink_cleanup);
/* send the request */
+61 -41
View File
@@ -220,7 +220,8 @@ int main(int argc, char *argv[])
time_t timeout_seconds = 0;
bool found = false;
long dnet = -1;
unsigned object_type = 0;
unsigned long long_value = 0;
uint32_t object_type = 0;
BACNET_MAC_ADDRESS mac = { 0 };
BACNET_MAC_ADDRESS adr = { 0 };
BACNET_ADDRESS dest = { 0 };
@@ -253,7 +254,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true;
}
@@ -267,26 +271,56 @@ int main(int argc, char *argv[])
} else {
if (target_args == 0) {
/* device-id */
Target_Device_Object_Instance = strtol(argv[argi], NULL, 0);
if (!bacnet_strtoul(argv[argi], &long_value)) {
fprintf(stderr, "device-instance=%s invalid\n", argv[argi]);
return 1;
}
if (long_value > BACNET_MAX_INSTANCE) {
fprintf(
stderr, "device-instance=%lu - exceeds %d\n",
long_value, BACNET_MAX_INSTANCE);
return 1;
}
Target_Device_Object_Instance = (uint32_t)long_value;
target_args++;
} else if (target_args == 1) {
/* process-id */
data.ackProcessIdentifier = strtol(argv[argi], NULL, 0);
if (!bacnet_strtoul(argv[argi], &long_value)) {
fprintf(stderr, "process-id=%s invalid\n", argv[argi]);
return 1;
}
if (long_value > UINT32_MAX) {
fprintf(
stderr, "process-id=%lu - exceeds %u\n", long_value,
UINT32_MAX);
return 1;
}
data.ackProcessIdentifier = (uint32_t)long_value;
target_args++;
} else if (target_args == 2) {
/* event-object-type */
if (bactext_object_type_strtol(argv[argi], &object_type)) {
data.eventObjectIdentifier.type = object_type;
target_args++;
} else {
if (!bactext_object_type_strtol(argv[argi], &object_type)) {
fprintf(
stderr, "event-object-type=%s invalid\n", argv[argi]);
return 1;
}
data.eventObjectIdentifier.type = object_type;
target_args++;
} else if (target_args == 3) {
/* event-object-instance */
data.eventObjectIdentifier.instance =
strtol(argv[argi], NULL, 0);
if (!bacnet_strtoul(argv[argi], &long_value)) {
fprintf(
stderr, "event-object-instance=%s invalid\n",
argv[argi]);
return 1;
}
if (long_value > BACNET_MAX_INSTANCE) {
fprintf(
stderr, "event-object-instance=%lu - exceeds %u\n",
long_value, BACNET_MAX_INSTANCE);
return 1;
}
data.eventObjectIdentifier.instance = (uint32_t)long_value;
target_args++;
} else if (target_args == 4) {
/* event-state-acked */
@@ -299,15 +333,27 @@ int main(int argc, char *argv[])
}
} else if (target_args == 5) {
/* event-time-stamp */
bacapp_timestamp_init_ascii(&data.eventTimeStamp, argv[argi]);
if (!bacapp_timestamp_init_ascii(
&data.eventTimeStamp, argv[argi])) {
fprintf(
stderr, "event-time-stamp=%s invalid\n", argv[argi]);
return 1;
}
target_args++;
} else if (target_args == 6) {
/* ack-source */
characterstring_init_ansi(&data.ackSource, argv[argi]);
if (!characterstring_init_ansi(&data.ackSource, argv[argi])) {
fprintf(stderr, "ack-source=%s invalid\n", argv[argi]);
return 1;
}
target_args++;
} else if (target_args == 7) {
/* ack-time-stamp */
bacapp_timestamp_init_ascii(&data.ackTimeStamp, argv[argi]);
if (!bacapp_timestamp_init_ascii(
&data.ackTimeStamp, argv[argi])) {
fprintf(stderr, "ack-time-stamp=%s invalid\n", argv[argi]);
return 1;
}
target_args++;
} else {
print_usage(filename);
@@ -319,36 +365,10 @@ int main(int argc, char *argv[])
print_usage(filename);
return 0;
}
/* setup my info */
address_init();
if (specific_address) {
if (adr.len && mac.len) {
memcpy(&dest.mac[0], &mac.adr[0], mac.len);
dest.mac_len = mac.len;
memcpy(&dest.adr[0], &adr.adr[0], adr.len);
dest.len = adr.len;
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
dest.net = dnet;
} else {
dest.net = BACNET_BROADCAST_NETWORK;
}
} else if (mac.len) {
memcpy(&dest.mac[0], &mac.adr[0], mac.len);
dest.mac_len = mac.len;
dest.len = 0;
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
dest.net = dnet;
} else {
dest.net = 0;
}
} else {
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
dest.net = dnet;
} else {
dest.net = BACNET_BROADCAST_NETWORK;
}
dest.mac_len = 0;
dest.len = 0;
}
bacnet_address_init(&dest, &mac, dnet, &adr);
address_add(Target_Device_Object_Instance, MAX_APDU, &dest);
printf(
"Added Device %u to address cache\n",
+59 -20
View File
@@ -154,6 +154,24 @@ static void print_help(const char *filename)
printf("Add a BACnetLIST element to a property of an object\n"
"in a BACnet device.\n");
printf("\n");
printf("--mac A\n"
"Optional BACnet mac address.\n"
"Valid ranges are from 00 to FF (hex) for MS/TP or ARCNET,\n"
"or an IP string with optional port number like 10.1.2.3:47808\n"
"or an Ethernet MAC in hex like 00:21:70:7e:32:bb\n");
printf("\n");
printf("--dnet N\n"
"Optional BACnet network number N for directed requests.\n"
"Valid range is from 0 to 65535 where 0 is the local connection\n"
"and 65535 is network broadcast.\n");
printf("\n");
printf("--dadr A\n"
"Optional BACnet mac address on the destination BACnet network "
"number.\n"
"Valid ranges are from 00 to FF (hex) for MS/TP or ARCNET,\n"
"or an IP string with optional port number like 10.1.2.3:47808\n"
"or an Ethernet MAC in hex like 00:21:70:7e:32:bb\n");
printf("\n");
printf("device-instance:\n"
"BACnet Device Object Instance number that you are\n"
"trying to communicate to. This number will be used\n"
@@ -234,12 +252,12 @@ int main(int argc, char *argv[])
bool found = false;
char *value_string = NULL;
bool status = false;
unsigned context_tag = 0;
unsigned long context_tag = 0;
BACNET_APPLICATION_DATA_VALUE *application_value = NULL;
unsigned object_type = 0;
unsigned object_instance = 0;
unsigned property_id = 0;
unsigned property_array_index = 0;
uint32_t object_type = 0;
unsigned long object_instance = 0;
uint32_t property_id = 0;
long property_array_index = 0;
long property_tag = 0;
long dnet = -1;
BACNET_MAC_ADDRESS mac = { 0 };
@@ -274,7 +292,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= UINT16_MAX)) {
specific_address = true;
}
@@ -289,39 +310,43 @@ int main(int argc, char *argv[])
Verbose = true;
} else {
if (target_args == 0) {
object_instance = strtoul(argv[argi], NULL, 0);
if (!bacnet_strtoul(argv[argi], &object_instance)) {
fprintf(stderr, "device-instance=%s invalid\n", argv[argi]);
return 1;
}
if (object_instance > BACNET_MAX_INSTANCE) {
fprintf(
stderr, "device-instance=%u - not greater than %u\n",
stderr, "device-instance=%lu - not greater than %u\n",
object_instance, BACNET_MAX_INSTANCE);
return 1;
}
Target_Device_Object_Instance = object_instance;
target_args++;
} else if (target_args == 1) {
if (bactext_object_type_strtol(argv[argi], &object_type) ==
false) {
if (!bactext_object_type_strtol(argv[argi], &object_type)) {
fprintf(stderr, "object-type=%s invalid\n", argv[argi]);
return 1;
}
Target_Object_Type = object_type;
target_args++;
} else if (target_args == 2) {
object_instance = strtoul(argv[argi], NULL, 0);
if (!bacnet_strtoul(argv[argi], &object_instance)) {
fprintf(stderr, "object-instance=%s invalid\n", argv[argi]);
return 1;
}
if (object_instance > BACNET_MAX_INSTANCE) {
fprintf(
stderr, "device-instance=%u - not greater than %u\n",
stderr, "object-instance=%u - not greater than %u\n",
Target_Device_Object_Instance, BACNET_MAX_INSTANCE);
return 1;
}
Target_Object_Instance = object_instance;
if (Verbose) {
printf("Instance=%u=%s\n", object_instance, argv[argi]);
printf("Instance=%lu=%s\n", object_instance, argv[argi]);
}
target_args++;
} else if (target_args == 3) {
if (bactext_property_strtol(argv[argi], &property_id) ==
false) {
if (!bactext_property_strtol(argv[argi], &property_id)) {
fprintf(stderr, "property=%s invalid\n", argv[argi]);
return 1;
}
@@ -331,11 +356,18 @@ int main(int argc, char *argv[])
}
target_args++;
} else if (target_args == 4) {
property_array_index = strtol(argv[argi], NULL, 0);
Target_Object_Array_Index = property_array_index;
if (!bacnet_strtol(argv[argi], &property_array_index)) {
fprintf(stderr, "array-index=%s invalid\n", argv[argi]);
return 1;
}
if (property_array_index < 0) {
Target_Object_Array_Index = BACNET_ARRAY_ALL;
} else {
Target_Object_Array_Index = property_array_index;
}
if (Verbose) {
printf(
"Array_Index=%i=%s\n", property_array_index,
"Array_Index=%li=%s\n", property_array_index,
argv[argi]);
}
target_args++;
@@ -346,7 +378,11 @@ int main(int argc, char *argv[])
if (tag_value_arg == 0) {
/* special case for context tagged values */
if (toupper(argv[argi][0]) == 'C') {
context_tag = strtoul(&argv[target_args][1], NULL, 0);
if (!bacnet_strtoul(
&argv[target_args][1], &context_tag)) {
fprintf(stderr, "tag=%s invalid\n", argv[argi]);
return 1;
}
application_value->context_tag = context_tag;
application_value->context_specific = true;
argi++;
@@ -354,7 +390,10 @@ int main(int argc, char *argv[])
application_value->context_specific = false;
}
/* application tag */
property_tag = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &property_tag)) {
fprintf(stderr, "tag=%s invalid\n", argv[argi]);
return 1;
}
if (Verbose) {
printf("tag=%ld\n", property_tag);
}
+9 -2
View File
@@ -329,7 +329,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true;
}
@@ -359,7 +362,11 @@ int main(int argc, char *argv[])
}
} else {
if (target_args == 0) {
Target_Device_Object_Instance = strtol(argv[argi], NULL, 0);
if (!bacnet_string_to_uint32(
argv[argi], &Target_Device_Object_Instance)) {
fprintf(stderr, "device-instance=%s invalid\n", argv[argi]);
return 1;
}
target_args++;
} else if (target_args == 1) {
APDU_Hex_ASCII = argv[argi];
+8 -2
View File
@@ -381,13 +381,19 @@ int main(int argc, char *argv[])
}
if (strcmp(argv[argi], "--device") == 0) {
if (++argi < argc) {
device_id = strtol(argv[argi], NULL, 0);
if (!bacnet_string_to_uint32(argv[argi], &device_id)) {
fprintf(stderr, "device-instance=%s invalid\n", argv[argi]);
return 1;
}
}
} else if (strcmp(argv[argi], "--test") == 0) {
blinkt_test = true;
} else {
if (target_args == 0) {
device_id = strtol(argv[argi], NULL, 0);
if (!bacnet_string_to_uint32(argv[argi], &device_id)) {
fprintf(stderr, "device-instance=%s invalid\n", argv[argi]);
return 1;
}
target_args++;
}
}
+17 -9
View File
@@ -229,8 +229,8 @@ int main(int argc, char *argv[])
struct mstimer apdu_timer;
struct mstimer maintenance_timer;
bool found = false;
unsigned object_type = 0;
unsigned object_instance = 0;
unsigned long object_type = 0;
unsigned long object_instance = 0;
long dnet = -1;
BACNET_MAC_ADDRESS mac = { 0 };
BACNET_MAC_ADDRESS adr = { 0 };
@@ -264,7 +264,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= UINT16_MAX)) {
specific_address = true;
}
@@ -279,25 +282,30 @@ int main(int argc, char *argv[])
Verbose = true;
} else {
if (target_args == 0) {
object_instance = strtoul(argv[argi], NULL, 0);
if (!bacnet_strtoul(argv[argi], &object_instance)) {
fprintf(stderr, "device-instance=%s invalid\n", argv[argi]);
return 1;
}
if (object_instance > BACNET_MAX_INSTANCE) {
fprintf(
stderr, "device-instance=%u - not greater than %u\n",
stderr, "device-instance=%lu - not greater than %u\n",
object_instance, BACNET_MAX_INSTANCE);
return 1;
}
Target_Device_Object_Instance = object_instance;
target_args++;
} else if (target_args == 1) {
if (bactext_object_type_strtol(argv[argi], &object_type) ==
false) {
if (!bacnet_strtoul(argv[argi], &object_type)) {
fprintf(stderr, "object-type=%s invalid\n", argv[argi]);
return 1;
}
Target_Object_Type = object_type;
target_args++;
} else if (target_args == 2) {
object_instance = strtoul(argv[argi], NULL, 0);
if (!bacnet_strtoul(argv[argi], &object_instance)) {
fprintf(stderr, "object-instance=%s invalid\n", argv[argi]);
return 1;
}
if (object_instance > BACNET_MAX_INSTANCE) {
fprintf(
stderr, "object-instance=%u - not greater than %u\n",
@@ -306,7 +314,7 @@ int main(int argc, char *argv[])
}
Target_Object_Instance = object_instance;
if (Verbose) {
printf("Instance=%u=%s\n", object_instance, argv[argi]);
printf("Instance=%lu=%s\n", object_instance, argv[argi]);
}
target_args++;
}
+113 -30
View File
@@ -121,27 +121,59 @@ static void Init_Service_Handlers(void)
static void print_usage(const char *filename)
{
printf("Usage: %s device-instance state [timeout [password]]\n", filename);
printf(" [--dnet][--dadr][--mac]\n");
printf(" [--version][--help]\n");
}
static void print_help(const char *filename)
{
printf("Send BACnet DeviceCommunicationControl service to device.\n");
printf("\n");
printf("--mac A\n"
"Optional BACnet mac address. "
"Valid ranges are from 00 to FF (hex) for MS/TP or ARCNET,\n"
"or an IP string with optional port number like 10.1.2.3:47808\n"
"or an Ethernet MAC in hex like 00:21:70:7e:32:bb\n");
printf("\n");
printf("--dnet N\n"
"Optional BACnet network number N for directed requests.\n"
"Valid range is from 0 to 65535 where 0 is the local connection\n"
"and 65535 is network broadcast.\n");
printf("\n");
printf("--dadr A\n"
"Optional BACnet mac address on the destination BACnet network "
"number.\n"
"Valid ranges are from 00 to FF (hex) for MS/TP or ARCNET,\n"
"or an IP string with optional port number like 10.1.2.3:47808\n"
"or an Ethernet MAC in hex like 00:21:70:7e:32:bb\n");
printf("\n");
printf("device-instance:\n"
"BACnet Device Object Instance number that you are\n"
"trying to communicate to. This number will be used\n"
"to try and bind with the device using Who-Is and\n"
"I-Am services. For example, if you were writing\n"
"Device Object 123, the device-instance would be 123.\n");
printf("\n");
printf("state:\n"
"Possible state values:\n"
" 0=enable\n"
" 1=disable\n"
" 2=disable-initiation\n");
printf("\n");
printf("timeout:\n"
"The timeout can be 0 for infinite, or a value in minutes for "
"disable.\n");
printf("\n");
printf(
"Send BACnet DeviceCommunicationControl service to device.\n"
"\n"
"The device-instance can be 0 to %lu.\n"
"Possible state values:\n"
" 0=enable\n"
" 1=disable\n"
" 2=disable-initiation\n"
"The timeout can be 0 for infinite, or a value in minutes for "
"disable.\n"
"The optional password is a character string of 1 to 20 characters.\n"
"\nExample:\n"
"password:\n"
"The optional password is a character string of 1 to 20 characters.\n");
printf("\n");
printf(
"Example:\n"
"If you want disable Device Communications in Device 123\n"
"for 60 minutes with password 'filister', use the following command:\n"
"%s 123 1 60 filister\n",
(unsigned long)BACNET_MAX_INSTANCE, filename);
filename);
}
int main(int argc, char *argv[])
@@ -156,6 +188,13 @@ int main(int argc, char *argv[])
time_t timeout_seconds = 0;
uint8_t invoke_id = 0;
bool found = false;
long dnet = -1;
BACNET_MAC_ADDRESS mac = { 0 };
BACNET_MAC_ADDRESS adr = { 0 };
BACNET_ADDRESS dest = { 0 };
bool specific_address = false;
unsigned int target_args = 0;
uint32_t target_value = 0;
int argi = 0;
const char *filename = NULL;
@@ -175,31 +214,75 @@ int main(int argc, char *argv[])
"FITNESS FOR A PARTICULAR PURPOSE.\n");
return 0;
}
if (strcmp(argv[argi], "--mac") == 0) {
if (++argi < argc) {
if (bacnet_address_mac_from_ascii(&mac, argv[argi])) {
specific_address = true;
}
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= UINT16_MAX)) {
specific_address = true;
}
}
} else if (strcmp(argv[argi], "--dadr") == 0) {
if (++argi < argc) {
if (bacnet_address_mac_from_ascii(&adr, argv[argi])) {
specific_address = true;
}
}
} else {
/* unnamed arguments */
if (target_args == 0) {
if (!bacnet_string_to_uint32(
argv[argi], &Target_Device_Object_Instance)) {
fprintf(stderr, "device-instance=%s invalid\n", argv[argi]);
return 1;
}
if (Target_Device_Object_Instance > BACNET_MAX_INSTANCE) {
fprintf(
stderr, "device-instance=%u - not greater than %u\n",
Target_Device_Object_Instance, BACNET_MAX_INSTANCE);
return 1;
}
target_args++;
} else if (target_args == 1) {
if (!bacnet_string_to_uint32(argv[argi], &target_value)) {
fprintf(stderr, "state=%s invalid\n", argv[argi]);
return 1;
}
Communication_State =
(BACNET_COMMUNICATION_ENABLE_DISABLE)target_value;
target_args++;
} else if (target_args == 2) {
if (!bacnet_string_to_uint16(
argv[argi], &Communication_Timeout_Minutes)) {
fprintf(stderr, "timeout=%s invalid\n", argv[argi]);
return 1;
}
target_args++;
} else if (target_args == 3) {
Communication_Password = argv[argi];
target_args++;
}
}
}
if (argc < 3) {
print_usage(filename);
return 0;
}
/* decode the command line parameters */
Target_Device_Object_Instance = strtol(argv[1], NULL, 0);
Communication_State = (uint16_t)strtol(argv[2], NULL, 0);
/* optional timeout, required if password is included */
if (argc > 3) {
Communication_Timeout_Minutes = (uint16_t)strtol(argv[3], NULL, 0);
}
/* optional password */
if (argc > 4) {
Communication_Password = argv[4];
}
if (Target_Device_Object_Instance > BACNET_MAX_INSTANCE) {
fprintf(
stderr, "device-instance=%u - not greater than %u\n",
Target_Device_Object_Instance, BACNET_MAX_INSTANCE);
return 1;
}
/* setup my info */
Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
address_init();
if (specific_address) {
bacnet_address_init(&dest, &mac, dnet, &adr);
address_add(Target_Device_Object_Instance, MAX_APDU, &dest);
}
Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
Init_Service_Handlers();
dlenv_init();
atexit(datalink_cleanup);
+17 -9
View File
@@ -183,8 +183,8 @@ int main(int argc, char *argv[])
struct mstimer apdu_timer;
struct mstimer maintenance_timer;
bool found = false;
unsigned object_type = 0;
unsigned object_instance = 0;
unsigned long object_type = 0;
unsigned long object_instance = 0;
long dnet = -1;
BACNET_MAC_ADDRESS mac = { 0 };
BACNET_MAC_ADDRESS adr = { 0 };
@@ -218,7 +218,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= UINT16_MAX)) {
specific_address = true;
}
@@ -233,25 +236,30 @@ int main(int argc, char *argv[])
Verbose = true;
} else {
if (target_args == 0) {
object_instance = strtoul(argv[argi], NULL, 0);
if (!bacnet_strtoul(argv[argi], &object_instance)) {
fprintf(stderr, "device-instance=%s invalid\n", argv[argi]);
return 1;
}
if (object_instance > BACNET_MAX_INSTANCE) {
fprintf(
stderr, "device-instance=%u - not greater than %u\n",
stderr, "device-instance=%lu - not greater than %u\n",
object_instance, BACNET_MAX_INSTANCE);
return 1;
}
Target_Device_Object_Instance = object_instance;
target_args++;
} else if (target_args == 1) {
if (bactext_object_type_strtol(argv[argi], &object_type) ==
false) {
if (!bacnet_strtoul(argv[argi], &object_type)) {
fprintf(stderr, "object-type=%s invalid\n", argv[argi]);
return 1;
}
Target_Object_Type = object_type;
target_args++;
} else if (target_args == 2) {
object_instance = strtoul(argv[argi], NULL, 0);
if (!bacnet_strtoul(argv[argi], &object_instance)) {
fprintf(stderr, "object-instance=%s invalid\n", argv[argi]);
return 1;
}
if (object_instance > BACNET_MAX_INSTANCE) {
fprintf(
stderr, "object-instance=%u - not greater than %u\n",
@@ -260,7 +268,7 @@ int main(int argc, char *argv[])
}
Target_Object_Instance = object_instance;
if (Verbose) {
printf("Instance=%u=%s\n", object_instance, argv[argi]);
printf("Instance=%lu=%s\n", object_instance, argv[argi]);
}
target_args++;
}
+22 -34
View File
@@ -153,7 +153,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true;
}
@@ -166,16 +169,28 @@ int main(int argc, char *argv[])
}
} else {
if (target_args == 0) {
Target_Error_Class = strtol(argv[argi], NULL, 0);
if (!bacnet_string_to_uint16(argv[argi], &Target_Error_Class)) {
fprintf(stderr, "error-class=%s invalid\n", argv[argi]);
return 1;
}
target_args++;
} else if (target_args == 1) {
Target_Error_Code = strtol(argv[argi], NULL, 0);
if (!bacnet_string_to_uint16(argv[argi], &Target_Error_Code)) {
fprintf(stderr, "error-code=%s invalid\n", argv[argi]);
return 1;
}
target_args++;
} else if (target_args == 2) {
Target_Service = strtol(argv[argi], NULL, 0);
if (!bacnet_string_to_uint16(argv[argi], &Target_Service)) {
fprintf(stderr, "service=%s invalid\n", argv[argi]);
return 1;
}
target_args++;
} else if (target_args == 2) {
Target_Invoke_ID = strtol(argv[argi], NULL, 0);
} else if (target_args == 3) {
if (!bacnet_string_to_uint8(argv[argi], &Target_Invoke_ID)) {
fprintf(stderr, "invoke-id=%s invalid\n", argv[argi]);
return 1;
}
target_args++;
} else {
print_usage(filename);
@@ -185,34 +200,7 @@ int main(int argc, char *argv[])
}
address_init();
if (specific_address) {
if (adr.len && mac.len) {
memcpy(&dest.mac[0], &mac.adr[0], mac.len);
dest.mac_len = mac.len;
memcpy(&dest.adr[0], &adr.adr[0], adr.len);
dest.len = adr.len;
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
dest.net = dnet;
} else {
dest.net = BACNET_BROADCAST_NETWORK;
}
} else if (mac.len) {
memcpy(&dest.mac[0], &mac.adr[0], mac.len);
dest.mac_len = mac.len;
dest.len = 0;
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
dest.net = dnet;
} else {
dest.net = 0;
}
} else {
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
dest.net = dnet;
} else {
dest.net = BACNET_BROADCAST_NETWORK;
}
dest.mac_len = 0;
dest.len = 0;
}
bacnet_address_init(&dest, &mac, dnet, &adr);
}
/* setup my info */
Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
+27 -255
View File
@@ -232,9 +232,7 @@ static void print_help(const char *filename)
int main(int argc, char *argv[])
{
BACNET_EVENT_NOTIFICATION_DATA event_data = { 0 };
BACNET_BIT_STRING *pBitString;
BACNET_CHARACTER_STRING bcstring;
BACNET_PROPERTY_STATES tag = PROP_STATE_BOOLEAN_VALUE;
unsigned long long_value = 0;
BACNET_ADDRESS src = { 0 }; /* address where message came from */
unsigned timeout = 100; /* milliseconds */
uint16_t pdu_len = 0;
@@ -252,7 +250,6 @@ int main(int argc, char *argv[])
int argi = 0;
unsigned int target_args = 0;
const char *filename = NULL;
unsigned found_index = 0;
filename = filename_remove_path(argv[0]);
for (argi = 1; argi < argc; argi++) {
@@ -278,7 +275,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true;
}
@@ -292,226 +292,28 @@ int main(int argc, char *argv[])
} else {
if (target_args == 0) {
/* device-id */
Target_Device_Object_Instance = strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 1) {
/* process-id */
event_data.processIdentifier = strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 2) {
/* initiating-device-id */
event_data.initiatingObjectIdentifier.type = OBJECT_DEVICE;
event_data.initiatingObjectIdentifier.instance =
strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 3) {
/* event-object-type */
event_data.eventObjectIdentifier.type =
strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 4) {
/* event-object-instance */
event_data.eventObjectIdentifier.instance =
strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 5) {
/* sequence-number */
event_data.timeStamp.tag = TIME_STAMP_SEQUENCE;
event_data.timeStamp.value.sequenceNum =
strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 6) {
/* notification-class */
event_data.notificationClass = strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 7) {
/* priority */
event_data.priority = strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 8) {
/* message-text */
characterstring_init_ansi(&bcstring, argv[argi]);
event_data.messageText = &bcstring;
target_args++;
} else if (target_args == 9) {
/* notify-type */
if (bactext_notify_type_index(argv[argi], &found_index)) {
event_data.notifyType = found_index;
} else {
event_data.notifyType = strtol(argv[argi], NULL, 0);
}
target_args++;
} else if (target_args == 10) {
/* ack-required */
event_data.ackRequired = strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 11) {
/* from-state */
if (bactext_event_state_index(argv[argi], &found_index)) {
event_data.fromState = found_index;
} else {
event_data.fromState = strtol(argv[argi], NULL, 0);
}
target_args++;
} else if (target_args == 12) {
/* to-state */
if (bactext_event_state_index(argv[argi], &found_index)) {
event_data.toState = found_index;
} else {
event_data.toState = strtol(argv[argi], NULL, 0);
}
target_args++;
} else if (target_args == 13) {
/* event-type - see BACNET_EVENT_TYPE */
if (bactext_event_type_index(argv[argi], &found_index)) {
event_data.eventType = found_index;
} else {
event_data.eventType = strtol(argv[argi], NULL, 0);
}
target_args++;
} else {
if (event_data.eventType == EVENT_CHANGE_OF_BITSTRING) {
if (target_args == 14) {
pBitString =
&event_data.notificationParams.changeOfBitstring
.referencedBitString;
bitstring_init_ascii(pBitString, argv[argi]);
target_args++;
} else if (target_args == 15) {
pBitString = &event_data.notificationParams
.changeOfBitstring.statusFlags;
bitstring_init_ascii(pBitString, argv[argi]);
target_args++;
} else {
print_usage(filename);
return 1;
}
} else if (event_data.eventType == EVENT_CHANGE_OF_STATE) {
if (target_args == 14) {
tag = strtol(argv[argi], NULL, 0);
event_data.notificationParams.changeOfState.newState
.tag = tag;
target_args++;
} else if (target_args == 15) {
if (tag == PROP_STATE_BOOLEAN_VALUE) {
event_data.notificationParams.changeOfState.newState
.state.booleanValue =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_BINARY_VALUE) {
event_data.notificationParams.changeOfState.newState
.state.binaryValue =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_EVENT_TYPE) {
event_data.notificationParams.changeOfState.newState
.state.eventType = strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_POLARITY) {
event_data.notificationParams.changeOfState.newState
.state.polarity = strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_PROGRAM_CHANGE) {
event_data.notificationParams.changeOfState.newState
.state.programChange =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_PROGRAM_STATE) {
event_data.notificationParams.changeOfState.newState
.state.programState =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_REASON_FOR_HALT) {
event_data.notificationParams.changeOfState.newState
.state.programError =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_RELIABILITY) {
event_data.notificationParams.changeOfState.newState
.state.reliability =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_EVENT_STATE) {
event_data.notificationParams.changeOfState.newState
.state.state = strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_SYSTEM_STATUS) {
event_data.notificationParams.changeOfState.newState
.state.systemStatus =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_UNITS) {
event_data.notificationParams.changeOfState.newState
.state.units = strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_UNSIGNED_VALUE) {
event_data.notificationParams.changeOfState.newState
.state.unsignedValue =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_LIFE_SAFETY_MODE) {
event_data.notificationParams.changeOfState.newState
.state.lifeSafetyMode =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_LIFE_SAFETY_STATE) {
event_data.notificationParams.changeOfState.newState
.state.lifeSafetyState =
strtol(argv[argi], NULL, 0);
} else {
printf("Invalid Change-Of-State Tag\n");
return 1;
}
target_args++;
} else if (target_args == 16) {
pBitString = &event_data.notificationParams
.changeOfBitstring.statusFlags;
bitstring_init_ascii(pBitString, argv[argi]);
target_args++;
} else {
print_usage(filename);
return 1;
}
} else if (event_data.eventType == EVENT_CHANGE_OF_VALUE) {
/* FIXME: add event type parameters */
} else if (event_data.eventType == EVENT_COMMAND_FAILURE) {
/* FIXME: add event type parameters */
} else if (event_data.eventType == EVENT_FLOATING_LIMIT) {
/* FIXME: add event type parameters */
} else if (event_data.eventType == EVENT_OUT_OF_RANGE) {
/* FIXME: add event type parameters */
} else if (
event_data.eventType == EVENT_CHANGE_OF_LIFE_SAFETY) {
/* FIXME: add event type parameters */
} else if (event_data.eventType == EVENT_EXTENDED) {
/* FIXME: add event type parameters */
} else if (event_data.eventType == EVENT_BUFFER_READY) {
/* FIXME: add event type parameters */
} else if (event_data.eventType == EVENT_UNSIGNED_RANGE) {
/* FIXME: add event type parameters */
} else if (event_data.eventType == EVENT_ACCESS_EVENT) {
/* FIXME: add event type parameters */
} else if (event_data.eventType == EVENT_DOUBLE_OUT_OF_RANGE) {
/* FIXME: add event type parameters */
} else if (event_data.eventType == EVENT_SIGNED_OUT_OF_RANGE) {
/* FIXME: add event type parameters */
} else if (
event_data.eventType == EVENT_UNSIGNED_OUT_OF_RANGE) {
/* FIXME: add event type parameters */
} else if (
event_data.eventType == EVENT_CHANGE_OF_CHARACTERSTRING) {
/* FIXME: add event type parameters */
} else if (
event_data.eventType == EVENT_CHANGE_OF_STATUS_FLAGS) {
/* FIXME: add event type parameters */
} else if (
event_data.eventType == EVENT_CHANGE_OF_RELIABILITY) {
/* FIXME: add event type parameters */
} else if (event_data.eventType == EVENT_NONE) {
/* FIXME: add event type parameters */
} else if (
event_data.eventType == EVENT_CHANGE_OF_DISCRETE_VALUE) {
/* FIXME: add event type parameters */
} else if (event_data.eventType == EVENT_CHANGE_OF_TIMER) {
/* FIXME: add event type parameters */
} else if (
(event_data.eventType >= EVENT_PROPRIETARY_MIN) &&
(event_data.eventType <= EVENT_PROPRIETARY_MAX)) {
/* Enumerated values 64-65535 may
be used by others subject to
the procedures and constraints
described in Clause 23. */
} else {
print_usage(filename);
if (!bacnet_strtoul(argv[argi], &long_value)) {
fprintf(stderr, "device-id=%s invalid\n", argv[argi]);
return 1;
}
if (long_value > BACNET_MAX_INSTANCE) {
fprintf(
stderr, "device-id=%lu - exceeds %u\n", long_value,
BACNET_MAX_INSTANCE);
return 1;
}
Target_Device_Object_Instance = (uint32_t)long_value;
target_args++;
} else if (target_args == 1) {
if (!event_notify_parse(
&event_data, argc - argi, &argv[argi])) {
fprintf(stderr, "event=%s invalid\n", argv[argi]);
} else {
target_args++;
}
} else {
print_usage(filename);
return 1;
}
}
}
@@ -519,42 +321,12 @@ int main(int argc, char *argv[])
print_usage(filename);
return 0;
}
/* setup my info */
address_init();
if (specific_address) {
if (adr.len && mac.len) {
memcpy(&dest.mac[0], &mac.adr[0], mac.len);
dest.mac_len = mac.len;
memcpy(&dest.adr[0], &adr.adr[0], adr.len);
dest.len = adr.len;
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
dest.net = dnet;
} else {
dest.net = BACNET_BROADCAST_NETWORK;
}
} else if (mac.len) {
memcpy(&dest.mac[0], &mac.adr[0], mac.len);
dest.mac_len = mac.len;
dest.len = 0;
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
dest.net = dnet;
} else {
dest.net = 0;
}
} else {
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
dest.net = dnet;
} else {
dest.net = BACNET_BROADCAST_NETWORK;
}
dest.mac_len = 0;
dest.len = 0;
}
bacnet_address_init(&dest, &mac, dnet, &adr);
address_add(Target_Device_Object_Instance, MAX_APDU, &dest);
printf(
"Added Device %u to address cache\n",
Target_Device_Object_Instance);
}
/* setup my info */
Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
Init_Service_Handlers();
dlenv_init();
+4 -1
View File
@@ -178,7 +178,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true;
}
+4 -1
View File
@@ -279,7 +279,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true;
}
+4 -1
View File
@@ -390,7 +390,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= UINT16_MAX)) {
specific_address = true;
}
+42 -19
View File
@@ -235,12 +235,12 @@ int main(int argc, char *argv[])
bool found = false;
char *value_string = NULL;
bool status = false;
unsigned context_tag = 0;
unsigned long context_tag = 0;
BACNET_APPLICATION_DATA_VALUE *application_value = NULL;
unsigned object_type = 0;
unsigned object_instance = 0;
unsigned property_id = 0;
unsigned property_array_index = 0;
unsigned long object_type = 0;
unsigned long object_instance = 0;
uint32_t property_id = 0;
long property_array_index = 0;
long property_tag = 0;
long dnet = -1;
BACNET_MAC_ADDRESS mac = { 0 };
@@ -275,7 +275,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= UINT16_MAX)) {
specific_address = true;
}
@@ -290,34 +293,39 @@ int main(int argc, char *argv[])
Verbose = true;
} else {
if (target_args == 0) {
object_instance = strtoul(argv[argi], NULL, 0);
if (!bacnet_strtoul(argv[argi], &object_instance)) {
fprintf(stderr, "device-instance=%s invalid\n", argv[argi]);
return 1;
}
if (object_instance > BACNET_MAX_INSTANCE) {
fprintf(
stderr, "device-instance=%u - not greater than %u\n",
stderr, "device-instance=%lu - not greater than %u\n",
object_instance, BACNET_MAX_INSTANCE);
return 1;
}
Target_Device_Object_Instance = object_instance;
target_args++;
} else if (target_args == 1) {
if (bactext_object_type_strtol(argv[argi], &object_type) ==
false) {
if (!bacnet_strtoul(argv[argi], &object_type)) {
fprintf(stderr, "object-type=%s invalid\n", argv[argi]);
return 1;
}
Target_Object_Type = object_type;
target_args++;
} else if (target_args == 2) {
object_instance = strtoul(argv[argi], NULL, 0);
if (!bacnet_strtoul(argv[argi], &object_instance)) {
fprintf(stderr, "object-instance=%s invalid\n", argv[argi]);
return 1;
}
if (object_instance > BACNET_MAX_INSTANCE) {
fprintf(
stderr, "device-instance=%u - not greater than %u\n",
stderr, "object-instance=%u - not greater than %u\n",
Target_Device_Object_Instance, BACNET_MAX_INSTANCE);
return 1;
}
Target_Object_Instance = object_instance;
if (Verbose) {
printf("Instance=%u=%s\n", object_instance, argv[argi]);
printf("Instance=%lu=%s\n", object_instance, argv[argi]);
}
target_args++;
} else if (target_args == 3) {
@@ -332,11 +340,19 @@ int main(int argc, char *argv[])
}
target_args++;
} else if (target_args == 4) {
property_array_index = strtol(argv[argi], NULL, 0);
Target_Object_Array_Index = property_array_index;
if (!bacnet_strtol(argv[argi], &property_array_index)) {
fprintf(stderr, "array-index=%s invalid\n", argv[argi]);
return 1;
}
if (property_array_index < 0) {
Target_Object_Array_Index = BACNET_ARRAY_ALL;
} else {
Target_Object_Array_Index =
(BACNET_ARRAY_INDEX)property_array_index;
}
if (Verbose) {
printf(
"Array_Index=%i=%s\n", property_array_index,
"Array_Index=%li=%s\n", property_array_index,
argv[argi]);
}
target_args++;
@@ -347,15 +363,22 @@ int main(int argc, char *argv[])
if (tag_value_arg == 0) {
/* special case for context tagged values */
if (toupper(argv[argi][0]) == 'C') {
context_tag = strtoul(&argv[target_args][1], NULL, 0);
if (!bacnet_strtoul(
&argv[target_args][1], &context_tag)) {
fprintf(stderr, "tag=%s invalid\n", argv[argi]);
return 1;
}
application_value->context_tag = context_tag;
application_value->context_specific = true;
argi++;
} else {
application_value->context_specific = false;
}
/* application tag */
property_tag = strtol(argv[argi], NULL, 0);
/* property application tag */
if (!bacnet_strtol(argv[argi], &property_tag)) {
fprintf(stderr, "tag=%s invalid\n", argv[argi]);
return 1;
}
if (Verbose) {
printf("tag=%ld\n", property_tag);
}
+1 -1
View File
@@ -297,7 +297,7 @@ int main(int argc, char *argv[])
/* Handle command-line arguments */
if (argc > 1) {
device_instance = strtoul(argv[1], NULL, 10);
bacnet_string_to_uint32(argv[1], &device_instance);
}
Device_Set_Object_Instance_Number(device_instance);
printf("BACnet Device ID: %u\n", device_instance);
+4 -1
View File
@@ -186,7 +186,10 @@ int main(int argc, char *argv[])
}
if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
global_broadcast = false;
}
+12 -198
View File
@@ -89,9 +89,6 @@ static void print_help(const char *filename)
int main(int argc, char *argv[])
{
BACNET_EVENT_NOTIFICATION_DATA event_data = { 0 };
BACNET_BIT_STRING *pBitString;
BACNET_CHARACTER_STRING bcstring;
BACNET_PROPERTY_STATES tag = PROP_STATE_BOOLEAN_VALUE;
long dnet = -1;
BACNET_MAC_ADDRESS mac = { 0 };
BACNET_MAC_ADDRESS adr = { 0 };
@@ -125,7 +122,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true;
}
@@ -138,206 +138,20 @@ int main(int argc, char *argv[])
}
} else {
if (target_args == 0) {
event_data.processIdentifier = strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 1) {
event_data.initiatingObjectIdentifier.type =
strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 2) {
event_data.initiatingObjectIdentifier.instance =
strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 3) {
event_data.eventObjectIdentifier.type =
strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 4) {
event_data.eventObjectIdentifier.instance =
strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 5) {
event_data.timeStamp.tag = TIME_STAMP_SEQUENCE;
event_data.timeStamp.value.sequenceNum =
strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 6) {
event_data.notificationClass = strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 7) {
event_data.priority = strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 8) {
event_data.eventType = strtol(argv[argi], NULL, 0);
target_args++;
} else {
if (event_data.eventType == EVENT_CHANGE_OF_BITSTRING) {
if (target_args == 9) {
pBitString =
&event_data.notificationParams.changeOfBitstring
.referencedBitString;
bitstring_init_ascii(pBitString, argv[argi]);
target_args++;
} else if (target_args == 10) {
pBitString = &event_data.notificationParams
.changeOfBitstring.statusFlags;
bitstring_init_ascii(pBitString, argv[argi]);
target_args++;
} else if (target_args == 11) {
characterstring_init_ansi(&bcstring, argv[argi]);
event_data.messageText = &bcstring;
target_args++;
} else if (target_args == 12) {
event_data.notifyType = strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 13) {
event_data.ackRequired = strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 14) {
event_data.fromState = strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 15) {
event_data.toState = strtol(argv[argi], NULL, 0);
target_args++;
} else {
print_usage(filename);
return 1;
}
} else if (event_data.eventType == EVENT_CHANGE_OF_STATE) {
if (target_args == 9) {
tag = strtol(argv[argi], NULL, 0);
event_data.notificationParams.changeOfState.newState
.tag = tag;
target_args++;
} else if (target_args == 10) {
if (tag == PROP_STATE_BOOLEAN_VALUE) {
event_data.notificationParams.changeOfState.newState
.state.booleanValue =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_BINARY_VALUE) {
event_data.notificationParams.changeOfState.newState
.state.binaryValue =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_EVENT_TYPE) {
event_data.notificationParams.changeOfState.newState
.state.eventType = strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_POLARITY) {
event_data.notificationParams.changeOfState.newState
.state.polarity = strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_PROGRAM_CHANGE) {
event_data.notificationParams.changeOfState.newState
.state.programChange =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_PROGRAM_STATE) {
event_data.notificationParams.changeOfState.newState
.state.programState =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_REASON_FOR_HALT) {
event_data.notificationParams.changeOfState.newState
.state.programError =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_RELIABILITY) {
event_data.notificationParams.changeOfState.newState
.state.reliability =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_EVENT_STATE) {
event_data.notificationParams.changeOfState.newState
.state.state = strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_SYSTEM_STATUS) {
event_data.notificationParams.changeOfState.newState
.state.systemStatus =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_UNITS) {
event_data.notificationParams.changeOfState.newState
.state.units = strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_UNSIGNED_VALUE) {
event_data.notificationParams.changeOfState.newState
.state.unsignedValue =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_LIFE_SAFETY_MODE) {
event_data.notificationParams.changeOfState.newState
.state.lifeSafetyMode =
strtol(argv[argi], NULL, 0);
} else if (tag == PROP_STATE_LIFE_SAFETY_STATE) {
event_data.notificationParams.changeOfState.newState
.state.lifeSafetyState =
strtol(argv[argi], NULL, 0);
} else {
printf("Invalid Change-Of-State Tag\n");
return 1;
}
target_args++;
} else if (target_args == 11) {
pBitString = &event_data.notificationParams
.changeOfBitstring.statusFlags;
bitstring_init_ascii(pBitString, argv[argi]);
target_args++;
} else if (target_args == 12) {
characterstring_init_ansi(&bcstring, argv[argi]);
event_data.messageText = &bcstring;
target_args++;
} else if (target_args == 13) {
event_data.notifyType = strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 14) {
event_data.ackRequired = strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 15) {
event_data.fromState = strtol(argv[argi], NULL, 0);
target_args++;
} else if (target_args == 16) {
event_data.toState = strtol(argv[argi], NULL, 0);
target_args++;
} else {
print_usage(filename);
return 1;
}
} else if (event_data.eventType == EVENT_CHANGE_OF_VALUE) {
} else if (event_data.eventType == EVENT_COMMAND_FAILURE) {
} else if (event_data.eventType == EVENT_FLOATING_LIMIT) {
} else if (event_data.eventType == EVENT_OUT_OF_RANGE) {
} else if (
event_data.eventType == EVENT_CHANGE_OF_LIFE_SAFETY) {
} else if (event_data.eventType == EVENT_EXTENDED) {
} else if (event_data.eventType == EVENT_BUFFER_READY) {
} else if (event_data.eventType == EVENT_UNSIGNED_RANGE) {
if (!event_notify_parse(
&event_data, argc - argi, &argv[argi])) {
fprintf(stderr, "event=%s invalid\n", argv[argi]);
} else {
print_usage(filename);
return 1;
target_args++;
}
} else {
print_usage(filename);
return 1;
}
}
}
address_init();
if (specific_address) {
if (adr.len && mac.len) {
memcpy(&dest.mac[0], &mac.adr[0], mac.len);
dest.mac_len = mac.len;
memcpy(&dest.adr[0], &adr.adr[0], adr.len);
dest.len = adr.len;
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
dest.net = dnet;
} else {
dest.net = BACNET_BROADCAST_NETWORK;
}
} else if (mac.len) {
memcpy(&dest.mac[0], &mac.adr[0], mac.len);
dest.mac_len = mac.len;
dest.len = 0;
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
dest.net = dnet;
} else {
dest.net = 0;
}
} else {
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
dest.net = dnet;
} else {
dest.net = BACNET_BROADCAST_NETWORK;
}
dest.mac_len = 0;
dest.len = 0;
}
bacnet_address_init(&dest, &mac, dnet, &adr);
}
/* setup my info */
Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
+4 -1
View File
@@ -224,7 +224,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
global_broadcast = false;
}
+4 -1
View File
@@ -383,7 +383,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
global_broadcast = false;
}
+4 -1
View File
@@ -279,7 +279,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true;
}
+4 -1
View File
@@ -236,7 +236,10 @@ int main(int argc, char *argv[])
}
} else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) {
dnet = strtol(argv[argi], NULL, 0);
if (!bacnet_strtol(argv[argi], &dnet)) {
fprintf(stderr, "dnet=%s invalid\n", argv[argi]);
return 1;
}
if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true;
}