|
| 1 | +/* |
| 2 | + * Copyright (C) 2020 Legrand North America, Inc. |
| 3 | + * |
| 4 | + * SPDX-License-Identifier: MIT |
| 5 | + */ |
| 6 | + |
| 7 | +#include <zephyr/kernel.h> |
| 8 | +#include <zephyr/random/random.h> |
| 9 | +#include <stdint.h> |
| 10 | +#include <stdlib.h> |
| 11 | + |
| 12 | +/* BACnet Stack defines - first */ |
| 13 | +#include "bacnet/bacdef.h" |
| 14 | +/* BACnet Stack core API */ |
| 15 | +#include "bacnet/version.h" |
| 16 | +#include "bacnet/basic/sys/mstimer.h" |
| 17 | +/* BACnet Stack basic device API - see bacnet_basic/device.c for details */ |
| 18 | +#include "bacnet/basic/object/device.h" |
| 19 | +/* BACnet Stack basic objects enabled in prj.conf */ |
| 20 | +#include "bacnet/basic/object/ao.h" |
| 21 | +#if (BACNET_PROTOCOL_REVISION >= 17) |
| 22 | +#include "bacnet/basic/object/netport.h" |
| 23 | +#endif |
| 24 | +#include "bacnet_basic/bacnet_basic.h" |
| 25 | + |
| 26 | +/* Logging module registration is already done in ports/zephyr/main.c */ |
| 27 | +#include "bacnet_osif/bacnet_log.h" |
| 28 | +LOG_MODULE_DECLARE(bacnet, CONFIG_BACNETSTACK_LOG_LEVEL); |
| 29 | + |
| 30 | +static const uint32_t Device_Instance = 260123; |
| 31 | +static const uint32_t Actuator_Instance = 1; |
| 32 | +/* timer for Actuator Update Interval */ |
| 33 | +static struct mstimer Actuator_Update_Timer; |
| 34 | + |
| 35 | +static void BACnet_Smart_Actuator_Datalink_Init(void) |
| 36 | +{ |
| 37 | +} |
| 38 | + |
| 39 | +/** |
| 40 | + * @brief BACnet Project Initialization Handler |
| 41 | + * @param context [in] The context to pass to the callback function |
| 42 | + * @note This is called from the BACnet task |
| 43 | + */ |
| 44 | +static void BACnet_Smart_Actuator_Init_Handler(void *context) |
| 45 | +{ |
| 46 | + (void)context; |
| 47 | + LOG_INF("BACnet Stack Initialized"); |
| 48 | + BACnet_Smart_Actuator_Datalink_Init(); |
| 49 | + /* initialize objects for this basic sample */ |
| 50 | + Device_Init(NULL); |
| 51 | + Device_Set_Object_Instance_Number(Device_Instance); |
| 52 | + Analog_Output_Create(Actuator_Instance); |
| 53 | + Analog_Output_Name_Set(Actuator_Instance, "Actuator"); |
| 54 | + Analog_Output_Units_Set(Actuator_Instance, UNITS_PERCENT); |
| 55 | + Analog_Output_Min_Pres_Value_Set(Actuator_Instance, 0.0f); |
| 56 | + Analog_Output_Max_Pres_Value_Set(Actuator_Instance, 100.0f); |
| 57 | + LOG_INF("BACnet Device ID: %u", Device_Object_Instance_Number()); |
| 58 | + /* start the seconds cyclic timer */ |
| 59 | + mstimer_set(&Actuator_Update_Timer, 1000); |
| 60 | + srand(sys_rand32_get()); |
| 61 | +} |
| 62 | + |
| 63 | +/** |
| 64 | + * @brief BACnet Project Task Handler |
| 65 | + * @param context [in] The context to pass to the callback function |
| 66 | + * @note This is called from the BACnet task |
| 67 | + */ |
| 68 | +static void BACnet_Smart_Actuator_Task_Handler(void *context) |
| 69 | +{ |
| 70 | + float percent = 0.0f, change = 0.0f; |
| 71 | + |
| 72 | + (void)context; |
| 73 | + if (mstimer_expired(&Actuator_Update_Timer)) { |
| 74 | + mstimer_reset(&Actuator_Update_Timer); |
| 75 | + /* simulate an internal software program, |
| 76 | + and update the BACnet object values */ |
| 77 | + if (Analog_Output_Out_Of_Service(Actuator_Instance)) { |
| 78 | + return; |
| 79 | + } |
| 80 | + percent = Analog_Output_Present_Value(Actuator_Instance); |
| 81 | + change = -1.0f + 2.0f * ((float)rand()) / RAND_MAX; |
| 82 | + percent += change; |
| 83 | + Analog_Output_Present_Value_Set(Actuator_Instance, percent, |
| 84 | + BACNET_MAX_PRIORITY); |
| 85 | + } |
| 86 | +} |
| 87 | + |
| 88 | +int main(void) |
| 89 | +{ |
| 90 | + LOG_INF("*** BACnet Smart Actuator (B-SA) ***"); |
| 91 | + LOG_INF("BACnet Stack Version " BACNET_VERSION_TEXT); |
| 92 | + LOG_INF("BACnet Stack Max APDU: %d", MAX_APDU); |
| 93 | + bacnet_basic_init_callback_set(BACnet_Smart_Actuator_Init_Handler, |
| 94 | + NULL); |
| 95 | + bacnet_basic_task_callback_set(BACnet_Smart_Actuator_Task_Handler, |
| 96 | + NULL); |
| 97 | + /* work happens in server module */ |
| 98 | + for (;;) { |
| 99 | + k_sleep(K_MSEC(1000)); |
| 100 | + } |
| 101 | + |
| 102 | + return 0; |
| 103 | +} |
0 commit comments