Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * @file
- * @brief BACnet server with minimal objects
- */
- #include <stddef.h>
- #include <stdint.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <signal.h>
- #include <string.h>
- /* BACnet Stack defines - first */
- #include "bacnet/bacdef.h"
- /* BACnet Stack API */
- #include "bacnet/bacdcode.h"
- #include "bacnet/bacerror.h"
- #include "bacnet/apdu.h"
- #include "bacnet/dcc.h"
- #include "bacnet/iam.h"
- #include "bacnet/npdu.h"
- #include "bacnet/getevent.h"
- #include "bacnet/version.h"
- #include "bacnet/basic/services.h"
- /* basic objects */
- #include "bacnet/basic/object/device.h"
- #include "bacnet/basic/object/ai.h"
- #include "bacnet/basic/object/netport.h"
- /* basic BACnet stuff */
- #include "bacnet/basic/binding/address.h"
- #include "bacnet/basic/sys/filename.h"
- #include "bacnet/basic/sys/mstimer.h"
- #include "bacnet/basic/tsm/tsm.h"
- #include "bacnet/datalink/datalink.h"
- #include "bacnet/datalink/dlenv.h"
- /* Our custom object functions table */
- static object_functions_t My_Object_Table[] = {
- {OBJECT_DEVICE, NULL /* Init - don't init Device or it will recourse! */,
- Device_Count, Device_Index_To_Instance,
- Device_Valid_Object_Instance_Number, Device_Object_Name,
- Device_Read_Property_Local, Device_Write_Property_Local,
- Device_Property_Lists, DeviceGetRRInfo, NULL /* Iterator */,
- NULL /* Value_Lists */, NULL /* COV */, NULL /* COV Clear */,
- NULL /* Intrinsic Reporting */, NULL /* Add_List_Element */,
- NULL /* Remove_List_Element */, NULL /* Create */, NULL /* Delete */,
- NULL /* Timer */},
- {OBJECT_ANALOG_INPUT, Analog_Input_Init, Analog_Input_Count,
- Analog_Input_Index_To_Instance, Analog_Input_Valid_Instance,
- Analog_Input_Object_Name, Analog_Input_Read_Property,
- Analog_Input_Write_Property, Analog_Input_Property_Lists,
- NULL /* ReadRangeInfo */, NULL /* Iterator */, NULL /* Value_Lists */,
- NULL /* COV */, NULL /* COV Clear */, NULL /* Intrinsic Reporting */,
- NULL /* Add_List_Element */, NULL /* Remove_List_Element */,
- NULL /* Create */, NULL /* Delete */, NULL /* Timer */},
- {OBJECT_NETWORK_PORT, Network_Port_Init, Network_Port_Count,
- Network_Port_Index_To_Instance, Network_Port_Valid_Instance,
- Network_Port_Object_Name, Network_Port_Read_Property,
- Network_Port_Write_Property, Network_Port_Property_Lists,
- NULL /* ReadRangeInfo */, NULL /* Iterator */, NULL /* Value_Lists */,
- NULL /* COV */, NULL /* COV Clear */, NULL /* Intrinsic Reporting */,
- NULL /* Add_List_Element */, NULL /* Remove_List_Element */,
- NULL /* Create */, NULL /* Delete */, NULL /* Timer */},
- {MAX_BACNET_OBJECT_TYPE, NULL /* Init */, NULL /* Count */,
- NULL /* Index_To_Instance */, NULL /* Valid_Instance */,
- NULL /* Object_Name */, NULL /* Read_Property */,
- NULL /* Write_Property */, NULL /* Property_Lists */,
- NULL /* ReadRangeInfo */, NULL /* Iterator */, NULL /* Value_Lists */,
- NULL /* COV */, NULL /* COV Clear */, NULL /* Intrinsic Reporting */,
- NULL /* Add_List_Element */, NULL /* Remove_List_Element */,
- NULL /* Create */, NULL /* Delete */, NULL /* Timer */}
- };
- /* Timers for various BACnet timeouts */
- static struct mstimer BACnet_Task_Timer;
- static struct mstimer BACnet_TSM_Timer;
- static struct mstimer BACnet_Address_Timer;
- static struct mstimer BACnet_Object_Timer;
- static uint8_t Rx_Buf[MAX_MPDU] = { 0 };
- /** Initialize the handlers we will utilize.
- * @note Doesn't initialize any objects yet.
- */
- static void Init_Service_Handlers(void)
- {
- Device_Init(My_Object_Table);
- /* Create single analog input instance */
- uint32_t ai_instance = Analog_Input_Create(1);
- Analog_Input_Name_Set(ai_instance, "Analog-Value-1");
- Analog_Input_Description_Set(ai_instance, "Example analog value");
- Analog_Input_Units_Set(ai_instance, UNITS_PERCENT);
- /* we need to handle who-is to support dynamic device binding */
- apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_WHO_IS, handler_who_is);
- apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_WHO_HAS, handler_who_has);
- /* set the handler for all the services we don't implement */
- apdu_set_unrecognized_service_handler_handler(handler_unrecognized_service);
- /* Set the handlers for any confirmed services that we support. */
- apdu_set_confirmed_handler(
- SERVICE_CONFIRMED_READ_PROPERTY, handler_read_property);
- apdu_set_confirmed_handler(
- SERVICE_CONFIRMED_READ_PROP_MULTIPLE, handler_read_property_multiple);
- apdu_set_confirmed_handler(
- SERVICE_CONFIRMED_WRITE_PROPERTY, handler_write_property);
- /* configure the cyclic timers */
- mstimer_set(&BACnet_Task_Timer, 1000UL);
- mstimer_set(&BACnet_TSM_Timer, 50UL);
- mstimer_set(&BACnet_Address_Timer, 60UL*1000UL);
- mstimer_set(&BACnet_Object_Timer, 100UL);
- }
- int main(int argc, char *argv[])
- {
- BACNET_ADDRESS src = { 0 };
- uint16_t pdu_len = 0;
- unsigned timeout = 1;
- uint32_t elapsed_milliseconds = 0;
- uint32_t elapsed_seconds = 0;
- const char *filename = NULL;
- filename = filename_remove_path(argv[0]);
- /* allow the device ID to be set */
- if (argc > 1) {
- Device_Set_Object_Instance_Number(strtol(argv[1], NULL, 0));
- }
- printf("BACnet Server Demo\n"
- "BACnet Stack Version %s\n"
- "BACnet Device ID: %u\n"
- "Max APDU: %d\n",
- BACNET_VERSION_TEXT, Device_Object_Instance_Number(), MAX_APDU);
- address_init();
- Init_Service_Handlers();
- dlenv_init();
- atexit(datalink_cleanup);
- Send_I_Am(&Handler_Transmit_Buffer[0]);
- /* loop forever */
- for (;;) {
- pdu_len = datalink_receive(&src, &Rx_Buf[0], MAX_MPDU, timeout);
- if (pdu_len) {
- npdu_handler(&src, &Rx_Buf[0], pdu_len);
- }
- if (mstimer_expired(&BACnet_Task_Timer)) {
- mstimer_reset(&BACnet_Task_Timer);
- elapsed_milliseconds = mstimer_interval(&BACnet_Task_Timer);
- elapsed_seconds = elapsed_milliseconds/1000;
- dcc_timer_seconds(elapsed_seconds);
- datalink_maintenance_timer(elapsed_seconds);
- dlenv_maintenance_timer(elapsed_seconds);
- }
- if (mstimer_expired(&BACnet_TSM_Timer)) {
- mstimer_reset(&BACnet_TSM_Timer);
- elapsed_milliseconds = mstimer_interval(&BACnet_TSM_Timer);
- tsm_timer_milliseconds(elapsed_milliseconds);
- }
- if (mstimer_expired(&BACnet_Address_Timer)) {
- mstimer_reset(&BACnet_Address_Timer);
- elapsed_milliseconds = mstimer_interval(&BACnet_Address_Timer);
- elapsed_seconds = elapsed_milliseconds/1000;
- address_cache_timer(elapsed_seconds);
- }
- if (mstimer_expired(&BACnet_Object_Timer)) {
- mstimer_reset(&BACnet_Object_Timer);
- elapsed_milliseconds = mstimer_interval(&BACnet_Object_Timer);
- Device_Timer(elapsed_milliseconds);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement