diff --git a/bacnet-stack/src/rp.c b/bacnet-stack/src/rp.c index 477e244b..b3558a19 100644 --- a/bacnet-stack/src/rp.c +++ b/bacnet-stack/src/rp.c @@ -147,16 +147,23 @@ int rp_ack_encode_apdu_init( { int len = 0; /* length of each encoding */ int apdu_len = 0; /* total length of the apdu, return value */ + uint32_t obj_instance = rpdata->object_instance; if (apdu) { apdu[0] = PDU_TYPE_COMPLEX_ACK; /* complex ACK service */ apdu[1] = invoke_id; /* original invoke id from request */ apdu[2] = SERVICE_CONFIRMED_READ_PROPERTY; /* service choice */ apdu_len = 3; + + /* Test for case of indefinite Device object instance */ + if ( (rpdata->object_type == OBJECT_DEVICE) && + (obj_instance == BACNET_MAX_INSTANCE) ) + obj_instance = Device_Object_Instance_Number(); + /* service ack follows */ len = encode_context_object_id(&apdu[apdu_len], 0, rpdata->object_type, - rpdata->object_instance); + obj_instance); apdu_len += len; len = encode_context_enumerated(&apdu[apdu_len], 1, @@ -198,25 +205,9 @@ int rp_ack_encode_apdu( int apdu_len = 0; /* total length of the apdu, return value */ if (apdu) { - apdu[0] = PDU_TYPE_COMPLEX_ACK; /* complex ACK service */ - apdu[1] = invoke_id; /* original invoke id from request */ - apdu[2] = SERVICE_CONFIRMED_READ_PROPERTY; /* service choice */ - apdu_len = 3; - /* service ack follows */ - apdu_len += - encode_context_object_id(&apdu[apdu_len], 0, rpdata->object_type, - rpdata->object_instance); - apdu_len += - encode_context_enumerated(&apdu[apdu_len], 1, - rpdata->object_property); - /* context 2 array index is optional */ - if (rpdata->array_index != BACNET_ARRAY_ALL) { - apdu_len += - encode_context_unsigned(&apdu[apdu_len], 2, - rpdata->array_index); - } + /* Do the initial encoding */ + apdu_len = rp_ack_encode_apdu_init(apdu, invoke_id, rpdata); /* propertyValue */ - apdu_len += encode_opening_tag(&apdu[apdu_len], 3); for (len = 0; len < rpdata->application_data_len; len++) { apdu[apdu_len++] = rpdata->application_data[len]; } diff --git a/bacnet-stack/src/rpm.c b/bacnet-stack/src/rpm.c index 6b6859bb..b60177dd 100644 --- a/bacnet-stack/src/rpm.c +++ b/bacnet-stack/src/rpm.c @@ -108,6 +108,14 @@ int rpm_encode_apdu_object_end( return apdu_len; } +/** Encode an RPM request, to be sent. + * + * @param apdu [in,out] Buffer to hold encoded bytes. + * @param max_apdu [in] Length of apdu buffer. + * @param invoke_id [in] The Invoke ID to use for this message. + * @param read_access_data [in] The RPM data to be requested. + * @return Length of encoded bytes, or 0 on failure. + */ int rpm_encode_apdu( uint8_t * apdu, size_t max_apdu, @@ -328,12 +336,18 @@ int rpm_ack_encode_apdu_object_begin( BACNET_RPM_DATA * rpmdata) { int apdu_len = 0; /* total length of the apdu, return value */ + uint32_t obj_instance = rpmdata->object_instance; if (apdu) { + /* Test for case of indefinite Device object instance */ + if ( (rpmdata->object_type == OBJECT_DEVICE) && + (obj_instance == BACNET_MAX_INSTANCE) ) + obj_instance = Device_Object_Instance_Number(); + /* Tag 0: objectIdentifier */ apdu_len = encode_context_object_id(&apdu[0], 0, rpmdata->object_type, - rpmdata->object_instance); + obj_instance); /* Tag 1: listOfResults */ apdu_len += encode_opening_tag(&apdu[apdu_len], 1); }