Added WritePropertyMultiple demo application.

This commit is contained in:
skarg
2017-11-01 21:33:48 +00:00
parent 9186440c56
commit 04c94698e5
6 changed files with 591 additions and 20 deletions
+21 -18
View File
@@ -32,7 +32,6 @@
#include <errno.h>
#include <string.h>
#include "config.h"
#include "txbuf.h"
#include "bacdef.h"
#include "bacdcode.h"
#include "address.h"
@@ -51,12 +50,16 @@
/** @file s_wpm.c Send Write Property Multiple request. */
/** Sends a Write Property Multiple request.
* @param pdu [out] Buffer to build the outgoing message into
* @param max_pdu [in] Length of the pdu buffer.
* @param device_id [in] ID of the destination device
* @param write_access_data [in] Ptr to structure with the linked list of
* objects and properties to be written.
* @return invoke id of outgoing message, or 0 if device is not bound or no tsm available
*/
uint8_t Send_Write_Property_Multiple_Request_Data(
uint8_t Send_Write_Property_Multiple_Request(
uint8_t * pdu,
size_t max_pdu,
uint32_t device_id,
BACNET_WRITE_ACCESS_DATA * write_access_data)
{
@@ -69,28 +72,26 @@ uint8_t Send_Write_Property_Multiple_Request_Data(
int pdu_len = 0;
int bytes_sent = 0;
BACNET_NPDU_DATA npdu_data;
/* if we are forbidden to send, don't send! */
if (!dcc_communication_enabled())
return 0;
/* if we are forbidden to send, don't send! */
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)
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);
pdu_len = npdu_encode_pdu(&pdu[0], &dest, &my_address,&npdu_data);
/* encode the APDU portion of the packet */
len =
wpm_encode_apdu(&Handler_Transmit_Buffer[pdu_len], max_apdu,
wpm_encode_apdu(&pdu[pdu_len], max_pdu - pdu_len,
invoke_id, write_access_data);
pdu_len += len;
/* will it fit in the sender?
@@ -100,21 +101,23 @@ uint8_t Send_Write_Property_Multiple_Request_Data(
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);
&npdu_data, &pdu[0], (uint16_t) pdu_len);
bytes_sent =
datalink_send_pdu(&dest, &npdu_data,
&Handler_Transmit_Buffer[0], pdu_len);
&pdu[0], pdu_len);
#if PRINT_ENABLED
if (bytes_sent <= 0)
fprintf(stderr, "Failed to Send WriteProperty Request (%s)!\n",
if (bytes_sent <= 0) {
fprintf(stderr,
"Failed to Send WritePropertyMultiple Request (%s)!\n",
strerror(errno));
}
#endif
} else {
tsm_free_invoke_id(invoke_id);
invoke_id = 0;
#if PRINT_ENABLED
fprintf(stderr,
"Failed to Send WriteProperty Request "
"Failed to Send WritePropertyMultiple Request "
"(exceeds destination maximum APDU)!\n");
#endif
}