diff --git a/bacnet-stack/demo/handler/h_rp.c b/bacnet-stack/demo/handler/h_rp.c index 8662b4ef..108e01bd 100644 --- a/bacnet-stack/demo/handler/h_rp.c +++ b/bacnet-stack/demo/handler/h_rp.c @@ -52,6 +52,139 @@ static uint8_t Temp_Buf[MAX_APDU] = { 0 }; +/* Encodes the property APDU and returns the length, + or sets the error, and returns -1 */ +int Encode_Property_APDU( + uint8_t * apdu, + BACNET_OBJECT_TYPE object_type, + uint32_t object_instance, + BACNET_PROPERTY_ID property, + int32_t array_index, + BACNET_ERROR_CLASS * error_class, + BACNET_ERROR_CODE * error_code) +{ + int apdu_len = -1; + + /* initialize the default return values */ + *error_class = ERROR_CLASS_OBJECT; + *error_code = ERROR_CODE_UNKNOWN_OBJECT; + /* handle each object type */ + switch(object_type) { + case OBJECT_DEVICE: + if ((object_instance == Device_Object_Instance_Number()) || + (object_instance == BACNET_MAX_INSTANCE)) { + apdu_len = Device_Encode_Property_APDU( + &apdu[0], + property, + array_index, + error_class, error_code); + } + break; + case OBJECT_ANALOG_INPUT: + if (Analog_Input_Valid_Instance(object_instance)) { + apdu_len = Analog_Input_Encode_Property_APDU( + &apdu[0], + object_instance, + property, + array_index, + error_class, error_code); + } + break; + case OBJECT_ANALOG_OUTPUT: + if (!Analog_Output_Valid_Instance(object_instance)) { + apdu_len = Analog_Output_Encode_Property_APDU( + &apdu[0], + object_instance, + property, + array_index, + error_class, error_code); + } + break; + case OBJECT_ANALOG_VALUE: + if (Analog_Value_Valid_Instance(object_instance)) { + apdu_len = Analog_Value_Encode_Property_APDU(&Temp_Buf[0], + object_instance, + property, + array_index, + error_class, error_code); + } + break; + case OBJECT_BINARY_INPUT: + if (Binary_Input_Valid_Instance(object_instance)) { + apdu_len = Binary_Input_Encode_Property_APDU( + &apdu[0], + object_instance, + property, + array_index, + error_class, error_code); + } + break; + case OBJECT_BINARY_OUTPUT: + if (Binary_Output_Valid_Instance(object_instance)) { + apdu_len = Binary_Output_Encode_Property_APDU( + &apdu[0], + object_instance, + property, + array_index, + error_class, error_code); + } + break; + case OBJECT_BINARY_VALUE: + if (Binary_Value_Valid_Instance(object_instance)) { + apdu_len = Binary_Value_Encode_Property_APDU(&Temp_Buf[0], + object_instance, + property, + array_index, + error_class, error_code); + } + break; + case OBJECT_LIFE_SAFETY_POINT: + if (Life_Safety_Point_Valid_Instance(object_instance)) { + apdu_len = Life_Safety_Point_Encode_Property_APDU(&Temp_Buf[0], + object_instance, + property, + array_index, + error_class, error_code); + } + break; + case OBJECT_LOAD_CONTROL: + if (Load_Control_Valid_Instance(object_instance)) { + apdu_len = Load_Control_Encode_Property_APDU(&Temp_Buf[0], + object_instance, + property, + array_index, + error_class, error_code); + } + break; + case OBJECT_MULTI_STATE_OUTPUT: + if (Multistate_Output_Valid_Instance(object_instance)) { + apdu_len = Multistate_Output_Encode_Property_APDU(&Temp_Buf[0], + object_instance, + property, + array_index, + error_class, error_code); + } + break; +#if BACFILE + case OBJECT_FILE: + if (bacfile_valid_instance(object_instance)) { + apdu_len = bacfile_encode_property_apdu(&Temp_Buf[0], + object_instance, + property, + array_index, + error_class, error_code); + } + break; +#endif + default: + *error_class = ERROR_CLASS_OBJECT; + *error_code = ERROR_CODE_UNSUPPORTED_OBJECT_TYPE; + break; + } + + return apdu_len; +} + void handler_read_property(uint8_t * service_request, uint16_t service_len, BACNET_ADDRESS * src, BACNET_CONFIRMED_SERVICE_DATA * service_data) @@ -94,247 +227,26 @@ void handler_read_property(uint8_t * service_request, } else { /* most cases will be error */ error = true; - switch (data.object_type) { - case OBJECT_DEVICE: + len = Encode_Property_APDU( + &Temp_Buf[0], + data.object_type, + data.object_instance, + data.object_property, + data.array_index, + &error_class, &error_code); + if (len >= 0) { + /* encode the APDU portion of the packet */ + data.application_data = &Temp_Buf[0]; + data.application_data_len = len; /* FIXME: probably need a length limitation sent with encode */ - if (data.object_instance == Device_Object_Instance_Number()) { - len = Device_Encode_Property_APDU(&Temp_Buf[0], - data.object_property, - data.array_index, &error_class, &error_code); - if (len >= 0) { - /* encode the APDU portion of the packet */ - data.application_data = &Temp_Buf[0]; - data.application_data_len = len; - /* FIXME: probably need a length limitation sent with encode */ - len = - rp_ack_encode_apdu(&Handler_Transmit_Buffer - [pdu_len], service_data->invoke_id, &data); + len = + rp_ack_encode_apdu(&Handler_Transmit_Buffer[pdu_len], + service_data->invoke_id, &data); #if PRINT_ENABLED - fprintf(stderr, - "Sending Read Property Ack for Device!\n"); + fprintf(stderr, + "Sending Read Property Ack!\n"); #endif - error = false; - } - } - break; - case OBJECT_ANALOG_INPUT: - if (Analog_Input_Valid_Instance(data.object_instance)) { - len = Analog_Input_Encode_Property_APDU(&Temp_Buf[0], - data.object_instance, - data.object_property, - data.array_index, &error_class, &error_code); - if (len >= 0) { - /* encode the APDU portion of the packet */ - data.application_data = &Temp_Buf[0]; - data.application_data_len = len; - /* FIXME: probably need a length limitation sent with encode */ - len = - rp_ack_encode_apdu(&Handler_Transmit_Buffer - [pdu_len], service_data->invoke_id, &data); -#if PRINT_ENABLED - fprintf(stderr, "Sending Read Property Ack for AI!\n"); -#endif - error = false; - } - } - break; - case OBJECT_BINARY_INPUT: - if (Binary_Input_Valid_Instance(data.object_instance)) { - len = Binary_Input_Encode_Property_APDU(&Temp_Buf[0], - data.object_instance, - data.object_property, - data.array_index, &error_class, &error_code); - if (len >= 0) { - /* encode the APDU portion of the packet */ - data.application_data = &Temp_Buf[0]; - data.application_data_len = len; - /* FIXME: probably need a length limitation sent with encode */ - len = - rp_ack_encode_apdu(&Handler_Transmit_Buffer - [pdu_len], service_data->invoke_id, &data); -#if PRINT_ENABLED - fprintf(stderr, "Sending Read Property Ack for BI!\n"); -#endif - error = false; - } - } - break; - case OBJECT_BINARY_OUTPUT: - if (Binary_Output_Valid_Instance(data.object_instance)) { - len = Binary_Output_Encode_Property_APDU(&Temp_Buf[0], - data.object_instance, - data.object_property, - data.array_index, &error_class, &error_code); - if (len >= 0) { - /* encode the APDU portion of the packet */ - data.application_data = &Temp_Buf[0]; - data.application_data_len = len; - /* FIXME: probably need a length limitation sent with encode */ - len = - rp_ack_encode_apdu(&Handler_Transmit_Buffer - [pdu_len], service_data->invoke_id, &data); -#if PRINT_ENABLED - fprintf(stderr, "Sending Read Property Ack for BO!\n"); -#endif - error = false; - } - } - break; - case OBJECT_BINARY_VALUE: - if (Binary_Value_Valid_Instance(data.object_instance)) { - len = Binary_Value_Encode_Property_APDU(&Temp_Buf[0], - data.object_instance, - data.object_property, - data.array_index, &error_class, &error_code); - if (len >= 0) { - /* encode the APDU portion of the packet */ - data.application_data = &Temp_Buf[0]; - data.application_data_len = len; - /* FIXME: probably need a length limitation sent with encode */ - len = - rp_ack_encode_apdu(&Handler_Transmit_Buffer - [pdu_len], service_data->invoke_id, &data); -#if PRINT_ENABLED - fprintf(stderr, "Sending Read Property Ack for BV!\n"); -#endif - error = false; - } - } - break; - case OBJECT_ANALOG_OUTPUT: - if (Analog_Output_Valid_Instance(data.object_instance)) { - len = Analog_Output_Encode_Property_APDU(&Temp_Buf[0], - data.object_instance, - data.object_property, - data.array_index, &error_class, &error_code); - if (len >= 0) { - /* encode the APDU portion of the packet */ - data.application_data = &Temp_Buf[0]; - data.application_data_len = len; - /* FIXME: probably need a length limitation sent with encode */ - len = - rp_ack_encode_apdu(&Handler_Transmit_Buffer - [pdu_len], service_data->invoke_id, &data); -#if PRINT_ENABLED - fprintf(stderr, "Sending Read Property Ack for AO!\n"); -#endif - error = false; - } - } - break; - case OBJECT_ANALOG_VALUE: - if (Analog_Value_Valid_Instance(data.object_instance)) { - len = Analog_Value_Encode_Property_APDU(&Temp_Buf[0], - data.object_instance, - data.object_property, - data.array_index, &error_class, &error_code); - if (len >= 0) { - /* encode the APDU portion of the packet */ - data.application_data = &Temp_Buf[0]; - data.application_data_len = len; - /* FIXME: probably need a length limitation sent with encode */ - len = - rp_ack_encode_apdu(&Handler_Transmit_Buffer - [pdu_len], service_data->invoke_id, &data); -#if PRINT_ENABLED - fprintf(stderr, "Sending Read Property Ack for AV!\n"); -#endif - error = false; - } - } - break; - case OBJECT_LIFE_SAFETY_POINT: - if (Life_Safety_Point_Valid_Instance(data.object_instance)) { - len = Life_Safety_Point_Encode_Property_APDU(&Temp_Buf[0], - data.object_instance, - data.object_property, - data.array_index, &error_class, &error_code); - if (len >= 0) { - /* encode the APDU portion of the packet */ - data.application_data = &Temp_Buf[0]; - data.application_data_len = len; - /* FIXME: probably need a length limitation sent with encode */ - len = - rp_ack_encode_apdu(&Handler_Transmit_Buffer - [pdu_len], service_data->invoke_id, &data); -#if PRINT_ENABLED - fprintf(stderr, - "Sending Read Property Ack for LSP!\n"); -#endif - error = false; - } - } - break; - case OBJECT_LOAD_CONTROL: - if (Load_Control_Valid_Instance(data.object_instance)) { - len = Load_Control_Encode_Property_APDU(&Temp_Buf[0], - data.object_instance, - data.object_property, - data.array_index, &error_class, &error_code); - if (len >= 0) { - /* encode the APDU portion of the packet */ - data.application_data = &Temp_Buf[0]; - data.application_data_len = len; - /* FIXME: probably need a length limitation sent with encode */ - len = - rp_ack_encode_apdu(&Handler_Transmit_Buffer - [pdu_len], service_data->invoke_id, &data); -#if PRINT_ENABLED - fprintf(stderr, - "Sending Read Property Ack for Load Control!\n"); -#endif - error = false; - } - } - break; - case OBJECT_MULTI_STATE_OUTPUT: - if (Multistate_Output_Valid_Instance(data.object_instance)) { - len = Multistate_Output_Encode_Property_APDU(&Temp_Buf[0], - data.object_instance, - data.object_property, - data.array_index, &error_class, &error_code); - if (len >= 0) { - /* encode the APDU portion of the packet */ - data.application_data = &Temp_Buf[0]; - data.application_data_len = len; - /* FIXME: probably need a length limitation sent with encode */ - len = - rp_ack_encode_apdu(&Handler_Transmit_Buffer - [pdu_len], service_data->invoke_id, &data); -#if PRINT_ENABLED - fprintf(stderr, - "Sending Read Property Ack for MSO!\n"); -#endif - error = false; - } - } - break; -#if BACFILE - case OBJECT_FILE: - if (bacfile_valid_instance(data.object_instance)) { - len = bacfile_encode_property_apdu(&Temp_Buf[0], - data.object_instance, - data.object_property, - data.array_index, &error_class, &error_code); - if (len >= 0) { - /* encode the APDU portion of the packet */ - data.application_data = &Temp_Buf[0]; - data.application_data_len = len; - /* FIXME: probably need a length limitation sent with encode */ - len = - rp_ack_encode_apdu(&Handler_Transmit_Buffer - [pdu_len], service_data->invoke_id, &data); -#if PRINT_ENABLED - fprintf(stderr, - "Sending Read Property Ack for File!\n"); -#endif - error = false; - } - } - break; -#endif /* BACFILE */ - default: - break; + error = false; } } if (error) { diff --git a/bacnet-stack/demo/handler/h_rpm.c b/bacnet-stack/demo/handler/h_rpm.c index da71282d..68f780a8 100644 --- a/bacnet-stack/demo/handler/h_rpm.c +++ b/bacnet-stack/demo/handler/h_rpm.c @@ -53,7 +53,6 @@ #endif static uint8_t Temp_Buf[MAX_APDU] = { 0 }; -static uint8_t Application_Buf[MAX_APDU] = { 0 }; struct property_list_t { @@ -238,164 +237,55 @@ int apdu_copy(uint8_t *dest, uint8_t *src, int offset, int len, int max) return copy_len; } -/* Encodes the property APDU and returns the length, - or sets the error, and returns -1 */ -int Encode_Property_APDU( - uint8_t * apdu, +/* Encode the RPM property returning the length of the encoding, + or 0 if there is no room to fit the encoding. */ +int RPM_Encode_Property(uint8_t *apdu, + uint16_t offset, + uint16_t max_apdu, BACNET_OBJECT_TYPE object_type, uint32_t object_instance, - BACNET_PROPERTY_ID property, - int32_t array_index, - BACNET_ERROR_CLASS * error_class, - BACNET_ERROR_CODE * error_code) + BACNET_PROPERTY_ID object_property, + int32_t array_index) { - int apdu_len = -1; + int len = 0; + int apdu_len = 0; + BACNET_ERROR_CLASS error_class = ERROR_CLASS_OBJECT; + BACNET_ERROR_CODE error_code = ERROR_CODE_UNKNOWN_OBJECT; - switch(object_type) { - case OBJECT_DEVICE: - if ((object_instance == Device_Object_Instance_Number()) || - (object_instance == BACNET_MAX_INSTANCE)) { - apdu_len = Device_Encode_Property_APDU( - &apdu[0], - property, - array_index, - error_class, error_code); - } else { - *error_class = ERROR_CLASS_OBJECT; - *error_code = ERROR_CODE_UNKNOWN_OBJECT; - } - break; - case OBJECT_ANALOG_INPUT: - if (Analog_Input_Valid_Instance(object_instance)) { - apdu_len = Analog_Input_Encode_Property_APDU( - &apdu[0], - object_instance, - property, - array_index, - error_class, error_code); - } else { - *error_class = ERROR_CLASS_OBJECT; - *error_code = ERROR_CODE_UNKNOWN_OBJECT; - } - break; - case OBJECT_ANALOG_OUTPUT: - if (!Analog_Output_Valid_Instance(object_instance)) { - apdu_len = Analog_Output_Encode_Property_APDU( - &apdu[0], - object_instance, - property, - array_index, - error_class, error_code); - } else { - *error_class = ERROR_CLASS_OBJECT; - *error_code = ERROR_CODE_UNKNOWN_OBJECT; - } - break; - case OBJECT_ANALOG_VALUE: - if (Analog_Value_Valid_Instance(object_instance)) { - apdu_len = Analog_Value_Encode_Property_APDU(&Temp_Buf[0], - object_instance, - property, - array_index, - error_class, error_code); - } else { - *error_class = ERROR_CLASS_OBJECT; - *error_code = ERROR_CODE_UNKNOWN_OBJECT; - } - break; - case OBJECT_BINARY_INPUT: - if (Binary_Input_Valid_Instance(object_instance)) { - apdu_len = Binary_Input_Encode_Property_APDU( - &apdu[0], - object_instance, - property, - array_index, - error_class, error_code); - } else { - *error_class = ERROR_CLASS_OBJECT; - *error_code = ERROR_CODE_UNKNOWN_OBJECT; - } - break; - case OBJECT_BINARY_OUTPUT: - if (Binary_Output_Valid_Instance(object_instance)) { - apdu_len = Binary_Output_Encode_Property_APDU( - &apdu[0], - object_instance, - property, - array_index, - error_class, error_code); - } else { - *error_class = ERROR_CLASS_OBJECT; - *error_code = ERROR_CODE_UNKNOWN_OBJECT; - } - break; - case OBJECT_BINARY_VALUE: - if (Binary_Value_Valid_Instance(object_instance)) { - apdu_len = Binary_Value_Encode_Property_APDU(&Temp_Buf[0], - object_instance, - property, - array_index, - error_class, error_code); - } else { - *error_class = ERROR_CLASS_OBJECT; - *error_code = ERROR_CODE_UNKNOWN_OBJECT; - } - break; - case OBJECT_LIFE_SAFETY_POINT: - if (Life_Safety_Point_Valid_Instance(object_instance)) { - apdu_len = Life_Safety_Point_Encode_Property_APDU(&Temp_Buf[0], - object_instance, - property, - array_index, - error_class, error_code); - } else { - *error_class = ERROR_CLASS_OBJECT; - *error_code = ERROR_CODE_UNKNOWN_OBJECT; - } - break; - case OBJECT_LOAD_CONTROL: - if (Load_Control_Valid_Instance(object_instance)) { - apdu_len = Load_Control_Encode_Property_APDU(&Temp_Buf[0], - object_instance, - property, - array_index, - error_class, error_code); - } else { - *error_class = ERROR_CLASS_OBJECT; - *error_code = ERROR_CODE_UNKNOWN_OBJECT; - } - break; - case OBJECT_MULTI_STATE_OUTPUT: - if (Multistate_Output_Valid_Instance(object_instance)) { - apdu_len = Multistate_Output_Encode_Property_APDU(&Temp_Buf[0], - object_instance, - property, - array_index, - error_class, error_code); - } else { - *error_class = ERROR_CLASS_OBJECT; - *error_code = ERROR_CODE_UNKNOWN_OBJECT; - } - break; -#if BACFILE - case OBJECT_FILE: - if (bacfile_valid_instance(object_instance)) { - apdu_len = bacfile_encode_property_apdu(&Temp_Buf[0], - object_instance, - property, - array_index, - error_class, error_code); - } else { - *error_class = ERROR_CLASS_OBJECT; - *error_code = ERROR_CODE_UNKNOWN_OBJECT; - } - break; -#endif - default: - *error_class = ERROR_CLASS_OBJECT; - *error_code = ERROR_CODE_UNSUPPORTED_OBJECT_TYPE; - break; + len = rpm_ack_encode_apdu_object_property( + &Temp_Buf[0], + object_property, + array_index); + len = apdu_copy(&apdu[0], &Temp_Buf[0], offset, len, max_apdu); + if (!len) + return 0; + apdu_len += len; + len = Encode_Property_APDU( + &Temp_Buf[0], + object_type, + object_instance, + object_property, + array_index, + &error_class, &error_code); + if (len < 0) { + /* error was returned - encode that for the response */ + len = rpm_ack_encode_apdu_object_property_error( + &Temp_Buf[0], + error_class, error_code); + len = apdu_copy(&apdu[0], &Temp_Buf[0], offset, len, max_apdu); + if (!len) + return 0; + } else if ((offset+apdu_len+1+len+1) < max_apdu) { + /* enough room to fit the property value and tags */ + len = rpm_ack_encode_apdu_object_property_value( + &apdu[offset+apdu_len], + &Temp_Buf[0], + len); + } else { + /* not enough room - abort! */ + return 0; } + apdu_len += len; return apdu_len; } @@ -409,18 +299,15 @@ void handler_read_property_multiple( int len = 0; int copy_len = 0; int decode_len = 0; - int application_data_len = 0; int pdu_len = 0; BACNET_NPDU_DATA npdu_data; int bytes_sent; - BACNET_ERROR_CLASS error_class = ERROR_CLASS_OBJECT; - BACNET_ERROR_CODE error_code = ERROR_CODE_UNKNOWN_OBJECT; BACNET_ADDRESS my_address; BACNET_OBJECT_TYPE object_type; uint32_t object_instance = 0; int apdu_len = 0; - int npdu_len; - BACNET_PROPERTY_ID object_property, temp_object_property; + int npdu_len = 0; + BACNET_PROPERTY_ID object_property; int32_t array_index = 0; /* jps_debug - see if we are utilizing all the buffer */ @@ -565,114 +452,55 @@ void handler_read_property_multiple( struct special_property_list_t property_list; unsigned property_count = 0; unsigned index = 0; + BACNET_PROPERTY_ID special_object_property; + + special_object_property = object_property; RPM_Property_List(object_type, &property_list); property_count = RPM_Object_Property_Count( &property_list, - object_property); + special_object_property); for (index = 0; index < property_count; index++) { - temp_object_property = RPM_Object_Property( + object_property = RPM_Object_Property( &property_list, - object_property, + special_object_property, index); - len = rpm_ack_encode_apdu_object_property( - &Temp_Buf[0], - temp_object_property, - array_index); - copy_len = apdu_copy( - &Handler_Transmit_Buffer[npdu_len], &Temp_Buf[0], - apdu_len, len, - sizeof(Handler_Transmit_Buffer)); - if (!copy_len) { - apdu_len = abort_encode_apdu( - &Handler_Transmit_Buffer[npdu_len], - service_data->invoke_id, - ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true); - goto RPM_ABORT; - } else { - apdu_len += copy_len; - } - application_data_len = Encode_Property_APDU( - &Application_Buf[0], + len = RPM_Encode_Property( + &Handler_Transmit_Buffer[0], + npdu_len + apdu_len, + sizeof(Handler_Transmit_Buffer), object_type, object_instance, - temp_object_property, - array_index, - &error_class, &error_code); - if (application_data_len < 0) { - len = rpm_ack_encode_apdu_object_property_error( - &Temp_Buf[0], - error_class, error_code); + object_property, + array_index); + if (len > 0) { + apdu_len += len; } else { - len = rpm_ack_encode_apdu_object_property_value( - &Temp_Buf[0], - &Application_Buf[0], - application_data_len); - } - copy_len = apdu_copy( - &Handler_Transmit_Buffer[npdu_len], &Temp_Buf[0], - apdu_len, len, - sizeof(Handler_Transmit_Buffer)); - if (!copy_len) { apdu_len = abort_encode_apdu( - &Handler_Transmit_Buffer[npdu_len], - service_data->invoke_id, - ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, - true); - goto RPM_ABORT; - } else { - apdu_len += copy_len; + &Handler_Transmit_Buffer[npdu_len], + service_data->invoke_id, + ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true); + goto RPM_ABORT; } } } else { /* handle an individual property */ - len = rpm_ack_encode_apdu_object_property( - &Temp_Buf[0], - object_property, - array_index); - copy_len = apdu_copy( - &Handler_Transmit_Buffer[npdu_len], &Temp_Buf[0], - apdu_len, len, - sizeof(Handler_Transmit_Buffer)); - if (!copy_len) { - apdu_len = abort_encode_apdu( - &Handler_Transmit_Buffer[npdu_len], - service_data->invoke_id, - ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true); - goto RPM_ABORT; - } else { - apdu_len += copy_len; - } - application_data_len = Encode_Property_APDU( - &Application_Buf[0], + len = RPM_Encode_Property( + &Handler_Transmit_Buffer[0], + npdu_len + apdu_len, + sizeof(Handler_Transmit_Buffer), object_type, object_instance, object_property, - array_index, - &error_class, &error_code); - if (application_data_len < 0) { - len = rpm_ack_encode_apdu_object_property_error( - &Temp_Buf[0], - error_class, error_code); + array_index); + if (len > 0) { + apdu_len += len; } else { - len = rpm_ack_encode_apdu_object_property_value( - &Temp_Buf[0], - &Application_Buf[0], - application_data_len); - } - copy_len = apdu_copy( - &Handler_Transmit_Buffer[npdu_len], &Temp_Buf[0], - apdu_len, len, - sizeof(Handler_Transmit_Buffer)); - if (!copy_len) { apdu_len = abort_encode_apdu( - &Handler_Transmit_Buffer[npdu_len], - service_data->invoke_id, - ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, - true); - goto RPM_ABORT; - } else { - apdu_len += copy_len; + &Handler_Transmit_Buffer[npdu_len], + service_data->invoke_id, + ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true); + goto RPM_ABORT; } } } while(1); diff --git a/bacnet-stack/demo/handler/handlers.h b/bacnet-stack/demo/handler/handlers.h index 970d2409..bdfac08e 100644 --- a/bacnet-stack/demo/handler/handlers.h +++ b/bacnet-stack/demo/handler/handlers.h @@ -107,6 +107,19 @@ extern "C" { BACNET_ADDRESS * src, BACNET_CONFIRMED_SERVICE_DATA * service_data); + /* Encodes the property APDU and returns the length, + or sets the error, and returns -1 */ + /* resides in h_rp.c */ + int Encode_Property_APDU( + uint8_t * apdu, + BACNET_OBJECT_TYPE object_type, + uint32_t object_instance, + BACNET_PROPERTY_ID property, + int32_t array_index, + BACNET_ERROR_CLASS * error_class, + BACNET_ERROR_CODE * error_code); + + #ifdef __cplusplus }