Added linked list of lighting-command notification callbacks, (#893)

This commit is contained in:
Steve Karg
2025-01-21 14:30:38 -06:00
committed by GitHub
parent cfe257fe69
commit 44c2bccdeb
4 changed files with 69 additions and 22 deletions
+1 -1
View File
@@ -2394,7 +2394,7 @@ uint32_t Lighting_Output_Create(uint32_t object_instance)
pObject->Physical_Value = 0.0f;
lighting_command_init(&pObject->Lighting_Command);
pObject->Lighting_Command.Key = object_instance;
pObject->Lighting_Command.Tracking_Value_Callback =
pObject->Lighting_Command.Notification_Head.callback =
Lighting_Output_Tracking_Value_Callback;
pObject->Last_Lighting_Command.operation = BACNET_LIGHTS_NONE;
pObject->Last_Lighting_Command.use_target_level = false;
+48 -10
View File
@@ -15,6 +15,50 @@
/* me! */
#include "lighting_command.h"
/**
* @brief call the lighting command tracking value callbacks
* @param data - dimmer data
* @param old_value - value prior to write
* @param value - value of the write
*/
static void lighting_command_tracking_value_handler(
struct bacnet_lighting_command_data *data, float old_value, float value)
{
struct lighting_command_notification *head;
head = &data->Notification_Head;
do {
if (head->callback) {
head->callback(data->Key, old_value, value);
}
head = head->next;
} while (head);
}
/**
* @brief Add a Lighting Command notification callback
* @param cb - notification callback to be added
*/
void lighting_command_notification_add(
struct bacnet_lighting_command_data *data,
struct lighting_command_notification *notification)
{
struct lighting_command_notification *head;
head = &data->Notification_Head;
do {
if (head->next == notification) {
/* already here! */
break;
} else if (!head->next) {
/* first available free node */
head->next = notification;
break;
}
head = head->next;
} while (head);
}
/**
* @brief Callback for tracking value updates
* @param data - dimmer data
@@ -24,7 +68,6 @@
static void lighting_command_tracking_value_notify(
struct bacnet_lighting_command_data *data, float old_value, float value)
{
if (data->Tracking_Value_Callback) {
if (!data->Out_Of_Service) {
/* clamp value within trim values, if non-zero */
if (isless(value, 1.0f)) {
@@ -35,16 +78,10 @@ static void lighting_command_tracking_value_notify(
} else if (isless(value, data->Low_Trim_Value)) {
value = data->Low_Trim_Value;
}
data->Tracking_Value_Callback(data->Key, old_value, value);
lighting_command_tracking_value_handler(data, old_value, value);
} else {
debug_printf(
"Lighting-Command[%lu]-Out-of-Service\n",
(unsigned long)data->Key);
}
} else {
debug_printf(
"Lighting-Command[%lu]-Tracking-Value=%f\n",
(unsigned long)data->Key, (double)value);
"Lighting-Command[%lu]-Out-of-Service\n", (unsigned long)data->Key);
}
}
@@ -643,5 +680,6 @@ void lighting_command_init(struct bacnet_lighting_command_data *data)
data->Blink.Interval = 0;
data->Blink.Duration = 0;
data->Blink.State = false;
data->Tracking_Value_Callback = NULL;
data->Notification_Head.next = NULL;
data->Notification_Head.callback = NULL;
}
+10 -1
View File
@@ -19,6 +19,11 @@
*/
typedef void (*lighting_command_tracking_value_callback)(
uint32_t key, float old_value, float value);
struct lighting_command_notification;
struct lighting_command_notification {
struct lighting_command_notification *next;
lighting_command_tracking_value_callback callback;
};
typedef struct bacnet_lighting_command_warn_data {
/* warn */
@@ -51,7 +56,7 @@ typedef struct bacnet_lighting_command_data {
bool Out_Of_Service : 1;
/* key used with callback */
uint32_t Key;
lighting_command_tracking_value_callback Tracking_Value_Callback;
struct lighting_command_notification Notification_Head;
} BACNET_LIGHTING_COMMAND_DATA;
#ifdef __cplusplus
@@ -83,6 +88,10 @@ BACNET_STACK_EXPORT
void lighting_command_none(struct bacnet_lighting_command_data *data);
BACNET_STACK_EXPORT
void lighting_command_init(struct bacnet_lighting_command_data *data);
BACNET_STACK_EXPORT
void lighting_command_notification_add(
struct bacnet_lighting_command_data *data,
struct lighting_command_notification *notification);
#ifdef __cplusplus
}
@@ -133,7 +133,7 @@ static void test_lighting_command_command_unit(void)
float target_step = 1.0f;
lighting_command_init(&data);
data.Tracking_Value_Callback = dimmer_tracking_value;
data.Notification_Head.callback = dimmer_tracking_value;
lighting_command_stop(&data);
lighting_command_timer(&data, milliseconds);
zassert_true(data.In_Progress == BACNET_LIGHTING_IDLE, NULL);