diff --git a/src/bacnet/bacapp.c b/src/bacnet/bacapp.c index 79e20eac..49080328 100644 --- a/src/bacnet/bacapp.c +++ b/src/bacnet/bacapp.c @@ -1220,6 +1220,7 @@ int bacapp_known_property_tag( case PROP_MANIPULATED_VARIABLE_REFERENCE: case PROP_CONTROLLED_VARIABLE_REFERENCE: case PROP_INPUT_REFERENCE: + case PROP_EVENT_ALGORITHM_INHIBIT_REF: /* Properties using BACnetObjectPropertyReference */ return BACNET_APPLICATION_TAG_OBJECT_PROPERTY_REFERENCE; @@ -2325,7 +2326,7 @@ static int bacapp_snprintf_enumerated( str, str_len, "reserved %lu", (unsigned long)value); } else { ret_val = bacapp_snprintf( - str, str_len, "proprietary %lu", (unsigned long)value); + str, str_len, "proprietary-%lu", (unsigned long)value); } break; case PROP_EVENT_STATE: @@ -2335,7 +2336,7 @@ static int bacapp_snprintf_enumerated( case PROP_UNITS: if (bactext_engineering_unit_name_proprietary((unsigned)value)) { ret_val = bacapp_snprintf( - str, str_len, "proprietary %lu", (unsigned long)value); + str, str_len, "proprietary-%lu", (unsigned long)value); } else { ret_val = bacapp_snprintf( str, str_len, "%s", bactext_engineering_unit_name(value)); @@ -2602,7 +2603,7 @@ static int bacapp_snprintf_object_id( str, str_len, "reserved %u, ", (unsigned)object_id->type); } else { slen = bacapp_snprintf( - str, str_len, "proprietary %u, ", (unsigned)object_id->type); + str, str_len, "proprietary-%u, ", (unsigned)object_id->type); } ret_val += bacapp_snprintf_shift(slen, &str, &str_len); slen = bacapp_snprintf( @@ -2870,7 +2871,6 @@ static int bacapp_snprintf_object_property_reference( str, str_len, ", %lu", (unsigned long)value->property_array_index); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); } - ret_val += bacapp_snprintf_shift(slen, &str, &str_len); ret_val += bacapp_snprintf(str, str_len, "}"); return ret_val; @@ -4031,7 +4031,20 @@ bool bacapp_print_value( #endif bacapp_snprintf_value(str, str_len + 1, object_value); if (stream) { - fprintf(stream, "%s", str); + if (object_value->object_type == OBJECT_SCHEDULE) { + switch (object_value->object_property) { + case PROP_PRESENT_VALUE: + case PROP_SCHEDULE_DEFAULT: + fprintf( + stream, "[%u] %s", object_value->value->tag, str); + break; + default: + fprintf(stream, "%s", str); + break; + } + } else { + fprintf(stream, "%s", str); + } } #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* nothing to do with stack based RAM */ diff --git a/src/bacnet/bacenum.h b/src/bacnet/bacenum.h index f2abe1f4..8bf3990d 100644 --- a/src/bacnet/bacenum.h +++ b/src/bacnet/bacenum.h @@ -533,7 +533,7 @@ typedef enum BACnetPropertyIdentifier { PROP_PROPRIETARY_RANGE_MIN = 512, PROP_PROPRIETARY_RANGE_MAX = 4194303, PROP_RESERVED_RANGE_MIN2 = 4194304, - /* enumerations 4194304-4194327 are defined in Addendum 2020cc */ + /* enumerations 4194304-4194327 are defined in Addendum 2020cc (PR 24) */ PROP_MAX_BVLC_LENGTH_ACCEPTED = 4194304, PROP_MAX_NPDU_LENGTH_ACCEPTED = 4194305, PROP_OPERATIONAL_CERTIFICATE_FILE = 4194306, @@ -558,7 +558,7 @@ typedef enum BACnetPropertyIdentifier { PROP_SC_PRIMARY_HUB_URI = 4194325, PROP_SC_MAXIMUM_RECONNECT_TIME = 4194326, PROP_SC_MINIMUM_RECONNECT_TIME = 4194327, - /* enumerations 4194328-4194332 are defined in Addendum 2020ca */ + /* enumerations 4194328-4194337 are defined in Addendum 2020ca (PR 24) */ PROP_COLOR_OVERRIDE = 4194328, PROP_COLOR_REFERENCE = 4194329, PROP_DEFAULT_COLOR = 4194330, @@ -568,15 +568,13 @@ typedef enum BACnetPropertyIdentifier { PROP_HIGH_END_TRIM = 4194335, PROP_LOW_END_TRIM = 4194336, PROP_TRIM_FADE_TIME = 4194337, - /* Addendum 135-2020bx */ - /* enumerations 4194338-4194340 are defined in Addendum 2020bx */ + /* enumerations 4194338-4194340 are defined in Addendum 2020bx (PR 27) */ PROP_DEVICE_ADDRESS_PROXY_ENABLE = 4194338, PROP_DEVICE_ADDRESS_PROXY_TABLE = 4194339, PROP_DEVICE_ADDRESS_PROXY_TIMEOUT = 4194340, - /* enumerations 4194341-4194342 are defined in Addendum 2020cj */ + /* enumerations 4194341-4194349 are defined in Addendum 2020cp (PR 30) */ PROP_DEFAULT_ON_VALUE = 4194341, PROP_LAST_ON_VALUE = 4194342, - /* enumerations 4194343-4194349 are defined in Addendum 2020cp */ PROP_AUTHORIZATION_CACHE = 4194343, PROP_AUTHORIZATION_GROUPS = 4194344, PROP_AUTHORIZATION_POLICY = 4194345, @@ -1743,6 +1741,7 @@ typedef enum BACnet_Confirmed_Service_Choice { /* Security Services */ SERVICE_CONFIRMED_AUTHENTICATE = 24, SERVICE_CONFIRMED_REQUEST_KEY = 25, + SERVICE_CONFIRMED_AUTH_REQUEST = 34, /* Services added after 1995 */ /* readRange [26] see Object Access Services */ /* lifeSafetyOperation [27] see Alarm and Event Services */ diff --git a/src/bacnet/bactext.c b/src/bacnet/bactext.c index 96c8a0b8..d23bebdd 100644 --- a/src/bacnet/bactext.c +++ b/src/bacnet/bactext.c @@ -58,37 +58,43 @@ static bool bactext_strtoul_index( } INDTEXT_DATA bacnet_confirmed_service_names[] = { - { SERVICE_CONFIRMED_ACKNOWLEDGE_ALARM, "Acknowledge-Alarm" }, - { SERVICE_CONFIRMED_COV_NOTIFICATION, "COV-Notification" }, - { SERVICE_CONFIRMED_EVENT_NOTIFICATION, "Event-Notification" }, - { SERVICE_CONFIRMED_GET_ALARM_SUMMARY, "Get-Alarm-Summary" }, - { SERVICE_CONFIRMED_GET_ENROLLMENT_SUMMARY, "Get-Enrollment-Summary" }, - { SERVICE_CONFIRMED_SUBSCRIBE_COV, "Subscribe-COV" }, - { SERVICE_CONFIRMED_ATOMIC_READ_FILE, "Atomic-Read-File" }, - { SERVICE_CONFIRMED_ATOMIC_WRITE_FILE, "Atomic-Write-File" }, - { SERVICE_CONFIRMED_ADD_LIST_ELEMENT, "Add-List-Element" }, - { SERVICE_CONFIRMED_REMOVE_LIST_ELEMENT, "Remove-List-Element" }, - { SERVICE_CONFIRMED_CREATE_OBJECT, "Create-Object" }, - { SERVICE_CONFIRMED_DELETE_OBJECT, "Delete-Object" }, - { SERVICE_CONFIRMED_READ_PROPERTY, "Read-Property" }, - { SERVICE_CONFIRMED_READ_PROP_CONDITIONAL, "Read-Property-Conditional" }, - { SERVICE_CONFIRMED_READ_PROP_MULTIPLE, "Read-Property-Multiple" }, - { SERVICE_CONFIRMED_WRITE_PROPERTY, "Write-Property" }, - { SERVICE_CONFIRMED_WRITE_PROP_MULTIPLE, "Write-Property-Multiple" }, + { SERVICE_CONFIRMED_ACKNOWLEDGE_ALARM, "AcknowledgeAlarm" }, + { SERVICE_CONFIRMED_COV_NOTIFICATION, "ConfirmedCOVNotification" }, + { SERVICE_CONFIRMED_EVENT_NOTIFICATION, "ConfirmedEventNotification" }, + { SERVICE_CONFIRMED_GET_ALARM_SUMMARY, "GetAlarmSummary" }, + { SERVICE_CONFIRMED_GET_ENROLLMENT_SUMMARY, "GetEnrollmentSummary" }, + { SERVICE_CONFIRMED_SUBSCRIBE_COV, "SubscribeCOV" }, + { SERVICE_CONFIRMED_ATOMIC_READ_FILE, "AtomicReadFile" }, + { SERVICE_CONFIRMED_ATOMIC_WRITE_FILE, "AtomicWriteFile" }, + { SERVICE_CONFIRMED_ADD_LIST_ELEMENT, "AddListElement" }, + { SERVICE_CONFIRMED_REMOVE_LIST_ELEMENT, "RemoveListElement" }, + { SERVICE_CONFIRMED_CREATE_OBJECT, "CreateObject" }, + { SERVICE_CONFIRMED_DELETE_OBJECT, "DeleteObject" }, + { SERVICE_CONFIRMED_READ_PROPERTY, "ReadProperty" }, + { SERVICE_CONFIRMED_READ_PROP_CONDITIONAL, "ReadPropertyConditional" }, + { SERVICE_CONFIRMED_READ_PROP_MULTIPLE, "ReadPropertyMultiple" }, + { SERVICE_CONFIRMED_WRITE_PROPERTY, "WriteProperty" }, + { SERVICE_CONFIRMED_WRITE_PROP_MULTIPLE, "WritePropertyMultiple" }, { SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL, - "Device-Communication-Control" }, - { SERVICE_CONFIRMED_PRIVATE_TRANSFER, "Private-Transfer" }, - { SERVICE_CONFIRMED_TEXT_MESSAGE, "Text-Message" }, - { SERVICE_CONFIRMED_REINITIALIZE_DEVICE, "Reinitialize-Device" }, - { SERVICE_CONFIRMED_VT_OPEN, "VT-Open" }, - { SERVICE_CONFIRMED_VT_CLOSE, "VT-Close" }, - { SERVICE_CONFIRMED_VT_DATA, "VT-Data" }, + "DeviceCommunicationControl" }, + { SERVICE_CONFIRMED_PRIVATE_TRANSFER, "ConfirmedPrivateTransfer" }, + { SERVICE_CONFIRMED_TEXT_MESSAGE, "ConfirmedTextMessage" }, + { SERVICE_CONFIRMED_REINITIALIZE_DEVICE, "ReinitializeDevice" }, + { SERVICE_CONFIRMED_VT_OPEN, "VTOpen" }, + { SERVICE_CONFIRMED_VT_CLOSE, "VTClose" }, + { SERVICE_CONFIRMED_VT_DATA, "VTData" }, { SERVICE_CONFIRMED_AUTHENTICATE, "Authenticate" }, - { SERVICE_CONFIRMED_REQUEST_KEY, "Request-Key" }, - { SERVICE_CONFIRMED_READ_RANGE, "Read-Range" }, - { SERVICE_CONFIRMED_LIFE_SAFETY_OPERATION, "Life-Safety_Operation" }, - { SERVICE_CONFIRMED_SUBSCRIBE_COV_PROPERTY, "Subscribe-COV-Property" }, - { SERVICE_CONFIRMED_GET_EVENT_INFORMATION, "Get-Event-Information" }, + { SERVICE_CONFIRMED_REQUEST_KEY, "RequestKey" }, + { SERVICE_CONFIRMED_READ_RANGE, "ReadRange" }, + { SERVICE_CONFIRMED_LIFE_SAFETY_OPERATION, "LifeSafetyOperation" }, + { SERVICE_CONFIRMED_SUBSCRIBE_COV_PROPERTY, "SubscribeCOVProperty" }, + { SERVICE_CONFIRMED_GET_EVENT_INFORMATION, "GetEventInformation" }, + { SERVICE_CONFIRMED_SUBSCRIBE_COV_PROPERTY_MULTIPLE, + "SubscribeCOVPropertyMultiple" }, + { SERVICE_CONFIRMED_COV_NOTIFICATION_MULTIPLE, + "ConfirmedCOVNotificationMultiple" }, + { SERVICE_CONFIRMED_AUDIT_NOTIFICATION, "ConfirmedAuditNotification" }, + { SERVICE_CONFIRMED_AUTH_REQUEST, "ConfirmedAuthRequest" }, { 0, NULL } }; @@ -101,16 +107,20 @@ const char *bactext_confirmed_service_name(unsigned index) INDTEXT_DATA bacnet_unconfirmed_service_names[] = { { SERVICE_UNCONFIRMED_I_AM, "I-Am" }, { SERVICE_UNCONFIRMED_I_HAVE, "I-Have" }, - { SERVICE_UNCONFIRMED_COV_NOTIFICATION, "COV-Notification" }, - { SERVICE_UNCONFIRMED_EVENT_NOTIFICATION, "Event-Notification" }, - { SERVICE_UNCONFIRMED_PRIVATE_TRANSFER, "Private-Transfer" }, - { SERVICE_UNCONFIRMED_TEXT_MESSAGE, "Text-Message" }, - { SERVICE_UNCONFIRMED_TIME_SYNCHRONIZATION, "Time-Synchronization" }, + { SERVICE_UNCONFIRMED_COV_NOTIFICATION, "UnconfirmedCOVNotification" }, + { SERVICE_UNCONFIRMED_EVENT_NOTIFICATION, "UnconfirmedEventNotification" }, + { SERVICE_UNCONFIRMED_PRIVATE_TRANSFER, "UnconfirmedPrivateTransfer" }, + { SERVICE_UNCONFIRMED_TEXT_MESSAGE, "UnconfirmedTextMessage" }, + { SERVICE_UNCONFIRMED_TIME_SYNCHRONIZATION, "TimeSynchronization" }, { SERVICE_UNCONFIRMED_WHO_HAS, "Who-Has" }, { SERVICE_UNCONFIRMED_WHO_IS, "Who-Is" }, - { SERVICE_UNCONFIRMED_UTC_TIME_SYNCHRONIZATION, - "UTC-Time-Synchronization" }, - { SERVICE_UNCONFIRMED_WRITE_GROUP, "Write-Group" }, + { SERVICE_UNCONFIRMED_UTC_TIME_SYNCHRONIZATION, "UTCTimeSynchronization" }, + { SERVICE_UNCONFIRMED_WRITE_GROUP, "WriteGroup" }, + { SERVICE_UNCONFIRMED_COV_NOTIFICATION_MULTIPLE, + "UnconfirmedCOVNotificationMultiple" }, + { SERVICE_UNCONFIRMED_AUDIT_NOTIFICATION, "UnconfirmedAuditNotification" }, + { SERVICE_UNCONFIRMED_WHO_AM_I, "Who-Am-I" }, + { SERVICE_UNCONFIRMED_YOU_ARE, "You-Are" }, { 0, NULL } }; @@ -255,6 +265,78 @@ INDTEXT_DATA bacnet_object_type_names[] = { { 0, NULL } }; +INDTEXT_DATA bacnet_object_type_names_capitalized[] = { + { OBJECT_ANALOG_INPUT, "Analog Input" }, + { OBJECT_ANALOG_OUTPUT, "Analog Output" }, + { OBJECT_ANALOG_VALUE, "Analog Value" }, + { OBJECT_BINARY_INPUT, "Binary Input" }, + { OBJECT_BINARY_OUTPUT, "Binary Output" }, + { OBJECT_BINARY_VALUE, "Binary Value" }, + { OBJECT_CALENDAR, "Calendar" }, + { OBJECT_COMMAND, "Command" }, + { OBJECT_DEVICE, "Device" }, + { OBJECT_EVENT_ENROLLMENT, "Event Enrollment" }, + { OBJECT_FILE, "File" }, + { OBJECT_GROUP, "Group" }, + { OBJECT_LOOP, "Loop" }, + { OBJECT_MULTI_STATE_INPUT, "Multi-state Input" }, + { OBJECT_MULTI_STATE_OUTPUT, "Multi-state Output" }, + { OBJECT_NOTIFICATION_CLASS, "Notification Class" }, + { OBJECT_PROGRAM, "Program" }, + { OBJECT_SCHEDULE, "Schedule" }, + { OBJECT_AVERAGING, "Averaging" }, + { OBJECT_MULTI_STATE_VALUE, "Multi-state Value" }, + { OBJECT_TRENDLOG, "Trend Log" }, + { OBJECT_LIFE_SAFETY_POINT, "Life Safety Point" }, + { OBJECT_LIFE_SAFETY_ZONE, "Life Safety Zone" }, + { OBJECT_ACCUMULATOR, "Accumulator" }, + { OBJECT_PULSE_CONVERTER, "Pulse Converter" }, + { OBJECT_EVENT_LOG, "Event Log" }, + { OBJECT_GLOBAL_GROUP, "Global Group" }, + { OBJECT_TREND_LOG_MULTIPLE, "Trend Log Multiple" }, + { OBJECT_LOAD_CONTROL, "Load Control" }, + { OBJECT_STRUCTURED_VIEW, "Structured View" }, + { OBJECT_ACCESS_DOOR, "Access Door" }, + { OBJECT_LIGHTING_OUTPUT, "Lighting Output" }, + { OBJECT_ACCESS_CREDENTIAL, "Access Credential" }, + { OBJECT_ACCESS_POINT, "Access Point" }, + { OBJECT_ACCESS_RIGHTS, "Access Rights" }, + { OBJECT_ACCESS_USER, "Access User" }, + { OBJECT_ACCESS_ZONE, "Access Zone" }, + { OBJECT_CREDENTIAL_DATA_INPUT, "Credential Data Input" }, + { OBJECT_NETWORK_SECURITY, "Network Security" }, + { OBJECT_BITSTRING_VALUE, "Bitstring Value" }, + { OBJECT_CHARACTERSTRING_VALUE, "Characterstring Value" }, + { OBJECT_DATE_PATTERN_VALUE, "Date Pattern Value" }, + { OBJECT_DATE_VALUE, "Date Value" }, + { OBJECT_DATETIME_PATTERN_VALUE, "Datetime Pattern Value" }, + { OBJECT_DATETIME_VALUE, "Datetime Value" }, + { OBJECT_INTEGER_VALUE, "Integer Value" }, + { OBJECT_LARGE_ANALOG_VALUE, "Large Analog Value" }, + { OBJECT_OCTETSTRING_VALUE, "Octetstring Value" }, + { OBJECT_POSITIVE_INTEGER_VALUE, "Positive Integer Value" }, + { OBJECT_TIME_PATTERN_VALUE, "Time Pattern Value" }, + { OBJECT_TIME_VALUE, "Time Value" }, + { OBJECT_NOTIFICATION_FORWARDER, "Notification Forwarder" }, + { OBJECT_ALERT_ENROLLMENT, "Alert Enrollment" }, + { OBJECT_CHANNEL, "Channel" }, + { OBJECT_LIGHTING_OUTPUT, "Lighting Output" }, + { OBJECT_BINARY_LIGHTING_OUTPUT, "Binary Lighting Output" }, + { OBJECT_NETWORK_PORT, "Network Port" }, + { OBJECT_ELEVATOR_GROUP, "Elevator Group" }, + { OBJECT_ESCALATOR, "Escalator" }, + { OBJECT_LIFT, "Lift" }, + { OBJECT_STAGING, "Staging" }, + { OBJECT_AUDIT_LOG, "Audit Log" }, + { OBJECT_AUDIT_REPORTER, "Audit Reporter" }, + { OBJECT_COLOR, "Color" }, + { OBJECT_COLOR_TEMPERATURE, "Color Temperature" }, + /* Enumerated values 0-127 are reserved for definition by ASHRAE. + Enumerated values 128-1023 may be used by others subject to + the procedures and constraints described in Clause 23. */ + { 0, NULL } +}; + const char *bactext_object_type_name(unsigned index) { return indtext_by_index_split_default( @@ -262,6 +344,13 @@ const char *bactext_object_type_name(unsigned index) ASHRAE_Reserved_String, Vendor_Proprietary_String); } +const char *bactext_object_type_name_capitalized(unsigned index) +{ + return indtext_by_index_split_default( + bacnet_object_type_names_capitalized, index, OBJECT_PROPRIETARY_MIN, + ASHRAE_Reserved_String, Vendor_Proprietary_String); +} + bool bactext_object_type_index(const char *search_name, unsigned *found_index) { return indtext_by_istring( @@ -299,7 +388,7 @@ INDTEXT_DATA bacnet_property_names[] = { { PROP_CONTROLLED_VARIABLE_UNITS, "controlled-variable-units" }, { PROP_CONTROLLED_VARIABLE_VALUE, "controlled-variable-value" }, { PROP_COV_INCREMENT, "cov-increment" }, - { PROP_DATE_LIST, "datelist" }, + { PROP_DATE_LIST, "date-list" }, { PROP_DAYLIGHT_SAVINGS_STATUS, "daylight-savings-status" }, { PROP_DEADBAND, "deadband" }, { PROP_DERIVATIVE_CONSTANT, "derivative-constant" }, @@ -475,6 +564,7 @@ INDTEXT_DATA bacnet_property_names[] = { { PROP_INTERVAL_OFFSET, "interval-offset" }, { PROP_LAST_RESTART_REASON, "last-restart-reason" }, { PROP_LOGGING_TYPE, "logging-type" }, + { PROP_RESTART_NOTIFICATION_RECIPIENTS, "restart-notification-recipients" }, { PROP_TIME_OF_DEVICE_RESTART, "time-of-device-restart" }, { PROP_TIME_SYNCHRONIZATION_INTERVAL, "time-synchronization-interval" }, { PROP_TRIGGER, "trigger" }, diff --git a/src/bacnet/bactext.h b/src/bacnet/bactext.h index 180d6c01..e92df155 100644 --- a/src/bacnet/bactext.h +++ b/src/bacnet/bactext.h @@ -36,6 +36,8 @@ bool bactext_application_tag_index( BACNET_STACK_EXPORT const char *bactext_object_type_name(unsigned index); BACNET_STACK_EXPORT +const char *bactext_object_type_name_capitalized(unsigned index); +BACNET_STACK_EXPORT bool bactext_object_type_index(const char *search_name, unsigned *found_index); BACNET_STACK_EXPORT bool bactext_object_type_strtol(const char *search_name, unsigned *found_index); diff --git a/src/bacnet/proplist.c b/src/bacnet/proplist.c index e0d1c5ad..5ee22903 100644 --- a/src/bacnet/proplist.c +++ b/src/bacnet/proplist.c @@ -354,7 +354,6 @@ static const int Properties_BACnetARRAY[] = { PROP_CONTROL_GROUPS, PROP_BIT_TEXT, PROP_PORT_FILTER, - PROP_NOTIFICATION_CLASS, PROP_STATE_CHANGE_VALUES, PROP_LINK_SPEEDS, PROP_IP_DNS_SERVER, @@ -427,6 +426,14 @@ bool property_list_bacnet_array_member( break; } break; + case OBJECT_LOOP: + switch (object_property) { + case PROP_ACTION: + return false; + default: + break; + } + break; default: break; } @@ -481,6 +488,7 @@ static const int Properties_BACnetLIST[] = { PROP_ROUTING_TABLE, PROP_LANDING_CALLS, PROP_FAULT_SIGNALS, + PROP_ADDITIONAL_REFERENCE_PORTS, -1 }; diff --git a/src/bacnet/timestamp.c b/src/bacnet/timestamp.c index 1424762d..b1d6680f 100644 --- a/src/bacnet/timestamp.c +++ b/src/bacnet/timestamp.c @@ -477,16 +477,28 @@ int bacapp_timestamp_to_ascii( str, str_size, "%u", (unsigned)timestamp->value.sequenceNum); break; case TIME_STAMP_DATETIME: - /* 2021/12/31-23:59:59.99 */ - str_len = snprintf( - str, str_size, "%04u/%02u/%02u-%02u:%02u:%02u.%02u", - (unsigned)timestamp->value.dateTime.date.year, - (unsigned)timestamp->value.dateTime.date.month, - (unsigned)timestamp->value.dateTime.date.day, - (unsigned)timestamp->value.dateTime.time.hour, - (unsigned)timestamp->value.dateTime.time.min, - (unsigned)timestamp->value.dateTime.time.sec, - (unsigned)timestamp->value.dateTime.time.hundredths); + if (datetime_wildcard_year(×tamp->value.dateTime.date)) { + /* 255/12/31-23:59:59.99 */ + str_len = snprintf( + str, str_size, "255/%02u/%02u-%02u:%02u:%02u.%02u", + (unsigned)timestamp->value.dateTime.date.month, + (unsigned)timestamp->value.dateTime.date.day, + (unsigned)timestamp->value.dateTime.time.hour, + (unsigned)timestamp->value.dateTime.time.min, + (unsigned)timestamp->value.dateTime.time.sec, + (unsigned)timestamp->value.dateTime.time.hundredths); + } else { + /* 2021/12/31-23:59:59.99 */ + str_len = snprintf( + str, str_size, "%04u/%02u/%02u-%02u:%02u:%02u.%02u", + (unsigned)timestamp->value.dateTime.date.year, + (unsigned)timestamp->value.dateTime.date.month, + (unsigned)timestamp->value.dateTime.date.day, + (unsigned)timestamp->value.dateTime.time.hour, + (unsigned)timestamp->value.dateTime.time.min, + (unsigned)timestamp->value.dateTime.time.sec, + (unsigned)timestamp->value.dateTime.time.hundredths); + } break; default: break;