diff --git a/CHANGELOG.md b/CHANGELOG.md index b9360d7f..cd457af1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,8 @@ The git repositories are hosted at the following sites: ### Fixed +* Fixed BACnetGroupChannelValue encoding and decoding of BACnetChannelValue + which was deemed errata by BACnet standard committee. (#980) * Fixed some INTRINSIC_REPORTING #ifs in AV and BV basic objects. (#977) ### Removed diff --git a/src/bacnet/write_group.c b/src/bacnet/write_group.c index 4017a7a7..68b62dfb 100644 --- a/src/bacnet/write_group.c +++ b/src/bacnet/write_group.c @@ -282,7 +282,7 @@ int bacnet_write_group_service_request_decode( * change-list [2] SEQUENCE OF BACnetGroupChannelValue ::= SEQUENCE { * channel [0] Unsigned16, * overriding-priority [1] Unsigned (1..16) OPTIONAL, - * value BACnetChannelValue + * value [2] BACnetChannelValue * } * inhibit-delay [3] BOOLEAN OPTIONAL * } @@ -408,6 +408,9 @@ bool bacnet_write_group_same( /** * @brief Compare two BACnetGroupChannelValue value lists + * @param head1 Pointer to the first value list to compare + * @param head2 Pointer to the second value list to compare + * @return true if the values are the same, else false */ bool bacnet_group_change_list_same( const BACNET_GROUP_CHANNEL_VALUE *head1, @@ -464,7 +467,7 @@ bool bacnet_group_channel_value_same( * BACnetGroupChannelValue ::= SEQUENCE { * channel [0] Unsigned16, * overriding-priority [1] Unsigned (1..16) OPTIONAL, - * value BACnetChannelValue + * value [2] BACnetChannelValue * } * * @param apdu Pointer to the buffer for encoded values @@ -495,12 +498,23 @@ int bacnet_group_channel_value_encode( apdu += len; } } - /* value BACnetChannelValue */ + /* value [2] BACnetChannelValue */ + len = encode_opening_tag(apdu, 2); + apdu_len += len; + if (apdu) { + apdu += len; + } + /* BACnetChannelValue */ len = bacnet_channel_value_type_encode(apdu, &value->value); apdu_len += len; if (apdu) { apdu += len; } + len = encode_closing_tag(apdu, 2); + apdu_len += len; + if (apdu) { + apdu += len; + } /* is there another one to encode? */ value = value->next; } @@ -514,7 +528,7 @@ int bacnet_group_channel_value_encode( * BACnetGroupChannelValue ::= SEQUENCE { * channel [0] Unsigned16, * overriding-priority [1] Unsigned (1..16) OPTIONAL, - * value BACnetChannelValue + * value [2] BACnetChannelValue * } * * @param apdu Pointer to the buffer for encoded values @@ -566,6 +580,12 @@ int bacnet_group_channel_value_decode( } } /* value BACnetChannelValue */ + if (bacnet_is_opening_tag_number( + &apdu[apdu_len], apdu_size - apdu_len, 2, &len)) { + apdu_len += len; + } else { + return BACNET_STATUS_ERROR; + } len = bacnet_channel_value_decode( &apdu[apdu_len], apdu_size - apdu_len, &channel_value); if (len > 0) { @@ -576,6 +596,12 @@ int bacnet_group_channel_value_decode( } else { return BACNET_STATUS_ERROR; } + if (bacnet_is_closing_tag_number( + &apdu[apdu_len], apdu_size - apdu_len, 2, &len)) { + apdu_len += len; + } else { + return BACNET_STATUS_ERROR; + } return apdu_len; } diff --git a/src/bacnet/write_group.h b/src/bacnet/write_group.h index a3a2d8c7..d5a0489d 100644 --- a/src/bacnet/write_group.h +++ b/src/bacnet/write_group.h @@ -21,7 +21,7 @@ * BACnetGroupChannelValue ::= SEQUENCE { * channel [0] Unsigned16, * overriding-priority [1] Unsigned (1..16) OPTIONAL, - * value BACnetChannelValue + * value [2] BACnetChannelValue * } */ struct BACnet_Group_Channel_Value;