diff --git a/bacnet-stack/bacdcode.c b/bacnet-stack/bacdcode.c index 00b8a5cd..a20755cf 100644 --- a/bacnet-stack/bacdcode.c +++ b/bacnet-stack/bacdcode.c @@ -1038,6 +1038,27 @@ int encode_tagged_octet_string(uint8_t * apdu, return apdu_len; } +/* from clause 20.2.8 Encoding of an Octet String Value */ +/* and 20.2.1 General Rules for Encoding BACnet Tags */ +/* returns the number of apdu bytes consumed */ +int encode_context_octet_string(uint8_t * apdu, + int tag_number, + BACNET_OCTET_STRING * octet_string) +{ + int apdu_len = 0; + + if (apdu && octet_string) { + apdu_len = encode_tag(&apdu[0], (uint8_t) tag_number, + true, octetstring_length(octet_string)); + if ((apdu_len + octetstring_length(octet_string)) < MAX_APDU) + apdu_len += encode_octet_string(&apdu[apdu_len], octet_string); + else + apdu_len = 0; + } + + return apdu_len; +} + /* from clause 20.2.8 Encoding of an Octet String Value */ /* and 20.2.1 General Rules for Encoding BACnet Tags */ /* returns the number of apdu bytes consumed */ diff --git a/bacnet-stack/bacdcode.h b/bacnet-stack/bacdcode.h index 4799dd6c..b1b9f21a 100644 --- a/bacnet-stack/bacdcode.h +++ b/bacnet-stack/bacdcode.h @@ -108,6 +108,9 @@ extern "C" { BACNET_OCTET_STRING * octet_string); int encode_tagged_octet_string(uint8_t * apdu, BACNET_OCTET_STRING * octet_string); + int encode_context_octet_string(uint8_t * apdu, + int tag_number, + BACNET_OCTET_STRING * octet_string); int decode_octet_string(uint8_t * apdu, uint32_t len_value, BACNET_OCTET_STRING * octet_string); diff --git a/bacnet-stack/demo/object/bacfile.c b/bacnet-stack/demo/object/bacfile.c index 624fdd45..583bc41a 100644 --- a/bacnet-stack/demo/object/bacfile.c +++ b/bacnet-stack/demo/object/bacfile.c @@ -227,6 +227,7 @@ bool bacfile_write_property(BACNET_WRITE_PROPERTY_DATA * wp_data, *error_code = ERROR_CODE_UNKNOWN_OBJECT; return false; } + /* decode the some of the request */ switch (wp_data->object_property) { case PROP_ARCHIVE: diff --git a/bacnet-stack/wp.c b/bacnet-stack/wp.c index 235e5287..74ff6f03 100644 --- a/bacnet-stack/wp.c +++ b/bacnet-stack/wp.c @@ -67,8 +67,8 @@ int wp_encode_apdu(uint8_t * apdu, /* propertyValue */ len = encode_opening_tag(&apdu[apdu_len], 3); apdu_len += len; - memmove(&apdu[apdu_len], &data->value[0], value_len); - apdu_len += value_len; + len = bacapp_encode_application_data(&apdu[apdu_len], &data->value); + apdu_len += len; len = encode_closing_tag(&apdu[apdu_len], 3); apdu_len += len; /* optional priority - 0 if not set, 1..16 if set */ @@ -82,24 +82,11 @@ int wp_encode_apdu(uint8_t * apdu, return apdu_len; } -int wp_encode_application_apdu(uint8_t * apdu, - uint8_t invoke_id, - BACNET_WRITE_PROPERTY_DATA * data, - BACNET_APPLICATION_DATA_VALUE * value) -{ - data->value_len = bacapp_encode_application_data( - &data->value[0], value); - - return wp_encode_apdu(apdu, invoke_id, data); -} - - /* decode the service request only */ /* FIXME: there could be various error messages returned using unique values less than zero */ int wp_decode_service_request(uint8_t * apdu, - unsigned apdu_len, BACNET_WRITE_PROPERTY_DATA * data, - BACNET_APPLICATION_DATA_VALUE * value) + unsigned apdu_len, BACNET_WRITE_PROPERTY_DATA * data) { int len = 0; int tag_len = 0; @@ -143,11 +130,11 @@ int wp_decode_service_request(uint8_t * apdu, if (decode_is_context_specific(&apdu[len])) return -2; len += bacapp_decode_application_data(&apdu[len], - apdu_len - len, &value); + apdu_len - len, &data->value); /* FIXME: check the return value; abort if no valid data? */ /* FIXME: there might be more than one data element in here! */ if (!decode_is_closing_tag_number(&apdu[len], 3)) - return -1; + return -4; /* a tag number of 3 is not extended so only one octet */ len++; /* Tag 4: optional Priority - assumed MAX if not explicitly set */ @@ -164,7 +151,7 @@ int wp_decode_service_request(uint8_t * apdu, && (unsigned_value <= BACNET_MAX_PRIORITY)) { data->priority = (uint8_t) unsigned_value; } else - return -1; + return -5; } } } diff --git a/bacnet-stack/wp.h b/bacnet-stack/wp.h index d0546070..99098ef7 100644 --- a/bacnet-stack/wp.h +++ b/bacnet-stack/wp.h @@ -47,8 +47,7 @@ typedef struct BACnet_Write_Property_Data { uint32_t object_instance; BACNET_PROPERTY_ID object_property; int32_t array_index; /* use BACNET_ARRAY_ALL when not setting */ - uint8_t value[MAX_APDU]; - uint16_t value_len; + BACNET_APPLICATION_DATA_VALUE value; uint8_t priority; /* use BACNET_NO_PRIORITY if no priority */ } BACNET_WRITE_PROPERTY_DATA; @@ -60,23 +59,16 @@ extern "C" { int wp_encode_apdu(uint8_t * apdu, uint8_t invoke_id, BACNET_WRITE_PROPERTY_DATA * data); - int wp_encode_application_apdu(uint8_t * apdu, - uint8_t invoke_id, - BACNET_WRITE_PROPERTY_DATA * data, - BACNET_APPLICATION_DATA_VALUE * value); - /* decode the service request only */ int wp_decode_service_request(uint8_t * apdu, unsigned apdu_len, BACNET_WRITE_PROPERTY_DATA * data); +#ifdef TEST +#include "ctest.h" int wp_decode_apdu(uint8_t * apdu, unsigned apdu_len, uint8_t * invoke_id, BACNET_WRITE_PROPERTY_DATA * data); - -#ifdef TEST -#include "ctest.h" - void test_ReadProperty(Test * pTest); void test_ReadPropertyAck(Test * pTest); #endif