diff --git a/zephyr/include/bacnet_basic/bacnet_basic.h b/zephyr/include/bacnet_basic/bacnet_basic.h index 7f332161..032addd6 100644 --- a/zephyr/include/bacnet_basic/bacnet_basic.h +++ b/zephyr/include/bacnet_basic/bacnet_basic.h @@ -10,12 +10,20 @@ #include +typedef void (*bacnet_basic_callback)(void *context); + #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ void bacnet_basic_init(void); +void bacnet_basic_init_callback_set(bacnet_basic_callback callback, + void *context); + void bacnet_basic_task(void); +void bacnet_basic_task_callback_set(bacnet_basic_callback callback, + void *context); + unsigned long bacnet_basic_uptime_seconds(void); unsigned long bacnet_basic_packet_count(void); diff --git a/zephyr/samples/profiles/b-ss/src/main.c b/zephyr/samples/profiles/b-ss/src/main.c index 8ed5e8ec..ea74ebf9 100644 --- a/zephyr/samples/profiles/b-ss/src/main.c +++ b/zephyr/samples/profiles/b-ss/src/main.c @@ -24,20 +24,40 @@ #include LOG_MODULE_DECLARE(bacnet, CONFIG_BACNETSTACK_LOG_LEVEL); -int main(void) +/** + * @brief BACnet Project Initialization Handler + * @param context [in] The context to pass to the callback function + * @note This is called from the BACnet task + */ +static void BACnet_Smart_Sensor_Init_Handler(void *context) { - LOG_INF("\n*** BACnet Profile B-SS Sample ***\n"); - LOG_INF("BACnet Stack Version " BACNET_VERSION_TEXT); - + (void)context; + LOG_INF("BACnet Stack Initialized"); /* initialize objects for this basic sample */ Device_Init(NULL); Device_Set_Object_Instance_Number(260123); Analog_Input_Create(1); Analog_Input_Name_Set(1, "Sensor"); - LOG_INF("BACnet Device ID: %u", Device_Object_Instance_Number()); - LOG_INF("BACnet Device Max APDU: %d", MAX_APDU); +} +/** + * @brief BACnet Project Task Handler + * @param context [in] The context to pass to the callback function + * @note This is called from the BACnet task + */ +static void BACnet_Smart_Sensor_Task_Handler(void *context) +{ + +} + +int main(void) +{ + LOG_INF("\n*** BACnet Profile B-SS Sample ***\n"); + LOG_INF("BACnet Stack Version " BACNET_VERSION_TEXT); + LOG_INF("BACnet Stack Max APDU: %d", MAX_APDU); + bacnet_basic_init_callback_set(BACnet_Smart_Sensor_Init_Handler, NULL); + bacnet_basic_task_callback_set(BACnet_Smart_Sensor_Task_Handler, NULL); /* work happens in server module */ return 0; diff --git a/zephyr/subsys/bacnet_basic/bacnet_basic.c b/zephyr/subsys/bacnet_basic/bacnet_basic.c index b28f72a4..93ea299a 100644 --- a/zephyr/subsys/bacnet_basic/bacnet_basic.c +++ b/zephyr/subsys/bacnet_basic/bacnet_basic.c @@ -38,6 +38,55 @@ static unsigned long BACnet_Uptime_Seconds; static unsigned long BACnet_Packet_Count; /* local Device ID to track changes */ static uint32_t Device_ID = 0xFFFFFFFF; +/* callbacks for custom features in BACnet thread */ +static bacnet_basic_callback BACnet_Init_Callback; +static void *BACnet_Init_Context; +static bacnet_basic_callback BACnet_Task_Callback; +static void *BACnet_Task_Context; + +/** + * @brief Set the callback for the BACnet initialization + * @param callback [in] The callback function called after initialization + * @param context [in] The context to pass to the callback function + */ +void bacnet_basic_init_callback_set(bacnet_basic_callback callback, + void *context) +{ + BACnet_Init_Callback = callback; + BACnet_Init_Context = context; +} + +/** + * @brief BACnet Task Callback Handler + */ +static void bacnet_init_callback_handler(void) +{ + if (BACnet_Init_Callback) { + BACnet_Init_Callback(BACnet_Init_Context); + } +} + +/** + * @brief Set the callback for the BACnet Task + * @param callback [in] The callback function to call during the task + * @param context [in] The context to pass to the callback function + */ +void bacnet_basic_task_callback_set(bacnet_basic_callback callback, + void *context) +{ + BACnet_Task_Callback = callback; + BACnet_Task_Context = context; +} + +/** + * @brief BACnet Task Callback Handler + */ +static void bacnet_task_callback_handler(void) +{ + if (BACnet_Task_Callback) { + BACnet_Task_Callback(BACnet_Task_Context); + } +} /** * @brief Get the BACnet device uptime in seconds @@ -88,6 +137,8 @@ void bacnet_basic_init(void) mstimer_set(&BACnet_Task_Timer, 1000L); /* start the timer for more time sensitive object specific cyclic tasks */ mstimer_set(&BACnet_Object_Timer, 100UL); + /* initialize user data in this thread */ + bacnet_init_callback_handler(); } /* local buffer for incoming PDUs to process */ @@ -139,4 +190,6 @@ void bacnet_basic_task(void) npdu_handler(&src, &PDUBuffer[0], pdu_len); BACnet_Packet_Count++; } + /* call user task in this thread */ + bacnet_task_callback_handler(); }