Advertisement
parthasarathym77

Untitled

Feb 12th, 2025
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.12 KB | Source Code | 0 0
  1. /**
  2.  * @file
  3.  * @brief BACnet server with minimal objects
  4.  */
  5.  
  6. #include <stddef.h>
  7. #include <stdint.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <signal.h>
  11. #include <string.h>
  12. /* BACnet Stack defines - first */
  13. #include "bacnet/bacdef.h"
  14. /* BACnet Stack API */
  15. #include "bacnet/bacdcode.h"
  16. #include "bacnet/bacerror.h"
  17. #include "bacnet/apdu.h"
  18. #include "bacnet/dcc.h"
  19. #include "bacnet/iam.h"
  20. #include "bacnet/npdu.h"
  21. #include "bacnet/getevent.h"
  22. #include "bacnet/version.h"
  23. #include "bacnet/basic/services.h"
  24. /* basic objects */
  25. #include "bacnet/basic/object/device.h"
  26. #include "bacnet/basic/object/ai.h"
  27. #include "bacnet/basic/object/netport.h"
  28. /* basic BACnet stuff */
  29. #include "bacnet/basic/binding/address.h"
  30. #include "bacnet/basic/sys/filename.h"
  31. #include "bacnet/basic/sys/mstimer.h"
  32. #include "bacnet/basic/tsm/tsm.h"
  33. #include "bacnet/datalink/datalink.h"
  34. #include "bacnet/datalink/dlenv.h"
  35.  
  36. /* Our custom object functions table */
  37. static object_functions_t My_Object_Table[] = {
  38.     {OBJECT_DEVICE, NULL /* Init - don't init Device or it will recourse! */,
  39.         Device_Count, Device_Index_To_Instance,
  40.         Device_Valid_Object_Instance_Number, Device_Object_Name,
  41.         Device_Read_Property_Local, Device_Write_Property_Local,
  42.         Device_Property_Lists, DeviceGetRRInfo, NULL /* Iterator */,
  43.         NULL /* Value_Lists */, NULL /* COV */, NULL /* COV Clear */,
  44.         NULL /* Intrinsic Reporting */, NULL /* Add_List_Element */,
  45.         NULL /* Remove_List_Element */, NULL /* Create */, NULL /* Delete */,
  46.         NULL /* Timer */},
  47.     {OBJECT_ANALOG_INPUT, Analog_Input_Init, Analog_Input_Count,
  48.         Analog_Input_Index_To_Instance, Analog_Input_Valid_Instance,
  49.         Analog_Input_Object_Name, Analog_Input_Read_Property,
  50.         Analog_Input_Write_Property, Analog_Input_Property_Lists,
  51.         NULL /* ReadRangeInfo */, NULL /* Iterator */, NULL /* Value_Lists */,
  52.         NULL /* COV */, NULL /* COV Clear */, NULL /* Intrinsic Reporting */,
  53.         NULL /* Add_List_Element */, NULL /* Remove_List_Element */,
  54.         NULL /* Create */, NULL /* Delete */, NULL /* Timer */},
  55.     {OBJECT_NETWORK_PORT, Network_Port_Init, Network_Port_Count,
  56.         Network_Port_Index_To_Instance, Network_Port_Valid_Instance,
  57.         Network_Port_Object_Name, Network_Port_Read_Property,
  58.         Network_Port_Write_Property, Network_Port_Property_Lists,
  59.         NULL /* ReadRangeInfo */, NULL /* Iterator */, NULL /* Value_Lists */,
  60.         NULL /* COV */, NULL /* COV Clear */, NULL /* Intrinsic Reporting */,
  61.         NULL /* Add_List_Element */, NULL /* Remove_List_Element */,
  62.         NULL /* Create */, NULL /* Delete */, NULL /* Timer */},
  63.     {MAX_BACNET_OBJECT_TYPE, NULL /* Init */, NULL /* Count */,
  64.         NULL /* Index_To_Instance */, NULL /* Valid_Instance */,
  65.         NULL /* Object_Name */, NULL /* Read_Property */,
  66.         NULL /* Write_Property */, NULL /* Property_Lists */,
  67.         NULL /* ReadRangeInfo */, NULL /* Iterator */, NULL /* Value_Lists */,
  68.         NULL /* COV */, NULL /* COV Clear */, NULL /* Intrinsic Reporting */,
  69.         NULL /* Add_List_Element */, NULL /* Remove_List_Element */,
  70.         NULL /* Create */, NULL /* Delete */, NULL /* Timer */}
  71. };
  72.  
  73. /* Timers for various BACnet timeouts */
  74. static struct mstimer BACnet_Task_Timer;
  75. static struct mstimer BACnet_TSM_Timer;
  76. static struct mstimer BACnet_Address_Timer;
  77. static struct mstimer BACnet_Object_Timer;
  78. static uint8_t Rx_Buf[MAX_MPDU] = { 0 };
  79.  
  80. /** Initialize the handlers we will utilize.
  81.  * @note Doesn't initialize any objects yet.
  82.  */
  83. static void Init_Service_Handlers(void)
  84. {
  85.     Device_Init(My_Object_Table);
  86.  
  87.     /* Create single analog input instance */
  88.     uint32_t ai_instance = Analog_Input_Create(1);
  89.     Analog_Input_Name_Set(ai_instance, "Analog-Value-1");
  90.     Analog_Input_Description_Set(ai_instance, "Example analog value");
  91.     Analog_Input_Units_Set(ai_instance, UNITS_PERCENT);
  92.  
  93.     /* we need to handle who-is to support dynamic device binding */
  94.     apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_WHO_IS, handler_who_is);
  95.     apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_WHO_HAS, handler_who_has);
  96.  
  97.     /* set the handler for all the services we don't implement */
  98.     apdu_set_unrecognized_service_handler_handler(handler_unrecognized_service);
  99.    
  100.     /* Set the handlers for any confirmed services that we support. */
  101.     apdu_set_confirmed_handler(
  102.         SERVICE_CONFIRMED_READ_PROPERTY, handler_read_property);
  103.     apdu_set_confirmed_handler(
  104.         SERVICE_CONFIRMED_READ_PROP_MULTIPLE, handler_read_property_multiple);
  105.     apdu_set_confirmed_handler(
  106.         SERVICE_CONFIRMED_WRITE_PROPERTY, handler_write_property);
  107.    
  108.     /* configure the cyclic timers */
  109.     mstimer_set(&BACnet_Task_Timer, 1000UL);
  110.     mstimer_set(&BACnet_TSM_Timer, 50UL);
  111.     mstimer_set(&BACnet_Address_Timer, 60UL*1000UL);
  112.     mstimer_set(&BACnet_Object_Timer, 100UL);
  113. }
  114.  
  115. int main(int argc, char *argv[])
  116. {
  117.     BACNET_ADDRESS src = { 0 };
  118.     uint16_t pdu_len = 0;
  119.     unsigned timeout = 1;
  120.     uint32_t elapsed_milliseconds = 0;
  121.     uint32_t elapsed_seconds = 0;
  122.     const char *filename = NULL;
  123.  
  124.     filename = filename_remove_path(argv[0]);
  125.    
  126.     /* allow the device ID to be set */
  127.     if (argc > 1) {
  128.         Device_Set_Object_Instance_Number(strtol(argv[1], NULL, 0));
  129.     }
  130.  
  131.  
  132.  
  133.     printf("BACnet Server Demo\n"
  134.            "BACnet Stack Version %s\n"
  135.            "BACnet Device ID: %u\n"
  136.            "Max APDU: %d\n",
  137.         BACNET_VERSION_TEXT, Device_Object_Instance_Number(), MAX_APDU);
  138.    
  139.     address_init();
  140.     Init_Service_Handlers();
  141.    
  142.     dlenv_init();
  143.     atexit(datalink_cleanup);
  144.     Send_I_Am(&Handler_Transmit_Buffer[0]);
  145.    
  146.     /* loop forever */
  147.     for (;;) {
  148.         pdu_len = datalink_receive(&src, &Rx_Buf[0], MAX_MPDU, timeout);
  149.  
  150.         if (pdu_len) {
  151.             npdu_handler(&src, &Rx_Buf[0], pdu_len);
  152.         }
  153.        
  154.         if (mstimer_expired(&BACnet_Task_Timer)) {
  155.             mstimer_reset(&BACnet_Task_Timer);
  156.             elapsed_milliseconds = mstimer_interval(&BACnet_Task_Timer);
  157.             elapsed_seconds = elapsed_milliseconds/1000;
  158.             dcc_timer_seconds(elapsed_seconds);
  159.             datalink_maintenance_timer(elapsed_seconds);
  160.             dlenv_maintenance_timer(elapsed_seconds);
  161.         }
  162.        
  163.         if (mstimer_expired(&BACnet_TSM_Timer)) {
  164.             mstimer_reset(&BACnet_TSM_Timer);
  165.             elapsed_milliseconds = mstimer_interval(&BACnet_TSM_Timer);
  166.             tsm_timer_milliseconds(elapsed_milliseconds);
  167.         }
  168.        
  169.         if (mstimer_expired(&BACnet_Address_Timer)) {
  170.             mstimer_reset(&BACnet_Address_Timer);
  171.             elapsed_milliseconds = mstimer_interval(&BACnet_Address_Timer);
  172.             elapsed_seconds = elapsed_milliseconds/1000;
  173.             address_cache_timer(elapsed_seconds);
  174.         }
  175.        
  176.         if (mstimer_expired(&BACnet_Object_Timer)) {
  177.             mstimer_reset(&BACnet_Object_Timer);
  178.             elapsed_milliseconds = mstimer_interval(&BACnet_Object_Timer);
  179.             Device_Timer(elapsed_milliseconds);
  180.         }
  181.     }
  182.  
  183.     return 0;
  184. }
Tags: BACnet
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement