Indented.
This commit is contained in:
@@ -426,8 +426,8 @@ static bool cov_subscribe(
|
|||||||
|
|
||||||
switch (cov_data->monitoredObjectIdentifier.type) {
|
switch (cov_data->monitoredObjectIdentifier.type) {
|
||||||
case OBJECT_BINARY_INPUT:
|
case OBJECT_BINARY_INPUT:
|
||||||
if (Binary_Input_Valid_Instance(
|
if (Binary_Input_Valid_Instance(cov_data->
|
||||||
cov_data->monitoredObjectIdentifier.instance)) {
|
monitoredObjectIdentifier.instance)) {
|
||||||
status =
|
status =
|
||||||
cov_list_subscribe(src, cov_data, error_class, error_code);
|
cov_list_subscribe(src, cov_data, error_class, error_code);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -244,8 +244,7 @@ int RPM_Encode_Property(
|
|||||||
rpm_ack_encode_apdu_object_property_error(&Temp_Buf[0],
|
rpm_ack_encode_apdu_object_property_error(&Temp_Buf[0],
|
||||||
error_class, error_code);
|
error_class, error_code);
|
||||||
len =
|
len =
|
||||||
memcopy(&apdu[0], &Temp_Buf[0], offset + apdu_len, len,
|
memcopy(&apdu[0], &Temp_Buf[0], offset + apdu_len, len, max_apdu);
|
||||||
max_apdu);
|
|
||||||
if (!len) {
|
if (!len) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -344,8 +343,8 @@ void handler_read_property_multiple(
|
|||||||
rpm_ack_encode_apdu_object_begin(&Temp_Buf[0], object_type,
|
rpm_ack_encode_apdu_object_begin(&Temp_Buf[0], object_type,
|
||||||
object_instance);
|
object_instance);
|
||||||
copy_len =
|
copy_len =
|
||||||
memcopy(&Handler_Transmit_Buffer[npdu_len], &Temp_Buf[0],
|
memcopy(&Handler_Transmit_Buffer[npdu_len], &Temp_Buf[0], apdu_len,
|
||||||
apdu_len, len, sizeof(Handler_Transmit_Buffer));
|
len, sizeof(Handler_Transmit_Buffer));
|
||||||
if (!copy_len) {
|
if (!copy_len) {
|
||||||
apdu_len =
|
apdu_len =
|
||||||
abort_encode_apdu(&Handler_Transmit_Buffer[npdu_len],
|
abort_encode_apdu(&Handler_Transmit_Buffer[npdu_len],
|
||||||
|
|||||||
@@ -60,9 +60,8 @@ static int rpm_ack_decode_service_request(
|
|||||||
rpm_object = read_access_data;
|
rpm_object = read_access_data;
|
||||||
old_rpm_object = rpm_object;
|
old_rpm_object = rpm_object;
|
||||||
while (rpm_object && apdu_len) {
|
while (rpm_object && apdu_len) {
|
||||||
len = rpm_ack_decode_object_id(
|
len =
|
||||||
apdu, apdu_len,
|
rpm_ack_decode_object_id(apdu, apdu_len, &rpm_object->object_type,
|
||||||
&rpm_object->object_type,
|
|
||||||
&rpm_object->object_instance);
|
&rpm_object->object_instance);
|
||||||
if (len <= 0) {
|
if (len <= 0) {
|
||||||
old_rpm_object->next = NULL;
|
old_rpm_object->next = NULL;
|
||||||
@@ -76,9 +75,8 @@ static int rpm_ack_decode_service_request(
|
|||||||
rpm_object->listOfProperties = rpm_property;
|
rpm_object->listOfProperties = rpm_property;
|
||||||
old_rpm_property = rpm_property;
|
old_rpm_property = rpm_property;
|
||||||
while (rpm_property && apdu_len) {
|
while (rpm_property && apdu_len) {
|
||||||
len = rpm_ack_decode_object_property(
|
len =
|
||||||
apdu,
|
rpm_ack_decode_object_property(apdu, apdu_len,
|
||||||
apdu_len,
|
|
||||||
&rpm_property->propertyIdentifier,
|
&rpm_property->propertyIdentifier,
|
||||||
&rpm_property->propertyArrayIndex);
|
&rpm_property->propertyArrayIndex);
|
||||||
if (len <= 0) {
|
if (len <= 0) {
|
||||||
@@ -99,10 +97,8 @@ static int rpm_ack_decode_service_request(
|
|||||||
rpm_property->value = value;
|
rpm_property->value = value;
|
||||||
old_value = value;
|
old_value = value;
|
||||||
while (value && (apdu_len > 0)) {
|
while (value && (apdu_len > 0)) {
|
||||||
len = bacapp_decode_application_data(
|
len =
|
||||||
apdu,
|
bacapp_decode_application_data(apdu, apdu_len, value);
|
||||||
apdu_len,
|
|
||||||
value);
|
|
||||||
decoded_len += len;
|
decoded_len += len;
|
||||||
apdu_len -= len;
|
apdu_len -= len;
|
||||||
apdu += len;
|
apdu += len;
|
||||||
@@ -113,7 +109,8 @@ static int rpm_ack_decode_service_request(
|
|||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
old_value = value;
|
old_value = value;
|
||||||
value = calloc(1, sizeof(BACNET_APPLICATION_DATA_VALUE));
|
value =
|
||||||
|
calloc(1, sizeof(BACNET_APPLICATION_DATA_VALUE));
|
||||||
old_value->next = value;
|
old_value->next = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -174,8 +171,7 @@ static void PrintReadPropertyMultipleData(
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
while (value) {
|
while (value) {
|
||||||
bacapp_print_value(stdout,
|
bacapp_print_value(stdout, value,
|
||||||
value,
|
|
||||||
listOfProperties->propertyIdentifier);
|
listOfProperties->propertyIdentifier);
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
if (value->next) {
|
if (value->next) {
|
||||||
@@ -205,8 +201,8 @@ void handler_read_property_multiple_ack(
|
|||||||
BACNET_CONFIRMED_SERVICE_ACK_DATA * service_data)
|
BACNET_CONFIRMED_SERVICE_ACK_DATA * service_data)
|
||||||
{
|
{
|
||||||
int len = 0;
|
int len = 0;
|
||||||
BACNET_READ_ACCESS_DATA * rpm_data;
|
BACNET_READ_ACCESS_DATA *rpm_data;
|
||||||
BACNET_READ_ACCESS_DATA * old_rpm_data;
|
BACNET_READ_ACCESS_DATA *old_rpm_data;
|
||||||
BACNET_PROPERTY_REFERENCE *rpm_property;
|
BACNET_PROPERTY_REFERENCE *rpm_property;
|
||||||
BACNET_PROPERTY_REFERENCE *old_rpm_property;
|
BACNET_PROPERTY_REFERENCE *old_rpm_property;
|
||||||
BACNET_APPLICATION_DATA_VALUE *value;
|
BACNET_APPLICATION_DATA_VALUE *value;
|
||||||
@@ -217,7 +213,8 @@ void handler_read_property_multiple_ack(
|
|||||||
|
|
||||||
rpm_data = calloc(1, sizeof(BACNET_READ_ACCESS_DATA));
|
rpm_data = calloc(1, sizeof(BACNET_READ_ACCESS_DATA));
|
||||||
if (rpm_data) {
|
if (rpm_data) {
|
||||||
len = rpm_ack_decode_service_request(service_request, service_len,
|
len =
|
||||||
|
rpm_ack_decode_service_request(service_request, service_len,
|
||||||
rpm_data);
|
rpm_data);
|
||||||
}
|
}
|
||||||
#if 1
|
#if 1
|
||||||
|
|||||||
@@ -57,25 +57,21 @@ void handler_ucov_notification(
|
|||||||
fprintf(stderr, "UCOV: Received Notification!\n");
|
fprintf(stderr, "UCOV: Received Notification!\n");
|
||||||
#endif
|
#endif
|
||||||
/* decode the service request only */
|
/* decode the service request only */
|
||||||
len = cov_notify_decode_service_request(
|
len =
|
||||||
service_request, service_len, &cov_data);
|
cov_notify_decode_service_request(service_request, service_len,
|
||||||
|
&cov_data);
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
fprintf(stderr, "UCOV: PID=%u ",
|
fprintf(stderr, "UCOV: PID=%u ", cov_data.subscriberProcessIdentifier);
|
||||||
cov_data.subscriberProcessIdentifier);
|
fprintf(stderr, "instance=%u ", cov_data.initiatingDeviceIdentifier);
|
||||||
fprintf(stderr, "instance=%u ",
|
|
||||||
cov_data.initiatingDeviceIdentifier);
|
|
||||||
fprintf(stderr, "%s %u ",
|
fprintf(stderr, "%s %u ",
|
||||||
bactext_object_type_name(
|
bactext_object_type_name(cov_data.monitoredObjectIdentifier.type),
|
||||||
cov_data.monitoredObjectIdentifier.type),
|
|
||||||
cov_data.monitoredObjectIdentifier.instance);
|
cov_data.monitoredObjectIdentifier.instance);
|
||||||
fprintf(stderr, "time remaining=%u seconds ",
|
fprintf(stderr, "time remaining=%u seconds ", cov_data.timeRemaining);
|
||||||
cov_data.timeRemaining);
|
|
||||||
fprintf(stderr, "%s ",
|
fprintf(stderr, "%s ",
|
||||||
bactext_property_name(property_value.propertyIdentifier));
|
bactext_property_name(property_value.propertyIdentifier));
|
||||||
if (property_value.propertyArrayIndex != BACNET_ARRAY_ALL) {
|
if (property_value.propertyArrayIndex != BACNET_ARRAY_ALL) {
|
||||||
fprintf(stderr, "%u ",
|
fprintf(stderr, "%u ", property_value.propertyArrayIndex);
|
||||||
property_value.propertyArrayIndex);
|
|
||||||
}
|
}
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -88,7 +88,6 @@ void Send_I_Am(
|
|||||||
|
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
if (bytes_sent <= 0)
|
if (bytes_sent <= 0)
|
||||||
fprintf(stderr, "Failed to Send I-Am Reply (%s)!\n",
|
fprintf(stderr, "Failed to Send I-Am Reply (%s)!\n", strerror(errno));
|
||||||
strerror(errno));
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,8 +69,7 @@ void Send_Who_Is_Router_To_Network(
|
|||||||
BACNET_NPDU_DATA npdu_data;
|
BACNET_NPDU_DATA npdu_data;
|
||||||
|
|
||||||
npdu_encode_npdu_network(&npdu_data,
|
npdu_encode_npdu_network(&npdu_data,
|
||||||
NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK,
|
NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK, false,
|
||||||
false,
|
|
||||||
MESSAGE_PRIORITY_NORMAL);
|
MESSAGE_PRIORITY_NORMAL);
|
||||||
/* fixme: should dnet/dlen/dadr be set in NPDU? */
|
/* fixme: should dnet/dlen/dadr be set in NPDU? */
|
||||||
pdu_len =
|
pdu_len =
|
||||||
@@ -112,8 +111,7 @@ void Send_I_Am_Router_To_Network(
|
|||||||
unsigned index = 0;
|
unsigned index = 0;
|
||||||
|
|
||||||
npdu_encode_npdu_network(&npdu_data,
|
npdu_encode_npdu_network(&npdu_data,
|
||||||
NETWORK_MESSAGE_I_AM_ROUTER_TO_NETWORK,
|
NETWORK_MESSAGE_I_AM_ROUTER_TO_NETWORK, false,
|
||||||
false,
|
|
||||||
MESSAGE_PRIORITY_NORMAL);
|
MESSAGE_PRIORITY_NORMAL);
|
||||||
pdu_len =
|
pdu_len =
|
||||||
npdu_encode_pdu(&Handler_Transmit_Buffer[0], NULL, NULL, &npdu_data);
|
npdu_encode_pdu(&Handler_Transmit_Buffer[0], NULL, NULL, &npdu_data);
|
||||||
@@ -157,9 +155,7 @@ void Send_Initialize_Routing_Table(
|
|||||||
BACNET_ROUTER_PORT *router_port;
|
BACNET_ROUTER_PORT *router_port;
|
||||||
unsigned i = 0; /* counter */
|
unsigned i = 0; /* counter */
|
||||||
|
|
||||||
npdu_encode_npdu_network(&npdu_data,
|
npdu_encode_npdu_network(&npdu_data, NETWORK_MESSAGE_INIT_RT_TABLE, true,
|
||||||
NETWORK_MESSAGE_INIT_RT_TABLE,
|
|
||||||
true,
|
|
||||||
MESSAGE_PRIORITY_NORMAL);
|
MESSAGE_PRIORITY_NORMAL);
|
||||||
pdu_len =
|
pdu_len =
|
||||||
npdu_encode_pdu(&Handler_Transmit_Buffer[0], NULL, NULL, &npdu_data);
|
npdu_encode_pdu(&Handler_Transmit_Buffer[0], NULL, NULL, &npdu_data);
|
||||||
@@ -208,10 +204,8 @@ void Send_Initialize_Routing_Table_Ack(
|
|||||||
int bytes_sent = 0;
|
int bytes_sent = 0;
|
||||||
BACNET_NPDU_DATA npdu_data;
|
BACNET_NPDU_DATA npdu_data;
|
||||||
|
|
||||||
npdu_encode_npdu_network(&npdu_data,
|
npdu_encode_npdu_network(&npdu_data, NETWORK_MESSAGE_INIT_RT_TABLE_ACK,
|
||||||
NETWORK_MESSAGE_INIT_RT_TABLE_ACK,
|
false, MESSAGE_PRIORITY_NORMAL);
|
||||||
false,
|
|
||||||
MESSAGE_PRIORITY_NORMAL);
|
|
||||||
pdu_len =
|
pdu_len =
|
||||||
npdu_encode_pdu(&Handler_Transmit_Buffer[0], NULL, NULL, &npdu_data);
|
npdu_encode_pdu(&Handler_Transmit_Buffer[0], NULL, NULL, &npdu_data);
|
||||||
/* encode the optional DNET list portion of the packet */
|
/* encode the optional DNET list portion of the packet */
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ uint8_t Send_Read_Property_Multiple_Request(
|
|||||||
uint8_t * pdu,
|
uint8_t * pdu,
|
||||||
size_t max_pdu,
|
size_t max_pdu,
|
||||||
uint32_t device_id, /* destination device */
|
uint32_t device_id, /* destination device */
|
||||||
BACNET_READ_ACCESS_DATA *read_access_data)
|
BACNET_READ_ACCESS_DATA * read_access_data)
|
||||||
{
|
{
|
||||||
BACNET_ADDRESS dest;
|
BACNET_ADDRESS dest;
|
||||||
BACNET_ADDRESS my_address;
|
BACNET_ADDRESS my_address;
|
||||||
@@ -72,14 +72,10 @@ uint8_t Send_Read_Property_Multiple_Request(
|
|||||||
/* encode the NPDU portion of the packet */
|
/* encode the NPDU portion of the packet */
|
||||||
datalink_get_my_address(&my_address);
|
datalink_get_my_address(&my_address);
|
||||||
npdu_encode_npdu_data(&npdu_data, true, MESSAGE_PRIORITY_NORMAL);
|
npdu_encode_npdu_data(&npdu_data, true, MESSAGE_PRIORITY_NORMAL);
|
||||||
pdu_len =
|
pdu_len = npdu_encode_pdu(&pdu[0], &dest, &my_address, &npdu_data);
|
||||||
npdu_encode_pdu(&pdu[0], &dest, &my_address,
|
|
||||||
&npdu_data);
|
|
||||||
/* encode the APDU portion of the packet */
|
/* encode the APDU portion of the packet */
|
||||||
len = rpm_encode_apdu(
|
len =
|
||||||
&pdu[pdu_len],
|
rpm_encode_apdu(&pdu[pdu_len], max_pdu - pdu_len, invoke_id,
|
||||||
max_pdu - pdu_len,
|
|
||||||
invoke_id,
|
|
||||||
read_access_data);
|
read_access_data);
|
||||||
if (len <= 0) {
|
if (len <= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -94,8 +90,7 @@ uint8_t Send_Read_Property_Multiple_Request(
|
|||||||
tsm_set_confirmed_unsegmented_transaction(invoke_id, &dest,
|
tsm_set_confirmed_unsegmented_transaction(invoke_id, &dest,
|
||||||
&npdu_data, &pdu[0], (uint16_t) pdu_len);
|
&npdu_data, &pdu[0], (uint16_t) pdu_len);
|
||||||
bytes_sent =
|
bytes_sent =
|
||||||
datalink_send_pdu(&dest, &npdu_data,
|
datalink_send_pdu(&dest, &npdu_data, &pdu[0], pdu_len);
|
||||||
&pdu[0], pdu_len);
|
|
||||||
#if PRINT_ENABLED
|
#if PRINT_ENABLED
|
||||||
if (bytes_sent <= 0)
|
if (bytes_sent <= 0)
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
|
|||||||
@@ -86,8 +86,8 @@ static void MyRejectHandler(
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void My_Router_Handler(
|
static void My_Router_Handler(
|
||||||
BACNET_ADDRESS *src,
|
BACNET_ADDRESS * src,
|
||||||
BACNET_NPDU_DATA *npdu_data,
|
BACNET_NPDU_DATA * npdu_data,
|
||||||
uint8_t * npdu, /* PDU data */
|
uint8_t * npdu, /* PDU data */
|
||||||
uint16_t npdu_len)
|
uint16_t npdu_len)
|
||||||
{
|
{
|
||||||
@@ -122,26 +122,26 @@ static void My_Router_Handler(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
port_mappings = npdu[0];
|
port_mappings = npdu[0];
|
||||||
printf("\nPort Mappings: %u\n",port_mappings);
|
printf("\nPort Mappings: %u\n", port_mappings);
|
||||||
npdu_offset = 1;
|
npdu_offset = 1;
|
||||||
npdu_len--;
|
npdu_len--;
|
||||||
while (npdu_len) {
|
while (npdu_len) {
|
||||||
len = decode_unsigned16(&npdu[npdu_offset], &dnet);
|
len = decode_unsigned16(&npdu[npdu_offset], &dnet);
|
||||||
printf("DNET=%hu, ",dnet);
|
printf("DNET=%hu, ", dnet);
|
||||||
npdu_offset += len;
|
npdu_offset += len;
|
||||||
npdu_len -= len;
|
npdu_len -= len;
|
||||||
if (!npdu_len) {
|
if (!npdu_len) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
port_id = npdu[npdu_offset];
|
port_id = npdu[npdu_offset];
|
||||||
printf("Port ID=%u, ",port_id);
|
printf("Port ID=%u, ", port_id);
|
||||||
npdu_offset++;
|
npdu_offset++;
|
||||||
npdu_len--;
|
npdu_len--;
|
||||||
if (!npdu_len) {
|
if (!npdu_len) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
port_info_len = npdu[npdu_offset];
|
port_info_len = npdu[npdu_offset];
|
||||||
printf("Port Info Length=%u, ",port_info_len);
|
printf("Port Info Length=%u, ", port_info_len);
|
||||||
npdu_offset++;
|
npdu_offset++;
|
||||||
npdu_len--;
|
npdu_len--;
|
||||||
printf("Port Info=\"");
|
printf("Port Info=\"");
|
||||||
@@ -150,7 +150,7 @@ static void My_Router_Handler(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (j < port_info_len) {
|
if (j < port_info_len) {
|
||||||
printf("%02X",npdu[npdu_offset]);
|
printf("%02X", npdu[npdu_offset]);
|
||||||
npdu_offset++;
|
npdu_offset++;
|
||||||
npdu_len--;
|
npdu_len--;
|
||||||
}
|
}
|
||||||
@@ -182,7 +182,7 @@ static void My_NPDU_Handler(
|
|||||||
|
|
||||||
apdu_offset = npdu_decode(&pdu[0], &dest, src, &npdu_data);
|
apdu_offset = npdu_decode(&pdu[0], &dest, src, &npdu_data);
|
||||||
if (npdu_data.network_layer_message) {
|
if (npdu_data.network_layer_message) {
|
||||||
My_Router_Handler(src,&npdu_data,&pdu[apdu_offset],
|
My_Router_Handler(src, &npdu_data, &pdu[apdu_offset],
|
||||||
(uint16_t) (pdu_len - apdu_offset));
|
(uint16_t) (pdu_len - apdu_offset));
|
||||||
} else if ((apdu_offset > 0) && (apdu_offset <= pdu_len)) {
|
} else if ((apdu_offset > 0) && (apdu_offset <= pdu_len)) {
|
||||||
if ((npdu_data.protocol_version == BACNET_PROTOCOL_VERSION) &&
|
if ((npdu_data.protocol_version == BACNET_PROTOCOL_VERSION) &&
|
||||||
@@ -325,7 +325,8 @@ static void address_parse(BACNET_ADDRESS * dst,
|
|||||||
dst->mac_len = 6;
|
dst->mac_len = 6;
|
||||||
for (index = 0; index < 4; index++) {
|
for (index = 0; index < 4; index++) {
|
||||||
dst->mac[index] = mac[index];
|
dst->mac[index] = mac[index];
|
||||||
} encode_unsigned16(&dst->mac[4],
|
}
|
||||||
|
encode_unsigned16(&dst->mac[4],
|
||||||
port);
|
port);
|
||||||
} else {
|
} else {
|
||||||
count =
|
count =
|
||||||
@@ -364,22 +365,14 @@ int main(int argc, char *argv[]) {
|
|||||||
filename_remove_path(argv[0]));
|
filename_remove_path(argv[0]));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ((
|
if ((argc > 1) && (strcmp(argv[1], "--help") == 0)) {
|
||||||
argc > 1) && (
|
|
||||||
strcmp(argv[1],
|
|
||||||
"--help") == 0)) {
|
|
||||||
printf("Send BACnet Initialize-Routing-Table message to a network\r\n"
|
printf("Send BACnet Initialize-Routing-Table message to a network\r\n"
|
||||||
"and wait for responses. Displays their network information.\r\n"
|
"and wait for responses. Displays their network information.\r\n"
|
||||||
"\r\n"
|
"\r\n" "address:\r\n"
|
||||||
"address:\r\n"
|
|
||||||
"MAC address in xx:xx:xx:xx:xx:xx format or IP x.x.x.x:port\r\n"
|
"MAC address in xx:xx:xx:xx:xx:xx format or IP x.x.x.x:port\r\n"
|
||||||
"DNET ID Len Info:\r\n"
|
"DNET ID Len Info:\r\n" "Port-info data:\r\n" " DNET:\r\n"
|
||||||
"Port-info data:\r\n"
|
" Destination network number 0-65534\r\n" " ID:\r\n"
|
||||||
" DNET:\r\n"
|
" Port Identifier number 0-255\r\n" " Info:\r\n"
|
||||||
" Destination network number 0-65534\r\n"
|
|
||||||
" ID:\r\n"
|
|
||||||
" Port Identifier number 0-255\r\n"
|
|
||||||
" Info:\r\n"
|
|
||||||
" Octet string of data, up to 255 octets\r\n"
|
" Octet string of data, up to 255 octets\r\n"
|
||||||
"To query the complete routing table, do not include any port-info.\r\n"
|
"To query the complete routing table, do not include any port-info.\r\n"
|
||||||
"To query using Initialize-Routing-Table message to 192.168.0.18:\r\n"
|
"To query using Initialize-Routing-Table message to 192.168.0.18:\r\n"
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ static void milliseconds_task_win32(
|
|||||||
|
|
||||||
/* functions used by the MS/TP state machine to put or get data */
|
/* functions used by the MS/TP state machine to put or get data */
|
||||||
uint16_t MSTP_Put_Receive(
|
uint16_t MSTP_Put_Receive(
|
||||||
volatile struct mstp_port_struct_t * mstp_port)
|
volatile struct mstp_port_struct_t *mstp_port)
|
||||||
{
|
{
|
||||||
(void) mstp_port;
|
(void) mstp_port;
|
||||||
|
|
||||||
@@ -217,7 +217,7 @@ static void write_received_packet(
|
|||||||
fwrite(&ts_sec, sizeof(ts_sec), 1, pFile);
|
fwrite(&ts_sec, sizeof(ts_sec), 1, pFile);
|
||||||
fwrite(&ts_usec, sizeof(ts_usec), 1, pFile);
|
fwrite(&ts_usec, sizeof(ts_usec), 1, pFile);
|
||||||
if (mstp_port->DataLength) {
|
if (mstp_port->DataLength) {
|
||||||
max_data = min(mstp_port->InputBufferSize,mstp_port->DataLength);
|
max_data = min(mstp_port->InputBufferSize, mstp_port->DataLength);
|
||||||
incl_len = orig_len = 8 + max_data + 2;
|
incl_len = orig_len = 8 + max_data + 2;
|
||||||
} else {
|
} else {
|
||||||
incl_len = orig_len = 8;
|
incl_len = orig_len = 8;
|
||||||
|
|||||||
@@ -308,12 +308,12 @@ int Binary_Output_Encode_Property_APDU(
|
|||||||
apdu_len = encode_application_enumerated(&apdu[0], present_value);
|
apdu_len = encode_application_enumerated(&apdu[0], present_value);
|
||||||
break;
|
break;
|
||||||
case PROP_ACTIVE_TEXT:
|
case PROP_ACTIVE_TEXT:
|
||||||
characterstring_init_ansi(&char_string,"on" );
|
characterstring_init_ansi(&char_string, "on");
|
||||||
apdu_len =
|
apdu_len =
|
||||||
encode_application_character_string(&apdu[0], &char_string);
|
encode_application_character_string(&apdu[0], &char_string);
|
||||||
break;
|
break;
|
||||||
case PROP_INACTIVE_TEXT:
|
case PROP_INACTIVE_TEXT:
|
||||||
characterstring_init_ansi(&char_string,"off" );
|
characterstring_init_ansi(&char_string, "off");
|
||||||
apdu_len =
|
apdu_len =
|
||||||
encode_application_character_string(&apdu[0], &char_string);
|
encode_application_character_string(&apdu[0], &char_string);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -216,8 +216,7 @@ static void Init_DataLink(
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void cleanup(void)
|
void cleanup(void) {
|
||||||
{
|
|
||||||
BACNET_READ_ACCESS_DATA *rpm_object;
|
BACNET_READ_ACCESS_DATA *rpm_object;
|
||||||
BACNET_READ_ACCESS_DATA *old_rpm_object;
|
BACNET_READ_ACCESS_DATA *old_rpm_object;
|
||||||
BACNET_PROPERTY_REFERENCE *rpm_property;
|
BACNET_PROPERTY_REFERENCE *rpm_property;
|
||||||
@@ -231,8 +230,7 @@ void cleanup(void)
|
|||||||
old_rpm_property = rpm_property;
|
old_rpm_property = rpm_property;
|
||||||
rpm_property = rpm_property->next;
|
rpm_property = rpm_property->next;
|
||||||
free(old_rpm_property);
|
free(old_rpm_property);
|
||||||
}
|
} old_rpm_object = rpm_object;
|
||||||
old_rpm_object = rpm_object;
|
|
||||||
rpm_object = rpm_object->next;
|
rpm_object = rpm_object->next;
|
||||||
free(old_rpm_object);
|
free(old_rpm_object);
|
||||||
}
|
}
|
||||||
@@ -251,14 +249,16 @@ 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;
|
||||||
uint8_t buffer[MAX_PDU] = {0};
|
uint8_t buffer[MAX_PDU] = {
|
||||||
|
0};
|
||||||
BACNET_READ_ACCESS_DATA *rpm_object;
|
BACNET_READ_ACCESS_DATA *rpm_object;
|
||||||
BACNET_PROPERTY_REFERENCE *rpm_property;
|
BACNET_PROPERTY_REFERENCE *rpm_property;
|
||||||
|
|
||||||
|
|
||||||
if (argc < 5) {
|
if (argc < 5) {
|
||||||
printf("Usage: %s device-instance object-type object-instance "
|
printf("Usage: %s device-instance object-type object-instance "
|
||||||
"property index [object-type ...]\r\n", filename_remove_path(argv[0]));
|
"property index [object-type ...]\r\n",
|
||||||
|
filename_remove_path(argv[0]));
|
||||||
if ((argc > 1) && (strcmp(argv[1], "--help") == 0)) {
|
if ((argc > 1) && (strcmp(argv[1], "--help") == 0)) {
|
||||||
printf("device-instance:\r\n"
|
printf("device-instance:\r\n"
|
||||||
"BACnet Device Object Instance number that you are\r\n"
|
"BACnet Device Object Instance number that you are\r\n"
|
||||||
@@ -285,8 +285,7 @@ int main(int argc, char *argv[]) {
|
|||||||
"If the property is an array, individual elements can\r\n"
|
"If the property is an array, individual elements can\r\n"
|
||||||
"be read. If this parameter is missing and the property\r\n"
|
"be read. If this parameter is missing and the property\r\n"
|
||||||
"is an array, the entire array will be read.\r\n"
|
"is an array, the entire array will be read.\r\n"
|
||||||
"\r\nExample:\r\n"
|
"\r\nExample:\r\n" "If you want read the ALL property in\r\n"
|
||||||
"If you want read the ALL property in\r\n"
|
|
||||||
"Device object 123, you would use the following command:\r\n"
|
"Device object 123, you would use the following command:\r\n"
|
||||||
"%s 123 8 123 8 -1\r\n"
|
"%s 123 8 123 8 -1\r\n"
|
||||||
"If you want read the OPTIONAL property in\r\n"
|
"If you want read the OPTIONAL property in\r\n"
|
||||||
@@ -294,10 +293,8 @@ int main(int argc, char *argv[]) {
|
|||||||
"%s 123 8 123 80 -1\r\n"
|
"%s 123 8 123 80 -1\r\n"
|
||||||
"If you want read the REQUIRED property in\r\n"
|
"If you want read the REQUIRED property in\r\n"
|
||||||
"Device object 123, you would use the following command:\r\n"
|
"Device object 123, you would use the following command:\r\n"
|
||||||
"%s 123 8 123 105 -1\r\n",
|
"%s 123 8 123 105 -1\r\n", filename_remove_path(argv[0]),
|
||||||
filename_remove_path(argv[0]),
|
filename_remove_path(argv[0]), filename_remove_path(argv[0]));
|
||||||
filename_remove_path(argv[0]),
|
|
||||||
filename_remove_path(argv[0]));
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -315,8 +312,7 @@ int main(int argc, char *argv[]) {
|
|||||||
arg_sets = 0;
|
arg_sets = 0;
|
||||||
while (rpm_object) {
|
while (rpm_object) {
|
||||||
tag_value_arg = 2 + (arg_sets * 4);
|
tag_value_arg = 2 + (arg_sets * 4);
|
||||||
rpm_object->object_type =
|
rpm_object->object_type = strtol(argv[tag_value_arg], NULL, 0);
|
||||||
strtol(argv[tag_value_arg], NULL, 0);
|
|
||||||
tag_value_arg++;
|
tag_value_arg++;
|
||||||
args_remaining--;
|
args_remaining--;
|
||||||
if (args_remaining <= 0) {
|
if (args_remaining <= 0) {
|
||||||
@@ -328,8 +324,7 @@ int main(int argc, char *argv[]) {
|
|||||||
rpm_object->object_type, MAX_BACNET_OBJECT_TYPE + 1);
|
rpm_object->object_type, MAX_BACNET_OBJECT_TYPE + 1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
rpm_object->object_instance =
|
rpm_object->object_instance = strtol(argv[tag_value_arg], NULL, 0);
|
||||||
strtol(argv[tag_value_arg], NULL, 0);
|
|
||||||
tag_value_arg++;
|
tag_value_arg++;
|
||||||
args_remaining--;
|
args_remaining--;
|
||||||
if (args_remaining <= 0) {
|
if (args_remaining <= 0) {
|
||||||
@@ -350,12 +345,14 @@ int main(int argc, char *argv[]) {
|
|||||||
tag_value_arg++;
|
tag_value_arg++;
|
||||||
args_remaining--;
|
args_remaining--;
|
||||||
if (args_remaining <= 0) {
|
if (args_remaining <= 0) {
|
||||||
fprintf(stderr, "Error: not enough object property quads.\r\n");
|
fprintf(stderr,
|
||||||
|
"Error: not enough object property quads.\r\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (rpm_property->propertyIdentifier > MAX_BACNET_PROPERTY_ID) {
|
if (rpm_property->propertyIdentifier > MAX_BACNET_PROPERTY_ID) {
|
||||||
fprintf(stderr, "property=%u - it must be less than %u\r\n",
|
fprintf(stderr, "property=%u - it must be less than %u\r\n",
|
||||||
rpm_property->propertyIdentifier, MAX_BACNET_PROPERTY_ID + 1);
|
rpm_property->propertyIdentifier,
|
||||||
|
MAX_BACNET_PROPERTY_ID + 1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
rpm_property->propertyArrayIndex =
|
rpm_property->propertyArrayIndex =
|
||||||
@@ -413,10 +410,9 @@ int main(int argc, char *argv[]) {
|
|||||||
&Target_Address);
|
&Target_Address);
|
||||||
if (found) {
|
if (found) {
|
||||||
if (invoke_id == 0) {
|
if (invoke_id == 0) {
|
||||||
invoke_id = Send_Read_Property_Multiple_Request(
|
invoke_id =
|
||||||
&buffer[0],
|
Send_Read_Property_Multiple_Request(&buffer[0],
|
||||||
sizeof(buffer),
|
sizeof(buffer), Target_Device_Object_Instance,
|
||||||
Target_Device_Object_Instance,
|
|
||||||
Read_Access_Data);
|
Read_Access_Data);
|
||||||
} else if (tsm_invoke_id_free(invoke_id))
|
} else if (tsm_invoke_id_free(invoke_id))
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -212,8 +212,8 @@ int main(int argc, char *argv[]) {
|
|||||||
filename_remove_path(argv[0]), filename_remove_path(argv[0]));
|
filename_remove_path(argv[0]), filename_remove_path(argv[0]));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* decode the command line parameters */
|
/* decode the command line parameters */ cov_data.
|
||||||
cov_data.subscriberProcessIdentifier = strtol(argv[1], NULL, 0);
|
subscriberProcessIdentifier = strtol(argv[1], NULL, 0);
|
||||||
cov_data.initiatingDeviceIdentifier = strtol(argv[2], NULL, 0);
|
cov_data.initiatingDeviceIdentifier = strtol(argv[2], NULL, 0);
|
||||||
cov_data.monitoredObjectIdentifier.type = strtol(argv[3], NULL, 0);
|
cov_data.monitoredObjectIdentifier.type = strtol(argv[3], NULL, 0);
|
||||||
cov_data.monitoredObjectIdentifier.instance = strtol(argv[4], NULL, 0);
|
cov_data.monitoredObjectIdentifier.instance = strtol(argv[4], NULL, 0);
|
||||||
|
|||||||
@@ -86,8 +86,8 @@ static void MyRejectHandler(
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void My_Router_Handler(
|
static void My_Router_Handler(
|
||||||
BACNET_ADDRESS *src,
|
BACNET_ADDRESS * src,
|
||||||
BACNET_NPDU_DATA *npdu_data,
|
BACNET_NPDU_DATA * npdu_data,
|
||||||
uint8_t * npdu, /* PDU data */
|
uint8_t * npdu, /* PDU data */
|
||||||
uint16_t npdu_len)
|
uint16_t npdu_len)
|
||||||
{
|
{
|
||||||
@@ -109,7 +109,7 @@ static void My_Router_Handler(
|
|||||||
printf("\nNetworks: ");
|
printf("\nNetworks: ");
|
||||||
while (npdu_len) {
|
while (npdu_len) {
|
||||||
len = decode_unsigned16(&npdu[npdu_offset], &dnet);
|
len = decode_unsigned16(&npdu[npdu_offset], &dnet);
|
||||||
printf("%hu",dnet);
|
printf("%hu", dnet);
|
||||||
npdu_len -= len;
|
npdu_len -= len;
|
||||||
if (npdu_len) {
|
if (npdu_len) {
|
||||||
printf(", ");
|
printf(", ");
|
||||||
@@ -141,7 +141,7 @@ void My_NPDU_Handler(
|
|||||||
|
|
||||||
apdu_offset = npdu_decode(&pdu[0], &dest, src, &npdu_data);
|
apdu_offset = npdu_decode(&pdu[0], &dest, src, &npdu_data);
|
||||||
if (npdu_data.network_layer_message) {
|
if (npdu_data.network_layer_message) {
|
||||||
My_Router_Handler(src,&npdu_data,&pdu[apdu_offset],
|
My_Router_Handler(src, &npdu_data, &pdu[apdu_offset],
|
||||||
(uint16_t) (pdu_len - apdu_offset));
|
(uint16_t) (pdu_len - apdu_offset));
|
||||||
} else if ((apdu_offset > 0) && (apdu_offset <= pdu_len)) {
|
} else if ((apdu_offset > 0) && (apdu_offset <= pdu_len)) {
|
||||||
if ((npdu_data.protocol_version == BACNET_PROTOCOL_VERSION) &&
|
if ((npdu_data.protocol_version == BACNET_PROTOCOL_VERSION) &&
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ extern "C" {
|
|||||||
int decode_context_boolean2(
|
int decode_context_boolean2(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
uint8_t tag_number,
|
uint8_t tag_number,
|
||||||
bool *boolean_value);
|
bool * boolean_value);
|
||||||
|
|
||||||
/* from clause 20.2.10 Encoding of a Bit String Value */
|
/* from clause 20.2.10 Encoding of a Bit String Value */
|
||||||
/* returns the number of apdu bytes consumed */
|
/* returns the number of apdu bytes consumed */
|
||||||
@@ -154,11 +154,11 @@ extern "C" {
|
|||||||
/* from clause 20.2.7 Encoding of a Double Precision Real Number Value */
|
/* from clause 20.2.7 Encoding of a Double Precision Real Number Value */
|
||||||
/* and 20.2.1 General Rules for Encoding BACnet Tags */
|
/* and 20.2.1 General Rules for Encoding BACnet Tags */
|
||||||
/* returns the number of apdu bytes consumed */
|
/* returns the number of apdu bytes consumed */
|
||||||
int encode_application_double(
|
int encode_application_double(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
double value);
|
double value);
|
||||||
|
|
||||||
int encode_context_double(
|
int encode_context_double(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
int tag_number,
|
int tag_number,
|
||||||
double value);
|
double value);
|
||||||
@@ -174,7 +174,7 @@ int encode_context_double(
|
|||||||
int decode_context_object_id(
|
int decode_context_object_id(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
uint8_t tag_number,
|
uint8_t tag_number,
|
||||||
uint16_t *object_type,
|
uint16_t * object_type,
|
||||||
uint32_t * instance);
|
uint32_t * instance);
|
||||||
|
|
||||||
int encode_bacnet_object_id(
|
int encode_bacnet_object_id(
|
||||||
|
|||||||
@@ -48,20 +48,20 @@ typedef struct {
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
int bacapp_encode_device_obj_property_ref(
|
int bacapp_encode_device_obj_property_ref(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE * value);
|
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE * value);
|
||||||
|
|
||||||
int bacapp_encode_context_device_obj_property_ref(
|
int bacapp_encode_context_device_obj_property_ref(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
uint8_t tag_number,
|
uint8_t tag_number,
|
||||||
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE * value);
|
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE * value);
|
||||||
|
|
||||||
int bacapp_decode_device_obj_property_ref(
|
int bacapp_decode_device_obj_property_ref(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE * value);
|
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE * value);
|
||||||
|
|
||||||
int bacapp_decode_context_device_obj_property_ref(
|
int bacapp_decode_context_device_obj_property_ref(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
uint8_t tag_number,
|
uint8_t tag_number,
|
||||||
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE * value);
|
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE * value);
|
||||||
@@ -69,7 +69,4 @@ int bacapp_decode_context_device_obj_property_ref(
|
|||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
|
||||||
#endif //_BAC_DEV_PROP_REF_H_
|
#endif //_BAC_DEV_PROP_REF_H_
|
||||||
|
|
||||||
|
|||||||
@@ -83,22 +83,20 @@ typedef struct {
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
int bacapp_decode_property_state(
|
int bacapp_decode_property_state(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
BACNET_PROPERTY_STATE * value);
|
BACNET_PROPERTY_STATE * value);
|
||||||
|
|
||||||
int bacapp_decode_context_property_state(
|
int bacapp_decode_context_property_state(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
uint8_t tag_number,
|
uint8_t tag_number,
|
||||||
BACNET_PROPERTY_STATE * value);
|
BACNET_PROPERTY_STATE * value);
|
||||||
|
|
||||||
int bacapp_encode_property_state(
|
int bacapp_encode_property_state(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
BACNET_PROPERTY_STATE * value);
|
BACNET_PROPERTY_STATE * value);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
|
||||||
#endif // _BAC_PROP_STATES_H_
|
#endif // _BAC_PROP_STATES_H_
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ extern "C" {
|
|||||||
uint8_t * pdu,
|
uint8_t * pdu,
|
||||||
size_t max_pdu,
|
size_t max_pdu,
|
||||||
uint32_t device_id, /* destination device */
|
uint32_t device_id, /* destination device */
|
||||||
BACNET_READ_ACCESS_DATA *read_access_data);
|
BACNET_READ_ACCESS_DATA * read_access_data);
|
||||||
|
|
||||||
/* returns the invoke ID for confirmed request, or 0 if failed */
|
/* returns the invoke ID for confirmed request, or 0 if failed */
|
||||||
uint8_t Send_Write_Property_Request(
|
uint8_t Send_Write_Property_Request(
|
||||||
|
|||||||
@@ -44,20 +44,17 @@ extern "C" {
|
|||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
#if DEBUG_ENABLED
|
#if DEBUG_ENABLED
|
||||||
void debug_printf(
|
void debug_printf(
|
||||||
const char *format,
|
const char *format,
|
||||||
...);
|
...);
|
||||||
#else
|
#else
|
||||||
static void debug_printf(
|
static void debug_printf(
|
||||||
const char *format,
|
const char *format,
|
||||||
...)
|
...) {
|
||||||
{
|
|
||||||
format = format;
|
format = format;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ typedef struct BACnet_Event_Notification_Data {
|
|||||||
uint32_t notificationClass;
|
uint32_t notificationClass;
|
||||||
uint8_t priority;
|
uint8_t priority;
|
||||||
BACNET_EVENT_TYPE eventType;
|
BACNET_EVENT_TYPE eventType;
|
||||||
BACNET_CHARACTER_STRING* messageText; /* OPTIONAL - Set to NULL if not being used */
|
BACNET_CHARACTER_STRING *messageText; /* OPTIONAL - Set to NULL if not being used */
|
||||||
BACNET_NOTIFY_TYPE notifyType;
|
BACNET_NOTIFY_TYPE notifyType;
|
||||||
bool ackRequired;
|
bool ackRequired;
|
||||||
BACNET_EVENT_STATE fromState;
|
BACNET_EVENT_STATE fromState;
|
||||||
@@ -162,7 +162,7 @@ extern "C" {
|
|||||||
** Creates a Confirmed Event Notification APDU
|
** Creates a Confirmed Event Notification APDU
|
||||||
**
|
**
|
||||||
****************************************************/
|
****************************************************/
|
||||||
int cevent_notify_encode_apdu(
|
int cevent_notify_encode_apdu(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
uint8_t invoke_id,
|
uint8_t invoke_id,
|
||||||
BACNET_EVENT_NOTIFICATION_DATA * data);
|
BACNET_EVENT_NOTIFICATION_DATA * data);
|
||||||
@@ -172,7 +172,7 @@ int cevent_notify_encode_apdu(
|
|||||||
** Creates an Unconfirmed Event Notification APDU
|
** Creates an Unconfirmed Event Notification APDU
|
||||||
**
|
**
|
||||||
****************************************************/
|
****************************************************/
|
||||||
int uevent_notify_encode_apdu(
|
int uevent_notify_encode_apdu(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
BACNET_EVENT_NOTIFICATION_DATA * data);
|
BACNET_EVENT_NOTIFICATION_DATA * data);
|
||||||
|
|
||||||
@@ -181,7 +181,7 @@ int uevent_notify_encode_apdu(
|
|||||||
** Encodes the service data part of Event Notification
|
** Encodes the service data part of Event Notification
|
||||||
**
|
**
|
||||||
****************************************************/
|
****************************************************/
|
||||||
int event_notify_encode_service_request(
|
int event_notify_encode_service_request(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
BACNET_EVENT_NOTIFICATION_DATA * data);
|
BACNET_EVENT_NOTIFICATION_DATA * data);
|
||||||
|
|
||||||
@@ -190,7 +190,7 @@ int event_notify_encode_service_request(
|
|||||||
** Decodes the service data part of Event Notification
|
** Decodes the service data part of Event Notification
|
||||||
**
|
**
|
||||||
****************************************************/
|
****************************************************/
|
||||||
int event_notify_decode_service_request(
|
int event_notify_decode_service_request(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
unsigned apdu_len,
|
unsigned apdu_len,
|
||||||
BACNET_EVENT_NOTIFICATION_DATA * data);
|
BACNET_EVENT_NOTIFICATION_DATA * data);
|
||||||
@@ -200,10 +200,10 @@ int event_notify_decode_service_request(
|
|||||||
** Sends an Unconfirmed Event Notifcation to a dest
|
** Sends an Unconfirmed Event Notifcation to a dest
|
||||||
**
|
**
|
||||||
****************************************************/
|
****************************************************/
|
||||||
int uevent_notify_send(
|
int uevent_notify_send(
|
||||||
uint8_t * buffer,
|
uint8_t * buffer,
|
||||||
BACNET_EVENT_NOTIFICATION_DATA * data,
|
BACNET_EVENT_NOTIFICATION_DATA * data,
|
||||||
BACNET_ADDRESS *dest);
|
BACNET_ADDRESS * dest);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@@ -47,9 +47,9 @@ extern "C" {
|
|||||||
|
|
||||||
/* copy len bytes from src to offset of dest if there is enough space. */
|
/* copy len bytes from src to offset of dest if there is enough space. */
|
||||||
/* returns 0 if there is not enough space, or the number of bytes copied. */
|
/* returns 0 if there is not enough space, or the number of bytes copied. */
|
||||||
size_t memcopy(
|
size_t memcopy(
|
||||||
void * dest,
|
void *dest,
|
||||||
void * src,
|
void *src,
|
||||||
size_t offset, /* where in dest to put the data */
|
size_t offset, /* where in dest to put the data */
|
||||||
size_t len, /* amount of data to copy */
|
size_t len, /* amount of data to copy */
|
||||||
size_t max); /* total size of destination */
|
size_t max); /* total size of destination */
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ extern "C" {
|
|||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
size_t max_apdu,
|
size_t max_apdu,
|
||||||
uint8_t invoke_id,
|
uint8_t invoke_id,
|
||||||
BACNET_READ_ACCESS_DATA *read_access_data);
|
BACNET_READ_ACCESS_DATA * read_access_data);
|
||||||
|
|
||||||
/* decode the object portion of the service request only */
|
/* decode the object portion of the service request only */
|
||||||
int rpm_decode_object_id(
|
int rpm_decode_object_id(
|
||||||
|
|||||||
@@ -60,12 +60,12 @@ extern "C" {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
int bacapp_encode_context_timestamp(
|
int bacapp_encode_context_timestamp(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
uint8_t tag_number,
|
uint8_t tag_number,
|
||||||
BACNET_TIMESTAMP * value);
|
BACNET_TIMESTAMP * value);
|
||||||
|
|
||||||
int bacapp_decode_context_timestamp(
|
int bacapp_decode_context_timestamp(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
uint8_t tag_number,
|
uint8_t tag_number,
|
||||||
BACNET_TIMESTAMP * value);
|
BACNET_TIMESTAMP * value);
|
||||||
@@ -73,6 +73,4 @@ int bacapp_decode_context_timestamp(
|
|||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -8,11 +8,12 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef BUILD_DLL
|
#ifdef BUILD_DLL
|
||||||
#define DLL_EXPORT __declspec(dllexport)
|
#define DLL_EXPORT __declspec(dllexport)
|
||||||
#else
|
#else
|
||||||
#define DLL_EXPORT __declspec(dllimport)
|
#define DLL_EXPORT __declspec(dllimport)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void DLL_EXPORT SomeFunction(const LPCSTR sometext);
|
void DLL_EXPORT SomeFunction(
|
||||||
|
const LPCSTR sometext);
|
||||||
|
|
||||||
#endif // __MAIN_H__
|
#endif // __MAIN_H__
|
||||||
|
|||||||
@@ -328,4 +328,3 @@ int Device_Encode_Property_APDU(
|
|||||||
|
|
||||||
return apdu_len;
|
return apdu_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -105,8 +105,7 @@ static struct mstp_flag_t {
|
|||||||
} MSTP_Flag;
|
} MSTP_Flag;
|
||||||
|
|
||||||
/* data passed to receive handler */
|
/* data passed to receive handler */
|
||||||
struct mstp_packet_info_t
|
struct mstp_packet_info_t {
|
||||||
{
|
|
||||||
/* A Boolean flag set to TRUE by the Receive State Machine */
|
/* A Boolean flag set to TRUE by the Receive State Machine */
|
||||||
/* if a valid frame is received. */
|
/* if a valid frame is received. */
|
||||||
unsigned valid_frame:1;
|
unsigned valid_frame:1;
|
||||||
@@ -286,7 +285,9 @@ static void MSTP_Send_Frame(
|
|||||||
#if 0
|
#if 0
|
||||||
/* return true if the packet is good. */
|
/* return true if the packet is good. */
|
||||||
/* note: buffer should include the CRC as the last byte */
|
/* note: buffer should include the CRC as the last byte */
|
||||||
static bool crc_header_good(uint8_t *buffer, uint8_t len)
|
static bool crc_header_good(
|
||||||
|
uint8_t * buffer,
|
||||||
|
uint8_t len)
|
||||||
{
|
{
|
||||||
uint8_t i; /* loop counter */
|
uint8_t i; /* loop counter */
|
||||||
uint8_t crc8 = 0xFF; /* loop counter */
|
uint8_t crc8 = 0xFF; /* loop counter */
|
||||||
@@ -299,7 +300,8 @@ static bool crc_header_good(uint8_t *buffer, uint8_t len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void mstp_receive_handler(void)
|
static void mstp_receive_handler(
|
||||||
|
void)
|
||||||
{
|
{
|
||||||
uint8_t data_register = 0; /* data from UART */
|
uint8_t data_register = 0; /* data from UART */
|
||||||
|
|
||||||
@@ -327,13 +329,15 @@ static void mstp_receive_handler(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (DataLength == 0) {
|
if (DataLength == 0) {
|
||||||
MSTP_Receive_Packet.header[MSTP_Receive_Packet.index] = data_register;
|
MSTP_Receive_Packet.header[MSTP_Receive_Packet.index] =
|
||||||
|
data_register;
|
||||||
if (MSTP_Receive_Packet.index == 5) {
|
if (MSTP_Receive_Packet.index == 5) {
|
||||||
if (crc_header_good(MSTP_Receive_Packet.header, 6)) {
|
if (crc_header_good(MSTP_Receive_Packet.header, 6)) {
|
||||||
FrameType = MSTP_Receive_Packet.header[0];
|
FrameType = MSTP_Receive_Packet.header[0];
|
||||||
DestinationAddress = MSTP_Receive_Packet.header[1];
|
DestinationAddress = MSTP_Receive_Packet.header[1];
|
||||||
SourceAddress = MSTP_Receive_Packet.header[2];
|
SourceAddress = MSTP_Receive_Packet.header[2];
|
||||||
DataLength = (MSTP_Receive_Packet.header[3] * 256) +
|
DataLength =
|
||||||
|
(MSTP_Receive_Packet.header[3] * 256) +
|
||||||
MSTP_Receive_Packet.header[4];
|
MSTP_Receive_Packet.header[4];
|
||||||
if (DataLength == 0) {
|
if (DataLength == 0) {
|
||||||
MSTP_Receive_Packet.valid_frame = true;
|
MSTP_Receive_Packet.valid_frame = true;
|
||||||
@@ -347,11 +351,12 @@ static void mstp_receive_handler(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
MSTP_Receive_Packet.buffer[MSTP_Receive_Packet.index] = data_register;
|
MSTP_Receive_Packet.buffer[MSTP_Receive_Packet.index] =
|
||||||
|
data_register;
|
||||||
if (packet_info->index == packet_info->len) {
|
if (packet_info->index == packet_info->len) {
|
||||||
/* PDU length ended */
|
/* PDU length ended */
|
||||||
packet_info->ready = true;
|
packet_info->ready = true;
|
||||||
} else if (packet_info->index >= sizeof(packet_info->buffer)){
|
} else if (packet_info->index >= sizeof(packet_info->buffer)) {
|
||||||
/* exceeded the size of the storage */
|
/* exceeded the size of the storage */
|
||||||
packet_info->len = packet_info->index;
|
packet_info->len = packet_info->index;
|
||||||
packet_info->ready = true;
|
packet_info->ready = true;
|
||||||
@@ -361,7 +366,8 @@ static void mstp_receive_handler(void)
|
|||||||
MSTP_Receive_Packet.index++;
|
MSTP_Receive_Packet.index++;
|
||||||
if (packet_info->ready) {
|
if (packet_info->ready) {
|
||||||
/* validate the CRC */
|
/* validate the CRC */
|
||||||
if (!lrc_packet_good(packet_info->buffer,packet_info->len+1)) {
|
if (!lrc_packet_good(packet_info->buffer,
|
||||||
|
packet_info->len + 1)) {
|
||||||
packet_info->ready = false;
|
packet_info->ready = false;
|
||||||
}
|
}
|
||||||
/* pull off the CRC */
|
/* pull off the CRC */
|
||||||
@@ -616,9 +622,8 @@ static void MSTP_Slave_Node_FSM(
|
|||||||
MSTP_Flag.ReceivePacketPending = true;
|
MSTP_Flag.ReceivePacketPending = true;
|
||||||
break;
|
break;
|
||||||
case FRAME_TYPE_TEST_REQUEST:
|
case FRAME_TYPE_TEST_REQUEST:
|
||||||
MSTP_Send_Frame(FRAME_TYPE_TEST_RESPONSE,
|
MSTP_Send_Frame(FRAME_TYPE_TEST_RESPONSE, SourceAddress,
|
||||||
SourceAddress, This_Station, &InputBuffer[0],
|
This_Station, &InputBuffer[0], DataLength);
|
||||||
DataLength);
|
|
||||||
break;
|
break;
|
||||||
case FRAME_TYPE_TEST_RESPONSE:
|
case FRAME_TYPE_TEST_RESPONSE:
|
||||||
default:
|
default:
|
||||||
@@ -634,8 +639,8 @@ static void MSTP_Slave_Node_FSM(
|
|||||||
/* and enter the IDLE state to wait for the next frame. */
|
/* and enter the IDLE state to wait for the next frame. */
|
||||||
/* Note: optimized such that we are never a client */
|
/* Note: optimized such that we are never a client */
|
||||||
MSTP_Send_Frame(FRAME_TYPE_BACNET_DATA_NOT_EXPECTING_REPLY,
|
MSTP_Send_Frame(FRAME_TYPE_BACNET_DATA_NOT_EXPECTING_REPLY,
|
||||||
TransmitPacketDest, This_Station,
|
TransmitPacketDest, This_Station, (uint8_t *) & TransmitPacket[0],
|
||||||
(uint8_t *) & TransmitPacket[0], TransmitPacketLen);
|
TransmitPacketLen);
|
||||||
MSTP_Flag.TransmitPacketPending = false;
|
MSTP_Flag.TransmitPacketPending = false;
|
||||||
MSTP_Flag.ReceivePacketPending = false;
|
MSTP_Flag.ReceivePacketPending = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,24 +36,24 @@
|
|||||||
/* This file has been customized for use with ATMEGA168 */
|
/* This file has been customized for use with ATMEGA168 */
|
||||||
#if defined(__AVR_ATmega168__)
|
#if defined(__AVR_ATmega168__)
|
||||||
/* USART defines for RS-485 port */
|
/* USART defines for RS-485 port */
|
||||||
#define UCSRB UCSR0B
|
#define UCSRB UCSR0B
|
||||||
#define TXEN TXEN0
|
#define TXEN TXEN0
|
||||||
#define RXEN RXEN0
|
#define RXEN RXEN0
|
||||||
#define UCSRC UCSR0C
|
#define UCSRC UCSR0C
|
||||||
#define UCSZ1 UCSZ01
|
#define UCSZ1 UCSZ01
|
||||||
#define UCSZ0 UCSZ00
|
#define UCSZ0 UCSZ00
|
||||||
#define UCSRA UCSR0A
|
#define UCSRA UCSR0A
|
||||||
#define U2X U2X0
|
#define U2X U2X0
|
||||||
#define UBRRL UBRR0
|
#define UBRRL UBRR0
|
||||||
#define UCSRA UCSR0A
|
#define UCSRA UCSR0A
|
||||||
#define UDRE UDRE0
|
#define UDRE UDRE0
|
||||||
#define UDR UDR0
|
#define UDR UDR0
|
||||||
#define TXC TXC0
|
#define TXC TXC0
|
||||||
#define FE FE0
|
#define FE FE0
|
||||||
#define DOR DOR0
|
#define DOR DOR0
|
||||||
#define UPE UPE0
|
#define UPE UPE0
|
||||||
#define DOR DOR0
|
#define DOR DOR0
|
||||||
#define RXC RXC0
|
#define RXC RXC0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "hardware.h"
|
#include "hardware.h"
|
||||||
|
|||||||
@@ -98,7 +98,8 @@ bool timer_silence_elapsed(
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
void timer_silence_reset(void)
|
void timer_silence_reset(
|
||||||
|
void)
|
||||||
{
|
{
|
||||||
uint8_t sreg;
|
uint8_t sreg;
|
||||||
|
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ static void snap_received_packet(
|
|||||||
mtu[30] = mstp_port->HeaderCRCActual;
|
mtu[30] = mstp_port->HeaderCRCActual;
|
||||||
mtu_len = 31;
|
mtu_len = 31;
|
||||||
if (mstp_port->DataLength) {
|
if (mstp_port->DataLength) {
|
||||||
max_data = min(mstp_port->InputBufferSize,mstp_port->DataLength);
|
max_data = min(mstp_port->InputBufferSize, mstp_port->DataLength);
|
||||||
for (i = 0; i < max_data; i++) {
|
for (i = 0; i < max_data; i++) {
|
||||||
mtu[31 + i] = mstp_port->InputBuffer[i];
|
mtu[31 + i] = mstp_port->InputBuffer[i];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -217,8 +217,8 @@ static void write_received_packet(
|
|||||||
fwrite(header, sizeof(header), 1, pFile);
|
fwrite(header, sizeof(header), 1, pFile);
|
||||||
if (mstp_port->DataLength) {
|
if (mstp_port->DataLength) {
|
||||||
fwrite(mstp_port->InputBuffer, max_data, 1, pFile);
|
fwrite(mstp_port->InputBuffer, max_data, 1, pFile);
|
||||||
fwrite((char *)&(mstp_port->DataCRCActualMSB), 1, 1, pFile);
|
fwrite((char *) &(mstp_port->DataCRCActualMSB), 1, 1, pFile);
|
||||||
fwrite((char *)&(mstp_port->DataCRCActualLSB), 1, 1, pFile);
|
fwrite((char *) &(mstp_port->DataCRCActualLSB), 1, 1, pFile);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "rx_fsm: failed to open %s: %s\n", Capture_Filename,
|
fprintf(stderr, "rx_fsm: failed to open %s: %s\n", Capture_Filename,
|
||||||
|
|||||||
@@ -381,7 +381,7 @@ bool bip_init(
|
|||||||
bip_set_socket(-1);
|
bip_set_socket(-1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* Enables transmission and receipt of broadcast messages on the socket.*/
|
/* Enables transmission and receipt of broadcast messages on the socket. */
|
||||||
rv = setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, (char *) &value,
|
rv = setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, (char *) &value,
|
||||||
sizeof(value));
|
sizeof(value));
|
||||||
if (rv < 0) {
|
if (rv < 0) {
|
||||||
|
|||||||
@@ -294,14 +294,13 @@ static void Init_DataLink(
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(
|
int main(int argc, char *argv[]) {
|
||||||
int argc,
|
BACNET_ADDRESS src = {
|
||||||
char *argv[])
|
0}; /* address where message came from */
|
||||||
{
|
|
||||||
BACNET_ADDRESS src = { 0 }; /* address where message came from */
|
|
||||||
uint16_t pdu_len = 0;
|
uint16_t pdu_len = 0;
|
||||||
unsigned timeout = 100; /* milliseconds */
|
unsigned timeout = 100; /* milliseconds */
|
||||||
BACNET_ADDRESS my_address, broadcast_address;
|
BACNET_ADDRESS my_address,
|
||||||
|
broadcast_address;
|
||||||
|
|
||||||
(void) argc;
|
(void) argc;
|
||||||
(void) argv;
|
(void) argv;
|
||||||
|
|||||||
@@ -245,7 +245,7 @@ static void write_received_packet(
|
|||||||
fwrite(&ts_sec, sizeof(ts_sec), 1, pFile);
|
fwrite(&ts_sec, sizeof(ts_sec), 1, pFile);
|
||||||
fwrite(&ts_usec, sizeof(ts_usec), 1, pFile);
|
fwrite(&ts_usec, sizeof(ts_usec), 1, pFile);
|
||||||
if (mstp_port->DataLength) {
|
if (mstp_port->DataLength) {
|
||||||
max_data = min(mstp_port->InputBufferSize,mstp_port->DataLength);
|
max_data = min(mstp_port->InputBufferSize, mstp_port->DataLength);
|
||||||
incl_len = orig_len = 8 + max_data + 2;
|
incl_len = orig_len = 8 + max_data + 2;
|
||||||
} else {
|
} else {
|
||||||
incl_len = orig_len = 8;
|
incl_len = orig_len = 8;
|
||||||
|
|||||||
+91
-113
@@ -303,7 +303,7 @@ int encode_closing_tag(
|
|||||||
static bool decode_is_extended_tag_number(
|
static bool decode_is_extended_tag_number(
|
||||||
uint8_t * apdu)
|
uint8_t * apdu)
|
||||||
{
|
{
|
||||||
return (bool)((apdu[0] & 0xF0) == 0xF0);
|
return (bool) ((apdu[0] & 0xF0) == 0xF0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* from clause 20.2.1.3.2 Constructed Data */
|
/* from clause 20.2.1.3.2 Constructed Data */
|
||||||
@@ -311,7 +311,7 @@ static bool decode_is_extended_tag_number(
|
|||||||
static bool decode_is_extended_value(
|
static bool decode_is_extended_value(
|
||||||
uint8_t * apdu)
|
uint8_t * apdu)
|
||||||
{
|
{
|
||||||
return (bool)((apdu[0] & 0x07) == 5);
|
return (bool) ((apdu[0] & 0x07) == 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* from clause 20.2.1.3.2 Constructed Data */
|
/* from clause 20.2.1.3.2 Constructed Data */
|
||||||
@@ -319,7 +319,7 @@ static bool decode_is_extended_value(
|
|||||||
bool decode_is_context_specific(
|
bool decode_is_context_specific(
|
||||||
uint8_t * apdu)
|
uint8_t * apdu)
|
||||||
{
|
{
|
||||||
return (bool)((apdu[0] & BIT3) == BIT3);
|
return (bool) ((apdu[0] & BIT3) == BIT3);
|
||||||
}
|
}
|
||||||
|
|
||||||
int decode_tag_number(
|
int decode_tag_number(
|
||||||
@@ -337,7 +337,7 @@ int decode_tag_number(
|
|||||||
len++;
|
len++;
|
||||||
} else {
|
} else {
|
||||||
if (tag_number) {
|
if (tag_number) {
|
||||||
*tag_number = (uint8_t)(apdu[0] >> 4);
|
*tag_number = (uint8_t) (apdu[0] >> 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -347,7 +347,7 @@ int decode_tag_number(
|
|||||||
bool decode_is_opening_tag(
|
bool decode_is_opening_tag(
|
||||||
uint8_t * apdu)
|
uint8_t * apdu)
|
||||||
{
|
{
|
||||||
return (bool)((apdu[0] & 0x07) == 6);
|
return (bool) ((apdu[0] & 0x07) == 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* from clause 20.2.1.3.2 Constructed Data */
|
/* from clause 20.2.1.3.2 Constructed Data */
|
||||||
@@ -355,7 +355,7 @@ bool decode_is_opening_tag(
|
|||||||
bool decode_is_closing_tag(
|
bool decode_is_closing_tag(
|
||||||
uint8_t * apdu)
|
uint8_t * apdu)
|
||||||
{
|
{
|
||||||
return (bool)((apdu[0] & 0x07) == 7);
|
return (bool) ((apdu[0] & 0x07) == 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* from clause 20.2.1.3.2 Constructed Data */
|
/* from clause 20.2.1.3.2 Constructed Data */
|
||||||
@@ -420,13 +420,13 @@ bool decode_is_context_tag(
|
|||||||
context_specific = decode_is_context_specific(apdu);
|
context_specific = decode_is_context_specific(apdu);
|
||||||
decode_tag_number(apdu, &my_tag_number);
|
decode_tag_number(apdu, &my_tag_number);
|
||||||
|
|
||||||
return (bool)(context_specific && (my_tag_number == tag_number));
|
return (bool) (context_specific && (my_tag_number == tag_number));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool decode_is_context_tag_with_length(
|
bool decode_is_context_tag_with_length(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
uint8_t tag_number,
|
uint8_t tag_number,
|
||||||
int * tag_length)
|
int *tag_length)
|
||||||
{
|
{
|
||||||
uint8_t my_tag_number = 0;
|
uint8_t my_tag_number = 0;
|
||||||
bool context_specific = false;
|
bool context_specific = false;
|
||||||
@@ -435,7 +435,7 @@ bool decode_is_context_tag_with_length(
|
|||||||
context_specific = decode_is_context_specific(apdu);
|
context_specific = decode_is_context_specific(apdu);
|
||||||
*tag_length = decode_tag_number(apdu, &my_tag_number);
|
*tag_length = decode_tag_number(apdu, &my_tag_number);
|
||||||
|
|
||||||
return (bool)(context_specific && (my_tag_number == tag_number));
|
return (bool) (context_specific && (my_tag_number == tag_number));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* from clause 20.2.1.3.2 Constructed Data */
|
/* from clause 20.2.1.3.2 Constructed Data */
|
||||||
@@ -447,10 +447,10 @@ bool decode_is_opening_tag_number(
|
|||||||
uint8_t my_tag_number = 0;
|
uint8_t my_tag_number = 0;
|
||||||
bool opening_tag = false;
|
bool opening_tag = false;
|
||||||
|
|
||||||
opening_tag = (bool)((apdu[0] & 0x07) == 6);
|
opening_tag = (bool) ((apdu[0] & 0x07) == 6);
|
||||||
decode_tag_number(apdu, &my_tag_number);
|
decode_tag_number(apdu, &my_tag_number);
|
||||||
|
|
||||||
return (bool)(opening_tag && (my_tag_number == tag_number));
|
return (bool) (opening_tag && (my_tag_number == tag_number));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* from clause 20.2.1.3.2 Constructed Data */
|
/* from clause 20.2.1.3.2 Constructed Data */
|
||||||
@@ -462,10 +462,10 @@ bool decode_is_closing_tag_number(
|
|||||||
uint8_t my_tag_number = 0;
|
uint8_t my_tag_number = 0;
|
||||||
bool closing_tag = false;
|
bool closing_tag = false;
|
||||||
|
|
||||||
closing_tag = (bool)((apdu[0] & 0x07) == 7);
|
closing_tag = (bool) ((apdu[0] & 0x07) == 7);
|
||||||
decode_tag_number(apdu, &my_tag_number);
|
decode_tag_number(apdu, &my_tag_number);
|
||||||
|
|
||||||
return (bool)(closing_tag && (my_tag_number == tag_number));
|
return (bool) (closing_tag && (my_tag_number == tag_number));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* from clause 20.2.3 Encoding of a Boolean Value */
|
/* from clause 20.2.3 Encoding of a Boolean Value */
|
||||||
@@ -496,7 +496,7 @@ int encode_context_boolean(
|
|||||||
int len = 0; /* return value */
|
int len = 0; /* return value */
|
||||||
|
|
||||||
len = encode_tag(&apdu[0], (uint8_t) tag_number, true, 1);
|
len = encode_tag(&apdu[0], (uint8_t) tag_number, true, 1);
|
||||||
apdu[len] = (bool)(boolean_value ? 1 : 0);
|
apdu[len] = (bool) (boolean_value ? 1 : 0);
|
||||||
len++;
|
len++;
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
@@ -517,21 +517,17 @@ bool decode_context_boolean(
|
|||||||
int decode_context_boolean2(
|
int decode_context_boolean2(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
uint8_t tag_number,
|
uint8_t tag_number,
|
||||||
bool *boolean_value)
|
bool * boolean_value)
|
||||||
{
|
{
|
||||||
int len = 0;
|
int len = 0;
|
||||||
if (decode_is_context_tag_with_length(&apdu[len], tag_number, &len)) {
|
if (decode_is_context_tag_with_length(&apdu[len], tag_number, &len)) {
|
||||||
if (apdu[len]) {
|
if (apdu[len]) {
|
||||||
*boolean_value = true;
|
*boolean_value = true;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
*boolean_value = false;
|
*boolean_value = false;
|
||||||
}
|
}
|
||||||
len++;
|
len++;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
@@ -624,7 +620,7 @@ int decode_bitstring(
|
|||||||
bitstring_set_octet(bit_string, (uint8_t) i,
|
bitstring_set_octet(bit_string, (uint8_t) i,
|
||||||
byte_reverse_bits(apdu[len++]));
|
byte_reverse_bits(apdu[len++]));
|
||||||
}
|
}
|
||||||
unused_bits = (uint8_t)(apdu[0] & 0x07);
|
unused_bits = (uint8_t) (apdu[0] & 0x07);
|
||||||
bitstring_set_bits_used(bit_string, (uint8_t) bytes_used,
|
bitstring_set_bits_used(bit_string, (uint8_t) bytes_used,
|
||||||
unused_bits);
|
unused_bits);
|
||||||
}
|
}
|
||||||
@@ -642,12 +638,10 @@ int decode_context_bitstring(
|
|||||||
int len = 0;
|
int len = 0;
|
||||||
|
|
||||||
if (decode_is_context_tag(&apdu[len], tag_number)) {
|
if (decode_is_context_tag(&apdu[len], tag_number)) {
|
||||||
len += decode_tag_number_and_value(&apdu[len], &tag_number,
|
len +=
|
||||||
&len_value);
|
decode_tag_number_and_value(&apdu[len], &tag_number, &len_value);
|
||||||
len += decode_bitstring(&apdu[len], len_value, bit_string);
|
len += decode_bitstring(&apdu[len], len_value, bit_string);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
@@ -671,9 +665,10 @@ int encode_bitstring(
|
|||||||
} else {
|
} else {
|
||||||
used_bytes = bitstring_bytes_used(bit_string);
|
used_bytes = bitstring_bytes_used(bit_string);
|
||||||
remaining_used_bits =
|
remaining_used_bits =
|
||||||
(uint8_t)(bitstring_bits_used(bit_string) - ((used_bytes - 1) * 8));
|
(uint8_t) (bitstring_bits_used(bit_string) - ((used_bytes -
|
||||||
|
1) * 8));
|
||||||
/* number of unused bits in the subsequent final octet */
|
/* number of unused bits in the subsequent final octet */
|
||||||
apdu[len++] = (uint8_t)(8 - remaining_used_bits);
|
apdu[len++] = (uint8_t) (8 - remaining_used_bits);
|
||||||
for (i = 0; i < used_bytes; i++) {
|
for (i = 0; i < used_bytes; i++) {
|
||||||
apdu[len++] = byte_reverse_bits(bitstring_octet(bit_string, i));
|
apdu[len++] = byte_reverse_bits(bitstring_octet(bit_string, i));
|
||||||
}
|
}
|
||||||
@@ -721,14 +716,15 @@ int encode_context_bitstring(
|
|||||||
/* returns the number of apdu bytes consumed */
|
/* returns the number of apdu bytes consumed */
|
||||||
int decode_object_id(
|
int decode_object_id(
|
||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
uint16_t *object_type,
|
uint16_t * object_type,
|
||||||
uint32_t * instance)
|
uint32_t * instance)
|
||||||
{
|
{
|
||||||
uint32_t value = 0;
|
uint32_t value = 0;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
|
||||||
len = decode_unsigned32(apdu, &value);
|
len = decode_unsigned32(apdu, &value);
|
||||||
*object_type = (uint16_t)(((value >> BACNET_INSTANCE_BITS) & BACNET_MAX_OBJECT));
|
*object_type =
|
||||||
|
(uint16_t) (((value >> BACNET_INSTANCE_BITS) & BACNET_MAX_OBJECT));
|
||||||
*instance = (value & BACNET_MAX_INSTANCE);
|
*instance = (value & BACNET_MAX_INSTANCE);
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
@@ -744,9 +740,7 @@ int decode_context_object_id(
|
|||||||
|
|
||||||
if (decode_is_context_tag_with_length(&apdu[len], tag_number, &len)) {
|
if (decode_is_context_tag_with_length(&apdu[len], tag_number, &len)) {
|
||||||
len += decode_object_id(&apdu[len], object_type, instance);
|
len += decode_object_id(&apdu[len], object_type, instance);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
@@ -912,19 +906,16 @@ int decode_context_octet_string(
|
|||||||
bool status = false;
|
bool status = false;
|
||||||
uint32_t len_value = 0;
|
uint32_t len_value = 0;
|
||||||
|
|
||||||
if (decode_is_context_tag(&apdu[len], tag_number))
|
if (decode_is_context_tag(&apdu[len], tag_number)) {
|
||||||
{
|
len +=
|
||||||
len += decode_tag_number_and_value(&apdu[len], &tag_number,
|
decode_tag_number_and_value(&apdu[len], &tag_number, &len_value);
|
||||||
&len_value);
|
|
||||||
|
|
||||||
status = octetstring_init(octet_string, &apdu[len], len_value);
|
status = octetstring_init(octet_string, &apdu[len], len_value);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
len += len_value;
|
len += len_value;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1022,20 +1013,17 @@ int decode_context_character_string(
|
|||||||
bool status = false;
|
bool status = false;
|
||||||
uint32_t len_value = 0;
|
uint32_t len_value = 0;
|
||||||
|
|
||||||
if (decode_is_context_tag(&apdu[len], tag_number))
|
if (decode_is_context_tag(&apdu[len], tag_number)) {
|
||||||
{
|
len +=
|
||||||
len += decode_tag_number_and_value(&apdu[len], &tag_number,
|
decode_tag_number_and_value(&apdu[len], &tag_number, &len_value);
|
||||||
&len_value);
|
|
||||||
|
|
||||||
status =
|
status =
|
||||||
characterstring_init(char_string, apdu[len], (char *) &apdu[len+1],
|
characterstring_init(char_string, apdu[len],
|
||||||
len_value - 1);
|
(char *) &apdu[len + 1], len_value - 1);
|
||||||
if (status) {
|
if (status) {
|
||||||
len += len_value;
|
len += len_value;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1085,12 +1073,10 @@ int decode_context_unsigned(
|
|||||||
int len = 0;
|
int len = 0;
|
||||||
|
|
||||||
if (decode_is_context_tag(&apdu[len], tag_number)) {
|
if (decode_is_context_tag(&apdu[len], tag_number)) {
|
||||||
len += decode_tag_number_and_value(&apdu[len], &tag_number,
|
len +=
|
||||||
&len_value);
|
decode_tag_number_and_value(&apdu[len], &tag_number, &len_value);
|
||||||
len += decode_unsigned(&apdu[len], len_value, value);
|
len += decode_unsigned(&apdu[len], len_value, value);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
@@ -1186,12 +1172,10 @@ int decode_context_enumerated(
|
|||||||
uint32_t len_value;
|
uint32_t len_value;
|
||||||
|
|
||||||
if (decode_is_context_tag(&apdu[len], tag_value)) {
|
if (decode_is_context_tag(&apdu[len], tag_value)) {
|
||||||
len += decode_tag_number_and_value(&apdu[len], &tag_number,
|
len +=
|
||||||
&len_value);
|
decode_tag_number_and_value(&apdu[len], &tag_number, &len_value);
|
||||||
len += decode_enumerated(&apdu[len], len_value, value);
|
len += decode_enumerated(&apdu[len], len_value, value);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
@@ -1285,12 +1269,10 @@ int decode_context_signed(
|
|||||||
int len = 0;
|
int len = 0;
|
||||||
|
|
||||||
if (decode_is_context_tag(&apdu[len], tag_number)) {
|
if (decode_is_context_tag(&apdu[len], tag_number)) {
|
||||||
len += decode_tag_number_and_value(&apdu[len], &tag_number,
|
len +=
|
||||||
&len_value);
|
decode_tag_number_and_value(&apdu[len], &tag_number, &len_value);
|
||||||
len += decode_signed(&apdu[len], len_value, value);
|
len += decode_signed(&apdu[len], len_value, value);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
@@ -1504,13 +1486,10 @@ int decode_application_time(
|
|||||||
uint8_t tag_number;
|
uint8_t tag_number;
|
||||||
decode_tag_number(&apdu[len], &tag_number);
|
decode_tag_number(&apdu[len], &tag_number);
|
||||||
|
|
||||||
if ( tag_number == BACNET_APPLICATION_TAG_TIME )
|
if (tag_number == BACNET_APPLICATION_TAG_TIME) {
|
||||||
{
|
|
||||||
len++;
|
len++;
|
||||||
len += decode_bacnet_time(&apdu[len], btime);
|
len += decode_bacnet_time(&apdu[len], btime);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
@@ -1526,9 +1505,7 @@ int decode_context_bacnet_time(
|
|||||||
|
|
||||||
if (decode_is_context_tag_with_length(&apdu[len], tag_number, &len)) {
|
if (decode_is_context_tag_with_length(&apdu[len], tag_number, &len)) {
|
||||||
len += decode_bacnet_time(&apdu[len], btime);
|
len += decode_bacnet_time(&apdu[len], btime);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
@@ -1550,15 +1527,11 @@ int encode_bacnet_date(
|
|||||||
{
|
{
|
||||||
/* allow 2 digit years */
|
/* allow 2 digit years */
|
||||||
if (bdate->year >= 1900) {
|
if (bdate->year >= 1900) {
|
||||||
apdu[0] = (uint8_t)(bdate->year - 1900);
|
apdu[0] = (uint8_t) (bdate->year - 1900);
|
||||||
}
|
} else if (bdate->year < 0x100) {
|
||||||
else if ( bdate->year < 0x100 )
|
apdu[0] = (uint8_t) bdate->year;
|
||||||
{
|
|
||||||
apdu[0] = (uint8_t)bdate->year;
|
|
||||||
|
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
/*
|
/*
|
||||||
** Don't try and guess what the user meant here. Just fail
|
** Don't try and guess what the user meant here. Just fail
|
||||||
*/
|
*/
|
||||||
@@ -1617,7 +1590,7 @@ int decode_date(
|
|||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
BACNET_DATE * bdate)
|
BACNET_DATE * bdate)
|
||||||
{
|
{
|
||||||
bdate->year = (uint16_t)(apdu[0] + 1900);
|
bdate->year = (uint16_t) (apdu[0] + 1900);
|
||||||
bdate->month = apdu[1];
|
bdate->month = apdu[1];
|
||||||
bdate->day = apdu[2];
|
bdate->day = apdu[2];
|
||||||
bdate->wday = apdu[3];
|
bdate->wday = apdu[3];
|
||||||
@@ -1633,13 +1606,10 @@ int decode_application_date(
|
|||||||
uint8_t tag_number;
|
uint8_t tag_number;
|
||||||
decode_tag_number(&apdu[len], &tag_number);
|
decode_tag_number(&apdu[len], &tag_number);
|
||||||
|
|
||||||
if ( tag_number == BACNET_APPLICATION_TAG_DATE )
|
if (tag_number == BACNET_APPLICATION_TAG_DATE) {
|
||||||
{
|
|
||||||
len++;
|
len++;
|
||||||
len += decode_date(&apdu[len], bdate);
|
len += decode_date(&apdu[len], bdate);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
@@ -1654,9 +1624,7 @@ int decode_context_date(
|
|||||||
|
|
||||||
if (decode_is_context_tag_with_length(&apdu[len], tag_number, &len)) {
|
if (decode_is_context_tag_with_length(&apdu[len], tag_number, &len)) {
|
||||||
len += decode_date(&apdu[len], bdate);
|
len += decode_date(&apdu[len], bdate);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
@@ -2203,7 +2171,7 @@ void testBACDCodeObject(
|
|||||||
uint32_t decoded_instance = 0;
|
uint32_t decoded_instance = 0;
|
||||||
|
|
||||||
encode_bacnet_object_id(&encoded_array[0], type, instance);
|
encode_bacnet_object_id(&encoded_array[0], type, instance);
|
||||||
decode_object_id(&encoded_array[0], (uint16_t *) &decoded_type,
|
decode_object_id(&encoded_array[0], (uint16_t *) & decoded_type,
|
||||||
&decoded_instance);
|
&decoded_instance);
|
||||||
ct_test(pTest, decoded_type == type);
|
ct_test(pTest, decoded_type == type);
|
||||||
ct_test(pTest, decoded_instance == instance);
|
ct_test(pTest, decoded_instance == instance);
|
||||||
@@ -2213,7 +2181,7 @@ void testBACDCodeObject(
|
|||||||
for (type = 0; type < 1024; type++) {
|
for (type = 0; type < 1024; type++) {
|
||||||
for (instance = 0; instance <= BACNET_MAX_INSTANCE; instance += 1024) {
|
for (instance = 0; instance <= BACNET_MAX_INSTANCE; instance += 1024) {
|
||||||
encode_bacnet_object_id(&encoded_array[0], type, instance);
|
encode_bacnet_object_id(&encoded_array[0], type, instance);
|
||||||
decode_object_id(&encoded_array[0], (uint16_t *) &decoded_type,
|
decode_object_id(&encoded_array[0], (uint16_t *) & decoded_type,
|
||||||
&decoded_instance);
|
&decoded_instance);
|
||||||
ct_test(pTest, decoded_type == type);
|
ct_test(pTest, decoded_type == type);
|
||||||
ct_test(pTest, decoded_instance == instance);
|
ct_test(pTest, decoded_instance == instance);
|
||||||
@@ -2293,7 +2261,8 @@ void testBACDCodeBitString(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testUnsignedContextDecodes(Test * pTest)
|
void testUnsignedContextDecodes(
|
||||||
|
Test * pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU];
|
uint8_t apdu[MAX_APDU];
|
||||||
int inLen;
|
int inLen;
|
||||||
@@ -2347,7 +2316,8 @@ void testUnsignedContextDecodes(Test * pTest)
|
|||||||
ct_test(pTest, in == out);
|
ct_test(pTest, in == out);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testSignedContextDecodes(Test * pTest)
|
void testSignedContextDecodes(
|
||||||
|
Test * pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU];
|
uint8_t apdu[MAX_APDU];
|
||||||
int inLen;
|
int inLen;
|
||||||
@@ -2401,7 +2371,8 @@ void testSignedContextDecodes(Test * pTest)
|
|||||||
ct_test(pTest, in == out);
|
ct_test(pTest, in == out);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testEnumeratedContextDecodes(Test * pTest)
|
void testEnumeratedContextDecodes(
|
||||||
|
Test * pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU];
|
uint8_t apdu[MAX_APDU];
|
||||||
int inLen;
|
int inLen;
|
||||||
@@ -2455,7 +2426,8 @@ void testEnumeratedContextDecodes(Test * pTest)
|
|||||||
ct_test(pTest, in == out);
|
ct_test(pTest, in == out);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testFloatContextDecodes(Test * pTest)
|
void testFloatContextDecodes(
|
||||||
|
Test * pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU];
|
uint8_t apdu[MAX_APDU];
|
||||||
int inLen;
|
int inLen;
|
||||||
@@ -2485,7 +2457,8 @@ void testFloatContextDecodes(Test * pTest)
|
|||||||
ct_test(pTest, in == out);
|
ct_test(pTest, in == out);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testObjectIDContextDecodes(Test * pTest)
|
void testObjectIDContextDecodes(
|
||||||
|
Test * pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU];
|
uint8_t apdu[MAX_APDU];
|
||||||
int inLen;
|
int inLen;
|
||||||
@@ -2513,7 +2486,8 @@ void testObjectIDContextDecodes(Test * pTest)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void testCharacterStringContextDecodes(Test * pTest)
|
void testCharacterStringContextDecodes(
|
||||||
|
Test * pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU];
|
uint8_t apdu[MAX_APDU];
|
||||||
int inLen;
|
int inLen;
|
||||||
@@ -2526,8 +2500,8 @@ void testCharacterStringContextDecodes(Test * pTest)
|
|||||||
characterstring_init_ansi(&in, "This is a test");
|
characterstring_init_ansi(&in, "This is a test");
|
||||||
|
|
||||||
inLen = encode_context_character_string(apdu, 10, &in);
|
inLen = encode_context_character_string(apdu, 10, &in);
|
||||||
outLen= decode_context_character_string(apdu, 10, &out);
|
outLen = decode_context_character_string(apdu, 10, &out);
|
||||||
outLen2= decode_context_character_string(apdu, 9, &out);
|
outLen2 = decode_context_character_string(apdu, 9, &out);
|
||||||
|
|
||||||
ct_test(pTest, outLen2 == -1);
|
ct_test(pTest, outLen2 == -1);
|
||||||
ct_test(pTest, inLen == outLen);
|
ct_test(pTest, inLen == outLen);
|
||||||
@@ -2536,7 +2510,8 @@ void testCharacterStringContextDecodes(Test * pTest)
|
|||||||
ct_test(pTest, strcmp(in.value, out.value) == 0);
|
ct_test(pTest, strcmp(in.value, out.value) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testBitStringContextDecodes(Test * pTest)
|
void testBitStringContextDecodes(
|
||||||
|
Test * pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU];
|
uint8_t apdu[MAX_APDU];
|
||||||
int inLen;
|
int inLen;
|
||||||
@@ -2555,8 +2530,8 @@ void testBitStringContextDecodes(Test * pTest)
|
|||||||
bitstring_set_bit(&in, 12, false);
|
bitstring_set_bit(&in, 12, false);
|
||||||
|
|
||||||
inLen = encode_context_bitstring(apdu, 10, &in);
|
inLen = encode_context_bitstring(apdu, 10, &in);
|
||||||
outLen= decode_context_bitstring(apdu, 10, &out);
|
outLen = decode_context_bitstring(apdu, 10, &out);
|
||||||
outLen2= decode_context_bitstring(apdu, 9, &out);
|
outLen2 = decode_context_bitstring(apdu, 9, &out);
|
||||||
|
|
||||||
ct_test(pTest, outLen2 == -1);
|
ct_test(pTest, outLen2 == -1);
|
||||||
ct_test(pTest, inLen == outLen);
|
ct_test(pTest, inLen == outLen);
|
||||||
@@ -2565,7 +2540,8 @@ void testBitStringContextDecodes(Test * pTest)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void testOctetStringContextDecodes(Test * pTest)
|
void testOctetStringContextDecodes(
|
||||||
|
Test * pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU];
|
uint8_t apdu[MAX_APDU];
|
||||||
int inLen;
|
int inLen;
|
||||||
@@ -2575,13 +2551,13 @@ void testOctetStringContextDecodes(Test * pTest)
|
|||||||
BACNET_OCTET_STRING in;
|
BACNET_OCTET_STRING in;
|
||||||
BACNET_OCTET_STRING out;
|
BACNET_OCTET_STRING out;
|
||||||
|
|
||||||
uint8_t initData[] = {0xde,0xad,0xbe,0xef};
|
uint8_t initData[] = { 0xde, 0xad, 0xbe, 0xef };
|
||||||
|
|
||||||
octetstring_init(&in, initData, sizeof(initData));
|
octetstring_init(&in, initData, sizeof(initData));
|
||||||
|
|
||||||
inLen = encode_context_octet_string(apdu, 10, &in);
|
inLen = encode_context_octet_string(apdu, 10, &in);
|
||||||
outLen= decode_context_octet_string(apdu, 10, &out);
|
outLen = decode_context_octet_string(apdu, 10, &out);
|
||||||
outLen2= decode_context_octet_string(apdu, 9, &out);
|
outLen2 = decode_context_octet_string(apdu, 9, &out);
|
||||||
|
|
||||||
ct_test(pTest, outLen2 == -1);
|
ct_test(pTest, outLen2 == -1);
|
||||||
ct_test(pTest, inLen == outLen);
|
ct_test(pTest, inLen == outLen);
|
||||||
@@ -2589,7 +2565,8 @@ void testOctetStringContextDecodes(Test * pTest)
|
|||||||
ct_test(pTest, octetstring_value_same(&in, &out));
|
ct_test(pTest, octetstring_value_same(&in, &out));
|
||||||
}
|
}
|
||||||
|
|
||||||
void testTimeContextDecodes(Test * pTest)
|
void testTimeContextDecodes(
|
||||||
|
Test * pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU];
|
uint8_t apdu[MAX_APDU];
|
||||||
int inLen;
|
int inLen;
|
||||||
@@ -2605,8 +2582,8 @@ void testTimeContextDecodes(Test * pTest)
|
|||||||
in.sec = 40;
|
in.sec = 40;
|
||||||
|
|
||||||
inLen = encode_context_time(apdu, 10, &in);
|
inLen = encode_context_time(apdu, 10, &in);
|
||||||
outLen= decode_context_bacnet_time(apdu, 10, &out);
|
outLen = decode_context_bacnet_time(apdu, 10, &out);
|
||||||
outLen2= decode_context_bacnet_time(apdu, 9, &out);
|
outLen2 = decode_context_bacnet_time(apdu, 9, &out);
|
||||||
|
|
||||||
ct_test(pTest, outLen2 == -1);
|
ct_test(pTest, outLen2 == -1);
|
||||||
ct_test(pTest, inLen == outLen);
|
ct_test(pTest, inLen == outLen);
|
||||||
@@ -2616,7 +2593,8 @@ void testTimeContextDecodes(Test * pTest)
|
|||||||
ct_test(pTest, in.sec == out.sec);
|
ct_test(pTest, in.sec == out.sec);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testDateContextDecodes(Test * pTest)
|
void testDateContextDecodes(
|
||||||
|
Test * pTest)
|
||||||
{
|
{
|
||||||
uint8_t apdu[MAX_APDU];
|
uint8_t apdu[MAX_APDU];
|
||||||
int inLen;
|
int inLen;
|
||||||
@@ -2632,8 +2610,8 @@ void testDateContextDecodes(Test * pTest)
|
|||||||
in.year = 1945;
|
in.year = 1945;
|
||||||
|
|
||||||
inLen = encode_context_date(apdu, 10, &in);
|
inLen = encode_context_date(apdu, 10, &in);
|
||||||
outLen= decode_context_date(apdu, 10, &out);
|
outLen = decode_context_date(apdu, 10, &out);
|
||||||
outLen2= decode_context_date(apdu, 9, &out);
|
outLen2 = decode_context_date(apdu, 9, &out);
|
||||||
|
|
||||||
ct_test(pTest, outLen2 == -1);
|
ct_test(pTest, outLen2 == -1);
|
||||||
ct_test(pTest, inLen == outLen);
|
ct_test(pTest, inLen == outLen);
|
||||||
|
|||||||
@@ -67,24 +67,23 @@ int bacapp_encode_device_obj_property_ref(
|
|||||||
int len;
|
int len;
|
||||||
int apdu_len = 0;
|
int apdu_len = 0;
|
||||||
|
|
||||||
len = encode_context_object_id(&apdu[apdu_len], 0,
|
len =
|
||||||
value->objectIdentifier.type,
|
encode_context_object_id(&apdu[apdu_len], 0,
|
||||||
value->objectIdentifier.instance);
|
value->objectIdentifier.type, value->objectIdentifier.instance);
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
|
|
||||||
len = encode_context_enumerated(&apdu[apdu_len], 1,
|
len =
|
||||||
|
encode_context_enumerated(&apdu[apdu_len], 1,
|
||||||
value->propertyIdentifier);
|
value->propertyIdentifier);
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
|
|
||||||
if ( value->arrayIndex > 0 )
|
if (value->arrayIndex > 0) {
|
||||||
{
|
len = encode_context_unsigned(&apdu[apdu_len], 2, value->arrayIndex);
|
||||||
len = encode_context_unsigned(&apdu[apdu_len], 2,
|
|
||||||
value->arrayIndex);
|
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
}
|
}
|
||||||
len = encode_context_object_id(&apdu[apdu_len], 3,
|
len =
|
||||||
value->deviceIndentifier.type,
|
encode_context_object_id(&apdu[apdu_len], 3,
|
||||||
value->deviceIndentifier.instance);
|
value->deviceIndentifier.type, value->deviceIndentifier.instance);
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
|
|
||||||
return apdu_len;
|
return apdu_len;
|
||||||
@@ -97,47 +96,41 @@ int bacapp_decode_device_obj_property_ref(
|
|||||||
int len;
|
int len;
|
||||||
int apdu_len = 0;
|
int apdu_len = 0;
|
||||||
|
|
||||||
if ( -1 == ( len = decode_context_object_id(&apdu[apdu_len], 0,
|
if (-1 == (len =
|
||||||
|
decode_context_object_id(&apdu[apdu_len], 0,
|
||||||
&value->objectIdentifier.type,
|
&value->objectIdentifier.type,
|
||||||
&value->objectIdentifier.instance)) )
|
&value->objectIdentifier.instance))) {
|
||||||
{
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
|
|
||||||
if ( -1 == ( len = decode_context_enumerated(&apdu[apdu_len], 1,
|
if (-1 == (len =
|
||||||
&value->propertyIdentifier)))
|
decode_context_enumerated(&apdu[apdu_len], 1,
|
||||||
{
|
&value->propertyIdentifier))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
|
|
||||||
if ( decode_is_context_tag(&apdu[apdu_len], 2 ))
|
if (decode_is_context_tag(&apdu[apdu_len], 2)) {
|
||||||
{
|
if (-1 == (len =
|
||||||
if ( -1 == ( len = decode_context_unsigned(&apdu[apdu_len], 2,
|
decode_context_unsigned(&apdu[apdu_len], 2,
|
||||||
&value->arrayIndex)))
|
&value->arrayIndex))) {
|
||||||
{
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
value->arrayIndex = 0;
|
value->arrayIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( decode_is_context_tag(&apdu[apdu_len], 3 ))
|
if (decode_is_context_tag(&apdu[apdu_len], 3)) {
|
||||||
{
|
if (-1 == (len =
|
||||||
if ( -1 == ( len = decode_context_object_id(&apdu[apdu_len], 3,
|
decode_context_object_id(&apdu[apdu_len], 3,
|
||||||
&value->deviceIndentifier.type,
|
&value->deviceIndentifier.type,
|
||||||
&value->deviceIndentifier.instance)) )
|
&value->deviceIndentifier.instance))) {
|
||||||
{
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
value->deviceIndentifier.instance = 0;
|
value->deviceIndentifier.instance = 0;
|
||||||
value->deviceIndentifier.type = 0;
|
value->deviceIndentifier.type = 0;
|
||||||
}
|
}
|
||||||
@@ -155,27 +148,20 @@ int bacapp_decode_context_device_obj_property_ref(
|
|||||||
|
|
||||||
if (decode_is_opening_tag_number(&apdu[len], tag_number)) {
|
if (decode_is_opening_tag_number(&apdu[len], tag_number)) {
|
||||||
len++;
|
len++;
|
||||||
section_length = bacapp_decode_device_obj_property_ref(
|
section_length =
|
||||||
&apdu[len], value);
|
bacapp_decode_device_obj_property_ref(&apdu[len], value);
|
||||||
|
|
||||||
if ( section_length == -1 )
|
if (section_length == -1) {
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len += section_length;
|
len += section_length;
|
||||||
if (decode_is_closing_tag_number(&apdu[len], tag_number)) {
|
if (decode_is_closing_tag_number(&apdu[len], tag_number)) {
|
||||||
len++;
|
len++;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
@@ -208,16 +194,22 @@ void testDevIdPropRef(
|
|||||||
|
|
||||||
ct_test(pTest, outLen == inLen);
|
ct_test(pTest, outLen == inLen);
|
||||||
|
|
||||||
ct_test(pTest, inData.objectIdentifier.instance == outData.objectIdentifier.instance);
|
ct_test(pTest,
|
||||||
ct_test(pTest, inData.objectIdentifier.type == outData.objectIdentifier.type);
|
inData.objectIdentifier.instance == outData.objectIdentifier.instance);
|
||||||
|
ct_test(pTest,
|
||||||
|
inData.objectIdentifier.type == outData.objectIdentifier.type);
|
||||||
|
|
||||||
ct_test(pTest, inData.propertyIdentifier == outData.propertyIdentifier);
|
ct_test(pTest, inData.propertyIdentifier == outData.propertyIdentifier);
|
||||||
|
|
||||||
ct_test(pTest, inData.arrayIndex == outData.arrayIndex);
|
ct_test(pTest, inData.arrayIndex == outData.arrayIndex);
|
||||||
|
|
||||||
ct_test(pTest, inData.deviceIndentifier.instance == outData.deviceIndentifier.instance);
|
ct_test(pTest,
|
||||||
ct_test(pTest, inData.deviceIndentifier.type == outData.deviceIndentifier.type);
|
inData.deviceIndentifier.instance ==
|
||||||
|
outData.deviceIndentifier.instance);
|
||||||
|
ct_test(pTest,
|
||||||
|
inData.deviceIndentifier.type == outData.deviceIndentifier.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TEST_DEV_ID_PROP_REF
|
#ifdef TEST_DEV_ID_PROP_REF
|
||||||
|
|
||||||
int main(
|
int main(
|
||||||
|
|||||||
@@ -50,108 +50,119 @@ int bacapp_decode_property_state(
|
|||||||
|
|
||||||
|
|
||||||
section_length =
|
section_length =
|
||||||
decode_tag_number_and_value(&apdu[len], (uint8_t*)&value->tag,
|
decode_tag_number_and_value(&apdu[len], (uint8_t *) & value->tag,
|
||||||
&len_value_type);
|
&len_value_type);
|
||||||
|
|
||||||
if ( -1 == section_length )
|
if (-1 == section_length) {
|
||||||
{
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
len += section_length;
|
len += section_length;
|
||||||
switch(value->tag)
|
switch (value->tag) {
|
||||||
{
|
|
||||||
case BOOLEAN_VALUE:
|
case BOOLEAN_VALUE:
|
||||||
value->state.booleanValue = decode_boolean(len_value_type);
|
value->state.booleanValue = decode_boolean(len_value_type);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BINARY_VALUE:
|
case BINARY_VALUE:
|
||||||
if ( -1 == ( section_length = decode_enumerated(&apdu[len], len_value_type, &value->state.binaryValue)))
|
if (-1 == (section_length =
|
||||||
{
|
decode_enumerated(&apdu[len], len_value_type,
|
||||||
|
&value->state.binaryValue))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EVENT_TYPE:
|
case EVENT_TYPE:
|
||||||
if ( -1 == ( section_length = decode_enumerated(&apdu[len], len_value_type, &value->state.eventType)))
|
if (-1 == (section_length =
|
||||||
{
|
decode_enumerated(&apdu[len], len_value_type,
|
||||||
|
&value->state.eventType))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case POLARITY:
|
case POLARITY:
|
||||||
if ( -1 == ( section_length = decode_enumerated(&apdu[len], len_value_type, &value->state.polarity)))
|
if (-1 == (section_length =
|
||||||
{
|
decode_enumerated(&apdu[len], len_value_type,
|
||||||
|
&value->state.polarity))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROGRAM_CHANGE:
|
case PROGRAM_CHANGE:
|
||||||
if ( -1 == ( section_length = decode_enumerated(&apdu[len], len_value_type, &value->state.programChange)))
|
if (-1 == (section_length =
|
||||||
{
|
decode_enumerated(&apdu[len], len_value_type,
|
||||||
|
&value->state.programChange))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROGRAM_STATE:
|
case PROGRAM_STATE:
|
||||||
if ( -1 == ( section_length = decode_enumerated(&apdu[len], len_value_type, &value->state.programState)))
|
if (-1 == (section_length =
|
||||||
{
|
decode_enumerated(&apdu[len], len_value_type,
|
||||||
|
&value->state.programState))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case REASON_FOR_HALT:
|
case REASON_FOR_HALT:
|
||||||
if ( -1 == ( section_length = decode_enumerated(&apdu[len], len_value_type, &value->state.programError)))
|
if (-1 == (section_length =
|
||||||
{
|
decode_enumerated(&apdu[len], len_value_type,
|
||||||
|
&value->state.programError))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RELIABILITY:
|
case RELIABILITY:
|
||||||
if ( -1 == ( section_length = decode_enumerated(&apdu[len], len_value_type, &value->state.reliability)))
|
if (-1 == (section_length =
|
||||||
{
|
decode_enumerated(&apdu[len], len_value_type,
|
||||||
|
&value->state.reliability))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STATE:
|
case STATE:
|
||||||
if ( -1 == ( section_length = decode_enumerated(&apdu[len], len_value_type, &value->state.state)))
|
if (-1 == (section_length =
|
||||||
{
|
decode_enumerated(&apdu[len], len_value_type,
|
||||||
|
&value->state.state))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SYSTEM_STATUS:
|
case SYSTEM_STATUS:
|
||||||
if ( -1 == ( section_length = decode_enumerated(&apdu[len], len_value_type, &value->state.systemStatus)))
|
if (-1 == (section_length =
|
||||||
{
|
decode_enumerated(&apdu[len], len_value_type,
|
||||||
|
&value->state.systemStatus))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UNITS:
|
case UNITS:
|
||||||
if ( -1 == ( section_length = decode_enumerated(&apdu[len], len_value_type, &value->state.units)))
|
if (-1 == (section_length =
|
||||||
{
|
decode_enumerated(&apdu[len], len_value_type,
|
||||||
|
&value->state.units))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UNSIGNED_VALUE:
|
case UNSIGNED_VALUE:
|
||||||
if ( -1 == ( section_length = decode_unsigned(&apdu[len], len_value_type, &value->state.unsignedValue)))
|
if (-1 == (section_length =
|
||||||
{
|
decode_unsigned(&apdu[len], len_value_type,
|
||||||
|
&value->state.unsignedValue))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LIFE_SAFETY_MODE:
|
case LIFE_SAFETY_MODE:
|
||||||
if ( -1 == ( section_length = decode_enumerated(&apdu[len], len_value_type, &value->state.lifeSafetyMode)))
|
if (-1 == (section_length =
|
||||||
{
|
decode_enumerated(&apdu[len], len_value_type,
|
||||||
|
&value->state.lifeSafetyMode))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LIFE_SAFETY_STATE:
|
case LIFE_SAFETY_STATE:
|
||||||
if ( -1 == ( section_length = decode_enumerated(&apdu[len], len_value_type, &value->state.lifeSafetyState)))
|
if (-1 == (section_length =
|
||||||
{
|
decode_enumerated(&apdu[len], len_value_type,
|
||||||
|
&value->state.lifeSafetyState))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -174,27 +185,19 @@ int bacapp_decode_context_property_state(
|
|||||||
|
|
||||||
if (decode_is_opening_tag_number(&apdu[len], tag_number)) {
|
if (decode_is_opening_tag_number(&apdu[len], tag_number)) {
|
||||||
len++;
|
len++;
|
||||||
section_length = bacapp_decode_property_state(
|
section_length = bacapp_decode_property_state(&apdu[len], value);
|
||||||
&apdu[len], value);
|
|
||||||
|
|
||||||
if ( section_length == -1 )
|
if (section_length == -1) {
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len += section_length;
|
len += section_length;
|
||||||
if (decode_is_closing_tag_number(&apdu[len], tag_number)) {
|
if (decode_is_closing_tag_number(&apdu[len], tag_number)) {
|
||||||
len++;
|
len++;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
@@ -206,62 +209,88 @@ int bacapp_encode_property_state(
|
|||||||
{
|
{
|
||||||
int len = 0; /* length of each encoding */
|
int len = 0; /* length of each encoding */
|
||||||
if (value && apdu) {
|
if (value && apdu) {
|
||||||
switch(value->tag)
|
switch (value->tag) {
|
||||||
{
|
|
||||||
case BOOLEAN_VALUE:
|
case BOOLEAN_VALUE:
|
||||||
len = encode_context_boolean(&apdu[0], 0, value->state.booleanValue);
|
len =
|
||||||
|
encode_context_boolean(&apdu[0], 0,
|
||||||
|
value->state.booleanValue);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BINARY_VALUE:
|
case BINARY_VALUE:
|
||||||
len = encode_context_enumerated(&apdu[0], 1, value->state.binaryValue);
|
len =
|
||||||
|
encode_context_enumerated(&apdu[0], 1,
|
||||||
|
value->state.binaryValue);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EVENT_TYPE:
|
case EVENT_TYPE:
|
||||||
len = encode_context_enumerated(&apdu[0], 2, value->state.eventType);
|
len =
|
||||||
|
encode_context_enumerated(&apdu[0], 2,
|
||||||
|
value->state.eventType);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case POLARITY:
|
case POLARITY:
|
||||||
len = encode_context_enumerated(&apdu[0], 3, value->state.polarity);
|
len =
|
||||||
|
encode_context_enumerated(&apdu[0], 3,
|
||||||
|
value->state.polarity);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROGRAM_CHANGE:
|
case PROGRAM_CHANGE:
|
||||||
len = encode_context_enumerated(&apdu[0], 4, value->state.programChange);
|
len =
|
||||||
|
encode_context_enumerated(&apdu[0], 4,
|
||||||
|
value->state.programChange);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROGRAM_STATE:
|
case PROGRAM_STATE:
|
||||||
len = encode_context_enumerated(&apdu[0], 5, value->state.programState);
|
len =
|
||||||
|
encode_context_enumerated(&apdu[0], 5,
|
||||||
|
value->state.programState);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case REASON_FOR_HALT:
|
case REASON_FOR_HALT:
|
||||||
len = encode_context_enumerated(&apdu[0], 6, value->state.programError);
|
len =
|
||||||
|
encode_context_enumerated(&apdu[0], 6,
|
||||||
|
value->state.programError);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RELIABILITY:
|
case RELIABILITY:
|
||||||
len = encode_context_enumerated(&apdu[0], 7, value->state.reliability);
|
len =
|
||||||
|
encode_context_enumerated(&apdu[0], 7,
|
||||||
|
value->state.reliability);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STATE:
|
case STATE:
|
||||||
len = encode_context_enumerated(&apdu[0], 8, value->state.state);
|
len =
|
||||||
|
encode_context_enumerated(&apdu[0], 8, value->state.state);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SYSTEM_STATUS:
|
case SYSTEM_STATUS:
|
||||||
len = encode_context_enumerated(&apdu[0], 9, value->state.systemStatus);
|
len =
|
||||||
|
encode_context_enumerated(&apdu[0], 9,
|
||||||
|
value->state.systemStatus);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UNITS:
|
case UNITS:
|
||||||
len = encode_context_enumerated(&apdu[0], 10, value->state.units);
|
len =
|
||||||
|
encode_context_enumerated(&apdu[0], 10,
|
||||||
|
value->state.units);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UNSIGNED_VALUE:
|
case UNSIGNED_VALUE:
|
||||||
len = encode_context_unsigned(&apdu[0], 11, value->state.unsignedValue);
|
len =
|
||||||
|
encode_context_unsigned(&apdu[0], 11,
|
||||||
|
value->state.unsignedValue);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LIFE_SAFETY_MODE:
|
case LIFE_SAFETY_MODE:
|
||||||
len = encode_context_enumerated(&apdu[0], 12, value->state.lifeSafetyMode);
|
len =
|
||||||
|
encode_context_enumerated(&apdu[0], 12,
|
||||||
|
value->state.lifeSafetyMode);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LIFE_SAFETY_STATE:
|
case LIFE_SAFETY_STATE:
|
||||||
len = encode_context_enumerated(&apdu[0], 13, value->state.lifeSafetyState);
|
len =
|
||||||
|
encode_context_enumerated(&apdu[0], 13,
|
||||||
|
value->state.lifeSafetyState);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -293,8 +322,8 @@ void testPropStates(
|
|||||||
outLen = bacapp_decode_property_state(appMsg, &outData);
|
outLen = bacapp_decode_property_state(appMsg, &outData);
|
||||||
|
|
||||||
ct_test(pTest, outLen == inLen);
|
ct_test(pTest, outLen == inLen);
|
||||||
ct_test(pTest, inData.tag == outData.tag );
|
ct_test(pTest, inData.tag == outData.tag);
|
||||||
ct_test(pTest, inData.state.booleanValue == outData.state.booleanValue );
|
ct_test(pTest, inData.state.booleanValue == outData.state.booleanValue);
|
||||||
|
|
||||||
/****************
|
/****************
|
||||||
*****************
|
*****************
|
||||||
@@ -309,8 +338,8 @@ void testPropStates(
|
|||||||
outLen = bacapp_decode_property_state(appMsg, &outData);
|
outLen = bacapp_decode_property_state(appMsg, &outData);
|
||||||
|
|
||||||
ct_test(pTest, outLen == inLen);
|
ct_test(pTest, outLen == inLen);
|
||||||
ct_test(pTest, inData.tag == outData.tag );
|
ct_test(pTest, inData.tag == outData.tag);
|
||||||
ct_test(pTest, inData.state.binaryValue == outData.state.binaryValue );
|
ct_test(pTest, inData.state.binaryValue == outData.state.binaryValue);
|
||||||
|
|
||||||
/****************
|
/****************
|
||||||
*****************
|
*****************
|
||||||
@@ -325,8 +354,8 @@ void testPropStates(
|
|||||||
outLen = bacapp_decode_property_state(appMsg, &outData);
|
outLen = bacapp_decode_property_state(appMsg, &outData);
|
||||||
|
|
||||||
ct_test(pTest, outLen == inLen);
|
ct_test(pTest, outLen == inLen);
|
||||||
ct_test(pTest, inData.tag == outData.tag );
|
ct_test(pTest, inData.tag == outData.tag);
|
||||||
ct_test(pTest, inData.state.eventType == outData.state.eventType );
|
ct_test(pTest, inData.state.eventType == outData.state.eventType);
|
||||||
|
|
||||||
/****************
|
/****************
|
||||||
*****************
|
*****************
|
||||||
@@ -341,8 +370,8 @@ void testPropStates(
|
|||||||
outLen = bacapp_decode_property_state(appMsg, &outData);
|
outLen = bacapp_decode_property_state(appMsg, &outData);
|
||||||
|
|
||||||
ct_test(pTest, outLen == inLen);
|
ct_test(pTest, outLen == inLen);
|
||||||
ct_test(pTest, inData.tag == outData.tag );
|
ct_test(pTest, inData.tag == outData.tag);
|
||||||
ct_test(pTest, inData.state.polarity == outData.state.polarity );
|
ct_test(pTest, inData.state.polarity == outData.state.polarity);
|
||||||
|
|
||||||
/****************
|
/****************
|
||||||
*****************
|
*****************
|
||||||
@@ -357,8 +386,8 @@ void testPropStates(
|
|||||||
outLen = bacapp_decode_property_state(appMsg, &outData);
|
outLen = bacapp_decode_property_state(appMsg, &outData);
|
||||||
|
|
||||||
ct_test(pTest, outLen == inLen);
|
ct_test(pTest, outLen == inLen);
|
||||||
ct_test(pTest, inData.tag == outData.tag );
|
ct_test(pTest, inData.tag == outData.tag);
|
||||||
ct_test(pTest, inData.state.programChange == outData.state.programChange );
|
ct_test(pTest, inData.state.programChange == outData.state.programChange);
|
||||||
|
|
||||||
/****************
|
/****************
|
||||||
*****************
|
*****************
|
||||||
@@ -373,8 +402,8 @@ void testPropStates(
|
|||||||
outLen = bacapp_decode_property_state(appMsg, &outData);
|
outLen = bacapp_decode_property_state(appMsg, &outData);
|
||||||
|
|
||||||
ct_test(pTest, outLen == inLen);
|
ct_test(pTest, outLen == inLen);
|
||||||
ct_test(pTest, inData.tag == outData.tag );
|
ct_test(pTest, inData.tag == outData.tag);
|
||||||
ct_test(pTest, inData.state.unsignedValue == outData.state.unsignedValue );
|
ct_test(pTest, inData.state.unsignedValue == outData.state.unsignedValue);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -85,16 +85,15 @@ int decode_context_real(
|
|||||||
int len = 0;
|
int len = 0;
|
||||||
|
|
||||||
if (decode_is_context_tag(&apdu[len], tag_number)) {
|
if (decode_is_context_tag(&apdu[len], tag_number)) {
|
||||||
len += decode_tag_number_and_value(&apdu[len], &tag_number,
|
len +=
|
||||||
&len_value);
|
decode_tag_number_and_value(&apdu[len], &tag_number, &len_value);
|
||||||
len += decode_real(&apdu[len], real_value);
|
len += decode_real(&apdu[len], real_value);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len = -1;
|
len = -1;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* from clause 20.2.6 Encoding of a Real Number Value */
|
/* from clause 20.2.6 Encoding of a Real Number Value */
|
||||||
/* returns the number of apdu bytes consumed */
|
/* returns the number of apdu bytes consumed */
|
||||||
int encode_bacnet_real(
|
int encode_bacnet_real(
|
||||||
|
|||||||
+12
-22
@@ -75,7 +75,7 @@ static uint8_t month_days(
|
|||||||
if ((month == 2) && is_leap_year(year))
|
if ((month == 2) && is_leap_year(year))
|
||||||
return 29;
|
return 29;
|
||||||
else if (month >= 1 && month <= 12)
|
else if (month >= 1 && month <= 12)
|
||||||
return (uint8_t)month_days[month];
|
return (uint8_t) month_days[month];
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -439,8 +439,7 @@ int bacapp_encode_context_datetime(
|
|||||||
int apdu_len = 0;
|
int apdu_len = 0;
|
||||||
|
|
||||||
|
|
||||||
if ( apdu && value )
|
if (apdu && value) {
|
||||||
{
|
|
||||||
len = encode_opening_tag(&apdu[apdu_len], tag_number);
|
len = encode_opening_tag(&apdu[apdu_len], tag_number);
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
|
|
||||||
@@ -463,14 +462,14 @@ int bacapp_decode_datetime(
|
|||||||
int len = 0;
|
int len = 0;
|
||||||
int section_len;
|
int section_len;
|
||||||
|
|
||||||
if ( -1 == ( section_len = decode_application_date(&apdu[len], &value->date) ) )
|
if (-1 == (section_len =
|
||||||
{
|
decode_application_date(&apdu[len], &value->date))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
len += section_len;
|
len += section_len;
|
||||||
|
|
||||||
if ( -1 == ( section_len = decode_application_time(&apdu[len], &value->time) ) )
|
if (-1 == (section_len =
|
||||||
{
|
decode_application_time(&apdu[len], &value->time))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -489,27 +488,19 @@ int bacapp_decode_context_datetime(
|
|||||||
|
|
||||||
if (decode_is_opening_tag_number(&apdu[apdu_len], tag_number)) {
|
if (decode_is_opening_tag_number(&apdu[apdu_len], tag_number)) {
|
||||||
apdu_len++;
|
apdu_len++;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( -1 == (len = bacapp_decode_datetime(&apdu[apdu_len], value)))
|
if (-1 == (len = bacapp_decode_datetime(&apdu[apdu_len], value))) {
|
||||||
{
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (decode_is_closing_tag_number(&apdu[apdu_len], tag_number))
|
if (decode_is_closing_tag_number(&apdu[apdu_len], tag_number)) {
|
||||||
{
|
|
||||||
apdu_len++;
|
apdu_len++;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return apdu_len;
|
return apdu_len;
|
||||||
@@ -855,7 +846,7 @@ void testDatetimeCodec(
|
|||||||
inLen = bacapp_encode_context_datetime(apdu, 10, &datetimeIn);
|
inLen = bacapp_encode_context_datetime(apdu, 10, &datetimeIn);
|
||||||
outLen = bacapp_decode_context_datetime(apdu, 10, &datetimeOut);
|
outLen = bacapp_decode_context_datetime(apdu, 10, &datetimeOut);
|
||||||
|
|
||||||
ct_test(pTest, inLen == outLen );
|
ct_test(pTest, inLen == outLen);
|
||||||
|
|
||||||
ct_test(pTest, datetimeIn.date.day == datetimeOut.date.day);
|
ct_test(pTest, datetimeIn.date.day == datetimeOut.date.day);
|
||||||
ct_test(pTest, datetimeIn.date.month == datetimeOut.date.month);
|
ct_test(pTest, datetimeIn.date.month == datetimeOut.date.month);
|
||||||
@@ -909,4 +900,3 @@ int main(
|
|||||||
|
|
||||||
#endif /* TEST_DATE_TIME */
|
#endif /* TEST_DATE_TIME */
|
||||||
#endif /* TEST */
|
#endif /* TEST */
|
||||||
|
|
||||||
|
|||||||
+520
-373
File diff suppressed because it is too large
Load Diff
@@ -37,7 +37,7 @@
|
|||||||
char *filename_remove_path(
|
char *filename_remove_path(
|
||||||
const char *filename_in)
|
const char *filename_in)
|
||||||
{
|
{
|
||||||
char *filename_out = (char *)filename_in;
|
char *filename_out = (char *) filename_in;
|
||||||
|
|
||||||
/* allow the device ID to be set */
|
/* allow the device ID to be set */
|
||||||
if (filename_in) {
|
if (filename_in) {
|
||||||
|
|||||||
@@ -36,12 +36,12 @@
|
|||||||
/* copy len bytes from src to offset of dest if there is enough space. */
|
/* copy len bytes from src to offset of dest if there is enough space. */
|
||||||
/* returns 0 if there is not enough space, or the number of bytes copied. */
|
/* returns 0 if there is not enough space, or the number of bytes copied. */
|
||||||
size_t memcopy(
|
size_t memcopy(
|
||||||
void * dest,
|
void *dest,
|
||||||
void * src,
|
void *src,
|
||||||
size_t offset, /* where in dest to put the data */
|
size_t offset, /* where in dest to put the data */
|
||||||
size_t len, /* amount of data to copy */
|
size_t len, /* amount of data to copy */
|
||||||
size_t max) /* total size of destination */
|
size_t max)
|
||||||
{
|
{ /* total size of destination */
|
||||||
size_t i;
|
size_t i;
|
||||||
size_t copy_len = 0;
|
size_t copy_len = 0;
|
||||||
char *s1, *s2;
|
char *s1, *s2;
|
||||||
@@ -73,15 +73,14 @@ void test_memcopy(
|
|||||||
char big_buffer[480] = "";
|
char big_buffer[480] = "";
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
|
|
||||||
len = memcopy(&buffer[0], &data1[0], 0,
|
len = memcopy(&buffer[0], &data1[0], 0, sizeof(data1), sizeof(buffer));
|
||||||
sizeof(data1), sizeof(buffer));
|
|
||||||
ct_test(pTest, len == sizeof(data1));
|
ct_test(pTest, len == sizeof(data1));
|
||||||
ct_test(pTest, memcmp(&buffer[0], &data1[0], len) == 0);
|
ct_test(pTest, memcmp(&buffer[0], &data1[0], len) == 0);
|
||||||
len = memcopy(&buffer[0], &data2[0], len,
|
len = memcopy(&buffer[0], &data2[0], len, sizeof(data2), sizeof(buffer));
|
||||||
sizeof(data2), sizeof(buffer));
|
|
||||||
ct_test(pTest, len == sizeof(data2));
|
ct_test(pTest, len == sizeof(data2));
|
||||||
len = memcopy(&buffer[0], &big_buffer[0], 1,
|
len =
|
||||||
sizeof(big_buffer), sizeof(buffer));
|
memcopy(&buffer[0], &big_buffer[0], 1, sizeof(big_buffer),
|
||||||
|
sizeof(buffer));
|
||||||
ct_test(pTest, len == 0);
|
ct_test(pTest, len == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ int rpm_encode_apdu(
|
|||||||
uint8_t * apdu,
|
uint8_t * apdu,
|
||||||
size_t max_apdu,
|
size_t max_apdu,
|
||||||
uint8_t invoke_id,
|
uint8_t invoke_id,
|
||||||
BACNET_READ_ACCESS_DATA *read_access_data)
|
BACNET_READ_ACCESS_DATA * read_access_data)
|
||||||
{
|
{
|
||||||
int apdu_len = 0; /* total length of the apdu, return value */
|
int apdu_len = 0; /* total length of the apdu, return value */
|
||||||
int len = 0; /* length of the data */
|
int len = 0; /* length of the data */
|
||||||
@@ -126,8 +126,8 @@ int rpm_encode_apdu(
|
|||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
rpm_object = read_access_data;
|
rpm_object = read_access_data;
|
||||||
while (rpm_object) {
|
while (rpm_object) {
|
||||||
len = encode_context_object_id(&apdu_temp[0], 0,
|
len =
|
||||||
rpm_object->object_type,
|
encode_context_object_id(&apdu_temp[0], 0, rpm_object->object_type,
|
||||||
rpm_object->object_instance);
|
rpm_object->object_instance);
|
||||||
len = memcopy(&apdu[0], &apdu_temp[0], apdu_len, len, max_apdu);
|
len = memcopy(&apdu[0], &apdu_temp[0], apdu_len, len, max_apdu);
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
@@ -144,7 +144,8 @@ int rpm_encode_apdu(
|
|||||||
rpm_property = rpm_object->listOfProperties;
|
rpm_property = rpm_object->listOfProperties;
|
||||||
while (rpm_property) {
|
while (rpm_property) {
|
||||||
/* stuff as many properties into it as APDU length will allow */
|
/* stuff as many properties into it as APDU length will allow */
|
||||||
len = encode_context_enumerated(&apdu_temp[0], 0,
|
len =
|
||||||
|
encode_context_enumerated(&apdu_temp[0], 0,
|
||||||
rpm_property->propertyIdentifier);
|
rpm_property->propertyIdentifier);
|
||||||
len = memcopy(&apdu[0], &apdu_temp[0], apdu_len, len, max_apdu);
|
len = memcopy(&apdu[0], &apdu_temp[0], apdu_len, len, max_apdu);
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
@@ -153,9 +154,11 @@ int rpm_encode_apdu(
|
|||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
/* optional array index */
|
/* optional array index */
|
||||||
if (rpm_property->propertyArrayIndex != BACNET_ARRAY_ALL) {
|
if (rpm_property->propertyArrayIndex != BACNET_ARRAY_ALL) {
|
||||||
len = encode_context_unsigned(&apdu_temp[0], 1,
|
len =
|
||||||
|
encode_context_unsigned(&apdu_temp[0], 1,
|
||||||
rpm_property->propertyArrayIndex);
|
rpm_property->propertyArrayIndex);
|
||||||
len = memcopy(&apdu[0], &apdu_temp[0], apdu_len, len, max_apdu);
|
len =
|
||||||
|
memcopy(&apdu[0], &apdu_temp[0], apdu_len, len, max_apdu);
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,8 +43,8 @@
|
|||||||
void sbuf_init(
|
void sbuf_init(
|
||||||
STATIC_BUFFER * b, /* static buffer structure */
|
STATIC_BUFFER * b, /* static buffer structure */
|
||||||
char *data, /* data block */
|
char *data, /* data block */
|
||||||
unsigned size) /* actual size, in bytes, of the data block or array of data */
|
unsigned size)
|
||||||
{
|
{ /* actual size, in bytes, of the data block or array of data */
|
||||||
if (b) {
|
if (b) {
|
||||||
b->data = data;
|
b->data = data;
|
||||||
b->size = size;
|
b->size = size;
|
||||||
|
|||||||
@@ -47,18 +47,23 @@ int bacapp_encode_context_timestamp(
|
|||||||
len = encode_opening_tag(&apdu[apdu_len], tag_number);
|
len = encode_opening_tag(&apdu[apdu_len], tag_number);
|
||||||
apdu_len += len;
|
apdu_len += len;
|
||||||
|
|
||||||
switch(value->tag)
|
switch (value->tag) {
|
||||||
{
|
|
||||||
case TIME_STAMP_TIME:
|
case TIME_STAMP_TIME:
|
||||||
len = encode_context_time(&apdu[apdu_len], 0, &value->value.time);
|
len =
|
||||||
|
encode_context_time(&apdu[apdu_len], 0,
|
||||||
|
&value->value.time);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TIME_STAMP_SEQUENCE:
|
case TIME_STAMP_SEQUENCE:
|
||||||
len = encode_context_unsigned(&apdu[apdu_len], 1, value->value.sequenceNum);
|
len =
|
||||||
|
encode_context_unsigned(&apdu[apdu_len], 1,
|
||||||
|
value->value.sequenceNum);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TIME_STAMP_DATETIME:
|
case TIME_STAMP_DATETIME:
|
||||||
len = bacapp_encode_context_datetime(&apdu[apdu_len], 2, &value->value.dateTime);
|
len =
|
||||||
|
bacapp_encode_context_datetime(&apdu[apdu_len], 2,
|
||||||
|
&value->value.dateTime);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -92,49 +97,42 @@ int bacapp_decode_context_timestamp(
|
|||||||
decode_tag_number_and_value(&apdu[len], &value->tag,
|
decode_tag_number_and_value(&apdu[len], &value->tag,
|
||||||
&len_value_type);
|
&len_value_type);
|
||||||
|
|
||||||
if ( -1 == section_len )
|
if (-1 == section_len) {
|
||||||
{
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
switch( value->tag )
|
switch (value->tag) {
|
||||||
{
|
|
||||||
case TIME_STAMP_TIME:
|
case TIME_STAMP_TIME:
|
||||||
if ( (section_len = decode_context_bacnet_time(&apdu[len], TIME_STAMP_TIME, &value->value.time)) == -1 )
|
if ((section_len =
|
||||||
{
|
decode_context_bacnet_time(&apdu[len], TIME_STAMP_TIME,
|
||||||
|
&value->value.time)) == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len += section_len;
|
len += section_len;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TIME_STAMP_SEQUENCE:
|
case TIME_STAMP_SEQUENCE:
|
||||||
if ( (section_len = decode_context_unsigned(&apdu[len], TIME_STAMP_SEQUENCE, &sequenceNum)) == -1 )
|
if ((section_len =
|
||||||
{
|
decode_context_unsigned(&apdu[len],
|
||||||
|
TIME_STAMP_SEQUENCE, &sequenceNum)) == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
} else {
|
||||||
else
|
if (sequenceNum <= 0xffff) {
|
||||||
{
|
|
||||||
if ( sequenceNum <= 0xffff )
|
|
||||||
{
|
|
||||||
len += section_len;
|
len += section_len;
|
||||||
value->value.sequenceNum = (uint16_t)sequenceNum;
|
value->value.sequenceNum = (uint16_t) sequenceNum;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TIME_STAMP_DATETIME:
|
case TIME_STAMP_DATETIME:
|
||||||
if ( (section_len = bacapp_decode_context_datetime(&apdu[len], TIME_STAMP_DATETIME, &value->value.dateTime)) == -1 )
|
if ((section_len =
|
||||||
{
|
bacapp_decode_context_datetime(&apdu[len],
|
||||||
|
TIME_STAMP_DATETIME,
|
||||||
|
&value->value.dateTime)) == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
len += section_len;
|
len += section_len;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -144,9 +142,7 @@ int bacapp_decode_context_timestamp(
|
|||||||
}
|
}
|
||||||
if (decode_is_closing_tag_number(&apdu[len], tag_number)) {
|
if (decode_is_closing_tag_number(&apdu[len], tag_number)) {
|
||||||
len++;
|
len++;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -180,7 +176,9 @@ void testTimestampSequence(
|
|||||||
|
|
||||||
ct_test(pTest, inLen == outLen);
|
ct_test(pTest, inLen == outLen);
|
||||||
ct_test(pTest, testTimestampIn.tag == testTimestampOut.tag);
|
ct_test(pTest, testTimestampIn.tag == testTimestampOut.tag);
|
||||||
ct_test(pTest, testTimestampIn.value.sequenceNum == testTimestampOut.value.sequenceNum);
|
ct_test(pTest,
|
||||||
|
testTimestampIn.value.sequenceNum ==
|
||||||
|
testTimestampOut.value.sequenceNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testTimestampTime(
|
void testTimestampTime(
|
||||||
@@ -206,10 +204,15 @@ void testTimestampTime(
|
|||||||
|
|
||||||
ct_test(pTest, inLen == outLen);
|
ct_test(pTest, inLen == outLen);
|
||||||
ct_test(pTest, testTimestampIn.tag == testTimestampOut.tag);
|
ct_test(pTest, testTimestampIn.tag == testTimestampOut.tag);
|
||||||
ct_test(pTest, testTimestampIn.value.time.hour == testTimestampOut.value.time.hour);
|
ct_test(pTest,
|
||||||
ct_test(pTest, testTimestampIn.value.time.min == testTimestampOut.value.time.min);
|
testTimestampIn.value.time.hour == testTimestampOut.value.time.hour);
|
||||||
ct_test(pTest, testTimestampIn.value.time.sec == testTimestampOut.value.time.sec);
|
ct_test(pTest,
|
||||||
ct_test(pTest, testTimestampIn.value.time.hundredths == testTimestampOut.value.time.hundredths);
|
testTimestampIn.value.time.min == testTimestampOut.value.time.min);
|
||||||
|
ct_test(pTest,
|
||||||
|
testTimestampIn.value.time.sec == testTimestampOut.value.time.sec);
|
||||||
|
ct_test(pTest,
|
||||||
|
testTimestampIn.value.time.hundredths ==
|
||||||
|
testTimestampOut.value.time.hundredths);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testTimestampTimeDate(
|
void testTimestampTimeDate(
|
||||||
@@ -239,15 +242,31 @@ void testTimestampTimeDate(
|
|||||||
|
|
||||||
ct_test(pTest, inLen == outLen);
|
ct_test(pTest, inLen == outLen);
|
||||||
ct_test(pTest, testTimestampIn.tag == testTimestampOut.tag);
|
ct_test(pTest, testTimestampIn.tag == testTimestampOut.tag);
|
||||||
ct_test(pTest, testTimestampIn.value.dateTime.time.hour == testTimestampOut.value.dateTime.time.hour);
|
ct_test(pTest,
|
||||||
ct_test(pTest, testTimestampIn.value.dateTime.time.min == testTimestampOut.value.dateTime.time.min);
|
testTimestampIn.value.dateTime.time.hour ==
|
||||||
ct_test(pTest, testTimestampIn.value.dateTime.time.sec == testTimestampOut.value.dateTime.time.sec);
|
testTimestampOut.value.dateTime.time.hour);
|
||||||
ct_test(pTest, testTimestampIn.value.dateTime.time.hundredths == testTimestampOut.value.dateTime.time.hundredths);
|
ct_test(pTest,
|
||||||
|
testTimestampIn.value.dateTime.time.min ==
|
||||||
|
testTimestampOut.value.dateTime.time.min);
|
||||||
|
ct_test(pTest,
|
||||||
|
testTimestampIn.value.dateTime.time.sec ==
|
||||||
|
testTimestampOut.value.dateTime.time.sec);
|
||||||
|
ct_test(pTest,
|
||||||
|
testTimestampIn.value.dateTime.time.hundredths ==
|
||||||
|
testTimestampOut.value.dateTime.time.hundredths);
|
||||||
|
|
||||||
ct_test(pTest, testTimestampIn.value.dateTime.date.year == testTimestampOut.value.dateTime.date.year);
|
ct_test(pTest,
|
||||||
ct_test(pTest, testTimestampIn.value.dateTime.date.month == testTimestampOut.value.dateTime.date.month);
|
testTimestampIn.value.dateTime.date.year ==
|
||||||
ct_test(pTest, testTimestampIn.value.dateTime.date.wday == testTimestampOut.value.dateTime.date.wday);
|
testTimestampOut.value.dateTime.date.year);
|
||||||
ct_test(pTest, testTimestampIn.value.dateTime.date.day == testTimestampOut.value.dateTime.date.day);
|
ct_test(pTest,
|
||||||
|
testTimestampIn.value.dateTime.date.month ==
|
||||||
|
testTimestampOut.value.dateTime.date.month);
|
||||||
|
ct_test(pTest,
|
||||||
|
testTimestampIn.value.dateTime.date.wday ==
|
||||||
|
testTimestampOut.value.dateTime.date.wday);
|
||||||
|
ct_test(pTest,
|
||||||
|
testTimestampIn.value.dateTime.date.day ==
|
||||||
|
testTimestampOut.value.dateTime.date.day);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,4 +299,3 @@ int main(
|
|||||||
|
|
||||||
#endif // TEST_TIME_STAMP
|
#endif // TEST_TIME_STAMP
|
||||||
#endif // TEST
|
#endif // TEST
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user