Added basic timer object, internal state machine, and unit tests (#1123)

* Added basic timer object, internal state machine, and unit tests

* Added BACnetTimerStateChangeValue encode, decode, parse, print, and diff with unit tests

* Changed handler of add/remove list element to check if the property is a BACnetLIST

* Added BACnetLIST utility for handling WriteProperty to a list.

* Fixed outlier ReadProperty object handlers to return zero when the RP parameter is NULL.
This commit is contained in:
Steve Karg
2025-11-05 15:11:45 -06:00
committed by GitHub
parent 17259b37f3
commit 4dd13cf199
126 changed files with 5509 additions and 56 deletions
+48 -2
View File
@@ -177,6 +177,9 @@ INDTEXT_DATA bacnet_application_tag_names[] = {
{ BACNET_APPLICATION_TAG_SHED_LEVEL, "BACnetShedLevel" },
{ BACNET_APPLICATION_TAG_ACCESS_RULE, "BACnetAccessRule" },
{ BACNET_APPLICATION_TAG_CHANNEL_VALUE, "BACnetChannelValue" },
{ BACNET_APPLICATION_TAG_LOG_RECORD, "BACnetLogRecord" },
{ BACNET_APPLICATION_TAG_NO_VALUE, "BACnetNoValue" },
{ BACNET_APPLICATION_TAG_ABSTRACT_SYNTAX, "ABSTRACT-SYNTAX" },
{ 0, NULL }
};
@@ -225,7 +228,7 @@ INDTEXT_DATA bacnet_object_type_names[] = {
{ OBJECT_LOAD_CONTROL, "load-control" },
{ OBJECT_STRUCTURED_VIEW, "structured-view" },
{ OBJECT_ACCESS_DOOR, "access-door" },
{ OBJECT_LIGHTING_OUTPUT, "lighting-output" },
{ OBJECT_TIMER, "timer" },
{ OBJECT_ACCESS_CREDENTIAL, "access-credential" },
{ OBJECT_ACCESS_POINT, "access-point" },
{ OBJECT_ACCESS_RIGHTS, "access-rights" },
@@ -297,7 +300,7 @@ INDTEXT_DATA bacnet_object_type_names_capitalized[] = {
{ OBJECT_LOAD_CONTROL, "Load Control" },
{ OBJECT_STRUCTURED_VIEW, "Structured View" },
{ OBJECT_ACCESS_DOOR, "Access Door" },
{ OBJECT_LIGHTING_OUTPUT, "Lighting Output" },
{ OBJECT_TIMER, "Timer" },
{ OBJECT_ACCESS_CREDENTIAL, "Access Credential" },
{ OBJECT_ACCESS_POINT, "Access Point" },
{ OBJECT_ACCESS_RIGHTS, "Access Rights" },
@@ -2686,6 +2689,7 @@ const char *bactext_program_request_name(unsigned index)
}
INDTEXT_DATA bactext_program_state_names[] = {
/* BACnetProgramState enumerations */
{ PROGRAM_STATE_IDLE, "idle" },
{ PROGRAM_STATE_LOADING, "loading" },
{ PROGRAM_STATE_RUNNING, "running" },
@@ -2702,6 +2706,7 @@ const char *bactext_program_state_name(unsigned index)
}
INDTEXT_DATA bactext_program_error_names[] = {
/* BACnetProgramError enumerations */
{ PROGRAM_ERROR_NORMAL, "normal" },
{ PROGRAM_ERROR_LOAD_FAILED, "load-failed" },
{ PROGRAM_ERROR_INTERNAL, "internal" },
@@ -2722,6 +2727,39 @@ const char *bactext_program_error_name(unsigned index)
}
}
INDTEXT_DATA bactext_timer_state_names[] = {
/* BACnetTimerState enumerations */
{ TIMER_STATE_IDLE, "idle" },
{ TIMER_STATE_RUNNING, "running" },
{ TIMER_STATE_EXPIRED, "expired" },
{ 0, NULL }
};
const char *bactext_timer_state_name(unsigned index)
{
return indtext_by_index_default(
bactext_timer_state_names, index, ASHRAE_Reserved_String);
}
INDTEXT_DATA bactext_timer_transition_names[] = {
/* BACnetTimerTransition enumerations */
{ TIMER_TRANSITION_NONE, "none" },
{ TIMER_TRANSITION_IDLE_TO_RUNNING, "idle-to-running" },
{ TIMER_TRANSITION_RUNNING_TO_IDLE, "running-to-idle" },
{ TIMER_TRANSITION_RUNNING_TO_RUNNING, "running-to-running" },
{ TIMER_TRANSITION_RUNNING_TO_EXPIRED, "running-to-expired" },
{ TIMER_TRANSITION_FORCED_TO_EXPIRED, "forced-to-expired" },
{ TIMER_TRANSITION_EXPIRED_TO_IDLE, "expired-to-idle" },
{ TIMER_TRANSITION_EXPIRED_TO_RUNNING, "expired-to-running" },
{ 0, NULL }
};
const char *bactext_timer_transition_name(unsigned index)
{
return indtext_by_index_default(
bactext_timer_transition_names, index, ASHRAE_Reserved_String);
}
/**
* @brief For a given enumerated object property string,
* find the enumeration value
@@ -2861,6 +2899,14 @@ bool bactext_object_property_strtoul(
status = bactext_strtoul_index(
bacnet_notify_type_names, search_name, found_index);
break;
case PROP_TIMER_STATE:
status = bactext_strtoul_index(
bactext_timer_state_names, search_name, found_index);
break;
case PROP_LAST_STATE_CHANGE:
status = bactext_strtoul_index(
bactext_timer_transition_names, search_name, found_index);
break;
default:
status = bactext_strtoul(search_name, found_index);
break;