diff --git a/bacnet-stack/demo/handler/s_cevent.c b/bacnet-stack/demo/handler/s_cevent.c new file mode 100644 index 00000000..ace8d3dd --- /dev/null +++ b/bacnet-stack/demo/handler/s_cevent.c @@ -0,0 +1,104 @@ +/************************************************************************** +* +* Copyright (C) 2005 Steve Karg +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*********************************************************************/ +#include +#include +#include +#include "event.h" +#include "datalink.h" +#include "tsm.h" +#include "dcc.h" +#include "address.h" +/* some demo stuff needed */ +#include "handlers.h" +#include "txbuf.h" + +/* returns the invoke id, 0=unsuccessful */ +uint8_t Send_CEvent_Notify( + uint32_t device_id, + BACNET_EVENT_NOTIFICATION_DATA * data) +{ + int len = 0; + int pdu_len = 0; + int bytes_sent = 0; + BACNET_NPDU_DATA npdu_data; + BACNET_ADDRESS dest; + BACNET_ADDRESS my_address; + unsigned max_apdu = 0; + bool status = false; + uint8_t invoke_id = 0; + + 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 */ + len = cevent_notify_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 ConfirmedEventNotification Request (%s)!\n", + strerror(errno)); + } +#endif + } else { + tsm_free_invoke_id(invoke_id); + invoke_id = 0; +#if PRINT_ENABLED + fprintf(stderr, + "Failed to Send ConfirmedEventNotification Request " + "(exceeds destination maximum APDU)!\n"); +#endif + } + } + + return invoke_id; +} diff --git a/bacnet-stack/include/client.h b/bacnet-stack/include/client.h index 143ea685..f3abea43 100644 --- a/bacnet-stack/include/client.h +++ b/bacnet-stack/include/client.h @@ -139,6 +139,10 @@ extern "C" { BACNET_EVENT_NOTIFICATION_DATA * data, BACNET_ADDRESS * dest); + uint8_t Send_CEvent_Notify( + uint32_t device_id, + BACNET_EVENT_NOTIFICATION_DATA * data); + void Send_Who_Is_Router_To_Network( BACNET_ADDRESS * dst, int dnet); @@ -157,8 +161,6 @@ extern "C" { uint32_t device_id, BACNET_ALARM_ACK_DATA * data); - - #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/bacnet-stack/lib/Makefile b/bacnet-stack/lib/Makefile index 33eb3043..0f678d17 100644 --- a/bacnet-stack/lib/Makefile +++ b/bacnet-stack/lib/Makefile @@ -105,6 +105,7 @@ HANDLER_SRC = \ $(BACNET_HANDLER)/s_rp.c \ $(BACNET_HANDLER)/s_rpm.c \ $(BACNET_HANDLER)/s_ts.c \ + $(BACNET_HANDLER)/s_cevent.c \ $(BACNET_HANDLER)/s_uevent.c \ $(BACNET_HANDLER)/s_whohas.c \ $(BACNET_HANDLER)/s_whois.c \ diff --git a/bacnet-stack/lib/makefile.b32 b/bacnet-stack/lib/makefile.b32 index c71c1bd0..312af992 100644 --- a/bacnet-stack/lib/makefile.b32 +++ b/bacnet-stack/lib/makefile.b32 @@ -107,6 +107,7 @@ HANDLER_SRC = \ $(BACNET_HANDLER)\s_rp.c \ $(BACNET_HANDLER)\s_rpm.c \ $(BACNET_HANDLER)\s_ts.c \ + $(BACNET_HANDLER)\s_cevent.c \ $(BACNET_HANDLER)\s_uevent.c \ $(BACNET_HANDLER)\s_whohas.c \ $(BACNET_HANDLER)\s_whois.c \