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
+77 -3
View File
@@ -37,6 +37,7 @@
#include "bacnet/calendar_entry.h"
#include "bacnet/special_event.h"
#include "bacnet/channel_value.h"
#include "bacnet/timer_value.h"
#include "bacnet/basic/sys/platform.h"
#if defined(BACAPP_SCALE)
@@ -528,6 +529,18 @@ int bacapp_encode_application_data(
apdu, &value->type.Channel_Value);
break;
#endif
#if defined(BACAPP_TIMER_VALUE)
case BACNET_APPLICATION_TAG_TIMER_VALUE:
/* BACnetTimerStateChangeValue */
apdu_len = bacnet_timer_value_type_encode(
apdu, &value->type.Timer_Value);
break;
#endif
#if defined(BACAPP_NO_VALUE)
case BACNET_APPLICATION_TAG_NO_VALUE:
apdu_len = bacnet_timer_value_no_value_encode(apdu);
break;
#endif
#if defined(BACAPP_LOG_RECORD)
case BACNET_APPLICATION_TAG_LOG_RECORD:
/* BACnetLogRecord */
@@ -1347,7 +1360,8 @@ int bacapp_known_property_tag(
case PROP_SC_PRIMARY_HUB_CONNECTION_STATUS:
case PROP_SC_FAILOVER_HUB_CONNECTION_STATUS:
return BACNET_APPLICATION_TAG_SC_HUB_CONNECTION_STATUS;
case PROP_STATE_CHANGE_VALUES:
return BACNET_APPLICATION_TAG_TIMER_VALUE;
default:
return -1;
}
@@ -1660,6 +1674,13 @@ int bacapp_decode_application_tag_value(
apdu, apdu_size, &value->type.Channel_Value);
break;
#endif
#if defined(BACAPP_TIMER_VALUE)
case BACNET_APPLICATION_TAG_TIMER_VALUE:
/* BACnetTimerStateChangeValue */
apdu_len = bacnet_timer_value_decode(
apdu, apdu_size, &value->type.Timer_Value);
break;
#endif
#if defined(BACAPP_LOG_RECORD)
case BACNET_APPLICATION_TAG_LOG_RECORD:
/* BACnetLogRecord */
@@ -2440,6 +2461,22 @@ static int bacapp_snprintf_enumerated(
ret_val = bacapp_snprintf(
str, str_len, "%s", bactext_protocol_level_name(value));
break;
case PROP_EVENT_TYPE:
ret_val = bacapp_snprintf(
str, str_len, "%s", bactext_event_type_name(value));
break;
case PROP_NOTIFY_TYPE:
ret_val = bacapp_snprintf(
str, str_len, "%s", bactext_notify_type_name(value));
break;
case PROP_TIMER_STATE:
ret_val = bacapp_snprintf(
str, str_len, "%s", bactext_timer_state_name(value));
break;
case PROP_LAST_STATE_CHANGE:
ret_val = bacapp_snprintf(
str, str_len, "%s", bactext_timer_transition_name(value));
break;
default:
ret_val =
bacapp_snprintf(str, str_len, "%lu", (unsigned long)value);
@@ -3981,6 +4018,17 @@ int bacapp_snprintf_value(
str, str_len, &value->type.Channel_Value);
break;
#endif
#if defined(BACAPP_TIMER_VALUE)
case BACNET_APPLICATION_TAG_TIMER_VALUE:
ret_val = bacnet_timer_value_to_ascii(
&value->type.Timer_Value, str, str_len);
break;
#endif
#if defined(BACAPP_NO_VALUE)
case BACNET_APPLICATION_TAG_NO_VALUE:
ret_val = bacnet_timer_value_no_value_to_ascii(str, str_len);
break;
#endif
#if defined(BACAPP_LOG_RECORD)
case BACNET_APPLICATION_TAG_LOG_RECORD:
ret_val = bacapp_snprintf_log_record(
@@ -4762,15 +4810,28 @@ bool bacapp_parse_application_data(
#endif
#if defined(BACAPP_ACCESS_RULE)
case BACNET_APPLICATION_TAG_ACCESS_RULE:
bacnet_access_rule_from_ascii(&value->type.Access_Rule, argv);
status = bacnet_access_rule_from_ascii(
&value->type.Access_Rule, argv);
break;
#endif
#if defined(BACAPP_CHANNEL_VALUE)
case BACNET_APPLICATION_TAG_CHANNEL_VALUE:
bacnet_channel_value_from_ascii(
status = bacnet_channel_value_from_ascii(
&value->type.Channel_Value, argv);
break;
#endif
#if defined(BACAPP_TIMER_VALUE)
case BACNET_APPLICATION_TAG_TIMER_VALUE:
status = bacnet_timer_value_from_ascii(
&value->type.Timer_Value, argv);
break;
#endif
#if defined(BACAPP_NO_VALUE)
case BACNET_APPLICATION_TAG_NO_VALUE:
status =
bacnet_timer_value_no_value_from_ascii(&value->tag, argv);
break;
#endif
#if defined(BACAPP_LOG_RECORD)
case BACNET_APPLICATION_TAG_LOG_RECORD:
status = bacnet_log_record_datum_from_ascii(
@@ -5484,6 +5545,19 @@ bool bacapp_same_value(
&test_value->type.Channel_Value);
break;
#endif
#if defined(BACAPP_TIMER_VALUE)
case BACNET_APPLICATION_TAG_TIMER_VALUE:
status = bacnet_timer_value_same(
&value->type.Timer_Value, &test_value->type.Timer_Value);
break;
#endif
#if defined(BACAPP_NO_VALUE)
case BACNET_APPLICATION_TAG_NO_VALUE:
if (value->tag == test_value->tag) {
status = true;
}
break;
#endif
#if defined(BACAPP_LOG_RECORD)
case BACNET_APPLICATION_TAG_LOG_RECORD:
status = bacnet_log_record_same(