From 2f21b3e352e8db031da799eec824540d4a65dbb6 Mon Sep 17 00:00:00 2001 From: skarg Date: Thu, 2 Aug 2012 20:25:43 +0000 Subject: [PATCH] refactored send-read-property to allow the request using a BACnet-Address. --- bacnet-stack/demo/handler/s_rp.c | 145 +++++++++++++++++++------------ bacnet-stack/include/client.h | 7 ++ 2 files changed, 98 insertions(+), 54 deletions(-) diff --git a/bacnet-stack/demo/handler/s_rp.c b/bacnet-stack/demo/handler/s_rp.c index 6cd0dba6..bdddf938 100644 --- a/bacnet-stack/demo/handler/s_rp.c +++ b/bacnet-stack/demo/handler/s_rp.c @@ -45,6 +45,91 @@ /** @file s_rp.c Send Read Property request. */ +/** Sends a Read Property request + * @ingroup DSRP + * + * @param dest [in] BACNET_ADDRESS of the destination device + * @param max_apdu [in] + * @param object_type [in] Type of the object whose property is to be read. + * @param object_instance [in] Instance # of the object to be read. + * @param object_property [in] Property to be read, but not ALL, REQUIRED, or OPTIONAL. + * @param array_index [in] Optional: if the Property is an array, + * - 0 for the array size + * - 1 to n for individual array members + * - BACNET_ARRAY_ALL (~0) for the full array to be read. + * @return invoke id of outgoing message, or 0 if device is not bound or no tsm available + */ +uint8_t Send_Read_Property_Request_Address( + BACNET_ADDRESS *dest, + uint16_t max_apdu, + BACNET_OBJECT_TYPE object_type, + uint32_t object_instance, + BACNET_PROPERTY_ID object_property, + uint32_t array_index) +{ + BACNET_ADDRESS my_address; + uint8_t invoke_id = 0; + bool status = false; + int len = 0; + int pdu_len = 0; + int bytes_sent = 0; + BACNET_READ_PROPERTY_DATA data; + BACNET_NPDU_DATA npdu_data; + + if (!dcc_communication_enabled()) { + return 0; + } + if (!dest) { + return 0; + } + /* is there a tsm available? */ + invoke_id = tsm_next_free_invokeID(); + if (invoke_id) { + /* encode the NPDU portion of the packet */ + datalink_get_my_address(&my_address); + npdu_encode_npdu_data(&npdu_data, true, MESSAGE_PRIORITY_NORMAL); + pdu_len = + npdu_encode_pdu(&Handler_Transmit_Buffer[0], dest, &my_address, + &npdu_data); + /* encode the APDU portion of the packet */ + data.object_type = object_type; + data.object_instance = object_instance; + data.object_property = object_property; + data.array_index = array_index; + len = + rp_encode_apdu(&Handler_Transmit_Buffer[pdu_len], invoke_id, + &data); + pdu_len += len; + /* will it fit in the sender? + note: if there is a bottleneck router in between + us and the destination, we won't know unless + we have a way to check for that and update the + max_apdu in the address binding table. */ + if ((uint16_t) pdu_len < max_apdu) { + tsm_set_confirmed_unsegmented_transaction(invoke_id, dest, + &npdu_data, &Handler_Transmit_Buffer[0], (uint16_t) pdu_len); + bytes_sent = + datalink_send_pdu(dest, &npdu_data, + &Handler_Transmit_Buffer[0], pdu_len); +#if PRINT_ENABLED + if (bytes_sent <= 0) + fprintf(stderr, "Failed to Send ReadProperty Request (%s)!\n", + strerror(errno)); +#endif + } else { + tsm_free_invoke_id(invoke_id); + invoke_id = 0; +#if PRINT_ENABLED + fprintf(stderr, + "Failed to Send ReadProperty Request " + "(exceeds destination maximum APDU)!\n"); +#endif + } + } + + return invoke_id; +} + /** Sends a Read Property request. * @ingroup DSRP * @@ -65,66 +150,18 @@ uint8_t Send_Read_Property_Request( BACNET_PROPERTY_ID object_property, uint32_t array_index) { - BACNET_ADDRESS dest; - BACNET_ADDRESS my_address; + BACNET_ADDRESS dest = {0}; unsigned max_apdu = 0; uint8_t invoke_id = 0; bool status = false; - int len = 0; - int pdu_len = 0; - int bytes_sent = 0; - BACNET_READ_PROPERTY_DATA data; - BACNET_NPDU_DATA npdu_data; - - if (!dcc_communication_enabled()) - return 0; /* is the device bound? */ status = address_get_by_device(device_id, &max_apdu, &dest); - /* is there a tsm available? */ - if (status) - invoke_id = tsm_next_free_invokeID(); - if (invoke_id) { - /* encode the NPDU portion of the packet */ - datalink_get_my_address(&my_address); - npdu_encode_npdu_data(&npdu_data, true, MESSAGE_PRIORITY_NORMAL); - pdu_len = - npdu_encode_pdu(&Handler_Transmit_Buffer[0], &dest, &my_address, - &npdu_data); - /* encode the APDU portion of the packet */ - data.object_type = object_type; - data.object_instance = object_instance; - data.object_property = object_property; - data.array_index = array_index; - len = - rp_encode_apdu(&Handler_Transmit_Buffer[pdu_len], invoke_id, - &data); - pdu_len += len; - /* will it fit in the sender? - note: if there is a bottleneck router in between - us and the destination, we won't know unless - we have a way to check for that and update the - max_apdu in the address binding table. */ - if ((unsigned) pdu_len < max_apdu) { - tsm_set_confirmed_unsegmented_transaction(invoke_id, &dest, - &npdu_data, &Handler_Transmit_Buffer[0], (uint16_t) pdu_len); - bytes_sent = - datalink_send_pdu(&dest, &npdu_data, - &Handler_Transmit_Buffer[0], pdu_len); -#if PRINT_ENABLED - if (bytes_sent <= 0) - fprintf(stderr, "Failed to Send ReadProperty Request (%s)!\n", - strerror(errno)); -#endif - } else { - tsm_free_invoke_id(invoke_id); - invoke_id = 0; -#if PRINT_ENABLED - fprintf(stderr, - "Failed to Send ReadProperty Request " - "(exceeds destination maximum APDU)!\n"); -#endif - } + if (status) { + invoke_id = Send_Read_Property_Request_Address( + &dest, max_apdu, object_type, + object_instance, object_property, + array_index); } return invoke_id; diff --git a/bacnet-stack/include/client.h b/bacnet-stack/include/client.h index 7f30c13a..b318bf65 100644 --- a/bacnet-stack/include/client.h +++ b/bacnet-stack/include/client.h @@ -114,6 +114,13 @@ extern "C" { /* returns the invoke ID for confirmed request, or 0 if failed */ + uint8_t Send_Read_Property_Request_Address( + BACNET_ADDRESS *dest, + uint16_t max_apdu, + BACNET_OBJECT_TYPE object_type, + uint32_t object_instance, + BACNET_PROPERTY_ID object_property, + uint32_t array_index); uint8_t Send_Read_Property_Request( uint32_t device_id, /* destination device */ BACNET_OBJECT_TYPE object_type,