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
+1
View File
@@ -35,6 +35,7 @@ The git repositories are hosted at the following sites:
### Changed ### Changed
* Changed apps to use common BACnet value string parsing functions. (#1152)
* Changed basic object API for units properties to use BACNET_ENGINEERING_UNITS * Changed basic object API for units properties to use BACNET_ENGINEERING_UNITS
datatype. (#1104) datatype. (#1104)
* Changed all the property list values into int32_t to support the larger * Changed all the property list values into int32_t to support the larger
+35 -34
View File
@@ -121,6 +121,8 @@ int main(int argc, char *argv[])
BACNET_MAC_ADDRESS mac = { 0 }; BACNET_MAC_ADDRESS mac = { 0 };
BACNET_MAC_ADDRESS adr = { 0 }; BACNET_MAC_ADDRESS adr = { 0 };
BACNET_ADDRESS dest = { 0 }; BACNET_ADDRESS dest = { 0 };
unsigned long long_value = 0;
bool server = false;
bool specific_address = false; bool specific_address = false;
int argi = 0; int argi = 0;
unsigned int target_args = 0; unsigned int target_args = 0;
@@ -150,7 +152,10 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--dnet") == 0) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true; specific_address = true;
} }
@@ -163,13 +168,37 @@ int main(int argc, char *argv[])
} }
} else { } else {
if (target_args == 0) { 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++; target_args++;
} else if (target_args == 1) { } 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++; target_args++;
} else if (target_args == 2) { } 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++; target_args++;
} else { } else {
print_usage(filename); print_usage(filename);
@@ -177,41 +206,13 @@ int main(int argc, char *argv[])
} }
} }
} }
address_init(); /* setup my info */
if (specific_address) { if (specific_address) {
if (adr.len && mac.len) { bacnet_address_init(&dest, &mac, dnet, &adr);
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;
}
} }
/* setup my info */ /* setup my info */
Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE); Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
Init_Service_Handlers(); Init_Service_Handlers();
address_init();
dlenv_init(); dlenv_init();
atexit(datalink_cleanup); atexit(datalink_cleanup);
/* send the request */ /* send the request */
+61 -41
View File
@@ -220,7 +220,8 @@ int main(int argc, char *argv[])
time_t timeout_seconds = 0; time_t timeout_seconds = 0;
bool found = false; bool found = false;
long dnet = -1; 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 mac = { 0 };
BACNET_MAC_ADDRESS adr = { 0 }; BACNET_MAC_ADDRESS adr = { 0 };
BACNET_ADDRESS dest = { 0 }; BACNET_ADDRESS dest = { 0 };
@@ -253,7 +254,10 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--dnet") == 0) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true; specific_address = true;
} }
@@ -267,26 +271,56 @@ int main(int argc, char *argv[])
} else { } else {
if (target_args == 0) { if (target_args == 0) {
/* device-id */ /* 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++; target_args++;
} else if (target_args == 1) { } else if (target_args == 1) {
/* process-id */ /* 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++; target_args++;
} else if (target_args == 2) { } else if (target_args == 2) {
/* event-object-type */ /* event-object-type */
if (bactext_object_type_strtol(argv[argi], &object_type)) { if (!bactext_object_type_strtol(argv[argi], &object_type)) {
data.eventObjectIdentifier.type = object_type;
target_args++;
} else {
fprintf( fprintf(
stderr, "event-object-type=%s invalid\n", argv[argi]); stderr, "event-object-type=%s invalid\n", argv[argi]);
return 1; return 1;
} }
data.eventObjectIdentifier.type = object_type;
target_args++;
} else if (target_args == 3) { } else if (target_args == 3) {
/* event-object-instance */ /* event-object-instance */
data.eventObjectIdentifier.instance = if (!bacnet_strtoul(argv[argi], &long_value)) {
strtol(argv[argi], NULL, 0); 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++; target_args++;
} else if (target_args == 4) { } else if (target_args == 4) {
/* event-state-acked */ /* event-state-acked */
@@ -299,15 +333,27 @@ int main(int argc, char *argv[])
} }
} else if (target_args == 5) { } else if (target_args == 5) {
/* event-time-stamp */ /* 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++; target_args++;
} else if (target_args == 6) { } else if (target_args == 6) {
/* ack-source */ /* 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++; target_args++;
} else if (target_args == 7) { } else if (target_args == 7) {
/* ack-time-stamp */ /* 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++; target_args++;
} else { } else {
print_usage(filename); print_usage(filename);
@@ -319,36 +365,10 @@ int main(int argc, char *argv[])
print_usage(filename); print_usage(filename);
return 0; return 0;
} }
/* setup my info */
address_init(); address_init();
if (specific_address) { if (specific_address) {
if (adr.len && mac.len) { bacnet_address_init(&dest, &mac, dnet, &adr);
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;
}
address_add(Target_Device_Object_Instance, MAX_APDU, &dest); address_add(Target_Device_Object_Instance, MAX_APDU, &dest);
printf( printf(
"Added Device %u to address cache\n", "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" printf("Add a BACnetLIST element to a property of an object\n"
"in a BACnet device.\n"); "in a BACnet device.\n");
printf("\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" printf("device-instance:\n"
"BACnet Device Object Instance number that you are\n" "BACnet Device Object Instance number that you are\n"
"trying to communicate to. This number will be used\n" "trying to communicate to. This number will be used\n"
@@ -234,12 +252,12 @@ int main(int argc, char *argv[])
bool found = false; bool found = false;
char *value_string = NULL; char *value_string = NULL;
bool status = false; bool status = false;
unsigned context_tag = 0; unsigned long context_tag = 0;
BACNET_APPLICATION_DATA_VALUE *application_value = NULL; BACNET_APPLICATION_DATA_VALUE *application_value = NULL;
unsigned object_type = 0; uint32_t object_type = 0;
unsigned object_instance = 0; unsigned long object_instance = 0;
unsigned property_id = 0; uint32_t property_id = 0;
unsigned property_array_index = 0; long property_array_index = 0;
long property_tag = 0; long property_tag = 0;
long dnet = -1; long dnet = -1;
BACNET_MAC_ADDRESS mac = { 0 }; BACNET_MAC_ADDRESS mac = { 0 };
@@ -274,7 +292,10 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--dnet") == 0) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= UINT16_MAX)) {
specific_address = true; specific_address = true;
} }
@@ -289,39 +310,43 @@ int main(int argc, char *argv[])
Verbose = true; Verbose = true;
} else { } else {
if (target_args == 0) { 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) { if (object_instance > BACNET_MAX_INSTANCE) {
fprintf( fprintf(
stderr, "device-instance=%u - not greater than %u\n", stderr, "device-instance=%lu - not greater than %u\n",
object_instance, BACNET_MAX_INSTANCE); object_instance, BACNET_MAX_INSTANCE);
return 1; return 1;
} }
Target_Device_Object_Instance = object_instance; Target_Device_Object_Instance = object_instance;
target_args++; target_args++;
} else if (target_args == 1) { } else if (target_args == 1) {
if (bactext_object_type_strtol(argv[argi], &object_type) == if (!bactext_object_type_strtol(argv[argi], &object_type)) {
false) {
fprintf(stderr, "object-type=%s invalid\n", argv[argi]); fprintf(stderr, "object-type=%s invalid\n", argv[argi]);
return 1; return 1;
} }
Target_Object_Type = object_type; Target_Object_Type = object_type;
target_args++; target_args++;
} else if (target_args == 2) { } 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) { if (object_instance > BACNET_MAX_INSTANCE) {
fprintf( 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); Target_Device_Object_Instance, BACNET_MAX_INSTANCE);
return 1; return 1;
} }
Target_Object_Instance = object_instance; Target_Object_Instance = object_instance;
if (Verbose) { if (Verbose) {
printf("Instance=%u=%s\n", object_instance, argv[argi]); printf("Instance=%lu=%s\n", object_instance, argv[argi]);
} }
target_args++; target_args++;
} else if (target_args == 3) { } else if (target_args == 3) {
if (bactext_property_strtol(argv[argi], &property_id) == if (!bactext_property_strtol(argv[argi], &property_id)) {
false) {
fprintf(stderr, "property=%s invalid\n", argv[argi]); fprintf(stderr, "property=%s invalid\n", argv[argi]);
return 1; return 1;
} }
@@ -331,11 +356,18 @@ int main(int argc, char *argv[])
} }
target_args++; target_args++;
} else if (target_args == 4) { } else if (target_args == 4) {
property_array_index = strtol(argv[argi], NULL, 0); if (!bacnet_strtol(argv[argi], &property_array_index)) {
Target_Object_Array_Index = 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) { if (Verbose) {
printf( printf(
"Array_Index=%i=%s\n", property_array_index, "Array_Index=%li=%s\n", property_array_index,
argv[argi]); argv[argi]);
} }
target_args++; target_args++;
@@ -346,7 +378,11 @@ int main(int argc, char *argv[])
if (tag_value_arg == 0) { if (tag_value_arg == 0) {
/* special case for context tagged values */ /* special case for context tagged values */
if (toupper(argv[argi][0]) == 'C') { 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_tag = context_tag;
application_value->context_specific = true; application_value->context_specific = true;
argi++; argi++;
@@ -354,7 +390,10 @@ int main(int argc, char *argv[])
application_value->context_specific = false; application_value->context_specific = false;
} }
/* application tag */ /* 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) { if (Verbose) {
printf("tag=%ld\n", property_tag); 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) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true; specific_address = true;
} }
@@ -359,7 +362,11 @@ int main(int argc, char *argv[])
} }
} else { } else {
if (target_args == 0) { 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++; target_args++;
} else if (target_args == 1) { } else if (target_args == 1) {
APDU_Hex_ASCII = argv[argi]; 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 (strcmp(argv[argi], "--device") == 0) {
if (++argi < argc) { 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) { } else if (strcmp(argv[argi], "--test") == 0) {
blinkt_test = true; blinkt_test = true;
} else { } else {
if (target_args == 0) { 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++; target_args++;
} }
} }
+17 -9
View File
@@ -229,8 +229,8 @@ int main(int argc, char *argv[])
struct mstimer apdu_timer; struct mstimer apdu_timer;
struct mstimer maintenance_timer; struct mstimer maintenance_timer;
bool found = false; bool found = false;
unsigned object_type = 0; unsigned long object_type = 0;
unsigned object_instance = 0; unsigned long object_instance = 0;
long dnet = -1; long dnet = -1;
BACNET_MAC_ADDRESS mac = { 0 }; BACNET_MAC_ADDRESS mac = { 0 };
BACNET_MAC_ADDRESS adr = { 0 }; BACNET_MAC_ADDRESS adr = { 0 };
@@ -264,7 +264,10 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--dnet") == 0) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= UINT16_MAX)) {
specific_address = true; specific_address = true;
} }
@@ -279,25 +282,30 @@ int main(int argc, char *argv[])
Verbose = true; Verbose = true;
} else { } else {
if (target_args == 0) { 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) { if (object_instance > BACNET_MAX_INSTANCE) {
fprintf( fprintf(
stderr, "device-instance=%u - not greater than %u\n", stderr, "device-instance=%lu - not greater than %u\n",
object_instance, BACNET_MAX_INSTANCE); object_instance, BACNET_MAX_INSTANCE);
return 1; return 1;
} }
Target_Device_Object_Instance = object_instance; Target_Device_Object_Instance = object_instance;
target_args++; target_args++;
} else if (target_args == 1) { } else if (target_args == 1) {
if (bactext_object_type_strtol(argv[argi], &object_type) == if (!bacnet_strtoul(argv[argi], &object_type)) {
false) {
fprintf(stderr, "object-type=%s invalid\n", argv[argi]); fprintf(stderr, "object-type=%s invalid\n", argv[argi]);
return 1; return 1;
} }
Target_Object_Type = object_type; Target_Object_Type = object_type;
target_args++; target_args++;
} else if (target_args == 2) { } 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) { if (object_instance > BACNET_MAX_INSTANCE) {
fprintf( fprintf(
stderr, "object-instance=%u - not greater than %u\n", stderr, "object-instance=%u - not greater than %u\n",
@@ -306,7 +314,7 @@ int main(int argc, char *argv[])
} }
Target_Object_Instance = object_instance; Target_Object_Instance = object_instance;
if (Verbose) { if (Verbose) {
printf("Instance=%u=%s\n", object_instance, argv[argi]); printf("Instance=%lu=%s\n", object_instance, argv[argi]);
} }
target_args++; target_args++;
} }
+113 -30
View File
@@ -121,27 +121,59 @@ static void Init_Service_Handlers(void)
static void print_usage(const char *filename) static void print_usage(const char *filename)
{ {
printf("Usage: %s device-instance state [timeout [password]]\n", filename); printf("Usage: %s device-instance state [timeout [password]]\n", filename);
printf(" [--dnet][--dadr][--mac]\n");
printf(" [--version][--help]\n"); printf(" [--version][--help]\n");
} }
static void print_help(const char *filename) 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( printf(
"Send BACnet DeviceCommunicationControl service to device.\n" "password:\n"
"\n" "The optional password is a character string of 1 to 20 characters.\n");
"The device-instance can be 0 to %lu.\n" printf("\n");
"Possible state values:\n" printf(
" 0=enable\n" "Example:\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"
"If you want disable Device Communications in Device 123\n" "If you want disable Device Communications in Device 123\n"
"for 60 minutes with password 'filister', use the following command:\n" "for 60 minutes with password 'filister', use the following command:\n"
"%s 123 1 60 filister\n", "%s 123 1 60 filister\n",
(unsigned long)BACNET_MAX_INSTANCE, filename); filename);
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@@ -156,6 +188,13 @@ int main(int argc, char *argv[])
time_t timeout_seconds = 0; time_t timeout_seconds = 0;
uint8_t invoke_id = 0; uint8_t invoke_id = 0;
bool found = false; 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; int argi = 0;
const char *filename = NULL; const char *filename = NULL;
@@ -175,31 +214,75 @@ int main(int argc, char *argv[])
"FITNESS FOR A PARTICULAR PURPOSE.\n"); "FITNESS FOR A PARTICULAR PURPOSE.\n");
return 0; 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) { if (argc < 3) {
print_usage(filename); print_usage(filename);
return 0; 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 */ /* setup my info */
Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
address_init(); 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(); Init_Service_Handlers();
dlenv_init(); dlenv_init();
atexit(datalink_cleanup); atexit(datalink_cleanup);
+17 -9
View File
@@ -183,8 +183,8 @@ int main(int argc, char *argv[])
struct mstimer apdu_timer; struct mstimer apdu_timer;
struct mstimer maintenance_timer; struct mstimer maintenance_timer;
bool found = false; bool found = false;
unsigned object_type = 0; unsigned long object_type = 0;
unsigned object_instance = 0; unsigned long object_instance = 0;
long dnet = -1; long dnet = -1;
BACNET_MAC_ADDRESS mac = { 0 }; BACNET_MAC_ADDRESS mac = { 0 };
BACNET_MAC_ADDRESS adr = { 0 }; BACNET_MAC_ADDRESS adr = { 0 };
@@ -218,7 +218,10 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--dnet") == 0) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= UINT16_MAX)) {
specific_address = true; specific_address = true;
} }
@@ -233,25 +236,30 @@ int main(int argc, char *argv[])
Verbose = true; Verbose = true;
} else { } else {
if (target_args == 0) { 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) { if (object_instance > BACNET_MAX_INSTANCE) {
fprintf( fprintf(
stderr, "device-instance=%u - not greater than %u\n", stderr, "device-instance=%lu - not greater than %u\n",
object_instance, BACNET_MAX_INSTANCE); object_instance, BACNET_MAX_INSTANCE);
return 1; return 1;
} }
Target_Device_Object_Instance = object_instance; Target_Device_Object_Instance = object_instance;
target_args++; target_args++;
} else if (target_args == 1) { } else if (target_args == 1) {
if (bactext_object_type_strtol(argv[argi], &object_type) == if (!bacnet_strtoul(argv[argi], &object_type)) {
false) {
fprintf(stderr, "object-type=%s invalid\n", argv[argi]); fprintf(stderr, "object-type=%s invalid\n", argv[argi]);
return 1; return 1;
} }
Target_Object_Type = object_type; Target_Object_Type = object_type;
target_args++; target_args++;
} else if (target_args == 2) { } 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) { if (object_instance > BACNET_MAX_INSTANCE) {
fprintf( fprintf(
stderr, "object-instance=%u - not greater than %u\n", stderr, "object-instance=%u - not greater than %u\n",
@@ -260,7 +268,7 @@ int main(int argc, char *argv[])
} }
Target_Object_Instance = object_instance; Target_Object_Instance = object_instance;
if (Verbose) { if (Verbose) {
printf("Instance=%u=%s\n", object_instance, argv[argi]); printf("Instance=%lu=%s\n", object_instance, argv[argi]);
} }
target_args++; target_args++;
} }
+22 -34
View File
@@ -153,7 +153,10 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--dnet") == 0) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true; specific_address = true;
} }
@@ -166,16 +169,28 @@ int main(int argc, char *argv[])
} }
} else { } else {
if (target_args == 0) { 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++; target_args++;
} else if (target_args == 1) { } 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++; target_args++;
} else if (target_args == 2) { } 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++; target_args++;
} else if (target_args == 2) { } else if (target_args == 3) {
Target_Invoke_ID = strtol(argv[argi], NULL, 0); if (!bacnet_string_to_uint8(argv[argi], &Target_Invoke_ID)) {
fprintf(stderr, "invoke-id=%s invalid\n", argv[argi]);
return 1;
}
target_args++; target_args++;
} else { } else {
print_usage(filename); print_usage(filename);
@@ -185,34 +200,7 @@ int main(int argc, char *argv[])
} }
address_init(); address_init();
if (specific_address) { if (specific_address) {
if (adr.len && mac.len) { bacnet_address_init(&dest, &mac, dnet, &adr);
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;
}
} }
/* setup my info */ /* setup my info */
Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE); 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[]) int main(int argc, char *argv[])
{ {
BACNET_EVENT_NOTIFICATION_DATA event_data = { 0 }; BACNET_EVENT_NOTIFICATION_DATA event_data = { 0 };
BACNET_BIT_STRING *pBitString; unsigned long long_value = 0;
BACNET_CHARACTER_STRING bcstring;
BACNET_PROPERTY_STATES tag = PROP_STATE_BOOLEAN_VALUE;
BACNET_ADDRESS src = { 0 }; /* address where message came from */ BACNET_ADDRESS src = { 0 }; /* address where message came from */
unsigned timeout = 100; /* milliseconds */ unsigned timeout = 100; /* milliseconds */
uint16_t pdu_len = 0; uint16_t pdu_len = 0;
@@ -252,7 +250,6 @@ int main(int argc, char *argv[])
int argi = 0; int argi = 0;
unsigned int target_args = 0; unsigned int target_args = 0;
const char *filename = NULL; const char *filename = NULL;
unsigned found_index = 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++) {
@@ -278,7 +275,10 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--dnet") == 0) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true; specific_address = true;
} }
@@ -292,226 +292,28 @@ int main(int argc, char *argv[])
} else { } else {
if (target_args == 0) { if (target_args == 0) {
/* device-id */ /* device-id */
Target_Device_Object_Instance = strtol(argv[argi], NULL, 0); if (!bacnet_strtoul(argv[argi], &long_value)) {
target_args++; fprintf(stderr, "device-id=%s invalid\n", argv[argi]);
} 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);
return 1; 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); print_usage(filename);
return 0; return 0;
} }
/* setup my info */
address_init(); address_init();
if (specific_address) { if (specific_address) {
if (adr.len && mac.len) { bacnet_address_init(&dest, &mac, dnet, &adr);
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;
}
address_add(Target_Device_Object_Instance, MAX_APDU, &dest); 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); Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
Init_Service_Handlers(); Init_Service_Handlers();
dlenv_init(); dlenv_init();
+4 -1
View File
@@ -178,7 +178,10 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--dnet") == 0) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true; specific_address = true;
} }
+4 -1
View File
@@ -279,7 +279,10 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--dnet") == 0) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true; specific_address = true;
} }
+4 -1
View File
@@ -390,7 +390,10 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--dnet") == 0) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= UINT16_MAX)) {
specific_address = true; specific_address = true;
} }
+42 -19
View File
@@ -235,12 +235,12 @@ int main(int argc, char *argv[])
bool found = false; bool found = false;
char *value_string = NULL; char *value_string = NULL;
bool status = false; bool status = false;
unsigned context_tag = 0; unsigned long context_tag = 0;
BACNET_APPLICATION_DATA_VALUE *application_value = NULL; BACNET_APPLICATION_DATA_VALUE *application_value = NULL;
unsigned object_type = 0; unsigned long object_type = 0;
unsigned object_instance = 0; unsigned long object_instance = 0;
unsigned property_id = 0; uint32_t property_id = 0;
unsigned property_array_index = 0; long property_array_index = 0;
long property_tag = 0; long property_tag = 0;
long dnet = -1; long dnet = -1;
BACNET_MAC_ADDRESS mac = { 0 }; BACNET_MAC_ADDRESS mac = { 0 };
@@ -275,7 +275,10 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--dnet") == 0) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= UINT16_MAX)) {
specific_address = true; specific_address = true;
} }
@@ -290,34 +293,39 @@ int main(int argc, char *argv[])
Verbose = true; Verbose = true;
} else { } else {
if (target_args == 0) { 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) { if (object_instance > BACNET_MAX_INSTANCE) {
fprintf( fprintf(
stderr, "device-instance=%u - not greater than %u\n", stderr, "device-instance=%lu - not greater than %u\n",
object_instance, BACNET_MAX_INSTANCE); object_instance, BACNET_MAX_INSTANCE);
return 1; return 1;
} }
Target_Device_Object_Instance = object_instance; Target_Device_Object_Instance = object_instance;
target_args++; target_args++;
} else if (target_args == 1) { } else if (target_args == 1) {
if (bactext_object_type_strtol(argv[argi], &object_type) == if (!bacnet_strtoul(argv[argi], &object_type)) {
false) {
fprintf(stderr, "object-type=%s invalid\n", argv[argi]); fprintf(stderr, "object-type=%s invalid\n", argv[argi]);
return 1; return 1;
} }
Target_Object_Type = object_type; Target_Object_Type = object_type;
target_args++; target_args++;
} else if (target_args == 2) { } 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) { if (object_instance > BACNET_MAX_INSTANCE) {
fprintf( 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); Target_Device_Object_Instance, BACNET_MAX_INSTANCE);
return 1; return 1;
} }
Target_Object_Instance = object_instance; Target_Object_Instance = object_instance;
if (Verbose) { if (Verbose) {
printf("Instance=%u=%s\n", object_instance, argv[argi]); printf("Instance=%lu=%s\n", object_instance, argv[argi]);
} }
target_args++; target_args++;
} else if (target_args == 3) { } else if (target_args == 3) {
@@ -332,11 +340,19 @@ int main(int argc, char *argv[])
} }
target_args++; target_args++;
} else if (target_args == 4) { } else if (target_args == 4) {
property_array_index = strtol(argv[argi], NULL, 0); if (!bacnet_strtol(argv[argi], &property_array_index)) {
Target_Object_Array_Index = 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) { if (Verbose) {
printf( printf(
"Array_Index=%i=%s\n", property_array_index, "Array_Index=%li=%s\n", property_array_index,
argv[argi]); argv[argi]);
} }
target_args++; target_args++;
@@ -347,15 +363,22 @@ int main(int argc, char *argv[])
if (tag_value_arg == 0) { if (tag_value_arg == 0) {
/* special case for context tagged values */ /* special case for context tagged values */
if (toupper(argv[argi][0]) == 'C') { 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_tag = context_tag;
application_value->context_specific = true; application_value->context_specific = true;
argi++; argi++;
} else { } else {
application_value->context_specific = false; application_value->context_specific = false;
} }
/* application tag */ /* property 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) { if (Verbose) {
printf("tag=%ld\n", property_tag); printf("tag=%ld\n", property_tag);
} }
+1 -1
View File
@@ -297,7 +297,7 @@ int main(int argc, char *argv[])
/* Handle command-line arguments */ /* Handle command-line arguments */
if (argc > 1) { 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); Device_Set_Object_Instance_Number(device_instance);
printf("BACnet Device ID: %u\n", 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 (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
global_broadcast = false; global_broadcast = false;
} }
+12 -198
View File
@@ -89,9 +89,6 @@ static void print_help(const char *filename)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
BACNET_EVENT_NOTIFICATION_DATA event_data = { 0 }; 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; long dnet = -1;
BACNET_MAC_ADDRESS mac = { 0 }; BACNET_MAC_ADDRESS mac = { 0 };
BACNET_MAC_ADDRESS adr = { 0 }; BACNET_MAC_ADDRESS adr = { 0 };
@@ -125,7 +122,10 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--dnet") == 0) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true; specific_address = true;
} }
@@ -138,206 +138,20 @@ int main(int argc, char *argv[])
} }
} else { } else {
if (target_args == 0) { if (target_args == 0) {
event_data.processIdentifier = strtol(argv[argi], NULL, 0); if (!event_notify_parse(
target_args++; &event_data, argc - argi, &argv[argi])) {
} else if (target_args == 1) { fprintf(stderr, "event=%s invalid\n", argv[argi]);
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) {
} else { } else {
print_usage(filename); target_args++;
return 1;
} }
} else {
print_usage(filename);
return 1;
} }
} }
} }
address_init();
if (specific_address) { if (specific_address) {
if (adr.len && mac.len) { bacnet_address_init(&dest, &mac, dnet, &adr);
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;
}
} }
/* setup my info */ /* setup my info */
Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE); 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) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
global_broadcast = false; global_broadcast = false;
} }
+4 -1
View File
@@ -383,7 +383,10 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--dnet") == 0) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
global_broadcast = false; global_broadcast = false;
} }
+4 -1
View File
@@ -279,7 +279,10 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--dnet") == 0) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true; specific_address = true;
} }
+4 -1
View File
@@ -236,7 +236,10 @@ int main(int argc, char *argv[])
} }
} else if (strcmp(argv[argi], "--dnet") == 0) { } else if (strcmp(argv[argi], "--dnet") == 0) {
if (++argi < argc) { 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)) { if ((dnet >= 0) && (dnet <= BACNET_BROADCAST_NETWORK)) {
specific_address = true; specific_address = true;
} }
+173
View File
@@ -2827,6 +2827,179 @@ const char *bactext_timer_transition_name(uint32_t index)
bactext_timer_transition_names, index, ASHRAE_Reserved_String); bactext_timer_transition_names, index, ASHRAE_Reserved_String);
} }
INDTEXT_DATA bactext_boolean_value_names[] = { { false, "false" },
{ true, "true" },
{ 0, NULL } };
const char *bactext_boolean_value_name(uint32_t index)
{
return indtext_by_index_default(
bactext_boolean_value_names, index, ASHRAE_Reserved_String);
}
bool bactext_property_states_strtoul(
BACNET_PROPERTY_STATES property_state,
const char *search_name,
uint32_t *found_index)
{
bool status = false;
switch (property_state) {
case PROP_STATE_BOOLEAN_VALUE:
status = bactext_string_to_uint32_index(
bactext_boolean_value_names, search_name, found_index);
break;
case PROP_STATE_BINARY_VALUE:
status = bactext_string_to_uint32_index(
bacnet_binary_present_value_names, search_name, found_index);
break;
case PROP_STATE_EVENT_TYPE:
status = bactext_string_to_uint32_index(
bacnet_event_type_names, search_name, found_index);
break;
case PROP_STATE_POLARITY:
status = bactext_string_to_uint32_index(
bacnet_binary_polarity_names, search_name, found_index);
break;
case PROP_STATE_PROGRAM_CHANGE:
status = bactext_string_to_uint32_index(
bactext_program_request_names, search_name, found_index);
break;
case PROP_STATE_PROGRAM_STATE:
status = bactext_string_to_uint32_index(
bactext_program_state_names, search_name, found_index);
break;
case PROP_STATE_REASON_FOR_HALT:
status = bactext_string_to_uint32_index(
bactext_program_error_names, search_name, found_index);
break;
case PROP_STATE_RELIABILITY:
status = bactext_string_to_uint32_index(
bacnet_reliability_names, search_name, found_index);
break;
case PROP_STATE_EVENT_STATE:
status = bactext_string_to_uint32_index(
bacnet_event_state_names, search_name, found_index);
break;
case PROP_STATE_SYSTEM_STATUS:
status = bactext_string_to_uint32_index(
bacnet_device_status_names, search_name, found_index);
break;
case PROP_STATE_UNITS:
status = bactext_string_to_uint32_index(
bacnet_engineering_unit_names, search_name, found_index);
break;
case PROP_STATE_LIFE_SAFETY_MODE:
status = bactext_string_to_uint32_index(
bactext_life_safety_mode_names, search_name, found_index);
break;
case PROP_STATE_LIFE_SAFETY_STATE:
status = bactext_string_to_uint32_index(
bactext_life_safety_state_names, search_name, found_index);
break;
case PROP_STATE_RESTART_REASON:
status = bactext_string_to_uint32_index(
bactext_restart_reason_names, search_name, found_index);
break;
case PROP_STATE_LIFE_SAFETY_OPERATION:
status = bactext_string_to_uint32_index(
bactext_life_safety_operation_names, search_name, found_index);
break;
case PROP_STATE_NODE_TYPE:
status = bactext_string_to_uint32_index(
bacnet_node_type_names, search_name, found_index);
break;
case PROP_STATE_NOTIFY_TYPE:
status = bactext_string_to_uint32_index(
bacnet_notify_type_names, search_name, found_index);
break;
case PROP_STATE_SHED_STATE:
status = bactext_string_to_uint32_index(
bacnet_shed_state_names, search_name, found_index);
break;
case PROP_STATE_SILENCED_STATE:
status = bactext_string_to_uint32_index(
bactext_silenced_state_names, search_name, found_index);
break;
case PROP_STATE_LIGHTING_IN_PROGRESS:
status = bactext_string_to_uint32_index(
bacnet_lighting_in_progress_names, search_name, found_index);
break;
case PROP_STATE_LIGHTING_OPERATION:
status = bactext_string_to_uint32_index(
bacnet_lighting_operation_names, search_name, found_index);
break;
case PROP_STATE_LIGHTING_TRANSITION:
status = bactext_string_to_uint32_index(
bacnet_lighting_transition_names, search_name, found_index);
break;
case PROP_STATE_BINARY_LIGHTING_VALUE:
status = bactext_string_to_uint32_index(
bacnet_binary_lighting_pv_names, search_name, found_index);
break;
case PROP_STATE_TIMER_STATE:
status = bactext_string_to_uint32_index(
bactext_timer_state_names, search_name, found_index);
break;
case PROP_STATE_TIMER_TRANSITION:
status = bactext_string_to_uint32_index(
bactext_timer_transition_names, search_name, found_index);
break;
case PROP_STATE_NETWORK_PORT_COMMAND:
status = bactext_string_to_uint32_index(
bactext_network_port_command_names, search_name, found_index);
break;
case PROP_STATE_NETWORK_TYPE:
status = bactext_string_to_uint32_index(
bactext_network_port_type_names, search_name, found_index);
break;
case PROP_STATE_NETWORK_NUMBER_QUALITY:
status = bactext_string_to_uint32_index(
bactext_network_number_quality_names, search_name, found_index);
break;
case PROP_STATE_PROTOCOL_LEVEL:
status = bactext_string_to_uint32_index(
bactext_protocol_level_names, search_name, found_index);
break;
case PROP_STATE_ACTION:
case PROP_STATE_DOOR_SECURED_STATUS:
case PROP_STATE_DOOR_STATUS:
case PROP_STATE_DOOR_VALUE:
case PROP_STATE_FILE_ACCESS_METHOD:
case PROP_STATE_LOCK_STATUS:
case PROP_STATE_MAINTENANCE:
case PROP_STATE_SECURITY_LEVEL:
case PROP_STATE_ACCESS_EVENT:
case PROP_STATE_ZONE_OCCUPANCY_STATE:
case PROP_STATE_ACCESS_CRED_DISABLE_REASON:
case PROP_STATE_ACCESS_CRED_DISABLE:
case PROP_STATE_AUTHENTICATION_STATUS:
case PROP_STATE_BACKUP_STATE:
case PROP_STATE_WRITE_STATUS:
case PROP_STATE_INTEGER_VALUE:
case PROP_STATE_BACNET_IP_MODE:
case PROP_STATE_ESCALATOR_OPERATION_DIRECTION:
case PROP_STATE_ESCALATOR_FAULT:
case PROP_STATE_ESCALATOR_MODE:
case PROP_STATE_LIFT_CAR_DIRECTION:
case PROP_STATE_LIFT_CAR_DOOR_COMMAND:
case PROP_STATE_LIFT_CAR_DRIVE_STATUS:
case PROP_STATE_LIFT_CAR_MODE:
case PROP_STATE_LIFT_GROUP_MODE:
case PROP_STATE_LIFT_FAULT:
case PROP_STATE_AUDIT_LEVEL:
case PROP_STATE_AUDIT_OPERATION:
case PROP_STATE_EXTENDED_VALUE:
case PROP_STATE_DOOR_ALARM_STATE:
case PROP_STATE_UNSIGNED_VALUE:
default:
status = bacnet_string_to_uint32(search_name, found_index);
break;
}
return status;
}
/** /**
* @brief For a given enumerated object property string, * @brief For a given enumerated object property string,
* find the enumeration value * find the enumeration value
+9
View File
@@ -242,6 +242,15 @@ const char *bactext_timer_transition_name(uint32_t index);
BACNET_STACK_EXPORT BACNET_STACK_EXPORT
const char *bactext_timer_state_name(uint32_t index); const char *bactext_timer_state_name(uint32_t index);
BACNET_STACK_EXPORT
const char *bactext_boolean_value_name(uint32_t index);
BACNET_STACK_EXPORT
bool bactext_property_states_strtoul(
BACNET_PROPERTY_STATES object_property,
const char *search_name,
uint32_t *found_index);
BACNET_STACK_EXPORT BACNET_STACK_EXPORT
bool bactext_object_property_strtoul( bool bactext_object_property_strtoul(
BACNET_OBJECT_TYPE object_type, BACNET_OBJECT_TYPE object_type,
+262
View File
@@ -13,6 +13,7 @@
#include "bacnet/timestamp.h" #include "bacnet/timestamp.h"
#include "bacnet/authentication_factor.h" #include "bacnet/authentication_factor.h"
#include "bacnet/bacapp.h" #include "bacnet/bacapp.h"
#include "bacnet/bactext.h"
/** @file event.c Encode/Decode Event Notifications */ /** @file event.c Encode/Decode Event Notifications */
@@ -3114,3 +3115,264 @@ int event_notify_decode_service_request(
return apdu_len; return apdu_len;
} }
/**
* @brief parse a list of strings for the event notification:
* @details event-notification string:
* process-id initiating-device-id event-object-type event-object-instance
* sequence-number notification-class priority message-text notify-type
* ack-required from-state to-state event-type
* [change-of-bitstring reference-bit-string status-flags]
* [change-of-state new-state-tag new-state-value status-flags]
* @param data [out] BACnetEventNotification data to store parsed data
* @param argc [in] number of arguments in argv
* @param argv [in] array of strings to parse
* @return true if successful, false if error
*/
bool event_notify_parse(
BACNET_EVENT_NOTIFICATION_DATA *data, int argc, char *argv[])
{
int argi = 0;
unsigned int target_args = 1;
uint32_t found_index = 0;
unsigned long long_value = 0;
BACNET_PROPERTY_STATES tag = PROP_STATE_BOOLEAN_VALUE;
BACNET_BIT_STRING *pBitString = NULL;
for (argi = 1; argi < argc; argi++) {
if (target_args == 1) {
/* process-id */
if (!bacnet_string_to_uint32(
argv[argi], &data->processIdentifier)) {
return false;
}
target_args++;
} else if (target_args == 2) {
/* initiating-device-id */
data->initiatingObjectIdentifier.type = OBJECT_DEVICE;
if (!bacnet_strtoul(argv[argi], &long_value)) {
return false;
}
if (long_value > BACNET_MAX_INSTANCE) {
return false;
}
data->initiatingObjectIdentifier.instance = (uint32_t)long_value;
target_args++;
} else if (target_args == 3) {
/* event-object-type */
if (!bactext_object_type_strtol(argv[argi], &found_index)) {
return false;
}
data->eventObjectIdentifier.type = (BACNET_OBJECT_TYPE)found_index;
target_args++;
} else if (target_args == 4) {
/* event-object-instance */
if (!bacnet_strtoul(argv[argi], &long_value)) {
return false;
}
if (long_value > BACNET_MAX_INSTANCE) {
return false;
}
data->eventObjectIdentifier.instance = (uint32_t)long_value;
target_args++;
} else if (target_args == 5) {
/* sequence-number */
if (!bacnet_string_to_uint16(
argv[argi], &data->timeStamp.value.sequenceNum)) {
return false;
}
data->timeStamp.tag = TIME_STAMP_SEQUENCE;
target_args++;
} else if (target_args == 6) {
/* notification-class */
if (!bacnet_string_to_uint32(
argv[argi], &data->notificationClass)) {
return false;
}
target_args++;
} else if (target_args == 7) {
/* priority */
if (!bacnet_string_to_uint8(argv[argi], &data->priority)) {
return false;
}
target_args++;
} else if (target_args == 8) {
/* message-text */
if (!characterstring_init_ansi(data->messageText, argv[argi])) {
return false;
}
target_args++;
} else if (target_args == 9) {
/* notify-type */
if (!bactext_notify_type_strtol(argv[argi], &found_index)) {
return false;
}
data->notifyType = (BACNET_NOTIFY_TYPE)found_index;
target_args++;
} else if (target_args == 10) {
/* ack-required */
if (!bacnet_string_to_bool(argv[argi], &data->ackRequired)) {
return false;
}
target_args++;
} else if (target_args == 11) {
/* from-state */
if (!bactext_event_state_strtol(argv[argi], &found_index)) {
return false;
}
data->fromState = (BACNET_EVENT_STATE)found_index;
target_args++;
} else if (target_args == 12) {
/* to-state */
if (!bactext_event_state_strtol(argv[argi], &found_index)) {
return false;
}
data->toState = (BACNET_EVENT_STATE)found_index;
target_args++;
} else if (target_args == 13) {
/* event-type */
if (!bactext_event_type_strtol(argv[argi], &found_index)) {
return false;
}
data->eventType = (BACNET_EVENT_TYPE)found_index;
target_args++;
} else {
if (data->eventType == EVENT_CHANGE_OF_BITSTRING) {
if (target_args == 14) {
pBitString = &data->notificationParams.changeOfBitstring
.referencedBitString;
bitstring_init_ascii(pBitString, argv[argi]);
target_args++;
} else if (target_args == 15) {
pBitString =
&data->notificationParams.changeOfBitstring.statusFlags;
bitstring_init_ascii(pBitString, argv[argi]);
target_args++;
} else {
return false;
}
} else if (data->eventType == EVENT_CHANGE_OF_STATE) {
if (target_args == 14) {
if (!bacnet_strtoul(argv[argi], &long_value)) {
return false;
}
tag = (BACNET_PROPERTY_STATES)long_value;
data->notificationParams.changeOfState.newState.tag = tag;
target_args++;
} else if (target_args == 15) {
if (!bactext_property_states_strtoul(
tag, argv[argi], &found_index)) {
return false;
}
if (tag == PROP_STATE_BOOLEAN_VALUE) {
if (found_index) {
data->notificationParams.changeOfState.newState
.state.booleanValue = true;
} else {
data->notificationParams.changeOfState.newState
.state.booleanValue = false;
}
} else if (tag == PROP_STATE_BINARY_VALUE) {
data->notificationParams.changeOfState.newState.state
.binaryValue = (BACNET_BINARY_PV)found_index;
} else if (tag == PROP_STATE_EVENT_TYPE) {
data->notificationParams.changeOfState.newState.state
.eventType = (BACNET_EVENT_TYPE)found_index;
} else if (tag == PROP_STATE_POLARITY) {
data->notificationParams.changeOfState.newState.state
.polarity = (BACNET_POLARITY)found_index;
} else if (tag == PROP_STATE_PROGRAM_CHANGE) {
data->notificationParams.changeOfState.newState.state
.programChange =
(BACNET_PROGRAM_REQUEST)found_index;
} else if (tag == PROP_STATE_PROGRAM_STATE) {
data->notificationParams.changeOfState.newState.state
.programState = (BACNET_PROGRAM_STATE)found_index;
} else if (tag == PROP_STATE_REASON_FOR_HALT) {
data->notificationParams.changeOfState.newState.state
.programError = (BACNET_PROGRAM_ERROR)found_index;
} else if (tag == PROP_STATE_RELIABILITY) {
data->notificationParams.changeOfState.newState.state
.reliability = (BACNET_RELIABILITY)found_index;
} else if (tag == PROP_STATE_EVENT_STATE) {
data->notificationParams.changeOfState.newState.state
.state = (BACNET_EVENT_STATE)found_index;
} else if (tag == PROP_STATE_SYSTEM_STATUS) {
data->notificationParams.changeOfState.newState.state
.systemStatus = (BACNET_DEVICE_STATUS)found_index;
} else if (tag == PROP_STATE_UNITS) {
data->notificationParams.changeOfState.newState.state
.units = (BACNET_ENGINEERING_UNITS)found_index;
} else if (tag == PROP_STATE_UNSIGNED_VALUE) {
data->notificationParams.changeOfState.newState.state
.unsignedValue =
(BACNET_UNSIGNED_INTEGER)found_index;
} else if (tag == PROP_STATE_LIFE_SAFETY_MODE) {
data->notificationParams.changeOfState.newState.state
.lifeSafetyMode =
(BACNET_LIFE_SAFETY_MODE)found_index;
} else if (tag == PROP_STATE_LIFE_SAFETY_STATE) {
data->notificationParams.changeOfState.newState.state
.lifeSafetyState =
(BACNET_LIFE_SAFETY_STATE)found_index;
} else {
return false;
}
target_args++;
} else if (target_args == 16) {
pBitString =
&data->notificationParams.changeOfState.statusFlags;
bitstring_init_ascii(pBitString, argv[argi]);
target_args++;
} else {
return false;
}
} else if (data->eventType == EVENT_CHANGE_OF_VALUE) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_COMMAND_FAILURE) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_FLOATING_LIMIT) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_OUT_OF_RANGE) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_CHANGE_OF_LIFE_SAFETY) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_EXTENDED) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_BUFFER_READY) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_UNSIGNED_RANGE) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_ACCESS_EVENT) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_DOUBLE_OUT_OF_RANGE) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_SIGNED_OUT_OF_RANGE) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_UNSIGNED_OUT_OF_RANGE) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_CHANGE_OF_CHARACTERSTRING) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_CHANGE_OF_STATUS_FLAGS) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_CHANGE_OF_RELIABILITY) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_NONE) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_CHANGE_OF_DISCRETE_VALUE) {
/* FIXME: add event type parameters */
} else if (data->eventType == EVENT_CHANGE_OF_TIMER) {
/* FIXME: add event type parameters */
} else if (
(data->eventType >= EVENT_PROPRIETARY_MIN) &&
(data->eventType <= EVENT_PROPRIETARY_MAX)) {
/* Enumerated values 64-65535 may
be used by others subject to
the procedures and constraints
described in Clause 23. */
}
}
}
return true;
}
+4
View File
@@ -471,6 +471,10 @@ int uevent_notify_send(
BACNET_EVENT_NOTIFICATION_DATA *data, BACNET_EVENT_NOTIFICATION_DATA *data,
BACNET_ADDRESS *dest); BACNET_ADDRESS *dest);
BACNET_STACK_EXPORT
bool event_notify_parse(
BACNET_EVENT_NOTIFICATION_DATA *data, int argc, char *argv[]);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif /* __cplusplus */