Added end-of-blink callback for warn-off and warn-relinquish lighting commands (#1214)
* Added Blink.Callback and Blink.Priority to support end-of-blink actions for WARN_OFF/WARN_RELINQUISH. The Blink.Callback is invoked when a blink sequence ends or when a new command interrupts a WARN_OFF/WARN_RELINQUISH in progress. * Added Lighting Output (LO) WARN_OFF/WARN_RELINQUISH post-egress priority array handling using the Blink.Callback
This commit is contained in:
@@ -61,6 +61,25 @@ static bool is_float_equal(float x1, float x2)
|
||||
return fabs(x1 - x2) < 0.001;
|
||||
}
|
||||
|
||||
static uint32_t Test_Blink_End_Key;
|
||||
static BACNET_LIGHTING_OPERATION Test_Blink_End_Operation;
|
||||
static uint8_t Test_Blink_End_Priority;
|
||||
|
||||
/**
|
||||
* @brief Callback that manipulates the value at the specified priority slot
|
||||
after a delay of Egress_Time seconds.
|
||||
* @param object_instance object-instance number of the object
|
||||
* @param operation BACnet lighting operation
|
||||
* @param priority BACnet priority array value 1..16
|
||||
*/
|
||||
static void test_blink_end(
|
||||
uint32_t key, BACNET_LIGHTING_OPERATION operation, uint8_t priority)
|
||||
{
|
||||
Test_Blink_End_Key = key;
|
||||
Test_Blink_End_Operation = operation;
|
||||
Test_Blink_End_Priority = priority;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief test dimmer blink handler
|
||||
* @param data - dimmer data
|
||||
@@ -72,64 +91,83 @@ static void test_lighting_command_blink_unit(BACNET_LIGHTING_COMMAND_DATA *data)
|
||||
uint16_t milliseconds = 10;
|
||||
uint32_t duration = 0;
|
||||
BACNET_LIGHTING_COMMAND_WARN_DATA *blink = &data->Blink;
|
||||
BACNET_LIGHTING_OPERATION operation[] = { BACNET_LIGHTS_WARN,
|
||||
BACNET_LIGHTS_WARN_OFF,
|
||||
BACNET_LIGHTS_WARN_RELINQUISH };
|
||||
unsigned i;
|
||||
|
||||
lighting_command_fade_to(data, data->Max_Actual_Value, 0);
|
||||
lighting_command_timer(data, milliseconds);
|
||||
zassert_true(data->In_Progress == BACNET_LIGHTING_IDLE, NULL);
|
||||
zassert_true(is_float_equal(Tracking_Value, data->Max_Actual_Value), NULL);
|
||||
if (blink->Duration == 0) {
|
||||
/* immediate */
|
||||
lighting_command_blink_warn(data, BACNET_LIGHTS_WARN, blink);
|
||||
lighting_command_timer(data, milliseconds);
|
||||
zassert_true(data->In_Progress == BACNET_LIGHTING_IDLE, NULL);
|
||||
zassert_true(is_float_equal(Tracking_Value, blink->End_Value), NULL);
|
||||
} else if (blink->Interval == 0) {
|
||||
/* no blink, just egress timing */
|
||||
lighting_command_blink_warn(data, BACNET_LIGHTS_WARN, blink);
|
||||
lighting_command_timer(data, milliseconds);
|
||||
zassert_true(data->In_Progress == BACNET_LIGHTING_OTHER, NULL);
|
||||
zassert_true(is_float_equal(Tracking_Value, blink->On_Value), NULL);
|
||||
milliseconds = blink->Duration;
|
||||
lighting_command_blink_warn(data, BACNET_LIGHTS_WARN, blink);
|
||||
lighting_command_timer(data, milliseconds);
|
||||
zassert_true(data->In_Progress == BACNET_LIGHTING_IDLE, NULL);
|
||||
zassert_true(is_float_equal(Tracking_Value, blink->End_Value), NULL);
|
||||
} else {
|
||||
/* blinking and egress timing */
|
||||
if ((blink->Count > 0) && (blink->Count < UINT16_MAX)) {
|
||||
duration = blink->Count * blink->Interval * 2UL;
|
||||
if (duration > blink->Duration) {
|
||||
duration = blink->Duration;
|
||||
}
|
||||
} else {
|
||||
duration = blink->Duration;
|
||||
}
|
||||
milliseconds = blink->Interval;
|
||||
do {
|
||||
lighting_command_blink_warn(data, BACNET_LIGHTS_WARN, blink);
|
||||
for (i = 0; i < ARRAY_SIZE(operation); i++) {
|
||||
/* blink warn - common */
|
||||
data->Blink.Callback = test_blink_end;
|
||||
data->Blink.Priority = 8;
|
||||
Test_Blink_End_Priority = 0;
|
||||
/* special cases */
|
||||
if (blink->Duration == 0) {
|
||||
/* immediate */
|
||||
lighting_command_blink_warn(data, operation[i], blink);
|
||||
lighting_command_timer(data, milliseconds);
|
||||
if (blink->Duration) {
|
||||
zassert_true(
|
||||
data->In_Progress == BACNET_LIGHTING_OTHER,
|
||||
"In_Progress=%d", data->In_Progress);
|
||||
if (data->Blink.State) {
|
||||
zassert_true(
|
||||
is_float_equal(Tracking_Value, blink->Off_Value),
|
||||
"Tracking_Value=%f", Tracking_Value);
|
||||
} else {
|
||||
zassert_true(
|
||||
is_float_equal(Tracking_Value, blink->On_Value),
|
||||
"Tracking_Value=%f", Tracking_Value);
|
||||
zassert_true(data->In_Progress == BACNET_LIGHTING_IDLE, NULL);
|
||||
zassert_true(
|
||||
is_float_equal(Tracking_Value, blink->End_Value), NULL);
|
||||
} else if (blink->Interval == 0) {
|
||||
/* no blink, just egress timing */
|
||||
lighting_command_blink_warn(data, operation[i], blink);
|
||||
lighting_command_timer(data, milliseconds);
|
||||
zassert_true(data->In_Progress == BACNET_LIGHTING_OTHER, NULL);
|
||||
zassert_true(is_float_equal(Tracking_Value, blink->On_Value), NULL);
|
||||
milliseconds = blink->Duration;
|
||||
lighting_command_blink_warn(data, operation[i], blink);
|
||||
lighting_command_timer(data, milliseconds);
|
||||
zassert_true(data->In_Progress == BACNET_LIGHTING_IDLE, NULL);
|
||||
zassert_true(
|
||||
is_float_equal(Tracking_Value, blink->End_Value), NULL);
|
||||
} else {
|
||||
/* blinking and egress timing */
|
||||
if ((blink->Count > 0) && (blink->Count < UINT16_MAX)) {
|
||||
duration = blink->Count * blink->Interval * 2UL;
|
||||
if (duration > blink->Duration) {
|
||||
duration = blink->Duration;
|
||||
}
|
||||
} else {
|
||||
zassert_true(
|
||||
data->In_Progress == BACNET_LIGHTING_IDLE, "In_Progress=%d",
|
||||
data->In_Progress);
|
||||
zassert_true(
|
||||
is_float_equal(Tracking_Value, blink->End_Value),
|
||||
"Tracking_Value=%f", Tracking_Value);
|
||||
duration = blink->Duration;
|
||||
}
|
||||
} while (blink->Duration);
|
||||
milliseconds = blink->Interval;
|
||||
do {
|
||||
lighting_command_blink_warn(data, operation[i], blink);
|
||||
lighting_command_timer(data, milliseconds);
|
||||
if (blink->Duration) {
|
||||
zassert_true(
|
||||
data->In_Progress == BACNET_LIGHTING_OTHER,
|
||||
"In_Progress=%d", data->In_Progress);
|
||||
if (data->Blink.State) {
|
||||
zassert_true(
|
||||
is_float_equal(Tracking_Value, blink->Off_Value),
|
||||
"Tracking_Value=%f", Tracking_Value);
|
||||
} else {
|
||||
zassert_true(
|
||||
is_float_equal(Tracking_Value, blink->On_Value),
|
||||
"Tracking_Value=%f", Tracking_Value);
|
||||
}
|
||||
} else {
|
||||
zassert_true(
|
||||
data->In_Progress == BACNET_LIGHTING_IDLE,
|
||||
"In_Progress=%d", data->In_Progress);
|
||||
zassert_true(
|
||||
is_float_equal(Tracking_Value, blink->End_Value),
|
||||
"Tracking_Value=%f", Tracking_Value);
|
||||
}
|
||||
} while (blink->Duration);
|
||||
}
|
||||
if (operation[i] != BACNET_LIGHTS_WARN) {
|
||||
/* callback was called */
|
||||
zassert_equal(Test_Blink_End_Priority, blink->Priority, NULL);
|
||||
zassert_equal(Test_Blink_End_Operation, operation[i], NULL);
|
||||
zassert_equal(Test_Blink_End_Key, data->Key, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user