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:
+77
-3
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user