diff --git a/bacnet-stack/bacdcode.c b/bacnet-stack/bacdcode.c index f8c8edab..31992843 100644 --- a/bacnet-stack/bacdcode.c +++ b/bacnet-stack/bacdcode.c @@ -163,21 +163,6 @@ int encode_closing_tag(uint8_t * apdu, uint8_t tag_number) return len; } -// from clause 20.2.1.3.2 Constructed Data -// returns the number of apdu bytes consumed -int decode_tag_number(uint8_t * apdu, uint8_t * tag_number) -{ - int len = 1; - - if ((apdu[0] & 0xF0) == 0xF0) { - *tag_number = apdu[1]; - len++; - } else - *tag_number = (apdu[0] >> 4); - - return len; -} - // from clause 20.2.1.3.2 Constructed Data // returns the number of apdu bytes consumed bool decode_is_context_specific(uint8_t * apdu) @@ -201,7 +186,22 @@ bool decode_is_closing_tag(uint8_t * apdu) // from clause 20.2.1.3.2 Constructed Data // returns the number of apdu bytes consumed -int decode_tag_value(uint8_t * apdu, uint32_t * value) +static int decode_tag_number(uint8_t * apdu, uint8_t * tag_number) +{ + int len = 1; + + if ((apdu[0] & 0xF0) == 0xF0) { + *tag_number = apdu[1]; + len++; + } else + *tag_number = (apdu[0] >> 4); + + return len; +} + +// from clause 20.2.1.3.2 Constructed Data +// returns the number of apdu bytes consumed +static int decode_tag_value(uint8_t * apdu, uint32_t * value) { int len = 1; union { @@ -257,6 +257,14 @@ int decode_tag_value(uint8_t * apdu, uint32_t * value) return len; } +// do both tag number and value so that len is returned correctly +static int decode_tag_number_and_value(uint8_t * apdu, uint8_t * tag_number, + uint32_t * value) +{ + (void)decode_tag_number(apdu, tag_number); + return decode_tag_value(apdu, value); +} + // from clause 20.2.6 Encoding of a Real Number Value // returns the number of apdu bytes consumed int decode_real(uint8_t * apdu, float *real_value) diff --git a/bacnet-stack/bacdcode.h b/bacnet-stack/bacdcode.h index 427fbda2..64d0e540 100644 --- a/bacnet-stack/bacdcode.h +++ b/bacnet-stack/bacdcode.h @@ -45,22 +45,12 @@ int encode_tag(uint8_t * apdu, uint8_t tag_number, bool context_specific, // from clause 20.2.1.3.2 Constructed Data // returns the number of apdu bytes consumed int encode_opening_tag(uint8_t * apdu, uint8_t tag_number); - -// from clause 20.2.1.3.2 Constructed Data -// returns the number of apdu bytes consumed int encode_closing_tag(uint8_t * apdu, uint8_t tag_number); - -// from clause 20.2.1.3.2 Constructed Data -// returns the number of apdu bytes consumed -int decode_tag_number(uint8_t * apdu, uint8_t * tag_number); - -// from clause 20.2.1.3.2 Constructed Data -// returns the number of apdu bytes consumed +static int decode_tag_number_and_value(uint8_t * apdu, uint8_t * tag_number, + uint32_t * value); bool decode_is_context_specific(uint8_t * apdu); - -// from clause 20.2.1.3.2 Constructed Data -// returns the number of apdu bytes consumed -int decode_tag_value(uint8_t * apdu, uint32_t * value); +bool decode_is_opening_tag(uint8_t * apdu); +bool decode_is_closing_tag(uint8_t * apdu); // from clause 20.2.6 Encoding of a Real Number Value // and 20.2.1 General Rules for Encoding BACnet Tags