Added new enumerations, text, BACnetARRAY and BACnetList from protocol-revision 30 (#1114)

This commit is contained in:
Steve Karg
2025-09-28 21:36:38 -05:00
committed by GitHub
parent b74af37720
commit f5bc0620e7
6 changed files with 184 additions and 60 deletions
+17 -4
View File
@@ -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) {
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 */
+5 -6
View File
@@ -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 */
+128 -38
View File
@@ -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" },
+2
View File
@@ -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);
+9 -1
View File
@@ -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
};
+12
View File
@@ -477,6 +477,17 @@ int bacapp_timestamp_to_ascii(
str, str_size, "%u", (unsigned)timestamp->value.sequenceNum);
break;
case TIME_STAMP_DATETIME:
if (datetime_wildcard_year(&timestamp->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",
@@ -487,6 +498,7 @@ int bacapp_timestamp_to_ascii(
(unsigned)timestamp->value.dateTime.time.min,
(unsigned)timestamp->value.dateTime.time.sec,
(unsigned)timestamp->value.dateTime.time.hundredths);
}
break;
default:
break;