From 4326128e72ed269659baee02627294cf97dc5795 Mon Sep 17 00:00:00 2001 From: Steve Karg Date: Thu, 25 Jul 2024 17:12:08 -0500 Subject: [PATCH] Secure ReadProperty decoding and BACnetActionCommand (#702) * Refactored and secured BACnetActionCommand codec into bacaction.c module for command object and added to bacapp module encode/decode with define for enabling and pseudo application tag for internal use. * Simplified bacapp_data_len() and moved into bacdcode module as bacnet_enclosed_data_len() function. * Secured ReadProperty-REQUEST and -ACK decoding. * Removed deprecated Keylist_Key() functions from usage. * Removed pseudo application datatypes from bacapp_data_decode() which only uses primitive application tag encoded values. * Defined INT_MAX when it is not already defined by compiler or libc. * Deprecated bacapp_decode_application_data_len() and bacapp_decode_context_data_len() as they are no longer used in any code in the library. * Added BACnetScale to bacapp module. Improved complex property value decoding. Refactored bacapp_decode_known_property() function. * Refactored and improved the bacapp_snprintf() function for printing EPICS. * Fixed Lighting Output WriteProperty to handle known property decoding. --- CMakeLists.txt | 4 +- Makefile | 3 + apps/epics/main.c | 37 +- ports/at91sam7s/CMakeLists.txt | 1 + ports/at91sam7s/Makefile | 1 + ports/bdk-atxx4-mstp/Makefile | 1 + ports/stm32f10x/CMakeLists.txt | 1 + ports/stm32f10x/Makefile | 1 + ports/stm32f4xx/CMakeLists.txt | 1 + ports/stm32f4xx/Makefile | 1 + ports/stm32f4xx/bacnet.ewp | 3 + .../BACnet_Stack_Library.vcxproj | 1 + .../BACnet_Stack_Library.vcxproj.filters | 3 + .../bacnet-stack/bacnet-stack.vcxproj | 2 + .../bacnet-stack/bacnet-stack.vcxproj.filters | 6 + ports/xplained/Makefile | 1 + ports/xplained/bacnet.cproj | 4 + src/bacnet/bacaction.c | 568 ++++ src/bacnet/bacaction.h | 108 + src/bacnet/bacapp.c | 2761 ++++++++++------- src/bacnet/bacapp.h | 56 +- src/bacnet/bacdcode.c | 131 + src/bacnet/bacdcode.h | 7 + src/bacnet/bacdef.h | 1 + src/bacnet/bacenum.h | 8 +- src/bacnet/bacstr.c | 70 +- src/bacnet/bacstr.h | 14 +- src/bacnet/bactext.c | 4 + src/bacnet/basic/object/bi.c | 12 +- src/bacnet/basic/object/bitstring_value.c | 17 +- src/bacnet/basic/object/bv.c | 10 +- src/bacnet/basic/object/command.c | 459 +-- src/bacnet/basic/object/command.h | 31 +- src/bacnet/basic/object/lo.c | 453 ++- src/bacnet/basic/object/ms-input.c | 12 +- src/bacnet/basic/object/msv.c | 12 +- src/bacnet/basic/object/netport.c | 142 +- src/bacnet/basic/object/objects.c | 6 +- src/bacnet/basic/service/h_rpm_a.c | 3 +- src/bacnet/basic/sys/platform.h | 6 + src/bacnet/config.h | 8 +- src/bacnet/cov.c | 4 +- src/bacnet/indtext.c | 4 +- src/bacnet/rp.c | 253 +- src/bacnet/rpm.c | 2 +- src/bacnet/wp.c | 3 +- src/bacnet/wpm.c | 4 +- test/CMakeLists.txt | 2 - test/bacnet/bacaddr/CMakeLists.txt | 1 + test/bacnet/bacapp/CMakeLists.txt | 1 + test/bacnet/bacapp/src/main.c | 191 +- test/bacnet/bacdest/CMakeLists.txt | 1 + test/bacnet/bacdevobjpropref/CMakeLists.txt | 1 + test/bacnet/bactimevalue/CMakeLists.txt | 1 + .../basic/binding/address/CMakeLists.txt | 1 + test/bacnet/basic/object/acc/CMakeLists.txt | 1 + .../object/access_credential/CMakeLists.txt | 1 + .../basic/object/access_door/CMakeLists.txt | 1 + .../basic/object/access_point/CMakeLists.txt | 1 + .../basic/object/access_rights/CMakeLists.txt | 1 + .../basic/object/access_user/CMakeLists.txt | 1 + .../basic/object/access_zone/CMakeLists.txt | 1 + test/bacnet/basic/object/ai/CMakeLists.txt | 1 + test/bacnet/basic/object/ao/CMakeLists.txt | 1 + test/bacnet/basic/object/av/CMakeLists.txt | 1 + .../basic/object/bacfile/CMakeLists.txt | 1 + test/bacnet/basic/object/bi/CMakeLists.txt | 1 + .../object/bitstring_value/CMakeLists.txt | 1 + test/bacnet/basic/object/blo/CMakeLists.txt | 1 + test/bacnet/basic/object/bo/CMakeLists.txt | 1 + test/bacnet/basic/object/bv/CMakeLists.txt | 1 + .../basic/object/calendar/CMakeLists.txt | 1 + .../basic/object/channel/CMakeLists.txt | 1 + .../basic/object/color_object/CMakeLists.txt | 1 + .../object/color_temperature/CMakeLists.txt | 1 + .../basic/object/command/CMakeLists.txt | 1 + test/bacnet/basic/object/command/src/main.c | 26 +- .../credential_data_input/CMakeLists.txt | 1 + test/bacnet/basic/object/csv/CMakeLists.txt | 1 + .../bacnet/basic/object/device/CMakeLists.txt | 1 + test/bacnet/basic/object/iv/CMakeLists.txt | 1 + test/bacnet/basic/object/lc/CMakeLists.txt | 1 + test/bacnet/basic/object/lo/CMakeLists.txt | 1 + test/bacnet/basic/object/lsp/CMakeLists.txt | 1 + test/bacnet/basic/object/lsz/CMakeLists.txt | 1 + .../basic/object/ms-input/CMakeLists.txt | 1 + test/bacnet/basic/object/mso/CMakeLists.txt | 1 + test/bacnet/basic/object/msv/CMakeLists.txt | 1 + test/bacnet/basic/object/nc/CMakeLists.txt | 1 + .../basic/object/netport/CMakeLists.txt | 1 + test/bacnet/basic/object/osv/CMakeLists.txt | 1 + test/bacnet/basic/object/piv/CMakeLists.txt | 1 + .../basic/object/schedule/CMakeLists.txt | 1 + .../object/structured_view/CMakeLists.txt | 1 + .../basic/object/time_value/CMakeLists.txt | 1 + .../basic/object/trendlog/CMakeLists.txt | 1 + test/bacnet/cov/CMakeLists.txt | 1 + test/bacnet/create_object/CMakeLists.txt | 1 + test/bacnet/delete_object/CMakeLists.txt | 1 + test/bacnet/event/CMakeLists.txt | 1 + test/bacnet/getalarm/CMakeLists.txt | 1 + test/bacnet/getevent/CMakeLists.txt | 1 + test/bacnet/hostnport/CMakeLists.txt | 1 + test/bacnet/list_element/CMakeLists.txt | 1 + test/bacnet/lso/CMakeLists.txt | 1 + test/bacnet/npdu/CMakeLists.txt | 1 + test/bacnet/ptransfer/CMakeLists.txt | 1 + test/bacnet/rpm/CMakeLists.txt | 1 + test/bacnet/specialevent/CMakeLists.txt | 1 + test/bacnet/timesync/CMakeLists.txt | 1 + test/bacnet/weeklyschedule/CMakeLists.txt | 1 + test/bacnet/wp/CMakeLists.txt | 1 + test/bacnet/wpm/CMakeLists.txt | 1 + zephyr/CMakeLists.txt | 2 + zephyr/tests/bacnet/abort/CMakeLists.txt | 5 +- zephyr/tests/bacnet/alarm_ack/CMakeLists.txt | 5 +- zephyr/tests/bacnet/arf/CMakeLists.txt | 5 +- zephyr/tests/bacnet/awf/CMakeLists.txt | 5 +- zephyr/tests/bacnet/bacapp/CMakeLists.txt | 6 +- zephyr/tests/bacnet/bacdcode/CMakeLists.txt | 5 +- .../bacnet/bacdevobjpropref/CMakeLists.txt | 5 +- zephyr/tests/bacnet/bacerror/CMakeLists.txt | 5 +- zephyr/tests/bacnet/bacint/CMakeLists.txt | 5 +- .../tests/bacnet/bacpropstates/CMakeLists.txt | 5 +- zephyr/tests/bacnet/bacreal/CMakeLists.txt | 5 +- zephyr/tests/bacnet/bacstr/CMakeLists.txt | 5 +- .../basic/binding/address/CMakeLists.txt | 6 +- .../bacnet/basic/object/acc/CMakeLists.txt | 6 +- .../object/access_credential/CMakeLists.txt | 6 +- .../basic/object/access_door/CMakeLists.txt | 6 +- .../basic/object/access_point/CMakeLists.txt | 6 +- .../basic/object/access_rights/CMakeLists.txt | 6 +- .../basic/object/access_user/CMakeLists.txt | 6 +- .../basic/object/access_zone/CMakeLists.txt | 6 +- .../bacnet/basic/object/ai/CMakeLists.txt | 6 +- .../bacnet/basic/object/ao/CMakeLists.txt | 6 +- .../bacnet/basic/object/av/CMakeLists.txt | 6 +- .../bacnet/basic/object/bi/CMakeLists.txt | 6 +- .../bacnet/basic/object/bo/CMakeLists.txt | 6 +- .../bacnet/basic/object/bv/CMakeLists.txt | 6 +- .../basic/object/calendar/CMakeLists.txt | 6 +- .../basic/object/color_object/CMakeLists.txt | 6 +- .../object/color_temperature/CMakeLists.txt | 6 +- .../basic/object/command/CMakeLists.txt | 6 +- .../credential_data_input/CMakeLists.txt | 6 +- .../bacnet/basic/object/device/CMakeLists.txt | 13 +- .../bacnet/basic/object/lc/CMakeLists.txt | 6 +- .../bacnet/basic/object/lo/CMakeLists.txt | 6 +- .../bacnet/basic/object/lsp/CMakeLists.txt | 6 +- .../basic/object/ms-input/CMakeLists.txt | 6 +- .../bacnet/basic/object/mso/CMakeLists.txt | 6 +- .../bacnet/basic/object/msv/CMakeLists.txt | 6 +- .../basic/object/netport/CMakeLists.txt | 6 +- .../basic/object/objects/CMakeLists.txt | 6 +- .../bacnet/basic/object/osv/CMakeLists.txt | 6 +- .../bacnet/basic/object/piv/CMakeLists.txt | 6 +- .../basic/object/schedule/CMakeLists.txt | 6 +- .../basic/object/time_value/CMakeLists.txt | 6 +- .../bacnet/basic/sys/fifo/CMakeLists.txt | 5 +- .../bacnet/basic/sys/filename/CMakeLists.txt | 5 +- .../tests/bacnet/basic/sys/key/CMakeLists.txt | 5 +- .../bacnet/basic/sys/keylist/CMakeLists.txt | 5 +- .../bacnet/basic/sys/ringbuf/CMakeLists.txt | 5 +- .../bacnet/basic/sys/sbuf/CMakeLists.txt | 5 +- zephyr/tests/bacnet/cov/CMakeLists.txt | 6 +- .../tests/bacnet/datalink/bvlc/CMakeLists.txt | 5 +- .../tests/bacnet/datalink/cobs/CMakeLists.txt | 5 +- .../tests/bacnet/datalink/crc/CMakeLists.txt | 5 +- .../tests/bacnet/datalink/mock/CMakeLists.txt | 5 +- zephyr/tests/bacnet/datetime/CMakeLists.txt | 5 +- zephyr/tests/bacnet/dcc/CMakeLists.txt | 5 +- zephyr/tests/bacnet/event/CMakeLists.txt | 6 +- zephyr/tests/bacnet/getevent/CMakeLists.txt | 5 +- zephyr/tests/bacnet/iam/CMakeLists.txt | 5 +- zephyr/tests/bacnet/ihave/CMakeLists.txt | 5 +- zephyr/tests/bacnet/lighting/CMakeLists.txt | 5 +- zephyr/tests/bacnet/lso/CMakeLists.txt | 5 +- zephyr/tests/bacnet/memcopy/CMakeLists.txt | 5 +- zephyr/tests/bacnet/npdu/CMakeLists.txt | 5 +- zephyr/tests/bacnet/property/CMakeLists.txt | 5 +- zephyr/tests/bacnet/ptransfer/CMakeLists.txt | 6 +- zephyr/tests/bacnet/rd/CMakeLists.txt | 5 +- zephyr/tests/bacnet/reject/CMakeLists.txt | 5 +- zephyr/tests/bacnet/rp/CMakeLists.txt | 5 +- zephyr/tests/bacnet/rpm/CMakeLists.txt | 6 +- zephyr/tests/bacnet/timestamp/CMakeLists.txt | 5 +- zephyr/tests/bacnet/timesync/CMakeLists.txt | 5 +- zephyr/tests/bacnet/whohas/CMakeLists.txt | 5 +- zephyr/tests/bacnet/whois/CMakeLists.txt | 5 +- zephyr/tests/bacnet/wp/CMakeLists.txt | 6 +- zephyr/tests/unit/bacnet/bits/CMakeLists.txt | 6 +- 191 files changed, 3856 insertions(+), 2099 deletions(-) create mode 100644 src/bacnet/bacaction.c create mode 100644 src/bacnet/bacaction.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a3f76fb..ee2e3cc9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.1 FATAL_ERROR) +cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project( bacnet-stack @@ -144,6 +144,8 @@ add_library(${PROJECT_NAME} src/bacnet/awf.h src/bacnet/bacaddr.c src/bacnet/bacaddr.h + src/bacnet/bacaction.c + src/bacnet/bacaction.h src/bacnet/bacapp.c src/bacnet/bacapp.h src/bacnet/bacdcode.c diff --git a/Makefile b/Makefile index 231c3e2b..0f26c338 100644 --- a/Makefile +++ b/Makefile @@ -370,6 +370,9 @@ CPPCHECK_OPTIONS += --template=gcc CPPCHECK_OPTIONS += --inline-suppr CPPCHECK_OPTIONS += --suppress=selfAssignment CPPCHECK_OPTIONS += --suppress=integerOverflow +CPPCHECK_OPTIONS += -DBACNET_STACK_DEPRECATED +#CPPCHECK_OPTIONS += -I./src +#CPPCHECK_OPTIONS += --enable=information --check-config CPPCHECK_OPTIONS += --error-exitcode=1 .PHONY: cppcheck cppcheck: diff --git a/apps/epics/main.c b/apps/epics/main.c index 6060f0d0..c5861da2 100644 --- a/apps/epics/main.c +++ b/apps/epics/main.c @@ -529,7 +529,6 @@ static void PrintReadPropertyData(BACNET_OBJECT_TYPE object_type, BACNET_APPLICATION_DATA_VALUE *value, *old_value; bool print_brace = false; KEY object_list_element; - bool isSequence = false; /* Ie, will need bracketing braces {} */ if (rpm_property == NULL) { fprintf(stdout, " -- Null Property data \n"); @@ -635,10 +634,6 @@ static void PrintReadPropertyData(BACNET_OBJECT_TYPE object_type, if (rpm_property->propertyIdentifier == PROP_OBJECT_LIST) { if (value->tag != BACNET_APPLICATION_TAG_OBJECT_ID) { - assert(value->tag == - BACNET_APPLICATION_TAG_OBJECT_ID); /* Something - not right - here */ break; } /* Store the object list so we can interrogate @@ -665,27 +660,12 @@ static void PrintReadPropertyData(BACNET_OBJECT_TYPE object_type, } } else if (rpm_property->propertyIdentifier == PROP_SUBORDINATE_LIST) { - if (value->tag != BACNET_APPLICATION_TAG_OBJECT_ID) { - assert(value->tag == - BACNET_APPLICATION_TAG_OBJECT_ID); /* Something - not right - here */ + if (value->tag != + BACNET_APPLICATION_TAG_DEVICE_OBJECT_REFERENCE) { break; } - /* TODO: handle Sequence of { Device ObjID, Object ID }, */ - isSequence = true; - } - - /* If the object is a Sequence, it needs its own bracketing - * braces */ - if (isSequence) { - fprintf(stdout, "{"); } bacapp_print_value(stdout, &object_value); - if (isSequence) { - fprintf(stdout, "}"); - } - if ((Walked_List_Index < Walked_List_Length) || (value->next != NULL)) { /* There are more. */ @@ -1787,11 +1767,14 @@ int main(int argc, char *argv[]) do { Object_List_Index++; if (Object_List_Index < Keylist_Count(Object_List)) { - nextKey = Keylist_Key(Object_List, Object_List_Index); - myObject.type = KEY_DECODE_TYPE(nextKey); - myObject.instance = KEY_DECODE_ID(nextKey); - /* Don't re-list the Device Object among its objects */ - if (myObject.type == OBJECT_DEVICE) { + if (Keylist_Index_Key(Object_List, Object_List_Index, &nextKey)) { + myObject.type = KEY_DECODE_TYPE(nextKey); + myObject.instance = KEY_DECODE_ID(nextKey); + /* Don't re-list the Device Object among its objects */ + if (myObject.type == OBJECT_DEVICE) { + continue; + } + } else { continue; } /* Closing brace for the previous Object */ diff --git a/ports/at91sam7s/CMakeLists.txt b/ports/at91sam7s/CMakeLists.txt index 0b57d69c..44afa125 100644 --- a/ports/at91sam7s/CMakeLists.txt +++ b/ports/at91sam7s/CMakeLists.txt @@ -139,6 +139,7 @@ set(BACNET_PROJECT_SOURCE ${LIBRARY_BACNET_BASIC}/sys/mstimer.c # BACnet core modules ${LIBRARY_BACNET_CORE}/abort.c + ${LIBRARY_BACNET_CORE}/bacaction.c ${LIBRARY_BACNET_CORE}/bacaddr.c ${LIBRARY_BACNET_CORE}/bacapp.c ${LIBRARY_BACNET_CORE}/bacdcode.c diff --git a/ports/at91sam7s/Makefile b/ports/at91sam7s/Makefile index e7ef1c26..389267cd 100644 --- a/ports/at91sam7s/Makefile +++ b/ports/at91sam7s/Makefile @@ -102,6 +102,7 @@ DEMOSRC = ai.c \ $(BACNET_BASIC)/service/s_ihave.c CORESRC = $(BACNET_CORE)/abort.c \ + $(BACNET_CORE)/bacaction.c \ $(BACNET_CORE)/bacaddr.c \ $(BACNET_CORE)/bacapp.c \ $(BACNET_CORE)/bacdcode.c \ diff --git a/ports/bdk-atxx4-mstp/Makefile b/ports/bdk-atxx4-mstp/Makefile index bd7bf85c..75856307 100644 --- a/ports/bdk-atxx4-mstp/Makefile +++ b/ports/bdk-atxx4-mstp/Makefile @@ -121,6 +121,7 @@ BASICSRC = $(BACNET_BASIC)/service/h_dcc.c \ CORESRC = \ $(BACNET_CORE)/datalink/crc.c \ $(BACNET_CORE)/abort.c \ + $(BACNET_CORE)/bacaction.c \ $(BACNET_CORE)/bacaddr.c \ $(BACNET_CORE)/bacapp.c \ $(BACNET_CORE)/bacdcode.c \ diff --git a/ports/stm32f10x/CMakeLists.txt b/ports/stm32f10x/CMakeLists.txt index 145b6d25..844d88c9 100644 --- a/ports/stm32f10x/CMakeLists.txt +++ b/ports/stm32f10x/CMakeLists.txt @@ -165,6 +165,7 @@ set(BACNET_PROJECT_SOURCE ${LIBRARY_BACNET_BASIC}/sys/mstimer.c # BACnet core library ${LIBRARY_BACNET_CORE}/abort.c + ${LIBRARY_BACNET_CORE}/bacaction.c ${LIBRARY_BACNET_CORE}/bacaddr.c ${LIBRARY_BACNET_CORE}/bacapp.c ${LIBRARY_BACNET_CORE}/bacdcode.c diff --git a/ports/stm32f10x/Makefile b/ports/stm32f10x/Makefile index 837b4794..a2b20ebc 100644 --- a/ports/stm32f10x/Makefile +++ b/ports/stm32f10x/Makefile @@ -54,6 +54,7 @@ BASIC_SRC = \ BACNET_SRC = \ $(BACNET_CORE)/abort.c \ + $(BACNET_CORE)/bacaction.c \ $(BACNET_CORE)/bacaddr.c \ $(BACNET_CORE)/bacapp.c \ $(BACNET_CORE)/bacdcode.c \ diff --git a/ports/stm32f4xx/CMakeLists.txt b/ports/stm32f4xx/CMakeLists.txt index 1f7387de..c02a0b18 100644 --- a/ports/stm32f4xx/CMakeLists.txt +++ b/ports/stm32f4xx/CMakeLists.txt @@ -181,6 +181,7 @@ set(BACNET_PROJECT_SOURCE ${LIBRARY_BACNET_BASIC}/sys/mstimer.c ${LIBRARY_BACNET_CORE}/abort.c + ${LIBRARY_BACNET_CORE}/bacaction.c ${LIBRARY_BACNET_CORE}/bacaddr.c ${LIBRARY_BACNET_CORE}/bacapp.c ${LIBRARY_BACNET_CORE}/bacdcode.c diff --git a/ports/stm32f4xx/Makefile b/ports/stm32f4xx/Makefile index 04630f32..c02c07a4 100644 --- a/ports/stm32f4xx/Makefile +++ b/ports/stm32f4xx/Makefile @@ -63,6 +63,7 @@ BASIC_SRC = \ BACNET_SRC = \ $(BACNET_CORE)/abort.c \ + $(BACNET_CORE)/bacaction.c \ $(BACNET_CORE)/bacaddr.c \ $(BACNET_CORE)/bacapp.c \ $(BACNET_CORE)/bacdcode.c \ diff --git a/ports/stm32f4xx/bacnet.ewp b/ports/stm32f4xx/bacnet.ewp index 265aaf16..a6f84636 100644 --- a/ports/stm32f4xx/bacnet.ewp +++ b/ports/stm32f4xx/bacnet.ewp @@ -1052,6 +1052,9 @@ $PROJ_DIR$\..\..\src\bacnet\abort.c + + $PROJ_DIR$\..\..\src\bacnet\bacaction.c + $PROJ_DIR$\..\..\src\bacnet\bacaddr.c diff --git a/ports/win32/Microsoft Visual Studio 2019/BACnet_Stack_Library/BACnet_Stack_Library.vcxproj b/ports/win32/Microsoft Visual Studio 2019/BACnet_Stack_Library/BACnet_Stack_Library.vcxproj index 0cce8639..fb8aec57 100644 --- a/ports/win32/Microsoft Visual Studio 2019/BACnet_Stack_Library/BACnet_Stack_Library.vcxproj +++ b/ports/win32/Microsoft Visual Studio 2019/BACnet_Stack_Library/BACnet_Stack_Library.vcxproj @@ -168,6 +168,7 @@ + diff --git a/ports/win32/Microsoft Visual Studio 2019/BACnet_Stack_Library/BACnet_Stack_Library.vcxproj.filters b/ports/win32/Microsoft Visual Studio 2019/BACnet_Stack_Library/BACnet_Stack_Library.vcxproj.filters index 7f01f612..7c8f0368 100644 --- a/ports/win32/Microsoft Visual Studio 2019/BACnet_Stack_Library/BACnet_Stack_Library.vcxproj.filters +++ b/ports/win32/Microsoft Visual Studio 2019/BACnet_Stack_Library/BACnet_Stack_Library.vcxproj.filters @@ -33,6 +33,9 @@ Source Files + + Source Files + Source Files diff --git a/ports/win32/Microsoft Visual Studio/bacnet-stack/bacnet-stack.vcxproj b/ports/win32/Microsoft Visual Studio/bacnet-stack/bacnet-stack.vcxproj index 176ceef3..c11e60df 100644 --- a/ports/win32/Microsoft Visual Studio/bacnet-stack/bacnet-stack.vcxproj +++ b/ports/win32/Microsoft Visual Studio/bacnet-stack/bacnet-stack.vcxproj @@ -28,6 +28,7 @@ + @@ -212,6 +213,7 @@ + diff --git a/ports/win32/Microsoft Visual Studio/bacnet-stack/bacnet-stack.vcxproj.filters b/ports/win32/Microsoft Visual Studio/bacnet-stack/bacnet-stack.vcxproj.filters index 40787be3..4a05f105 100644 --- a/ports/win32/Microsoft Visual Studio/bacnet-stack/bacnet-stack.vcxproj.filters +++ b/ports/win32/Microsoft Visual Studio/bacnet-stack/bacnet-stack.vcxproj.filters @@ -78,6 +78,9 @@ Source Files\src\bacnet + + Source Files\src\bacnet + Source Files\src\bacnet @@ -626,6 +629,9 @@ Source Files\src\bacnet + + Source Files\src\bacnet + Source Files\src\bacnet diff --git a/ports/xplained/Makefile b/ports/xplained/Makefile index 1d27cc53..d844251c 100644 --- a/ports/xplained/Makefile +++ b/ports/xplained/Makefile @@ -78,6 +78,7 @@ BASICSRC = $(BACNET_BASIC)/tsm/tsm.c \ # core BACnet stack files CORESRC = \ $(BACNET_CORE)/abort.c \ + $(BACNET_CORE)/bacaction.c \ $(BACNET_CORE)/bacaddr.c \ $(BACNET_CORE)/bacapp.c \ $(BACNET_CORE)/bacdcode.c \ diff --git a/ports/xplained/bacnet.cproj b/ports/xplained/bacnet.cproj index 320f033d..9f08d67d 100644 --- a/ports/xplained/bacnet.cproj +++ b/ports/xplained/bacnet.cproj @@ -759,6 +759,10 @@ compile bacnet-stack\h_apdu.c + + compile + bacnet-stack\bacaddr.c + compile bacnet-stack\bacaddr.c diff --git a/src/bacnet/bacaction.c b/src/bacnet/bacaction.c new file mode 100644 index 00000000..18091722 --- /dev/null +++ b/src/bacnet/bacaction.c @@ -0,0 +1,568 @@ +/** + * @file + * @brief BACnetActionCommand codec used by Command objects + * @author Steve Karg + * @date 2024 + * @copyright SPDX-License-Identifier: MIT + */ +#include +#include +#include + +/* BACnet Stack defines - first */ +#include "bacnet/bacdef.h" +/* BACnet Stack API */ +#include "bacnet/bacaction.h" +#include "bacnet/bacdcode.h" + +/** + * @brief Encode property value according to the application tag + * @param apdu - Pointer to the buffer to encode to, or NULL for length + * @param value - Pointer to the property value to encode from + * @return number of bytes encoded + */ +int bacnet_action_property_value_encode( + uint8_t *apdu, BACNET_ACTION_PROPERTY_VALUE *value) +{ + int apdu_len = 0; /* total length of the apdu, return value */ + + if (!value) { + return 0; + } + switch (value->tag) { +#if defined(BACACTION_NULL) + case BACNET_APPLICATION_TAG_NULL: + if (apdu) { + apdu[0] = value->tag; + } + apdu_len++; + break; +#endif +#if defined(BACACTION_BOOLEAN) + case BACNET_APPLICATION_TAG_BOOLEAN: + apdu_len = encode_application_boolean(apdu, value->type.Boolean); + break; +#endif +#if defined(BACACTION_UNSIGNED) + case BACNET_APPLICATION_TAG_UNSIGNED_INT: + apdu_len = + encode_application_unsigned(apdu, value->type.Unsigned_Int); + break; +#endif +#if defined(BACACTION_SIGNED) + case BACNET_APPLICATION_TAG_SIGNED_INT: + apdu_len = encode_application_signed(apdu, value->type.Signed_Int); + break; +#endif +#if defined(BACACTION_REAL) + case BACNET_APPLICATION_TAG_REAL: + apdu_len = encode_application_real(apdu, value->type.Real); + break; +#endif +#if defined(BACACTION_DOUBLE) + case BACNET_APPLICATION_TAG_DOUBLE: + apdu_len = encode_application_double(apdu, value->type.Double); + break; +#endif +#if defined(BACACTION_ENUMERATED) + case BACNET_APPLICATION_TAG_ENUMERATED: + apdu_len = + encode_application_enumerated(apdu, value->type.Enumerated); + break; +#endif + default: + break; + } + + return apdu_len; +} + +/** + * @brief Decode property value from the application buffer + * @param apdu - Pointer to the buffer to decode from + * @param apdu_size Size of the buffer to decode from + * @param value - Pointer to the property value to decode to + * @return number of bytes encoded + */ +int bacnet_action_property_value_decode( + uint8_t *apdu, uint32_t apdu_size, BACNET_ACTION_PROPERTY_VALUE *value) +{ + int len = 0; + int apdu_len = 0; + BACNET_TAG tag = { 0 }; + + if (!value) { + return 0; + } + if (!apdu) { + return 0; + } + len = bacnet_tag_decode(apdu, apdu_size, &tag); + if ((len > 0) && tag.application) { + if (value) { + value->tag = tag.number; + } + switch (tag.number) { +#if defined(BACACTION_NULL) + case BACNET_APPLICATION_TAG_NULL: + apdu_len = len; + break; +#endif +#if defined(BACACTION_BOOLEAN) + case BACNET_APPLICATION_TAG_BOOLEAN: + apdu_len = bacnet_boolean_application_decode( + apdu, apdu_size, &value->type.Boolean); + break; +#endif +#if defined(BACACTION_UNSIGNED) + case BACNET_APPLICATION_TAG_UNSIGNED_INT: + apdu_len = bacnet_unsigned_application_decode( + apdu, apdu_size, &value->type.Unsigned_Int); + break; +#endif +#if defined(BACACTION_SIGNED) + case BACNET_APPLICATION_TAG_SIGNED_INT: + apdu_len = bacnet_signed_application_decode( + apdu, apdu_size, &value->type.Signed_Int); + break; +#endif +#if defined(BACACTION_REAL) + case BACNET_APPLICATION_TAG_REAL: + apdu_len = bacnet_real_application_decode( + apdu, apdu_size, &value->type.Real); + break; +#endif +#if defined(BACACTION_DOUBLE) + case BACNET_APPLICATION_TAG_DOUBLE: + apdu_len = bacnet_double_application_decode( + apdu, apdu_size, &value->type.Double); + break; +#endif +#if defined(BACACTION_ENUMERATED) + case BACNET_APPLICATION_TAG_ENUMERATED: + apdu_len = bacnet_enumerated_application_decode( + apdu, apdu_size, &value->type.Enumerated); + break; +#endif + default: + break; + } + } + + return apdu_len; +} + +/** + * @brief Compare two BACnetActionPropertyValue complex datatypes + * @param value1 [in] The first structure to compare + * @param value2 [in] The second structure to compare + * @return true if the two structures are the same + */ +bool bacnet_action_property_value_same( + BACNET_ACTION_PROPERTY_VALUE *value1, BACNET_ACTION_PROPERTY_VALUE *value2) +{ + bool status = false; /*return value */ + + if ((value1 == NULL) || (value2 == NULL)) { + return false; + } + /* does the tag match? */ + if (value1->tag == value2->tag) { + status = true; + } + if (status) { + /* second test for same-ness */ + status = false; + /* does the value match? */ + switch (value1->tag) { +#if defined(BACACTION_NULL) + case BACNET_APPLICATION_TAG_NULL: + status = true; + break; +#endif +#if defined(BACACTION_BOOLEAN) + case BACNET_APPLICATION_TAG_BOOLEAN: + if (value1->type.Boolean == value2->type.Boolean) { + status = true; + } + break; +#endif +#if defined(BACACTION_UNSIGNED) + case BACNET_APPLICATION_TAG_UNSIGNED_INT: + if (value1->type.Unsigned_Int == value2->type.Unsigned_Int) { + status = true; + } + break; +#endif +#if defined(BACACTION_SIGNED) + case BACNET_APPLICATION_TAG_SIGNED_INT: + if (value1->type.Signed_Int == value2->type.Signed_Int) { + status = true; + } + break; +#endif +#if defined(BACACTION_REAL) + case BACNET_APPLICATION_TAG_REAL: + if (!islessgreater(value1->type.Real, value2->type.Real)) { + status = true; + } + break; +#endif +#if defined(BACACTION_DOUBLE) + case BACNET_APPLICATION_TAG_DOUBLE: + if (!islessgreater(value1->type.Double, value2->type.Double)) { + status = true; + } + break; +#endif +#if defined(BACACTION_ENUMERATED) + case BACNET_APPLICATION_TAG_ENUMERATED: + if (value1->type.Enumerated == value2->type.Enumerated) { + status = true; + } + break; +#endif + case BACNET_APPLICATION_TAG_EMPTYLIST: + status = true; + break; + default: + status = false; + break; + } + } + + return status; +} + +/** + * @brief Encode the BACnetActionCommand complex datatype + * + * BACnetActionCommand ::= SEQUENCE { + * deviceIdentifier [0] BACnetObjectIdentifier OPTIONAL, + * objectIdentifier [1] BACnetObjectIdentifier, + * propertyIdentifier [2] BACnetPropertyIdentifier, + * propertyArrayIndex [3] Unsigned OPTIONAL, + * --used only with array datatype + * propertyValue [4] ABSTRACT-SYNTAX.&Type, + * priority [5] Unsigned (1..16) OPTIONAL, + * --used only when property is commandable + * postDelay [6] Unsigned OPTIONAL, + * quitOnFailure [7] BOOLEAN, + * writeSuccessful [8] BOOLEAN + * } + * + * @param apdu [out] The APDU buffer to encode into, or NULL for length + * @param entry [in] The BACNET_ACTION_LIST structure to encode + * @return The length of the encoded data, or BACNET_STATUS_REJECT on error + */ +int bacnet_action_command_encode(uint8_t *apdu, BACNET_ACTION_LIST *entry) +{ + int len = 0; + int apdu_len = 0; + + if (!entry) { + return BACNET_STATUS_REJECT; + } + /* deviceIdentifier [0] BACnetObjectIdentifier OPTIONAL */ + if (entry->Device_Id.instance <= BACNET_MAX_INSTANCE) { + len = encode_context_object_id( + apdu, 0, entry->Device_Id.type, entry->Device_Id.instance); + apdu_len += len; + if (apdu) { + apdu += len; + } + } else { + return BACNET_STATUS_REJECT; + } + /* objectIdentifier [1] BACnetObjectIdentifier */ + len = encode_context_object_id( + apdu, 1, entry->Object_Id.type, entry->Object_Id.instance); + apdu_len += len; + if (apdu) { + apdu += len; + } + /* propertyIdentifier [2] BACnetPropertyIdentifier */ + len = encode_context_enumerated(apdu, 2, entry->Property_Identifier); + apdu_len += len; + if (apdu) { + apdu += len; + } + /* propertyArrayIndex [3] Unsigned OPTIONAL */ + if (entry->Property_Array_Index != BACNET_ARRAY_ALL) { + len = encode_context_unsigned(apdu, 3, entry->Property_Array_Index); + apdu_len += len; + if (apdu) { + apdu += len; + } + } + /* propertyValue [4] ABSTRACT-SYNTAX.&Type */ + len = encode_opening_tag(apdu, 4); + apdu_len += len; + if (apdu) { + apdu += len; + } + len = bacnet_action_property_value_encode(apdu, &entry->Value); + apdu_len += len; + if (apdu) { + apdu += len; + } + len = encode_closing_tag(apdu, 4); + apdu_len += len; + if (apdu) { + apdu += len; + } + /* priority [5] Unsigned (1..16) OPTIONAL */ + if (entry->Priority != BACNET_NO_PRIORITY) { + len = encode_context_unsigned(apdu, 5, entry->Priority); + apdu_len += len; + if (apdu) { + apdu += len; + } + } + /* postDelay [6] Unsigned OPTIONAL */ + if (entry->Post_Delay != UINT32_MAX) { + len = encode_context_unsigned(apdu, 6, entry->Post_Delay); + apdu_len += len; + if (apdu) { + apdu += len; + } + } + /* quitOnFailure [7] BOOLEAN */ + len = encode_context_boolean(apdu, 7, entry->Quit_On_Failure); + apdu_len += len; + if (apdu) { + apdu += len; + } + /* writeSuccessful [8] BOOLEAN */ + len = encode_context_boolean(apdu, 8, entry->Write_Successful); + apdu_len += len; + + return apdu_len; +} + +/** + * @brief Decode the BACnetActionCommand complex datatype + * @param apdu [in] The APDU buffer to decode + * @param apdu_size [in] The size of the APDU buffer + * @param tag [in] The BACNET_APPLICATION_TAG of the value + * @param entry [out] The BACNET_ACTION_LIST structure to fill + * @return The length of the decoded data, or BACNET_STATUS_ERROR on error + */ +int bacnet_action_command_decode( + uint8_t *apdu, size_t apdu_size, BACNET_ACTION_LIST *entry) +{ + int len = 0; + int apdu_len = 0; + int data_len = 0; + uint32_t instance = 0; + BACNET_OBJECT_TYPE type = OBJECT_NONE; /* for decoding */ + uint32_t property = 0; /* for decoding */ + BACNET_UNSIGNED_INTEGER unsigned_value = 0; + bool boolean_value = false; + + if (!apdu) { + return BACNET_STATUS_ERROR; + } + /* deviceIdentifier [0] BACnetObjectIdentifier OPTIONAL */ + len = bacnet_object_id_context_decode( + &apdu[apdu_len], apdu_size - apdu_len, 0, &type, &instance); + if (len > 0) { + if (instance > BACNET_MAX_INSTANCE) { + return BACNET_STATUS_ERROR; + } + apdu_len += len; + if (entry) { + entry->Device_Id.type = type; + entry->Device_Id.instance = instance; + } + } else if (len == 0) { + /* wrong tag - optional - skip apdu_len increment */ + if (entry) { + entry->Device_Id.type = OBJECT_DEVICE; + entry->Device_Id.instance = BACNET_MAX_INSTANCE; + } + } else { + return BACNET_STATUS_ERROR; + } + /* objectIdentifier [1] BACnetObjectIdentifier */ + len = bacnet_object_id_context_decode( + &apdu[apdu_len], apdu_size - apdu_len, 1, &type, &instance); + if (len > 0) { + if (instance > BACNET_MAX_INSTANCE) { + return BACNET_STATUS_ERROR; + } + apdu_len += len; + if (entry) { + entry->Object_Id.type = type; + entry->Object_Id.instance = instance; + } + } else { + return BACNET_STATUS_ERROR; + } + /* propertyIdentifier [2] BACnetPropertyIdentifier */ + len = bacnet_enumerated_context_decode( + &apdu[apdu_len], apdu_size - apdu_len, 2, &property); + if (len > 0) { + apdu_len += len; + if (entry) { + entry->Property_Identifier = (BACNET_PROPERTY_ID)property; + } + } else { + return BACNET_STATUS_ERROR; + } + /* propertyArrayIndex [3] Unsigned OPTIONAL */ + len = bacnet_unsigned_context_decode( + &apdu[apdu_len], apdu_size - apdu_len, 3, &unsigned_value); + if (len > 0) { + apdu_len += len; + if (entry) { + entry->Property_Array_Index = unsigned_value; + } + } else { + /* wrong tag or malformed - optional - skip apdu_len increment */ + if (entry) { + entry->Property_Array_Index = BACNET_ARRAY_ALL; + } + } + /* propertyValue [4] ABSTRACT-SYNTAX.&Type */ + if (!bacnet_is_opening_tag_number( + &apdu[apdu_len], apdu_size - apdu_len, 4, &len)) { + return BACNET_STATUS_ERROR; + } + /* determine the length of the data blob */ + data_len = + bacnet_enclosed_data_length(&apdu[apdu_len], apdu_size - apdu_len); + if (data_len == BACNET_STATUS_ERROR) { + return BACNET_STATUS_ERROR; + } + /* count the opening tag number length */ + apdu_len += len; + /* decode data from the APDU */ + if (data_len > MAX_APDU) { + /* not enough size in application_data to store the data chunk */ + return BACNET_STATUS_ERROR; + } + if (entry) { + len = bacnet_action_property_value_decode( + &apdu[apdu_len], data_len, &entry->Value); + if (len < 0) { + /* signal internal error */ + entry->Value.tag = BACNET_APPLICATION_TAG_ERROR; + } + } + /* add on the data length */ + apdu_len += data_len; + /* closing */ + if (!bacnet_is_closing_tag_number( + &apdu[apdu_len], apdu_size - apdu_len, 4, &len)) { + return BACNET_STATUS_ERROR; + } + /* count the closing tag number length */ + apdu_len += len; + /* priority [5] Unsigned (1..16) OPTIONAL */ + len = bacnet_unsigned_context_decode( + &apdu[apdu_len], apdu_len - apdu_size, 5, &unsigned_value); + if (len > 0) { + apdu_len += len; + if ((unsigned_value >= BACNET_MIN_PRIORITY) && + (unsigned_value <= BACNET_MAX_PRIORITY)) { + if (entry) { + entry->Priority = (uint8_t)unsigned_value; + } + } else { + return BACNET_STATUS_ERROR; + } + } else { + /* wrong tag or malformed - optional - skip apdu_len increment */ + if (entry) { + entry->Priority = BACNET_NO_PRIORITY; + } + } + /* postDelay [6] Unsigned OPTIONAL */ + len = bacnet_unsigned_context_decode( + &apdu[apdu_len], apdu_len - apdu_size, 6, &unsigned_value); + if (len > 0) { + apdu_len += len; + if (entry) { + entry->Post_Delay = (uint8_t)unsigned_value; + } + } else { + /* wrong tag or malformed - optional - skip apdu_len increment */ + if (entry) { + entry->Post_Delay = UINT32_MAX; + } + } + /* quitOnFailure [7] BOOLEAN */ + len = bacnet_boolean_context_decode( + &apdu[apdu_len], apdu_len - apdu_size, 7, &boolean_value); + if (len > 0) { + apdu_len += len; + if (entry) { + entry->Quit_On_Failure = boolean_value; + } + } else { + return BACNET_STATUS_ERROR; + } + /* writeSuccessful [8] BOOLEAN */ + len = bacnet_boolean_context_decode( + &apdu[apdu_len], apdu_len - apdu_size, 8, &boolean_value); + if (len > 0) { + apdu_len += len; + if (entry) { + entry->Write_Successful = boolean_value; + } + } else { + return BACNET_STATUS_ERROR; + } + + return apdu_len; +} + +/** + * @brief Compare two BACnetActionCommand complex datatypes + * @param entry1 [in] The first BACNET_ACTION_LIST structure to compare + * @param entry2 [in] The second BACNET_ACTION_LIST structure to compare + * @return True if the two structures are the same, else False + */ +bool bacnet_action_command_same( + BACNET_ACTION_LIST *entry1, BACNET_ACTION_LIST *entry2) +{ + if (!entry1 || !entry2) { + return false; + } + if (entry1->Device_Id.type != entry2->Device_Id.type) { + return false; + } + if (entry1->Device_Id.instance != entry2->Device_Id.instance) { + return false; + } + if (entry1->Object_Id.type != entry2->Object_Id.type) { + return false; + } + if (entry1->Object_Id.instance != entry2->Object_Id.instance) { + return false; + } + if (entry1->Property_Identifier != entry2->Property_Identifier) { + return false; + } + if (entry1->Property_Array_Index != entry2->Property_Array_Index) { + return false; + } + if (!bacnet_action_property_value_same(&entry1->Value, &entry2->Value)) { + return false; + } + if (entry1->Priority != entry2->Priority) { + return false; + } + if (entry1->Post_Delay != entry2->Post_Delay) { + return false; + } + if (entry1->Quit_On_Failure != entry2->Quit_On_Failure) { + return false; + } + if (entry1->Write_Successful != entry2->Write_Successful) { + return false; + } + + return true; +} diff --git a/src/bacnet/bacaction.h b/src/bacnet/bacaction.h new file mode 100644 index 00000000..c6641c2b --- /dev/null +++ b/src/bacnet/bacaction.h @@ -0,0 +1,108 @@ +/** + * @file + * @brief API for BACnetActionCommand codec used by Command objects + * @author Steve Karg + * @date 2024 + * @copyright SPDX-License-Identifier: MIT + */ +#ifndef BACNET_ACTION_H +#define BACNET_ACTION_H +#include +#include +/* BACnet Stack defines - first */ +#include "bacnet/bacdef.h" +#include "bacnet/bactimevalue.h" + +/* BACNET_ACTION_VALUE encodes and decodes the Property Value + in the Action Command. Choose the datatypes that your + application supports, or add additional. */ +#if !( \ + defined(BACACTION_ALL) || defined(BACACTION_NULL) || \ + defined(BACACTION_BOOLEAN) || defined(BACACTION_UNSIGNED) || \ + defined(BACACTION_SIGNED) || defined(BACACTION_REAL) || \ + defined(BACACTION_DOUBLE) || defined(BACACTION_OCTET_STRING) || \ + defined(BACACTION_ENUMERATED)) +#define BACACTION_ALL +#endif + +#if defined(BACACTION_ALL) +#define BACACTION_NULL +#define BACACTION_BOOLEAN +#define BACACTION_UNSIGNED +#define BACACTION_SIGNED +#define BACACTION_REAL +#define BACACTION_DOUBLE +#define BACACTION_ENUMERATED +#endif + +typedef struct BACnetActionPropertyValue { + uint8_t tag; + union { +#if defined(BACACTION_NULL) + /* NULL - not needed because it is encoded in the tag alone */ +#endif +#if defined(BACACTION_BOOLEAN) + bool Boolean; +#endif +#if defined(BACACTION_UNSIGNED) + BACNET_UNSIGNED_INTEGER Unsigned_Int; +#endif +#if defined(BACACTION_SIGNED) + int32_t Signed_Int; +#endif +#if defined(BACACTION_REAL) + float Real; +#endif +#if defined(BACACTION_DOUBLE) + double Double; +#endif +#if defined(BACACTION_ENUMERATED) + uint32_t Enumerated; +#endif + } type; + /* simple linked list if needed */ + struct BACnetActionPropertyValue *next; +} BACNET_ACTION_PROPERTY_VALUE; + +typedef struct bacnet_action_list { + BACNET_OBJECT_ID Device_Id; /* Optional */ + BACNET_OBJECT_ID Object_Id; + BACNET_PROPERTY_ID Property_Identifier; + uint32_t Property_Array_Index; /* Conditional */ + BACNET_ACTION_PROPERTY_VALUE Value; + uint8_t Priority; /* Conditional */ + uint32_t Post_Delay; /* Optional */ + bool Quit_On_Failure; + bool Write_Successful; + struct bacnet_action_list *next; +} BACNET_ACTION_LIST; + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +BACNET_STACK_EXPORT +int bacnet_action_property_value_encode( + uint8_t *apdu, BACNET_ACTION_PROPERTY_VALUE *value); +BACNET_STACK_EXPORT +int bacnet_action_property_value_decode( + uint8_t *apdu, uint32_t apdu_size, BACNET_ACTION_PROPERTY_VALUE *value); +BACNET_STACK_EXPORT +bool bacnet_action_property_value_same( + BACNET_ACTION_PROPERTY_VALUE *value1, BACNET_ACTION_PROPERTY_VALUE *value2); + +BACNET_STACK_EXPORT +int bacnet_action_command_encode(uint8_t *apdu, BACNET_ACTION_LIST *entry); + +BACNET_STACK_EXPORT +int bacnet_action_command_decode( + uint8_t *apdu, size_t apdu_size, BACNET_ACTION_LIST *entry); + +BACNET_STACK_EXPORT +bool bacnet_action_command_same( + BACNET_ACTION_LIST *entry1, BACNET_ACTION_LIST *entry2); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif diff --git a/src/bacnet/bacapp.c b/src/bacnet/bacapp.c index f3bb6aaa..9f5450ce 100644 --- a/src/bacnet/bacapp.c +++ b/src/bacnet/bacapp.c @@ -26,6 +26,7 @@ #include "bacnet/bactext.h" #include "bacnet/datetime.h" #include "bacnet/bacstr.h" +#include "bacnet/bacaction.h" #include "bacnet/lighting.h" #include "bacnet/hostnport.h" #include "bacnet/weeklyschedule.h" @@ -33,6 +34,121 @@ #include "bacnet/special_event.h" #include "bacnet/basic/sys/platform.h" +#if defined(BACAPP_SCALE) +/** + * @brief Encode a BACnetScale value. + * + * BACnetScale ::= CHOICE { + * float-scale [0] REAL, + * integer-scale [1] INTEGER + * } + * + * @param apdu - buffer to encode to + * @param value - value to encode + * @return number of bytes encoded + */ +static int bacnet_scale_encode(uint8_t *apdu, BACNET_SCALE *value) +{ + int apdu_len = 0; + + if (value) { + if (value->float_scale) { + apdu_len += encode_context_real(apdu, 0, value->type.real_scale); + } else { + apdu_len += + encode_context_signed(apdu, 1, value->type.integer_scale); + } + } + + return apdu_len; +} +#endif + +#if defined(BACAPP_SCALE) +/** + * @brief Decode a BACnetScale value. + * + * BACnetScale ::= CHOICE { + * float-scale [0] REAL, + * integer-scale [1] INTEGER + * } + * + * @param apdu - buffer to decode to + * @param apdu_size - size of the buffer + * @param value - value to encode + * @return number of bytes decoded, or BACNET_STATUS_ERROR on error + */ +static int +bacnet_scale_decode(uint8_t *apdu, size_t apdu_size, BACNET_SCALE *value) +{ + int len = 0; + int apdu_len = 0; + BACNET_TAG tag = { 0 }; + int32_t signed_value = 0; + float real_value = 0.0f; + + if (!apdu) { + return BACNET_STATUS_ERROR; + } + len = bacnet_tag_decode(&apdu[apdu_len], apdu_size - apdu_len, &tag); + if (len <= 0) { + return BACNET_STATUS_ERROR; + } + switch (tag.number) { + case 0: + len = bacnet_real_context_decode( + &apdu[apdu_len], apdu_size - apdu_len, tag.number, &real_value); + if (len > 0) { + value->float_scale = true; + value->type.real_scale = real_value; + apdu_len += len; + } + break; + case 1: + len = bacnet_signed_context_decode( + &apdu[apdu_len], apdu_size - apdu_len, tag.number, + &signed_value); + if (len > 0) { + value->float_scale = false; + value->type.integer_scale = signed_value; + apdu_len += len; + } + break; + default: + return BACNET_STATUS_ERROR; + } + + return apdu_len; +} +#endif + +#if defined(BACAPP_SCALE) +static bool bacnet_scale_same(BACNET_SCALE *value1, BACNET_SCALE *value2) +{ + bool status = false; + + if (value1 && value2) { + status = true; + if (value1->float_scale != value2->float_scale) { + status = false; + } else { + if (value1->float_scale) { + if (islessgreater( + value1->type.real_scale, value2->type.real_scale)) { + status = false; + } + } else { + if (value1->type.integer_scale != value2->type.integer_scale) { + status = false; + } + } + } + } + + return status; +} +#endif + /** * @brief Encode application data given by a pointer into the APDU. * @param apdu - Pointer to the buffer to encode to, or NULL for length @@ -226,6 +342,19 @@ int bacapp_encode_application_data( apdu_len = bacnet_fdt_entry_encode(apdu, &value->type.FDT_Entry); break; +#endif +#if defined(BACAPP_ACTION_COMMAND) + case BACNET_APPLICATION_TAG_ACTION_COMMAND: + /* BACnetActionCommand */ + apdu_len = bacnet_action_command_encode( + apdu, &value->type.Action_Command); + break; +#endif +#if defined(BACAPP_SCALE) + case BACNET_APPLICATION_TAG_SCALE: + /* BACnetScale */ + apdu_len = bacnet_scale_encode(apdu, &value->type.Scale); + break; #endif default: break; @@ -236,7 +365,7 @@ int bacapp_encode_application_data( } /** - * @brief Decode the data and store it into value. + * @brief Decode application tagged data and store it into value. * @param apdu Receive buffer * @param apdu_size Size of the receive buffer * @param tag_data_type Data type of the given tag @@ -338,110 +467,6 @@ int bacapp_data_decode( &value->type.Object_Id.type, &value->type.Object_Id.instance); } break; -#endif -#if defined(BACAPP_TIMESTAMP) - case BACNET_APPLICATION_TAG_TIMESTAMP: - len = bacnet_timestamp_decode( - apdu, apdu_size, &value->type.Time_Stamp); - break; -#endif -#if defined(BACAPP_DATETIME) - case BACNET_APPLICATION_TAG_DATETIME: - len = bacnet_datetime_decode( - apdu, apdu_size, &value->type.Date_Time); - break; -#endif -#if defined(BACAPP_DATERANGE) - case BACNET_APPLICATION_TAG_DATERANGE: - len = bacnet_daterange_decode( - apdu, apdu_size, &value->type.Date_Range); - break; -#endif -#if defined(BACAPP_LIGHTING_COMMAND) - case BACNET_APPLICATION_TAG_LIGHTING_COMMAND: - len = lighting_command_decode( - apdu, apdu_size, &value->type.Lighting_Command); - break; -#endif -#if defined(BACAPP_XY_COLOR) - case BACNET_APPLICATION_TAG_XY_COLOR: - /* BACnetxyColor */ - len = xy_color_decode(apdu, apdu_size, &value->type.XY_Color); - break; -#endif -#if defined(BACAPP_COLOR_COMMAND) - case BACNET_APPLICATION_TAG_COLOR_COMMAND: - /* BACnetColorCommand */ - len = color_command_decode( - apdu, apdu_size, NULL, &value->type.Color_Command); - break; -#endif -#if defined(BACAPP_WEEKLY_SCHEDULE) - case BACNET_APPLICATION_TAG_WEEKLY_SCHEDULE: - len = bacnet_weeklyschedule_decode( - apdu, apdu_size, &value->type.Weekly_Schedule); - break; -#endif -#if defined(BACAPP_CALENDAR_ENTRY) - case BACNET_APPLICATION_TAG_CALENDAR_ENTRY: - len = bacnet_calendar_entry_decode( - apdu, apdu_size, &value->type.Calendar_Entry); - break; -#endif -#if defined(BACAPP_SPECIAL_EVENT) - case BACNET_APPLICATION_TAG_SPECIAL_EVENT: - len = bacnet_special_event_decode( - apdu, apdu_size, &value->type.Special_Event); - break; -#endif -#if defined(BACAPP_HOST_N_PORT) - case BACNET_APPLICATION_TAG_HOST_N_PORT: - len = host_n_port_decode( - apdu, apdu_size, NULL, &value->type.Host_Address); - break; -#endif -#if defined(BACAPP_DEVICE_OBJECT_PROPERTY_REFERENCE) - case BACNET_APPLICATION_TAG_DEVICE_OBJECT_PROPERTY_REFERENCE: - /* BACnetDeviceObjectPropertyReference */ - len = bacnet_device_object_property_reference_decode( - apdu, apdu_size, - &value->type.Device_Object_Property_Reference); - break; -#endif -#if defined(BACAPP_DEVICE_OBJECT_REFERENCE) - case BACNET_APPLICATION_TAG_DEVICE_OBJECT_REFERENCE: - /* BACnetDeviceObjectReference */ - len = bacnet_device_object_reference_decode( - apdu, apdu_size, &value->type.Device_Object_Reference); - break; -#endif -#if defined(BACAPP_OBJECT_PROPERTY_REFERENCE) - case BACNET_APPLICATION_TAG_OBJECT_PROPERTY_REFERENCE: - /* BACnetObjectPropertyReference */ - len = bacapp_decode_obj_property_ref( - apdu, apdu_size, &value->type.Object_Property_Reference); - break; -#endif -#if defined(BACAPP_DESTINATION) - case BACNET_APPLICATION_TAG_DESTINATION: - /* BACnetDestination */ - len = bacnet_destination_decode( - apdu, apdu_size, &value->type.Destination); - break; -#endif -#if defined(BACAPP_BDT_ENTRY) - case BACNET_APPLICATION_TAG_BDT_ENTRY: - /* BACnetBDTEntry */ - len = bacnet_bdt_entry_decode( - apdu, apdu_size, NULL, &value->type.BDT_Entry); - break; -#endif -#if defined(BACAPP_FDT_ENTRY) - case BACNET_APPLICATION_TAG_FDT_ENTRY: - /* BACnetFDTEntry */ - len = bacnet_fdt_entry_decode( - apdu, apdu_size, NULL, &value->type.FDT_Entry); - break; #endif default: break; @@ -590,43 +615,17 @@ bool bacapp_decode_application_data_safe( /** * @brief Decode the data to determine the data length - * @param apdu Pointer to the received data. - * @param tag_data_type Data type to be decoded. - * @param len_value_type Length of the data in bytes. - * @return Number of bytes decoded. + * @param apdu Pointer to the received data. + * @param tag_number Data type to be decoded. + * @param len_value_type Length of the data in bytes. + * @return datalength for the given tag, or INT_MAX if out of range. + * @deprecated Use bacnet_application_data_length() instead. */ int bacapp_decode_data_len( - uint8_t *apdu, uint8_t tag_data_type, uint32_t len_value_type) + uint8_t *apdu, uint8_t tag_number, uint32_t len_value_type) { - int len = 0; - (void)apdu; - switch (tag_data_type) { - case BACNET_APPLICATION_TAG_NULL: - break; - case BACNET_APPLICATION_TAG_BOOLEAN: - break; - case BACNET_APPLICATION_TAG_UNSIGNED_INT: - case BACNET_APPLICATION_TAG_SIGNED_INT: - case BACNET_APPLICATION_TAG_REAL: - case BACNET_APPLICATION_TAG_DOUBLE: - case BACNET_APPLICATION_TAG_OCTET_STRING: - case BACNET_APPLICATION_TAG_CHARACTER_STRING: - case BACNET_APPLICATION_TAG_BIT_STRING: - case BACNET_APPLICATION_TAG_ENUMERATED: - case BACNET_APPLICATION_TAG_DATE: - case BACNET_APPLICATION_TAG_TIME: - case BACNET_APPLICATION_TAG_OBJECT_ID: - len = (int)(~0U >> 1); - if (len_value_type < (uint32_t)len) { - len = (int)len_value_type; - } - break; - default: - break; - } - - return len; + return bacnet_application_data_length(tag_number, len_value_type); } /** @@ -634,29 +633,43 @@ int bacapp_decode_data_len( * @param apdu - buffer of data to be decoded * @param apdu_size - number of bytes in the buffer * @return number of bytes decoded, or zero if errors occur + * @deprecated Use bacnet_enclosed_data_length() instead. */ int bacapp_decode_application_data_len(uint8_t *apdu, unsigned apdu_size) { - int apdu_len = 0; int len = 0; - BACNET_TAG tag = { 0 }; + int tag_len = 0; + int decode_len = 0; + BACNET_TAG tag = {0}; - len = bacnet_tag_decode(apdu, apdu_size, &tag); - if ((len > 0) && (tag.application)) { - apdu_len += len; - len = bacapp_decode_data_len(NULL, tag.number, tag.len_value_type); - apdu_len += len; + if (!bacnet_is_context_specific(apdu, apdu_size)) { + tag_len = bacnet_tag_decode(apdu, apdu_size, &tag); + if (tag_len > 0) { + len += tag_len; + decode_len = bacnet_application_data_length(tag.number, + tag.len_value_type); + len += decode_len; + } } - return apdu_len; + return len; } +/** + * @brief Encode a BACnet Context tagged data, + * or enclosed data for complex types + * @param apdu - buffer to encode to, or NULL for length + * @param context_tag_number - context tag number + * @param value - value to encode + * @return number of bytes encoded + */ int bacapp_encode_context_data_value( uint8_t *apdu, uint8_t context_tag_number, BACNET_APPLICATION_DATA_VALUE *value) { int apdu_len = 0; /* total length of the apdu, return value */ + int len; if (value) { switch (value->tag) { @@ -738,117 +751,40 @@ int bacapp_encode_context_data_value( value->type.Object_Id.instance); break; #endif -#if defined(BACAPP_TIMESTAMP) case BACNET_APPLICATION_TAG_TIMESTAMP: - apdu_len = bacapp_encode_context_timestamp( - apdu, context_tag_number, &value->type.Time_Stamp); - break; -#endif -#if defined(BACAPP_DATETIME) case BACNET_APPLICATION_TAG_DATETIME: - apdu_len = bacapp_encode_context_datetime( - apdu, context_tag_number, &value->type.Date_Time); - break; -#endif -#if defined(BACAPP_DATERANGE) case BACNET_APPLICATION_TAG_DATERANGE: - apdu_len = bacnet_daterange_context_encode( - apdu, context_tag_number, &value->type.Date_Range); - break; -#endif -#if defined(BACAPP_LIGHTING_COMMAND) case BACNET_APPLICATION_TAG_LIGHTING_COMMAND: - apdu_len = lighting_command_encode_context( - apdu, context_tag_number, &value->type.Lighting_Command); - break; -#endif -#if defined(BACAPP_XY_COLOR) case BACNET_APPLICATION_TAG_XY_COLOR: - /* BACnetxyColor */ - apdu_len = xy_color_context_encode( - apdu, context_tag_number, &value->type.XY_Color); - break; -#endif -#if defined(BACAPP_CALENDAR_ENTRY) case BACNET_APPLICATION_TAG_CALENDAR_ENTRY: - /* BACnetWeeklySchedule */ - apdu_len = bacnet_calendar_entry_context_encode( - apdu, context_tag_number, &value->type.Calendar_Entry); - break; -#endif -#if defined(BACAPP_SPECIAL_EVENT) case BACNET_APPLICATION_TAG_SPECIAL_EVENT: - /* BACnetWeeklySchedule */ - apdu_len = bacnet_special_event_context_encode( - apdu, context_tag_number, &value->type.Special_Event); - break; -#endif -#if defined(BACAPP_COLOR_COMMAND) case BACNET_APPLICATION_TAG_COLOR_COMMAND: - /* BACnetColorCommand */ - apdu_len = color_command_context_encode( - apdu, context_tag_number, &value->type.Color_Command); - break; -#endif -#if defined(BACAPP_WEEKLY_SCHEDULE) case BACNET_APPLICATION_TAG_WEEKLY_SCHEDULE: - /* BACnetWeeklySchedule */ - apdu_len = bacnet_weeklyschedule_context_encode( - apdu, context_tag_number, &value->type.Weekly_Schedule); - break; -#endif -#if defined(BACAPP_HOST_N_PORT) case BACNET_APPLICATION_TAG_HOST_N_PORT: - apdu_len = host_n_port_context_encode( - apdu, context_tag_number, &value->type.Host_Address); - break; -#endif -#if defined(BACAPP_DEVICE_OBJECT_PROPERTY_REFERENCE) case BACNET_APPLICATION_TAG_DEVICE_OBJECT_PROPERTY_REFERENCE: - /* BACnetDeviceObjectPropertyReference */ - apdu_len = bacapp_encode_context_device_obj_property_ref( - apdu, context_tag_number, - &value->type.Device_Object_Property_Reference); - break; -#endif -#if defined(BACAPP_DEVICE_OBJECT_REFERENCE) case BACNET_APPLICATION_TAG_DEVICE_OBJECT_REFERENCE: - /* BACnetDeviceObjectReference */ - apdu_len = bacapp_encode_context_device_obj_ref( - apdu, context_tag_number, - &value->type.Device_Object_Reference); - break; -#endif -#if defined(BACAPP_OBJECT_PROPERTY_REFERENCE) case BACNET_APPLICATION_TAG_OBJECT_PROPERTY_REFERENCE: - /* BACnetObjectPropertyReference */ - apdu_len = bacapp_encode_context_obj_property_ref( - apdu, context_tag_number, - &value->type.Object_Property_Reference); - break; -#endif -#if defined(BACAPP_DESTINATION) case BACNET_APPLICATION_TAG_DESTINATION: - /* BACnetDestination */ - apdu_len = bacnet_destination_context_encode( - apdu, context_tag_number, &value->type.Destination); - break; -#endif -#if defined(BACAPP_BDT_ENTRY) case BACNET_APPLICATION_TAG_BDT_ENTRY: - /* BACnetBDTEntry */ - apdu_len = bacnet_bdt_entry_context_encode( - apdu, context_tag_number, &value->type.BDT_Entry); - break; -#endif -#if defined(BACAPP_FDT_ENTRY) case BACNET_APPLICATION_TAG_FDT_ENTRY: - /* BACnetFDTEntry */ - apdu_len = bacnet_fdt_entry_context_encode( - apdu, context_tag_number, &value->type.FDT_Entry); + case BACNET_APPLICATION_TAG_ACTION_COMMAND: + case BACNET_APPLICATION_TAG_SCALE: + /* complex data is enclosed in open/close tags */ + len = encode_opening_tag(apdu, context_tag_number); + apdu_len += len; + if (apdu) { + apdu += len; + } + len = bacapp_encode_application_data(apdu, value); + apdu_len += len; + if (apdu) { + apdu += len; + } + len = encode_closing_tag(apdu, context_tag_number); + apdu_len += len; break; -#endif default: + (void)len; break; } } @@ -856,330 +792,45 @@ int bacapp_encode_context_data_value( return apdu_len; } -/* returns the fixed tag type for certain context tagged properties */ +/** + * @brief Lookup an application tag for specific context tagged data + * @param property - object property identifier + * @param tag_number - context tag number used in the property + * @return application tag, or MAX_BACNET_APPLICATION_TAG if not known + * @deprecated Use bacapp_known_property_tag() instead. + * @note This function was accurate for data constructed as a SEQUENCE, + * but not for data that used CHOICE. It is deprecated. + */ BACNET_APPLICATION_TAG bacapp_context_tag_type(BACNET_PROPERTY_ID property, uint8_t tag_number) { BACNET_APPLICATION_TAG tag = MAX_BACNET_APPLICATION_TAG; - switch (property) { - case PROP_DATE_LIST: - /* BACnetCalendarEntry ::= CHOICE { - date [0] Date, - date-range [1] BACnetDateRange, - weekNDay [2] BACnetWeekNDay - } - */ - switch (tag_number) { - case 0: /* single calendar date */ - tag = BACNET_APPLICATION_TAG_DATE; - break; - case 1: /* range of dates */ - tag = BACNET_APPLICATION_TAG_DATERANGE; - break; - case 2: /* selection of weeks, month, and day of month */ - tag = BACNET_APPLICATION_TAG_WEEKNDAY; - break; - default: - break; - } - break; - case PROP_ACTUAL_SHED_LEVEL: - case PROP_REQUESTED_SHED_LEVEL: - case PROP_EXPECTED_SHED_LEVEL: - /* BACnetShedLevel ::= CHOICE { - percent [0] Unsigned, - level [1] Unsigned, - amount [2] REAL - } - */ - switch (tag_number) { - case 0: - case 1: - tag = BACNET_APPLICATION_TAG_UNSIGNED_INT; - break; - case 2: - tag = BACNET_APPLICATION_TAG_REAL; - break; - default: - break; - } - break; - case PROP_ACTION: - /* BACnetActionCommand ::= SEQUENCE { - device-identifier [0] BACnetObjectIdentifier OPTIONAL, - object-identifier [1] BACnetObjectIdentifier, - property-identifier [2] BACnetPropertyIdentifier, - property-array-index [3] Unsigned OPTIONAL, - property-value [4] ABSTRACT-SYNTAX.&Type, - priority [5] Unsigned (1..16) OPTIONAL, - post-delay [6] Unsigned OPTIONAL, - quit-on-failure [7] BOOLEAN, - write-successful [8] BOOLEAN - } - */ - switch (tag_number) { - case 0: - case 1: - tag = BACNET_APPLICATION_TAG_OBJECT_ID; - break; - case 2: - tag = BACNET_APPLICATION_TAG_ENUMERATED; - break; - case 3: - case 5: - case 6: - tag = BACNET_APPLICATION_TAG_UNSIGNED_INT; - break; - case 7: - case 8: - tag = BACNET_APPLICATION_TAG_BOOLEAN; - break; - case 4: /* propertyValue: abstract syntax */ - default: - break; - } - break; - case PROP_LIST_OF_GROUP_MEMBERS: - /* ReadAccessSpecification ::= SEQUENCE { - object-identifier [0] BACnetObjectIdentifier, - list-of-property-references [1] SEQUENCE OF - BACnetPropertyReference - } - */ - switch (tag_number) { - case 0: - tag = BACNET_APPLICATION_TAG_OBJECT_ID; - break; - default: - break; - } - break; - case PROP_EXCEPTION_SCHEDULE: - switch (tag_number) { - case 1: - tag = BACNET_APPLICATION_TAG_OBJECT_ID; - break; - case 3: - tag = BACNET_APPLICATION_TAG_UNSIGNED_INT; - break; - case 0: /* calendarEntry: abstract syntax + context */ - case 2: /* list of BACnetTimeValue: abstract syntax */ - default: - break; - } - break; - case PROP_LOG_DEVICE_OBJECT_PROPERTY: - case PROP_OBJECT_PROPERTY_REFERENCE: - switch (tag_number) { - case 0: /* Object ID */ - case 3: /* Device ID */ - tag = BACNET_APPLICATION_TAG_OBJECT_ID; - break; - case 1: /* Property ID */ - tag = BACNET_APPLICATION_TAG_ENUMERATED; - break; - case 2: /* Array index */ - tag = BACNET_APPLICATION_TAG_UNSIGNED_INT; - break; - default: - break; - } - break; - case PROP_SUBORDINATE_LIST: - /* BACnetARRAY[N] of BACnetDeviceObjectReference */ - switch (tag_number) { - case 0: /* Optional Device ID */ - case 1: /* Object ID */ - tag = BACNET_APPLICATION_TAG_OBJECT_ID; - break; - default: - break; - } - break; - case PROP_RECIPIENT_LIST: - /* List of BACnetDestination */ - switch (tag_number) { - case 0: /* Device Object ID */ - tag = BACNET_APPLICATION_TAG_OBJECT_ID; - break; - case 1: - /* BACnetRecipient::= CHOICE { - device [0] BACnetObjectIdentifier - -->address [1] BACnetAddress - } - */ - break; - default: - break; - } - break; - case PROP_ACTIVE_COV_SUBSCRIPTIONS: - /* BACnetCOVSubscription ::= SEQUENCE { - recipient [0] BACnetRecipientProcess, - monitored-property-reference [1] BACnetObjectPropertyReference, - issue-confirmed-notifications [2] BOOLEAN, - time-remaining [3] Unsigned, - cov-increment [4] REAL OPTIONAL - -- used only with monitored - -- properties with a numeric datatype - } - */ - switch (tag_number) { - case 0: - /* BACnetRecipientProcess ::= SEQUENCE { - recipient [0] BACnetRecipient, - process-identifier [1] Unsigned32 - } - */ - break; - case 1: /* BACnetObjectPropertyReference */ - tag = BACNET_APPLICATION_TAG_OBJECT_PROPERTY_REFERENCE; - break; - case 2: /* issueConfirmedNotifications */ - tag = BACNET_APPLICATION_TAG_BOOLEAN; - break; - case 3: /* timeRemaining */ - tag = BACNET_APPLICATION_TAG_UNSIGNED_INT; - break; - case 4: /* covIncrement */ - tag = BACNET_APPLICATION_TAG_REAL; - break; - default: - break; - } - break; - case PROP_SETPOINT_REFERENCE: - switch (tag_number) { - case 0: - tag = BACNET_APPLICATION_TAG_OBJECT_PROPERTY_REFERENCE; - break; - default: - break; - } - break; - case PROP_FD_BBMD_ADDRESS: - case PROP_BACNET_IP_GLOBAL_ADDRESS: - switch (tag_number) { - case 0: - tag = BACNET_APPLICATION_TAG_HOST_N_PORT; - break; - default: - break; - } - break; - case PROP_LIGHTING_COMMAND: - switch (tag_number) { - case 0: - tag = BACNET_APPLICATION_TAG_LIGHTING_COMMAND; - break; - default: - break; - } - break; - case PROP_COLOR_COMMAND: - switch (tag_number) { - case 0: - tag = BACNET_APPLICATION_TAG_COLOR_COMMAND; - break; - default: - break; - } - break; - case PROP_LIST_OF_OBJECT_PROPERTY_REFERENCES: - case PROP_GROUP_MEMBERS: - switch (tag_number) { - case 0: - tag = - BACNET_APPLICATION_TAG_DEVICE_OBJECT_PROPERTY_REFERENCE; - break; - default: - break; - } - break; - case PROP_EVENT_TIME_STAMPS: - /* BACnetTimeStamp ::= CHOICE { - time [0] Time, -- deprecated in version 1 revision 21 - sequence-number [1] Unsigned (0..65535), - datetime [2] BACnetDateTime - } - */ - switch (tag_number) { - case TIME_STAMP_TIME: - tag = BACNET_APPLICATION_TAG_TIMESTAMP; - break; - case TIME_STAMP_SEQUENCE: - tag = BACNET_APPLICATION_TAG_UNSIGNED_INT; - break; - case TIME_STAMP_DATETIME: - tag = BACNET_APPLICATION_TAG_DATETIME; - break; - default: - break; - } - break; - case PROP_SCALE: - /* BACnetScale ::= CHOICE { - float-scale [0] REAL, - integer-scale [1] INTEGER - } - */ - switch (tag_number) { - case 0: - tag = BACNET_APPLICATION_TAG_REAL; - break; - case 1: - tag = BACNET_APPLICATION_TAG_SIGNED_INT; - break; - default: - break; - } - break; - case PROP_PRESCALE: - /* BACnetPrescale ::= SEQUENCE { - multiplier [0] Unsigned, - modulo-divide [1] Unsigned - } - */ - switch (tag_number) { - case 0: - tag = BACNET_APPLICATION_TAG_UNSIGNED_INT; - break; - case 1: - tag = BACNET_APPLICATION_TAG_UNSIGNED_INT; - break; - default: - break; - } - break; - default: - break; + (void)tag_number; + tag = bacapp_known_property_tag(MAX_BACNET_OBJECT_TYPE, property); + if (tag == -1) { + tag = MAX_BACNET_APPLICATION_TAG; } return tag; } +/** + * @brief Encode a BACnet Context tagged data + * @param apdu - buffer to encode to, or NULL for length + * @param value - value to encode from + * @param property - object property identifier + * @return number of bytes encoded + * @deprecated Use bacapp_encode_known_property() instead. + */ int bacapp_encode_context_data( uint8_t *apdu, BACNET_APPLICATION_DATA_VALUE *value, BACNET_PROPERTY_ID property) { - int apdu_len = 0; - BACNET_APPLICATION_TAG tag_data_type; + BACNET_OBJECT_TYPE object_type = MAX_BACNET_OBJECT_TYPE; - if (value && apdu) { - tag_data_type = bacapp_context_tag_type(property, value->context_tag); - if (tag_data_type != MAX_BACNET_APPLICATION_TAG) { - apdu_len = bacapp_encode_context_data_value( - &apdu[0], tag_data_type, value); - } else { - /* FIXME: what now? */ - apdu_len = 0; - } - value->next = NULL; - } - - return apdu_len; + return bacapp_encode_known_property(apdu, value, object_type, property); } /** @@ -1190,6 +841,7 @@ int bacapp_encode_context_data( * @param value - stores the decoded property value * @param property - context property identifier * @return number of bytes decoded, or #BACNET_STATUS_ERROR + * @deprecated Use bacapp_decode_known_property() instead. */ int bacapp_decode_context_data( uint8_t *apdu, @@ -1197,45 +849,10 @@ int bacapp_decode_context_data( BACNET_APPLICATION_DATA_VALUE *value, BACNET_PROPERTY_ID property) { - int apdu_len = 0, len = 0; - BACNET_TAG tag = { 0 }; + BACNET_OBJECT_TYPE object_type = MAX_BACNET_OBJECT_TYPE; - if (!value) { - return apdu_len; - } - len = bacnet_tag_decode(&apdu[0], apdu_size, &tag); - if (len > 0) { - if (tag.closing) { - /* Empty construct : (closing tag) */ - /* Don't advance over that closing tag. */ - apdu_len = 0; - } else if (tag.context) { - apdu_len += len; - value->context_specific = true; - value->next = NULL; - value->context_tag = tag.number; - value->tag = bacapp_context_tag_type(property, tag.number); - if (value->tag != MAX_BACNET_APPLICATION_TAG) { - len = bacapp_data_decode( - &apdu[apdu_len], apdu_size - apdu_len, value->tag, - tag.len_value_type, value); - if ((len >= 0) && (value->tag != MAX_BACNET_APPLICATION_TAG)) { - apdu_len += len; - } else { - apdu_len = BACNET_STATUS_ERROR; - } - } else if (tag.len_value_type) { - /* Unknown value : non null size (elementary type) */ - apdu_len += tag.len_value_type; - /* SHOULD NOT HAPPEN, EXCEPTED WHEN READING UNKNOWN CONTEXTUAL - * PROPERTY */ - } else { - apdu_len = BACNET_STATUS_ERROR; - } - } - } - - return apdu_len; + return bacapp_decode_known_property( + apdu, apdu_size, value, object_type, property); } #if defined(BACAPP_COMPLEX_TYPES) @@ -1247,6 +864,7 @@ int bacapp_decode_context_data( * @param value - stores the decoded property value * @param property - context property identifier * @return number of bytes decoded, or #BACNET_STATUS_ERROR + * @deprecated Use bacapp_decode_known_property() instead. */ int bacapp_decode_generic_property( uint8_t *apdu, @@ -1272,16 +890,35 @@ int bacapp_decode_generic_property( /** * @brief Decode BACnetPriorityValue complex data * + * BACnetPriorityValue ::= CHOICE { + * null NULL, + * real REAL, + * enumerated ENUMERATED, + * unsigned Unsigned, + * boolean BOOLEAN, + * integer INTEGER, + * double Double, + * time Time, + * characterstring CharacterString, + * octetstring OCTET STRING, + * bitstring BIT STRING, + * date Date, + * objectidentifier BACnetObjectIdentifier, + * constructed-value [0] ABSTRACT-SYNTAX.&Type, + * datetime [1] BACnetDateTime + * } + * * @param apdu - buffer of data to be decoded * @param apdu_size - number of bytes in the buffer * @param value - stores the decoded property value * @param property - context property identifier * @return number of bytes decoded, or #BACNET_STATUS_ERROR */ -static int decode_priority_value( +static int decode_priority_array_value( uint8_t *apdu, unsigned apdu_size, BACNET_APPLICATION_DATA_VALUE *value, + BACNET_OBJECT_TYPE object_type, BACNET_PROPERTY_ID property) { int apdu_len = 0; @@ -1290,8 +927,9 @@ static int decode_priority_value( if (bacnet_is_opening_tag_number(apdu, apdu_size, 0, &len)) { /* Contextual Abstract-syntax & type */ apdu_len += len; - len = bacapp_decode_generic_property( - &apdu[apdu_len], apdu_size - apdu_len, value, property); + len = bacapp_decode_known_property( + &apdu[apdu_len], apdu_size - apdu_len, value, object_type, + property); if (len < 0) { return BACNET_STATUS_ERROR; } @@ -1302,23 +940,30 @@ static int decode_priority_value( } apdu_len += len; } else { - apdu_len = - bacapp_decode_generic_property(apdu, apdu_size, value, property); + apdu_len = bacapp_decode_known_property( + &apdu[apdu_len], apdu_size - apdu_len, value, object_type, + property); } return apdu_len; } #endif -#if defined(BACAPP_COMPLEX_TYPES) +/** + * @brief Determine a pseudo application tag for a known property + * @param object_type - BACNET_OBJECT_TYPE + * @param property - BACNET_PROPERTY_ID + * @return pseudo BACNET_APPLICATION_TAG or -1 if not known + */ int bacapp_known_property_tag( BACNET_OBJECT_TYPE object_type, BACNET_PROPERTY_ID property) { +#if defined(BACAPP_COMPLEX_TYPES) switch (property) { - case PROP_MEMBER_OF: case PROP_ZONE_MEMBERS: case PROP_DOOR_MEMBERS: case PROP_SUBORDINATE_LIST: + case PROP_REPRESENTS: case PROP_ACCESS_EVENT_CREDENTIAL: case PROP_ACCESS_DOORS: case PROP_ZONE_FROM: @@ -1329,10 +974,13 @@ int bacapp_known_property_tag( case PROP_ENTRY_POINTS: case PROP_EXIT_POINTS: case PROP_MEMBERS: + case PROP_MEMBER_OF: case PROP_CREDENTIALS: case PROP_ACCOMPANIMENT: case PROP_BELONGS_TO: case PROP_LAST_ACCESS_POINT: + case PROP_ENERGY_METER_REF: + case PROP_TARGET_REFERENCES: /* Properties using BACnetDeviceObjectReference */ return BACNET_APPLICATION_TAG_DEVICE_OBJECT_REFERENCE; @@ -1383,7 +1031,13 @@ int bacapp_known_property_tag( if (object_type == OBJECT_COLOR) { /* Properties using BACnetxyColor */ return BACNET_APPLICATION_TAG_XY_COLOR; + } else if ( + (object_type == OBJECT_DATETIME_PATTERN_VALUE) || + (object_type == OBJECT_DATETIME_VALUE)) { + /* Properties using BACnetDateTime */ + return BACNET_APPLICATION_TAG_DATETIME; } + /* note: primitive application tagged present-values return '-1' */ return -1; case PROP_COLOR_COMMAND: @@ -1439,8 +1093,11 @@ int bacapp_known_property_tag( return -1; case PROP_ACTION: - /* FIXME: BACnetActionCommand */ - return -1; + /* BACnetActionCommand */ + return BACNET_APPLICATION_TAG_ACTION_COMMAND; + case PROP_SCALE: + /* BACnetScale */ + return BACNET_APPLICATION_TAG_SCALE; case PROP_FD_BBMD_ADDRESS: case PROP_BACNET_IP_GLOBAL_ADDRESS: @@ -1457,11 +1114,304 @@ int bacapp_known_property_tag( default: return -1; } +#else + return -1; +#endif +} + +/** + * @brief Decode the application value according to specific tag + * @param apdu - buffer of data to be decoded + * @param apdu_size - number of bytes in the buffer + * @param tag - BACNET_APPLICATION_TAG to be decoded + * @param value - stores the decoded property value + * @return number of bytes decoded (0..N), or #BACNET_STATUS_ERROR + */ +int bacapp_decode_application_tag_value( + uint8_t *apdu, + size_t apdu_size, + BACNET_APPLICATION_TAG tag, + BACNET_APPLICATION_DATA_VALUE *value) +{ + int apdu_len = 0; + + if (!value) { + return 0; + } + value->tag = tag; + switch (tag) { +#if defined(BACAPP_NULL) + case BACNET_APPLICATION_TAG_NULL: + /* nothing else to do */ + break; +#endif +#if defined(BACAPP_BOOLEAN) + case BACNET_APPLICATION_TAG_BOOLEAN: + apdu_len = bacnet_boolean_application_decode( + apdu, apdu_size, &value->type.Boolean); + if (apdu_len == 0) { + /* primitive value application decoders return 0 + when the wrong tag is encountered */ + apdu_len = BACNET_STATUS_ERROR; + } + break; +#endif +#if defined(BACAPP_UNSIGNED) + case BACNET_APPLICATION_TAG_UNSIGNED_INT: + apdu_len = bacnet_unsigned_application_decode( + apdu, apdu_size, &value->type.Unsigned_Int); + if (apdu_len == 0) { + /* primitive value application decoders return 0 + when the wrong tag is encountered */ + apdu_len = BACNET_STATUS_ERROR; + } + break; +#endif +#if defined(BACAPP_SIGNED) + case BACNET_APPLICATION_TAG_SIGNED_INT: + apdu_len = bacnet_signed_application_decode( + apdu, apdu_size, &value->type.Signed_Int); + if (apdu_len == 0) { + /* primitive value application decoders return 0 + when the wrong tag is encountered */ + apdu_len = BACNET_STATUS_ERROR; + } + break; +#endif +#if defined(BACAPP_REAL) + case BACNET_APPLICATION_TAG_REAL: + apdu_len = bacnet_real_application_decode( + apdu, apdu_size, &value->type.Real); + if (apdu_len == 0) { + /* primitive value application decoders return 0 + when the wrong tag is encountered */ + apdu_len = BACNET_STATUS_ERROR; + } + break; +#endif +#if defined(BACAPP_DOUBLE) + case BACNET_APPLICATION_TAG_DOUBLE: + apdu_len = bacnet_double_application_decode( + apdu, apdu_size, &value->type.Double); + if (apdu_len == 0) { + /* primitive value application decoders return 0 + when the wrong tag is encountered */ + apdu_len = BACNET_STATUS_ERROR; + } + break; +#endif +#if defined(BACAPP_OCTET_STRING) + case BACNET_APPLICATION_TAG_OCTET_STRING: + apdu_len = bacnet_octet_string_application_decode( + apdu, apdu_size, &value->type.Octet_String); + if (apdu_len == 0) { + /* primitive value application decoders return 0 + when the wrong tag is encountered */ + apdu_len = BACNET_STATUS_ERROR; + } + break; +#endif +#if defined(BACAPP_CHARACTER_STRING) + case BACNET_APPLICATION_TAG_CHARACTER_STRING: + apdu_len = bacnet_character_string_application_decode( + apdu, apdu_size, &value->type.Character_String); + if (apdu_len == 0) { + /* primitive value application decoders return 0 + when the wrong tag is encountered */ + apdu_len = BACNET_STATUS_ERROR; + } + break; +#endif +#if defined(BACAPP_BIT_STRING) + case BACNET_APPLICATION_TAG_BIT_STRING: + apdu_len = bacnet_bitstring_application_decode( + apdu, apdu_size, &value->type.Bit_String); + if (apdu_len == 0) { + apdu_len = BACNET_STATUS_ERROR; + } + break; +#endif +#if defined(BACAPP_ENUMERATED) + case BACNET_APPLICATION_TAG_ENUMERATED: + apdu_len = bacnet_enumerated_application_decode( + apdu, apdu_size, &value->type.Enumerated); + if (apdu_len == 0) { + /* primitive value application decoders return 0 + when the wrong tag is encountered */ + apdu_len = BACNET_STATUS_ERROR; + } + break; +#endif +#if defined(BACAPP_DATE) + case BACNET_APPLICATION_TAG_DATE: + apdu_len = bacnet_date_application_decode( + apdu, apdu_size, &value->type.Date); + if (apdu_len == 0) { + /* primitive value application decoders return 0 + when the wrong tag is encountered */ + apdu_len = BACNET_STATUS_ERROR; + } + break; +#endif +#if defined(BACAPP_TIME) + case BACNET_APPLICATION_TAG_TIME: + apdu_len = bacnet_time_application_decode( + apdu, apdu_size, &value->type.Time); + if (apdu_len == 0) { + /* primitive value application decoders return 0 + when the wrong tag is encountered */ + apdu_len = BACNET_STATUS_ERROR; + } + break; +#endif +#if defined(BACAPP_OBJECT_ID) + case BACNET_APPLICATION_TAG_OBJECT_ID: + apdu_len = bacnet_object_id_application_decode( + apdu, apdu_size, &value->type.Object_Id.type, + &value->type.Object_Id.instance); + if (apdu_len == 0) { + /* primitive value application decoders return 0 + when the wrong tag is encountered */ + apdu_len = BACNET_STATUS_ERROR; + } + break; +#endif + case BACNET_APPLICATION_TAG_EMPTYLIST: + apdu_len = 0; + break; +#if defined(BACAPP_DATETIME) + case BACNET_APPLICATION_TAG_DATETIME: + apdu_len = + bacnet_datetime_decode(apdu, apdu_size, &value->type.Date_Time); + break; +#endif +#if defined(BACAPP_TIMESTAMP) + case BACNET_APPLICATION_TAG_TIMESTAMP: + apdu_len = bacnet_timestamp_decode( + apdu, apdu_size, &value->type.Time_Stamp); + break; +#endif +#if defined(BACAPP_DATERANGE) + case BACNET_APPLICATION_TAG_DATERANGE: + apdu_len = bacnet_daterange_decode( + apdu, apdu_size, &value->type.Date_Range); + break; +#endif +#if defined(BACAPP_LIGHTING_COMMAND) + case BACNET_APPLICATION_TAG_LIGHTING_COMMAND: + /* BACnetLightingCommand */ + apdu_len = lighting_command_decode( + apdu, apdu_size, &value->type.Lighting_Command); + break; +#endif +#if defined(BACAPP_XY_COLOR) + case BACNET_APPLICATION_TAG_XY_COLOR: + /* BACnetxyColor */ + apdu_len = xy_color_decode(apdu, apdu_size, &value->type.XY_Color); + break; +#endif +#if defined(BACAPP_COLOR_COMMAND) + case BACNET_APPLICATION_TAG_COLOR_COMMAND: + /* BACnetColorCommand */ + apdu_len = color_command_decode( + apdu, apdu_size, NULL, &value->type.Color_Command); + break; +#endif +#if defined(BACAPP_WEEKLY_SCHEDULE) + case BACNET_APPLICATION_TAG_WEEKLY_SCHEDULE: + /* BACnetWeeklySchedule */ + apdu_len = bacnet_weeklyschedule_decode( + apdu, apdu_size, &value->type.Weekly_Schedule); + break; +#endif +#if defined(BACAPP_CALENDAR_ENTRY) + case BACNET_APPLICATION_TAG_CALENDAR_ENTRY: + /* BACnetCalendarEntry */ + apdu_len = bacnet_calendar_entry_decode( + apdu, apdu_size, &value->type.Calendar_Entry); + break; +#endif +#if defined(BACAPP_SPECIAL_EVENT) + case BACNET_APPLICATION_TAG_SPECIAL_EVENT: + /* BACnetSpecialEvent */ + apdu_len = bacnet_special_event_decode( + apdu, apdu_size, &value->type.Special_Event); + break; +#endif +#if defined(BACAPP_HOST_N_PORT) + case BACNET_APPLICATION_TAG_HOST_N_PORT: + /* BACnetHostNPort */ + apdu_len = host_n_port_decode( + apdu, apdu_size, NULL, &value->type.Host_Address); + break; +#endif +#if defined(BACAPP_DEVICE_OBJECT_PROPERTY_REFERENCE) + case BACNET_APPLICATION_TAG_DEVICE_OBJECT_PROPERTY_REFERENCE: + /* BACnetDeviceObjectPropertyReference */ + apdu_len = bacnet_device_object_property_reference_decode( + apdu, apdu_size, &value->type.Device_Object_Property_Reference); + break; +#endif +#if defined(BACAPP_DEVICE_OBJECT_REFERENCE) + case BACNET_APPLICATION_TAG_DEVICE_OBJECT_REFERENCE: + /* BACnetDeviceObjectReference */ + apdu_len = bacnet_device_object_reference_decode( + apdu, apdu_size, &value->type.Device_Object_Reference); + break; +#endif +#if defined(BACAPP_OBJECT_PROPERTY_REFERENCE) + case BACNET_APPLICATION_TAG_OBJECT_PROPERTY_REFERENCE: + /* BACnetObjectPropertyReference */ + apdu_len = bacapp_decode_obj_property_ref( + apdu, apdu_size, &value->type.Object_Property_Reference); + break; +#endif +#if defined(BACAPP_DESTINATION) + case BACNET_APPLICATION_TAG_DESTINATION: + /* BACnetDestination */ + apdu_len = bacnet_destination_decode( + apdu, apdu_size, &value->type.Destination); + break; +#endif +#if defined(BACAPP_BDT_ENTRY) + case BACNET_APPLICATION_TAG_BDT_ENTRY: + /* BACnetBDTEntry */ + apdu_len = bacnet_bdt_entry_decode( + apdu, apdu_size, NULL, &value->type.BDT_Entry); + break; +#endif +#if defined(BACAPP_FDT_ENTRY) + case BACNET_APPLICATION_TAG_FDT_ENTRY: + /* BACnetFDTEntry */ + apdu_len = bacnet_fdt_entry_decode( + apdu, apdu_size, NULL, &value->type.FDT_Entry); + break; +#endif +#if defined(BACAPP_ACTION_COMMAND) + case BACNET_APPLICATION_TAG_ACTION_COMMAND: + /* BACnetActionCommand */ + apdu_len = bacnet_action_command_decode( + apdu, apdu_size, &value->type.Action_Command); + break; +#endif +#if defined(BACAPP_SCALE) + case BACNET_APPLICATION_TAG_SCALE: + /* BACnetScale */ + apdu_len = bacnet_scale_decode(apdu, apdu_size, &value->type.Scale); + break; +#endif + default: + break; + } + + return apdu_len; } /** * @brief Decodes a well-known, possibly complex property value - * Used to reverse operations in bacapp_encode_application_data + * Used to reverse operations in bacapp_encode_application_data. + * @note This function is called repeatedly to decode array or lists one + * element at a time. * @param apdu - buffer of data to be decoded * @param max_apdu_len - number of bytes in the buffer * @param value - stores the decoded property value @@ -1471,268 +1421,73 @@ int bacapp_known_property_tag( */ int bacapp_decode_known_property( uint8_t *apdu, - int max_apdu_len, + int apdu_size, BACNET_APPLICATION_DATA_VALUE *value, BACNET_OBJECT_TYPE object_type, BACNET_PROPERTY_ID property) { - int len = 0; + int apdu_len = 0; + BACNET_APPLICATION_TAG tag; - /* NOTE: */ - /* When adding impl for a new prop, also add its tag */ - /* to bacapp_known_property_tag() */ - - int tag = bacapp_known_property_tag(object_type, property); - if (tag != -1) { - value->tag = tag; + if (bacnet_is_closing_tag(apdu, apdu_size)) { + if (value) { + value->tag = BACNET_APPLICATION_TAG_EMPTYLIST; + } + apdu_len = 0; + } else if (property == PROP_PRIORITY_ARRAY) { + /* BACnetPriorityValue */ + /* special case to reduce complexity - mostly encoded as application + tagged values, but sometimes encoded as abstract syntax or complex + data values */ + apdu_len = decode_priority_array_value( + apdu, apdu_size, value, object_type, PROP_PRESENT_VALUE); + } else { + /* Complex or primitive value? + Lookup the complex values using their object type and property */ + tag = bacapp_known_property_tag(object_type, property); + if (tag != -1) { + apdu_len = bacapp_decode_application_tag_value( + apdu, apdu_size, tag, value); + } else { + apdu_len = bacapp_decode_application_data(apdu, apdu_size, value); + } } - switch (property) { - case PROP_MEMBER_OF: - case PROP_ZONE_MEMBERS: - case PROP_DOOR_MEMBERS: - case PROP_SUBORDINATE_LIST: - case PROP_ACCESS_EVENT_CREDENTIAL: - case PROP_ACCESS_DOORS: - case PROP_ZONE_FROM: - case PROP_ZONE_TO: - case PROP_CREDENTIALS_IN_ZONE: - case PROP_LAST_CREDENTIAL_ADDED: - case PROP_LAST_CREDENTIAL_REMOVED: - case PROP_ENTRY_POINTS: - case PROP_EXIT_POINTS: - case PROP_MEMBERS: - case PROP_CREDENTIALS: - case PROP_ACCOMPANIMENT: - case PROP_BELONGS_TO: - case PROP_LAST_ACCESS_POINT: -#ifdef BACAPP_DEVICE_OBJECT_REFERENCE - /* Properties using BACnetDeviceObjectReference */ - len = bacapp_decode_device_obj_ref( - apdu, &value->type.Device_Object_Reference); -#endif - break; - - case PROP_TIME_OF_ACTIVE_TIME_RESET: - case PROP_TIME_OF_STATE_COUNT_RESET: - case PROP_CHANGE_OF_STATE_TIME: - case PROP_MAXIMUM_VALUE_TIMESTAMP: - case PROP_MINIMUM_VALUE_TIMESTAMP: - case PROP_VALUE_CHANGE_TIME: - case PROP_START_TIME: - case PROP_STOP_TIME: - case PROP_MODIFICATION_DATE: - case PROP_UPDATE_TIME: - case PROP_COUNT_CHANGE_TIME: - case PROP_LAST_CREDENTIAL_ADDED_TIME: - case PROP_LAST_CREDENTIAL_REMOVED_TIME: - case PROP_ACTIVATION_TIME: - case PROP_EXPIRATION_TIME: - case PROP_LAST_USE_TIME: -#ifdef BACAPP_DATETIME - /* Properties using BACnetDateTime value */ - len = bacnet_datetime_decode( - apdu, max_apdu_len, &value->type.Date_Time); -#endif - break; - - case PROP_OBJECT_PROPERTY_REFERENCE: - case PROP_LOG_DEVICE_OBJECT_PROPERTY: - case PROP_LIST_OF_OBJECT_PROPERTY_REFERENCES: -#ifdef BACAPP_DEVICE_OBJECT_PROPERTY_REFERENCE - /* Properties using BACnetDeviceObjectPropertyReference */ - len = bacnet_device_object_property_reference_decode( - apdu, max_apdu_len, - &value->type.Device_Object_Property_Reference); -#endif - break; - - case PROP_MANIPULATED_VARIABLE_REFERENCE: - case PROP_CONTROLLED_VARIABLE_REFERENCE: - case PROP_INPUT_REFERENCE: -#ifdef BACAPP_OBJECT_PROPERTY_REFERENCE - /* Properties using BACnetObjectPropertyReference */ - len = bacapp_decode_obj_property_ref( - apdu, max_apdu_len, &value->type.Object_Property_Reference); -#endif - break; - - case PROP_EVENT_TIME_STAMPS: - case PROP_LAST_RESTORE_TIME: - case PROP_TIME_OF_DEVICE_RESTART: - case PROP_ACCESS_EVENT_TIME: -#ifdef BACAPP_TIMESTAMP - /* Properties using BACnetTimeStamp */ - len = bacnet_timestamp_decode( - apdu, max_apdu_len, &value->type.Time_Stamp); -#endif - break; - - case PROP_DEFAULT_COLOR: -#ifdef BACAPP_XY_COLOR - /* Properties using BACnetxyColor */ - len = xy_color_decode(apdu, max_apdu_len, &value->type.XY_Color); -#endif - break; - case PROP_TRACKING_VALUE: - case PROP_PRESENT_VALUE: - if (object_type == OBJECT_COLOR) { -#ifdef BACAPP_XY_COLOR - /* Properties using BACnetxyColor */ - len = - xy_color_decode(apdu, max_apdu_len, &value->type.XY_Color); -#endif - } else { - /* Decode a "classic" simple property */ - len = bacapp_decode_generic_property( - apdu, max_apdu_len, value, property); - } - break; - - case PROP_COLOR_COMMAND: -#ifdef BACAPP_COLOR_COMMAND - /* Properties using BACnetColorCommand */ - len = color_command_decode( - apdu, max_apdu_len, NULL, &value->type.Color_Command); -#endif - break; - - case PROP_LIGHTING_COMMAND: -#ifdef BACAPP_LIGHTING_COMMAND - /* Properties using BACnetLightingCommand */ - len = lighting_command_decode( - apdu, max_apdu_len, &value->type.Lighting_Command); -#endif - break; - - case PROP_PRIORITY_ARRAY: - /* [16] BACnetPriorityValue : 16x values (simple property) */ - len = decode_priority_value(apdu, max_apdu_len, value, property); - break; - - case PROP_WEEKLY_SCHEDULE: -#ifdef BACAPP_WEEKLY_SCHEDULE - /* BACnetWeeklySchedule ([7] BACnetDailySchedule*/ - len = bacnet_weeklyschedule_decode( - apdu, max_apdu_len, &value->type.Weekly_Schedule); -#endif - break; - - case PROP_RECIPIENT_LIST: -#ifdef BACAPP_DESTINATION - len = bacnet_destination_decode( - apdu, max_apdu_len, &value->type.Destination); -#endif - break; - - case PROP_DATE_LIST: -#ifdef BACAPP_CALENDAR_ENTRY - /* List of BACnetCalendarEntry */ - len = bacnet_calendar_entry_decode( - apdu, max_apdu_len, &value->type.Calendar_Entry); -#endif - break; - - case PROP_EXCEPTION_SCHEDULE: -#ifdef BACAPP_SPECIAL_EVENT - /* List of BACnetSpecialEvent (Schedule) */ - len = bacnet_special_event_decode( - apdu, max_apdu_len, &value->type.Special_Event); -#endif - break; - - case PROP_EFFECTIVE_PERIOD: -#ifdef BACAPP_DATERANGE - /* BACnetDateRange (Schedule) */ - len = bacnet_daterange_decode( - apdu, max_apdu_len, &value->type.Date_Range); -#endif - break; - case PROP_FD_BBMD_ADDRESS: - case PROP_BACNET_IP_GLOBAL_ADDRESS: -#ifdef BACAPP_HOST_N_PORT - /* BACnetHostNPort */ - len = host_n_port_decode( - apdu, max_apdu_len, NULL, &value->type.Host_Address); -#endif - break; - case PROP_BBMD_BROADCAST_DISTRIBUTION_TABLE: -#ifdef BACAPP_BDT_ENTRY - /* BACnetBDTEntry */ - len = bacnet_bdt_entry_decode( - apdu, max_apdu_len, NULL, &value->type.BDT_Entry); -#endif - break; - case PROP_BBMD_FOREIGN_DEVICE_TABLE: -#ifdef BACAPP_FDT_ENTRY - /* BACnetFDTEntry */ - len = bacnet_fdt_entry_decode( - apdu, max_apdu_len, NULL, &value->type.FDT_Entry); -#endif - break; - - /* properties without a specific decoder - fall through to default - */ - - case PROP_LIST_OF_GROUP_MEMBERS: - /* Properties using ReadAccessSpecification */ - case PROP_ACTIVE_COV_SUBSCRIPTIONS: - /* FIXME: BACnetCOVSubscription */ - case PROP_TIME_SYNCHRONIZATION_RECIPIENTS: - case PROP_RESTART_NOTIFICATION_RECIPIENTS: - case PROP_UTC_TIME_SYNCHRONIZATION_RECIPIENTS: - /* FIXME: Properties using BACnetRecipient */ - case PROP_DEVICE_ADDRESS_BINDING: - case PROP_MANUAL_SLAVE_ADDRESS_BINDING: - case PROP_SLAVE_ADDRESS_BINDING: - /* FIXME: BACnetAddressBinding */ - case PROP_SCALE: - case PROP_ACTION: - default: - /* Decode a "classic" simple property */ - len = bacapp_decode_generic_property( - apdu, max_apdu_len, value, property); - break; - } - - return len; + return apdu_len; } -#endif #if defined(BACAPP_COMPLEX_TYPES) /** * @brief Determine the BACnet Context Data number of APDU bytes consumed - * * @param apdu - buffer of data to be decoded * @param apdu_len_max - number of bytes in the buffer * @param property - context property identifier - * * @return number of bytes decoded, or zero if errors occur + * @deprecated use bacnet_enclosed_data_length() instead */ int bacapp_decode_context_data_len( uint8_t *apdu, unsigned apdu_len_max, BACNET_PROPERTY_ID property) { int apdu_len = 0, len = 0; BACNET_TAG tag = { 0 }; - uint8_t application_tag = 0; + (void)property; len = bacnet_tag_decode(&apdu[0], apdu_len_max, &tag); if ((len > 0) && tag.context) { apdu_len = len; - application_tag = bacapp_context_tag_type(property, tag.number); - if (application_tag != MAX_BACNET_APPLICATION_TAG) { - len = bacapp_decode_data_len( - NULL, application_tag, tag.len_value_type); - apdu_len += len; - } else { - apdu_len += tag.len_value_type; - } + apdu_len += tag.len_value_type; } return apdu_len; } #endif +/** + * @brief Encode the data and store it into apdu. + * @param apdu Buffer to store the encoded data, or NULL for length only + * @param value Pointer to the application value structure + * @return Length of the encoded data in bytes + */ int bacapp_encode_data(uint8_t *apdu, BACNET_APPLICATION_DATA_VALUE *value) { int apdu_len = 0; /* total length of the apdu, return value */ @@ -1749,6 +1504,35 @@ int bacapp_encode_data(uint8_t *apdu, BACNET_APPLICATION_DATA_VALUE *value) return apdu_len; } +/** + * @brief Encode the data and store it into apdu. + * @param apdu Buffer to store the encoded data, or NULL for length only + * @param value Pointer to the application value structure with tag set + * the specific primitive types (gets overwritten for complex types) + * @return Length of the encoded data in bytes + */ +int bacapp_encode_known_property( + uint8_t *apdu, + BACNET_APPLICATION_DATA_VALUE *value, + BACNET_OBJECT_TYPE object_type, + BACNET_PROPERTY_ID property) +{ + int tag; + + tag = bacapp_known_property_tag(object_type, property); + if (tag != -1) { + value->tag = tag; + } + + return bacapp_encode_application_data(apdu, value); +} + +/** + * @brief Copy the application data value + * @param dest_value Pointer to the destination application value structure + * @param src_value Pointer to the source application value structure + * @return true on success, else false + */ bool bacapp_copy( BACNET_APPLICATION_DATA_VALUE *dest_value, BACNET_APPLICATION_DATA_VALUE *src_value) @@ -1857,89 +1641,41 @@ bool bacapp_copy( * @param property ID of the property to get the length for. * * @return Length in bytes 0..N, or BACNET_STATUS_ERROR. + * @deprecated Use bacnet_enclosed_data_length() instead. */ int bacapp_data_len( uint8_t *apdu, unsigned apdu_size, BACNET_PROPERTY_ID property) { - int len = 0; - int total_len = 0; - int apdu_len = 0; - BACNET_TAG tag = { 0 }; - uint8_t opening_tag_number = 0; - uint8_t opening_tag_number_counter = 0; - bool total_len_enable = false; + (void)property; + return bacnet_enclosed_data_length(apdu, apdu_size); +} - if (!apdu) { - return BACNET_STATUS_ERROR; - } - if (apdu_size <= apdu_len) { - /* error: exceeding our buffer limit */ - return BACNET_STATUS_ERROR; - } - if (!bacnet_is_opening_tag(apdu, apdu_size)) { - /* error: opening tag is missing */ - return BACNET_STATUS_ERROR; - } - do { - len = bacnet_tag_decode(apdu, apdu_size - apdu_len, &tag); - if (len == 0) { - return BACNET_STATUS_ERROR; - } - if (tag.opening) { - if (opening_tag_number_counter == 0) { - opening_tag_number = tag.number; - opening_tag_number_counter = 1; - total_len_enable = false; - } else if (tag.number == opening_tag_number) { - total_len_enable = true; - opening_tag_number_counter++; - } else { - total_len_enable = true; - } - } else if (tag.closing) { - if (tag.number == opening_tag_number) { - if (opening_tag_number_counter > 0) { - opening_tag_number_counter--; - } - } - total_len_enable = true; - } else if (tag.context) { -#if defined(BACAPP_COMPLEX_TYPES) - /* context-specific tagged data */ - len = bacapp_decode_context_data_len( - apdu, apdu_size - apdu_len, property); - total_len_enable = true; -#endif - } else { - /* application tagged data */ - len = - bacapp_decode_application_data_len(apdu, apdu_size - apdu_len); - total_len_enable = true; - } - if (opening_tag_number_counter > 0) { - if (len > 0) { - if (total_len_enable) { - total_len += len; - } - } else { - /* error: len is not incrementing */ - return BACNET_STATUS_ERROR; - } - apdu_len += len; - if (apdu_size <= apdu_len) { - /* error: exceeding our buffer limit */ - return BACNET_STATUS_ERROR; - } - apdu += len; - } - } while (opening_tag_number_counter > 0); +/** + * @brief Common snprintf() function to suppress CPP check false positives + * @param buffer - destination string + * @param count - length of the destination string + * @param format - format string + * @return number of characters written + */ +int bacapp_snprintf(char *buffer, size_t count, const char *format, ...) +{ + int length = 0; + va_list args; - return total_len; + va_start(args, format); + /* false positive cppcheck - vsnprintf allows null pointers */ + /* cppcheck-suppress nullPointer */ + /* cppcheck-suppress ctunullpointer */ + length = vsnprintf(buffer, count, format, args); + va_end(args); + + return length; } /** * @brief Shift the buffer pointer and decrease the size after an snprintf - * @param len - number of bytes (excluding terminating NULL byte) from snprintf + * @param len - number of bytes (excluding terminating NULL byte) from + * snprintf operation * @param buf - pointer to the buffer pointer * @param buf_size - pointer to the buffer size * @return number of bytes (excluding terminating NULL byte) from snprintf @@ -1962,6 +1698,221 @@ int bacapp_snprintf_shift(int len, char **buf, size_t *buf_size) return len; } +/** + * @brief Print a value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param property - property identifier + * @return number of characters written + */ +static int bacapp_snprintf_property_identifier( + char *str, size_t str_len, BACNET_PROPERTY_ID property) +{ + int ret_val = 0; + const char *char_str; + + char_str = bactext_property_name_default(property, NULL); + if (char_str) { + ret_val = bacapp_snprintf(str, str_len, "%s", char_str); + } else { + ret_val = bacapp_snprintf(str, str_len, "%lu", (unsigned long)property); + } + + return ret_val; +} + +/** + * @brief Print an null value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @return number of characters written + */ +static int bacapp_snprintf_null(char *str, size_t str_len) +{ + return bacapp_snprintf(str, str_len, "Null"); +} + +#if defined(BACAPP_BOOLEAN) +/** + * @brief Print an boolean value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param value - value to print + * @return number of characters written + */ +static int bacapp_snprintf_boolean(char *str, size_t str_len, bool value) +{ + if (value) { + return bacapp_snprintf(str, str_len, "TRUE"); + } else { + return bacapp_snprintf(str, str_len, "FALSE"); + } +} +#endif +#if defined(BACAPP_UNSIGNED) +/** + * @brief Print an unsigned integer value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param value - value to print + * @return number of characters written + */ +static int bacapp_snprintf_unsigned_integer( + char *str, size_t str_len, BACNET_UNSIGNED_INTEGER value) +{ + return bacapp_snprintf(str, str_len, "%lu", (unsigned long)value); +} +#endif + +#if defined(BACAPP_SIGNED) +/** + * @brief Print an signed integer value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param value - value to print + * @return number of characters written + */ +static int +bacapp_snprintf_signed_integer(char *str, size_t str_len, int32_t value) +{ + return bacapp_snprintf(str, str_len, "%ld", (long)value); +} +#endif + +#if defined(BACAPP_REAL) +/** + * @brief Print an real value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param value - value to print + * @return number of characters written + */ +static int bacapp_snprintf_real(char *str, size_t str_len, float value) +{ + return bacapp_snprintf(str, str_len, "%f", (double)value); +} +#endif +#if defined(BACAPP_DOUBLE) +/** + * @brief Print an double value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param value - value to print + * @return number of characters written + */ +static int bacapp_snprintf_double(char *str, size_t str_len, double value) +{ + return bacapp_snprintf(str, str_len, "%f", value); +} +#endif + +#if defined(BACAPP_ENUMERATED) +/** + * @brief Print an enumerated value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param object_type - object type identifier + * @param property - object property identifier + * @param value - enumerated value to print + * @return number of characters written + */ +static int bacapp_snprintf_enumerated( + char *str, + size_t str_len, + BACNET_OBJECT_TYPE object_type, + BACNET_PROPERTY_ID property, + uint32_t value) +{ + int ret_val = 0; + + switch (property) { + case PROP_PROPERTY_LIST: + ret_val = bacapp_snprintf_property_identifier(str, str_len, value); + break; + case PROP_OBJECT_TYPE: + if (value <= BACNET_OBJECT_TYPE_LAST) { + ret_val = bacapp_snprintf( + str, str_len, "%s", bactext_object_type_name(value)); + } else if (value <= BACNET_OBJECT_TYPE_RESERVED_MAX) { + ret_val = bacapp_snprintf( + str, str_len, "reserved %lu", (unsigned long)value); + } else { + ret_val = bacapp_snprintf( + str, str_len, "proprietary %lu", (unsigned long)value); + } + break; + case PROP_EVENT_STATE: + ret_val = bacapp_snprintf( + str, str_len, "%s", bactext_event_state_name(value)); + break; + case PROP_UNITS: + if (bactext_engineering_unit_name_proprietary((unsigned)value)) { + ret_val = bacapp_snprintf( + str, str_len, "proprietary %lu", (unsigned long)value); + } else { + ret_val = bacapp_snprintf( + str, str_len, "%s", bactext_engineering_unit_name(value)); + } + break; + case PROP_POLARITY: + ret_val = bacapp_snprintf( + str, str_len, "%s", bactext_binary_polarity_name(value)); + break; + case PROP_PRESENT_VALUE: + case PROP_RELINQUISH_DEFAULT: + switch (object_type) { + case OBJECT_BINARY_INPUT: + case OBJECT_BINARY_OUTPUT: + case OBJECT_BINARY_VALUE: + ret_val = bacapp_snprintf( + str, str_len, "%s", + bactext_binary_present_value_name(value)); + break; + case OBJECT_BINARY_LIGHTING_OUTPUT: + ret_val = bacapp_snprintf( + str, str_len, "%s", + bactext_binary_lighting_pv_name(value)); + break; + default: + ret_val = bacapp_snprintf( + str, str_len, "%lu", (unsigned long)value); + break; + } + break; + case PROP_RELIABILITY: + ret_val = bacapp_snprintf( + str, str_len, "%s", bactext_reliability_name(value)); + break; + case PROP_SYSTEM_STATUS: + ret_val = bacapp_snprintf( + str, str_len, "%s", bactext_device_status_name(value)); + break; + case PROP_SEGMENTATION_SUPPORTED: + ret_val = bacapp_snprintf( + str, str_len, "%s", bactext_segmentation_name(value)); + break; + case PROP_NODE_TYPE: + ret_val = bacapp_snprintf( + str, str_len, "%s", bactext_node_type_name(value)); + break; + case PROP_TRANSITION: + ret_val = bacapp_snprintf( + str, str_len, "%s", bactext_lighting_transition(value)); + break; + case PROP_IN_PROGRESS: + ret_val = bacapp_snprintf( + str, str_len, "%s", bactext_lighting_in_progress(value)); + break; + default: + ret_val = + bacapp_snprintf(str, str_len, "%lu", (unsigned long)value); + break; + } + + return ret_val; +} +#endif + #if defined(BACAPP_DATE) /** * @brief Print a date value to a string for EPICS @@ -1985,21 +1936,18 @@ static int bacapp_snprintf_date(char *str, size_t str_len, BACNET_DATE *bdate) weekday_text = bactext_day_of_week_name(bdate->wday); month_text = bactext_month_name(bdate->month); - /* false positive cppcheck - snprintf allows null pointers */ - /* cppcheck-suppress nullPointer */ - /* cppcheck-suppress ctunullpointer */ - slen = snprintf(str, str_len, "%s, %s", weekday_text, month_text); + slen = bacapp_snprintf(str, str_len, "%s, %s", weekday_text, month_text); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); if (bdate->day == 255) { - slen = snprintf(str, str_len, " (unspecified), "); + slen = bacapp_snprintf(str, str_len, " (unspecified), "); } else { - slen = snprintf(str, str_len, " %u, ", (unsigned)bdate->day); + slen = bacapp_snprintf(str, str_len, " %u, ", (unsigned)bdate->day); } ret_val += bacapp_snprintf_shift(slen, &str, &str_len); if (bdate->year == 2155) { - slen = snprintf(str, str_len, "(unspecified)"); + slen = bacapp_snprintf(str, str_len, "(unspecified)"); } else { - slen = snprintf(str, str_len, "%u", (unsigned)bdate->year); + slen = bacapp_snprintf(str, str_len, "%u", (unsigned)bdate->year); } ret_val += slen; @@ -2025,29 +1973,28 @@ static int bacapp_snprintf_time(char *str, size_t str_len, BACNET_TIME *btime) int slen = 0; if (btime->hour == 255) { - slen = snprintf(str, str_len, "**:"); + slen = bacapp_snprintf(str, str_len, "**:"); } else { - /* false positive cppcheck - snprintf allows null pointers */ - /* cppcheck-suppress nullPointer */ - slen = snprintf(str, str_len, "%02u:", (unsigned)btime->hour); + slen = bacapp_snprintf(str, str_len, "%02u:", (unsigned)btime->hour); } ret_val += bacapp_snprintf_shift(slen, &str, &str_len); if (btime->min == 255) { - slen = snprintf(str, str_len, "**:"); + slen = bacapp_snprintf(str, str_len, "**:"); } else { - slen = snprintf(str, str_len, "%02u:", (unsigned)btime->min); + slen = bacapp_snprintf(str, str_len, "%02u:", (unsigned)btime->min); } ret_val += bacapp_snprintf_shift(slen, &str, &str_len); if (btime->sec == 255) { - slen = snprintf(str, str_len, "**."); + slen = bacapp_snprintf(str, str_len, "**."); } else { - slen = snprintf(str, str_len, "%02u.", (unsigned)btime->sec); + slen = bacapp_snprintf(str, str_len, "%02u.", (unsigned)btime->sec); } ret_val += bacapp_snprintf_shift(slen, &str, &str_len); if (btime->hundredths == 255) { - slen = snprintf(str, str_len, "**"); + slen = bacapp_snprintf(str, str_len, "**"); } else { - slen = snprintf(str, str_len, "%02u", (unsigned)btime->hundredths); + slen = + bacapp_snprintf(str, str_len, "%02u", (unsigned)btime->hundredths); } ret_val += slen; @@ -2055,6 +2002,247 @@ static int bacapp_snprintf_time(char *str, size_t str_len, BACNET_TIME *btime) } #endif +#if defined(BACAPP_OBJECT_ID) || defined(BACAPP_DEVICE_OBJECT_REFERENCE) +/** + * @brief Print a value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param value - value to print + * @return number of characters written + */ +static int bacapp_snprintf_object_id( + char *str, size_t str_len, BACNET_OBJECT_ID *object_id) +{ + int ret_val = 0; + int slen = 0; + + slen = bacapp_snprintf(str, str_len, "("); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + if (object_id->type <= BACNET_OBJECT_TYPE_LAST) { + slen = bacapp_snprintf( + str, str_len, "%s, ", bactext_object_type_name(object_id->type)); + } else if (object_id->type < BACNET_OBJECT_TYPE_RESERVED_MAX) { + slen = bacapp_snprintf( + str, str_len, "reserved %u, ", (unsigned)object_id->type); + } else { + slen = bacapp_snprintf( + str, str_len, "proprietary %u, ", (unsigned)object_id->type); + } + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf( + str, str_len, "%lu)", (unsigned long)object_id->instance); + ret_val += slen; + + return ret_val; +} +#endif + +#if defined(BACAPP_DATERANGE) || defined(BACAPP_CALENDAR_ENTRY) +/** + * @brief Print a value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param value - value to print + * @return number of characters written + */ +static int +bacapp_snprintf_daterange(char *str, size_t str_len, BACNET_DATE_RANGE *value) +{ + int ret_val = 0; + int slen = 0; + + slen = bacapp_snprintf(str, str_len, "{"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf_date(str, str_len, &value->startdate); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, ".."); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf_date(str, str_len, &value->enddate); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + ret_val += bacapp_snprintf(str, str_len, "}"); + + return ret_val; +} +#endif + +#if defined(BACAPP_SPECIAL_EVENT) || defined(BACAPP_CALENDAR_ENTRY) +/** + * @brief Print a value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param value - value to print + * @return number of characters written + * (j) dates are represented enclosed in parenthesis: + * (Monday, 24-January-1998). + * Any "wild card" or unspecified field is shown by an asterisk (X'2A'): + * (Monday, *-January-1998). + * The omission of day of week implies that the day is unspecified: + * (24-January-1998); + */ +static int +bacapp_snprintf_weeknday(char *str, size_t str_len, BACNET_WEEKNDAY *value) +{ + int ret_val = 0; + int slen = 0; + + slen = bacapp_snprintf(str, str_len, "{"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + /* 1=Jan 13=odd 14=even FF=any */ + if (value->month == 255) { + slen = bacapp_snprintf(str, str_len, "*, "); + } else if (value->month == 13) { + slen = bacapp_snprintf(str, str_len, "odd, "); + } else if (value->month == 14) { + slen = bacapp_snprintf(str, str_len, "even, "); + } else { + slen = bacapp_snprintf(str, str_len, "%u, ", (unsigned)value->month); + } + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + /* 1=days 1-7, 2=days 8-14, 3=days 15-21, 4=days 22-28, + 5=days 29-31, 6=last 7 days, FF=any week */ + if (value->weekofmonth == 255) { + slen = bacapp_snprintf(str, str_len, "*, "); + } else if (value->weekofmonth == 6) { + slen = bacapp_snprintf(str, str_len, "last, "); + } else { + slen = + bacapp_snprintf(str, str_len, "%u, ", (unsigned)value->weekofmonth); + } + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + /* 1=Monday-7=Sunday, FF=any */ + if (value->dayofweek == 255) { + slen = bacapp_snprintf(str, str_len, "*"); + } else { + slen = bacapp_snprintf( + str, str_len, "%s", bactext_day_of_week_name(value->dayofweek)); + } + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + ret_val += bacapp_snprintf(str, str_len, "}"); + + return ret_val; +} +#endif + +#if defined(BACAPP_DEVICE_OBJECT_PROPERTY_REFERENCE) +/** + * @brief Print a BACnetDeviceObjectPropertyReference for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param value - value to print + * @return number of characters written + */ +static int bacapp_snprintf_device_object_property_reference( + char *str, size_t str_len, BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE *value) +{ + int slen; + int ret_val = 0; + + slen = bacapp_snprintf(str, str_len, "{"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + /* object-identifier [0] BACnetObjectIdentifier */ + slen = bacapp_snprintf_object_id(str, str_len, &value->objectIdentifier); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, ","); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + /* property-identifier [1] BACnetPropertyIdentifier */ + slen = bacapp_snprintf_property_identifier( + str, str_len, value->propertyIdentifier); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, ","); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + /* property-array-index [2] Unsigned OPTIONAL,*/ + if (value->arrayIndex == BACNET_ARRAY_ALL) { + slen = bacapp_snprintf(str, str_len, "-1"); + } else { + slen = bacapp_snprintf( + str, str_len, "%lu", (unsigned long)value->arrayIndex); + } + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, ","); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + /* device-identifier [3] BACnetObjectIdentifier OPTIONAL */ + slen = bacapp_snprintf_object_id(str, str_len, &value->deviceIdentifier); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + ret_val += bacapp_snprintf(str, str_len, "}"); + + return ret_val; +} +#endif + +#if defined(BACAPP_DEVICE_OBJECT_REFERENCE) +/** + * @brief Print a BACnetDeviceObjectReference for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param value - value to print + * @return number of characters written + */ +static int bacapp_snprintf_device_object_reference( + char *str, size_t str_len, BACNET_DEVICE_OBJECT_REFERENCE *value) +{ + int slen; + int ret_val = 0; + + /* BACnetDeviceObjectReference */ + slen = bacapp_snprintf(str, str_len, "{"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + if (value->deviceIdentifier.type == OBJECT_DEVICE) { + slen = + bacapp_snprintf_object_id(str, str_len, &value->deviceIdentifier); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, ","); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + } + slen = bacapp_snprintf_object_id(str, str_len, &value->objectIdentifier); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, "}"); + ret_val += slen; + + return ret_val; +} +#endif + +#if defined(BACAPP_OBJECT_PROPERTY_REFERENCE) +/** + * @brief Print a BACnetObjectPropertyReference for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param value - value to print + * @return number of characters written + */ +static int bacapp_snprintf_object_property_reference( + char *str, size_t str_len, BACNET_OBJECT_PROPERTY_REFERENCE *value) +{ + int slen; + int ret_val = 0; + + slen = bacapp_snprintf(str, str_len, "{"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + if (value->object_identifier.type != OBJECT_NONE) { + /* object-identifier [0] BACnetObjectIdentifier */ + slen = + bacapp_snprintf_object_id(str, str_len, &value->object_identifier); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, ","); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + } + /* property-identifier [1] BACnetPropertyIdentifier */ + slen = bacapp_snprintf_property_identifier( + str, str_len, value->property_identifier); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + if (value->property_array_index != BACNET_ARRAY_ALL) { + /* property-array-index [2] Unsigned OPTIONAL */ + slen = bacapp_snprintf( + 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; +} +#endif + #if defined(BACAPP_WEEKLY_SCHEDULE) /** * @brief Print a weekly schedule value to a string for EPICS @@ -2095,20 +2283,20 @@ static int bacapp_snprintf_weeklyschedule( } if (inner_tag == -1) { - slen = snprintf(str, str_len, "(Null; "); + slen = bacapp_snprintf(str, str_len, "(Null; "); } else if (inner_tag == -2) { - slen = snprintf(str, str_len, "(MIXED_TYPES; "); + slen = bacapp_snprintf(str, str_len, "(MIXED_TYPES; "); } else { - slen = snprintf( + slen = bacapp_snprintf( str, str_len, "(%s; ", bactext_application_tag_name(inner_tag)); } ret_val += bacapp_snprintf_shift(slen, &str, &str_len); for (wi = 0; wi < loopend; wi++) { BACNET_DAILY_SCHEDULE *ds = &ws->weeklySchedule[wi]; if (arrayIndex == BACNET_ARRAY_ALL) { - slen = snprintf(str, str_len, "%s: [", weekdaynames[wi]); + slen = bacapp_snprintf(str, str_len, "%s: [", weekdaynames[wi]); } else { - slen = snprintf( + slen = bacapp_snprintf( str, str_len, "%s: [", (arrayIndex >= 1 && arrayIndex <= 7) ? weekdaynames[arrayIndex - 1] @@ -2119,7 +2307,7 @@ static int bacapp_snprintf_weeklyschedule( slen = bacapp_snprintf_time(str, str_len, &ds->Time_Values[ti].Time); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); - slen = snprintf(str, str_len, " "); + slen = bacapp_snprintf(str, str_len, " "); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); bacnet_primitive_to_application_data_value( &dummyDataValue, &ds->Time_Values[ti].Value); @@ -2129,21 +2317,391 @@ static int bacapp_snprintf_weeklyschedule( slen = bacapp_snprintf_value(str, str_len, &dummyPropValue); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); if (ti < ds->TV_Count - 1) { - slen = snprintf(str, str_len, ", "); + slen = bacapp_snprintf(str, str_len, ", "); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); } } if (wi < loopend - 1) { - slen = snprintf(str, str_len, "]; "); + slen = bacapp_snprintf(str, str_len, "]; "); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); } } - slen = snprintf(str, str_len, "])"); + slen = bacapp_snprintf(str, str_len, "])"); ret_val += slen; return ret_val; } #endif +#if defined(BACAPP_HOST_N_PORT) +/** + * @brief Print a value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param value - value to print + * @return number of characters written + */ +static int bacapp_snprintf_host_n_port( + char *str, size_t str_len, BACNET_HOST_N_PORT *value) +{ + int slen, len, i; + char *char_str; + int ret_val = 0; + + slen = bacapp_snprintf(str, str_len, "{"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + if (value->host_ip_address) { + uint8_t *octet_str; + octet_str = octetstring_value(&value->host.ip_address); + slen = bacapp_snprintf( + str, str_len, "%u.%u.%u.%u:%u", (unsigned)octet_str[0], + (unsigned)octet_str[1], (unsigned)octet_str[2], + (unsigned)octet_str[3], (unsigned)value->port); + ret_val += slen; + } else if (value->host_name) { + BACNET_CHARACTER_STRING *name; + name = &value->host.name; + len = characterstring_length(name); + char_str = characterstring_value(name); + slen = bacapp_snprintf(str, str_len, "\""); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + for (i = 0; i < len; i++) { + if (isprint(*((unsigned char *)char_str))) { + slen = bacapp_snprintf(str, str_len, "%c", *char_str); + } else { + slen = bacapp_snprintf(str, str_len, "%c", '.'); + } + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + char_str++; + } + slen = bacapp_snprintf(str, str_len, "\""); + ret_val += slen; + } + slen = bacapp_snprintf(str, str_len, "}"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + + return ret_val; +} +#endif + +#if defined(BACAPP_SPECIAL_EVENT) || defined(BACAPP_CALENDAR_ENTRY) +/** + * @brief Print a value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param value - value to print + * @return number of characters written + */ +static int bacapp_snprintf_calendar_entry( + char *str, size_t str_len, BACNET_CALENDAR_ENTRY *value) +{ + int slen; + int ret_val = 0; + + slen = bacapp_snprintf(str, str_len, "{"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + switch (value->tag) { + case BACNET_CALENDAR_DATE: + slen = bacapp_snprintf_date(str, str_len, &value->type.Date); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + break; + case BACNET_CALENDAR_DATE_RANGE: + slen = + bacapp_snprintf_daterange(str, str_len, &value->type.DateRange); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + break; + case BACNET_CALENDAR_WEEK_N_DAY: + slen = + bacapp_snprintf_weeknday(str, str_len, &value->type.WeekNDay); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + break; + default: + /* do nothing */ + break; + } + slen = bacapp_snprintf(str, str_len, "}"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + + return ret_val; +} +#endif + +#if defined(BACAPP_SPECIAL_EVENT) +/** + * @brief Print a value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param value - value to print + * @return number of characters written + */ +static int bacapp_snprintf_primitive_data_value( + char *str, size_t str_len, BACNET_PRIMITIVE_DATA_VALUE *value) +{ + int ret_val = 0; + + switch (value->tag) { +#if defined(BACAPP_NULL) + case BACNET_APPLICATION_TAG_NULL: + ret_val = bacapp_snprintf_null(str, str_len); + break; +#endif +#if defined(BACAPP_BOOLEAN) + case BACNET_APPLICATION_TAG_BOOLEAN: + ret_val = + bacapp_snprintf_boolean(str, str_len, value->type.Boolean); + break; +#endif +#if defined(BACAPP_UNSIGNED) + case BACNET_APPLICATION_TAG_UNSIGNED_INT: + ret_val = bacapp_snprintf_unsigned_integer( + str, str_len, value->type.Unsigned_Int); + break; +#endif +#if defined(BACAPP_SIGNED) + case BACNET_APPLICATION_TAG_SIGNED_INT: + ret_val = bacapp_snprintf_signed_integer( + str, str_len, value->type.Signed_Int); + break; +#endif +#if defined(BACAPP_REAL) + case BACNET_APPLICATION_TAG_REAL: + ret_val = bacapp_snprintf_real(str, str_len, value->type.Real); + break; +#endif +#if defined(BACAPP_DOUBLE) + case BACNET_APPLICATION_TAG_DOUBLE: + ret_val = bacapp_snprintf_double(str, str_len, value->type.Double); + break; +#endif +#if defined(BACAPP_ENUMERATED) + case BACNET_APPLICATION_TAG_ENUMERATED: + ret_val = bacapp_snprintf_enumerated( + str, str_len, OBJECT_COMMAND, PROP_ACTION, + value->type.Enumerated); + break; +#endif + case BACNET_APPLICATION_TAG_EMPTYLIST: + break; + default: + break; + } + return ret_val; +} +#endif + +#if defined(BACAPP_SPECIAL_EVENT) +/** + * @brief Print a value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param ws - value to print + * @param arrayIndex - index of the to print + * @return number of characters written + */ +static int bacapp_snprintf_daily_schedule( + char *str, size_t str_len, BACNET_DAILY_SCHEDULE *value) +{ + int slen; + int ret_val = 0; + uint16_t i; + + slen = bacapp_snprintf(str, str_len, "{"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + for (i = 0; i < value->TV_Count; i++) { + if (i != 0) { + slen = bacapp_snprintf(str, str_len, ", "); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + } + slen = bacapp_snprintf_time(str, str_len, &value->Time_Values[i].Time); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, ","); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf_primitive_data_value( + str, str_len, &value->Time_Values[i].Value); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + } + slen = bacapp_snprintf(str, str_len, "}"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + + return ret_val; +} +#endif + +#if defined(BACAPP_SPECIAL_EVENT) +/** + * @brief Print a value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param ws - value to print + * @param arrayIndex - index of the to print + * @return number of characters written + */ +static int bacapp_snprintf_special_event( + char *str, size_t str_len, BACNET_SPECIAL_EVENT *value) +{ + int slen; + int ret_val = 0; + + slen = bacapp_snprintf(str, str_len, "{"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + switch (value->periodTag) { + case BACNET_SPECIAL_EVENT_PERIOD_CALENDAR_ENTRY: + slen = bacapp_snprintf_calendar_entry( + str, str_len, &value->period.calendarEntry); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + break; + case BACNET_SPECIAL_EVENT_PERIOD_CALENDAR_REFERENCE: + slen = bacapp_snprintf_object_id( + str, str_len, &value->period.calendarReference); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + break; + default: + break; + } + slen = bacapp_snprintf_daily_schedule(str, str_len, &value->timeValues); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, "}"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + + return ret_val; +} +#endif + +#if defined(BACAPP_ACTION_COMMAND) +/** + * @brief Print a weekly schedule value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param ws - weekly schedule value to print + * @param arrayIndex - index of the weekly schedule to print + * @return number of characters written + */ +static int bacapp_snprintf_action_property_value( + char *str, size_t str_len, BACNET_ACTION_PROPERTY_VALUE *value) +{ + int ret_val = 0; + + switch (value->tag) { +#if defined(BACACTION_NULL) + case BACNET_APPLICATION_TAG_NULL: + ret_val = bacapp_snprintf_null(str, str_len); + break; +#endif +#if defined(BACACTION_BOOLEAN) + case BACNET_APPLICATION_TAG_BOOLEAN: + ret_val = + bacapp_snprintf_boolean(str, str_len, value->type.Boolean); + break; +#endif +#if defined(BACACTION_UNSIGNED) + case BACNET_APPLICATION_TAG_UNSIGNED_INT: + ret_val = bacapp_snprintf_unsigned_integer( + str, str_len, value->type.Unsigned_Int); + break; +#endif +#if defined(BACACTION_SIGNED) + case BACNET_APPLICATION_TAG_SIGNED_INT: + ret_val = bacapp_snprintf_signed_integer( + str, str_len, value->type.Signed_Int); + break; +#endif +#if defined(BACACTION_REAL) + case BACNET_APPLICATION_TAG_REAL: + ret_val = bacapp_snprintf_real(str, str_len, value->type.Real); + break; +#endif +#if defined(BACACTION_DOUBLE) + case BACNET_APPLICATION_TAG_DOUBLE: + ret_val = bacapp_snprintf_double(str, str_len, value->type.Double); + break; +#endif +#if defined(BACACTION_ENUMERATED) + case BACNET_APPLICATION_TAG_ENUMERATED: + ret_val = bacapp_snprintf_enumerated( + str, str_len, OBJECT_COMMAND, PROP_ACTION, + value->type.Enumerated); + break; +#endif + case BACNET_APPLICATION_TAG_EMPTYLIST: + break; + default: + break; + } + + return ret_val; +} +#endif + +#if defined(BACAPP_ACTION_COMMAND) +/** + * @brief Print a value to a string for EPICS + * @param str - destination string, or NULL for length only + * @param str_len - length of the destination string, or 0 for length only + * @param value - value to print + * @return number of characters written + */ +static int bacapp_snprintf_action_command( + char *str, size_t str_len, BACNET_ACTION_LIST *value) +{ + int slen; + int ret_val = 0; + + slen = bacapp_snprintf(str, str_len, "{"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + /* deviceIdentifier [0] BACnetObjectIdentifier OPTIONAL */ + slen = bacapp_snprintf_object_id(str, str_len, &value->Device_Id); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, ","); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + /* objectIdentifier [1] BACnetObjectIdentifier */ + slen = bacapp_snprintf_object_id(str, str_len, &value->Device_Id); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, ","); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + /* propertyIdentifier [2] BACnetPropertyIdentifier */ + slen = bacapp_snprintf_property_identifier( + str, str_len, value->Property_Identifier); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, ","); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + /* propertyArrayIndex [3] Unsigned OPTIONAL */ + if (value->Property_Array_Index == BACNET_ARRAY_ALL) { + slen = bacapp_snprintf(str, str_len, "-1,"); + } else { + slen = bacapp_snprintf( + str, str_len, "%lu,", (unsigned long)value->Property_Array_Index); + } + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + /* propertyValue [4] ABSTRACT-SYNTAX.&Type */ + slen = bacapp_snprintf_action_property_value(str, str_len, &value->Value); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, ","); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + /* priority [5] Unsigned (1..16) OPTIONAL */ + slen = bacapp_snprintf(str, str_len, "%lu", (unsigned long)value->Priority); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, ","); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + /* postDelay [6] Unsigned OPTIONAL */ + slen = + bacapp_snprintf(str, str_len, "%lu", (unsigned long)value->Post_Delay); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, ","); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + /* quitOnFailure [7] BOOLEAN */ + slen = bacapp_snprintf_boolean(str, str_len, value->Quit_On_Failure); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, ","); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + /* writeSuccessful [8] BOOLEAN */ + slen = bacapp_snprintf_boolean(str, str_len, value->Write_Successful); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, "}"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + + return ret_val; +} +#endif + /** * @brief Extract the value into a text string * @param str - the buffer to store the extracted value, or NULL for length @@ -2176,38 +2734,36 @@ int bacapp_snprintf_value( switch (value->tag) { #if defined(BACAPP_NULL) case BACNET_APPLICATION_TAG_NULL: - ret_val = snprintf(str, str_len, "Null"); + ret_val = bacapp_snprintf_null(str, str_len); break; #endif #if defined(BACAPP_BOOLEAN) case BACNET_APPLICATION_TAG_BOOLEAN: - ret_val = (value->type.Boolean) - ? snprintf(str, str_len, "TRUE") - : snprintf(str, str_len, "FALSE"); + ret_val = + bacapp_snprintf_boolean(str, str_len, value->type.Boolean); break; #endif #if defined(BACAPP_UNSIGNED) case BACNET_APPLICATION_TAG_UNSIGNED_INT: - ret_val = snprintf( - str, str_len, "%lu", - (unsigned long)value->type.Unsigned_Int); + ret_val = bacapp_snprintf_unsigned_integer( + str, str_len, value->type.Unsigned_Int); break; #endif #if defined(BACAPP_SIGNED) case BACNET_APPLICATION_TAG_SIGNED_INT: - ret_val = - snprintf(str, str_len, "%ld", (long)value->type.Signed_Int); + ret_val = bacapp_snprintf_signed_integer( + str, str_len, value->type.Signed_Int); break; #endif #if defined(BACAPP_REAL) case BACNET_APPLICATION_TAG_REAL: - ret_val = - snprintf(str, str_len, "%f", (double)value->type.Real); + ret_val = bacapp_snprintf_real(str, str_len, value->type.Real); break; #endif #if defined(BACAPP_DOUBLE) case BACNET_APPLICATION_TAG_DOUBLE: - ret_val = snprintf(str, str_len, "%f", value->type.Double); + ret_val = + bacapp_snprintf_double(str, str_len, value->type.Double); break; #endif #if defined(BACAPP_OCTET_STRING) @@ -2217,7 +2773,8 @@ int bacapp_snprintf_value( uint8_t *octet_str; octet_str = octetstring_value(&value->type.Octet_String); for (i = 0; i < len; i++) { - slen = snprintf(str, str_len, "%02X", *octet_str); + slen = + bacapp_snprintf(str, str_len, "%02X", *octet_str); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); octet_str++; } @@ -2228,7 +2785,7 @@ int bacapp_snprintf_value( case BACNET_APPLICATION_TAG_CHARACTER_STRING: len = characterstring_length(&value->type.Character_String); char_str = characterstring_value(&value->type.Character_String); - slen = snprintf(str, str_len, "\""); + slen = bacapp_snprintf(str, str_len, "\""); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); #if (__STDC_VERSION__ >= 199901L) && defined(__STDC_ISO_10646__) if (characterstring_encoding(&value->type.Character_String) == @@ -2248,7 +2805,7 @@ int bacapp_snprintf_value( } } /* For portability, cast wchar_t to wint_t */ - slen = snprintf(str, str_len, "%lc", (wint_t)wc); + slen = bacapp_snprintf(str, str_len, "%lc", (wint_t)wc); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); if (len > wclen) { len -= wclen; @@ -2262,155 +2819,44 @@ int bacapp_snprintf_value( { for (i = 0; i < len; i++) { if (isprint(*((unsigned char *)char_str))) { - slen = snprintf(str, str_len, "%c", *char_str); + slen = + bacapp_snprintf(str, str_len, "%c", *char_str); } else { - slen = snprintf(str, str_len, "%c", '.'); + slen = bacapp_snprintf(str, str_len, "%c", '.'); } ret_val += bacapp_snprintf_shift(slen, &str, &str_len); char_str++; } } - slen = snprintf(str, str_len, "\""); + slen = bacapp_snprintf(str, str_len, "\""); ret_val += slen; break; #endif #if defined(BACAPP_BIT_STRING) case BACNET_APPLICATION_TAG_BIT_STRING: len = bitstring_bits_used(&value->type.Bit_String); - slen = snprintf(str, str_len, "{"); + slen = bacapp_snprintf(str, str_len, "{"); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); for (i = 0; i < len; i++) { bool bit; bit = bitstring_bit(&value->type.Bit_String, (uint8_t)i); - slen = snprintf(str, str_len, "%s", bit ? "true" : "false"); + slen = bacapp_snprintf( + str, str_len, "%s", bit ? "true" : "false"); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); if (i < (len - 1)) { - slen = snprintf(str, str_len, ","); + slen = bacapp_snprintf(str, str_len, ","); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); } } - slen = snprintf(str, str_len, "}"); + slen = bacapp_snprintf(str, str_len, "}"); ret_val += slen; break; #endif #if defined(BACAPP_ENUMERATED) case BACNET_APPLICATION_TAG_ENUMERATED: - switch (property) { - case PROP_PROPERTY_LIST: - char_str = (char *)bactext_property_name_default( - value->type.Enumerated, NULL); - if (char_str) { - ret_val = snprintf(str, str_len, "%s", char_str); - } else { - ret_val = snprintf( - str, str_len, "%lu", - (unsigned long)value->type.Enumerated); - } - break; - case PROP_OBJECT_TYPE: - if (value->type.Enumerated <= BACNET_OBJECT_TYPE_LAST) { - ret_val = snprintf( - str, str_len, "%s", - bactext_object_type_name( - value->type.Enumerated)); - } else if ( - value->type.Enumerated <= - BACNET_OBJECT_TYPE_RESERVED_MAX) { - ret_val = snprintf( - str, str_len, "reserved %lu", - (unsigned long)value->type.Enumerated); - } else { - ret_val = snprintf( - str, str_len, "proprietary %lu", - (unsigned long)value->type.Enumerated); - } - break; - case PROP_EVENT_STATE: - ret_val = snprintf( - str, str_len, "%s", - bactext_event_state_name(value->type.Enumerated)); - break; - case PROP_UNITS: - if (bactext_engineering_unit_name_proprietary( - (unsigned)value->type.Enumerated)) { - ret_val = snprintf( - str, str_len, "proprietary %lu", - (unsigned long)value->type.Enumerated); - } else { - ret_val = snprintf( - str, str_len, "%s", - bactext_engineering_unit_name( - value->type.Enumerated)); - } - break; - case PROP_POLARITY: - ret_val = snprintf( - str, str_len, "%s", - bactext_binary_polarity_name( - value->type.Enumerated)); - break; - case PROP_PRESENT_VALUE: - case PROP_RELINQUISH_DEFAULT: - switch (object_type) { - case OBJECT_BINARY_INPUT: - case OBJECT_BINARY_OUTPUT: - case OBJECT_BINARY_VALUE: - ret_val = snprintf( - str, str_len, "%s", - bactext_binary_present_value_name( - value->type.Enumerated)); - break; - case OBJECT_BINARY_LIGHTING_OUTPUT: - ret_val = snprintf( - str, str_len, "%s", - bactext_binary_lighting_pv_name( - value->type.Enumerated)); - break; - default: - ret_val = snprintf( - str, str_len, "%lu", - (unsigned long)value->type.Enumerated); - break; - } - break; - case PROP_RELIABILITY: - ret_val = snprintf( - str, str_len, "%s", - bactext_reliability_name(value->type.Enumerated)); - break; - case PROP_SYSTEM_STATUS: - ret_val = snprintf( - str, str_len, "%s", - bactext_device_status_name(value->type.Enumerated)); - break; - case PROP_SEGMENTATION_SUPPORTED: - ret_val = snprintf( - str, str_len, "%s", - bactext_segmentation_name(value->type.Enumerated)); - break; - case PROP_NODE_TYPE: - ret_val = snprintf( - str, str_len, "%s", - bactext_node_type_name(value->type.Enumerated)); - break; - case PROP_TRANSITION: - ret_val = snprintf( - str, str_len, "%s", - bactext_lighting_transition( - value->type.Enumerated)); - break; - case PROP_IN_PROGRESS: - ret_val = snprintf( - str, str_len, "%s", - bactext_lighting_in_progress( - value->type.Enumerated)); - break; - default: - ret_val = snprintf( - str, str_len, "%lu", - (unsigned long)value->type.Enumerated); - break; - } + ret_val = bacapp_snprintf_enumerated( + str, str_len, object_type, property, + value->type.Enumerated); break; #endif #if defined(BACAPP_DATE) @@ -2425,40 +2871,8 @@ int bacapp_snprintf_value( #endif #if defined(BACAPP_OBJECT_ID) case BACNET_APPLICATION_TAG_OBJECT_ID: - slen = snprintf(str, str_len, "("); - ret_val += bacapp_snprintf_shift(slen, &str, &str_len); - if (value->type.Object_Id.type <= BACNET_OBJECT_TYPE_LAST) { - slen = snprintf( - str, str_len, "%s, ", - bactext_object_type_name(value->type.Object_Id.type)); - } else if ( - value->type.Object_Id.type < - BACNET_OBJECT_TYPE_RESERVED_MAX) { - slen = snprintf( - str, str_len, "reserved %u, ", - (unsigned)value->type.Object_Id.type); - } else { - slen = snprintf( - str, str_len, "proprietary %u, ", - (unsigned)value->type.Object_Id.type); - } - ret_val += bacapp_snprintf_shift(slen, &str, &str_len); - slen = snprintf( - str, str_len, "%lu)", - (unsigned long)value->type.Object_Id.instance); - ret_val += slen; - break; -#endif -#if defined(BACAPP_DATERANGE) - case BACNET_APPLICATION_TAG_DATERANGE: - slen = bacapp_snprintf_date( - str, str_len, &value->type.Date_Range.startdate); - ret_val += bacapp_snprintf_shift(slen, &str, &str_len); - slen = snprintf(str, str_len, ".."); - ret_val += bacapp_snprintf_shift(slen, &str, &str_len); - slen = bacapp_snprintf_date( - str, str_len, &value->type.Date_Range.enddate); - ret_val += slen; + ret_val = bacapp_snprintf_object_id( + str, str_len, &value->type.Object_Id); break; #endif #if defined(BACAPP_TIMESTAMP) @@ -2473,13 +2887,19 @@ int bacapp_snprintf_value( slen = bacapp_snprintf_date( str, str_len, &value->type.Date_Time.date); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); - slen = snprintf(str, str_len, "-"); + slen = bacapp_snprintf(str, str_len, "-"); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); slen = bacapp_snprintf_time( str, str_len, &value->type.Date_Time.time); ret_val += slen; break; #endif +#if defined(BACAPP_DATERANGE) + case BACNET_APPLICATION_TAG_DATERANGE: + ret_val = bacapp_snprintf_daterange( + str, str_len, &value->type.Date_Range); + break; +#endif #if defined(BACAPP_LIGHTING_COMMAND) case BACNET_APPLICATION_TAG_LIGHTING_COMMAND: ret_val = lighting_command_to_ascii( @@ -2496,15 +2916,15 @@ int bacapp_snprintf_value( #if defined(BACAPP_COLOR_COMMAND) case BACNET_APPLICATION_TAG_COLOR_COMMAND: /* BACnetColorCommand */ - slen = snprintf(str, str_len, "("); + slen = bacapp_snprintf(str, str_len, "("); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); - slen = snprintf( + slen = bacapp_snprintf( str, str_len, "%s", bactext_color_operation_name( value->type.Color_Command.operation)); ret_val += bacapp_snprintf_shift(slen, &str, &str_len); /* FIXME: add the Lighting Command optional values */ - slen = snprintf(str, str_len, ")"); + slen = bacapp_snprintf(str, str_len, ")"); ret_val += slen; break; #endif @@ -2516,50 +2936,29 @@ int bacapp_snprintf_value( object_value->array_index); break; #endif -#if defined(BACAPP_SPECIAL_EVENT) - case BACNET_APPLICATION_TAG_SPECIAL_EVENT: - /* FIXME: add printing for BACnetSpecialEvent */ - ret_val = snprintf(str, str_len, "SpecialEvent(TODO)"); - break; -#endif -#if defined(BACAPP_CALENDAR_ENTRY) - case BACNET_APPLICATION_TAG_CALENDAR_ENTRY: - /* FIXME: add printing for BACnetCalendarEntry */ - ret_val = snprintf(str, str_len, "CalendarEntry(TODO)"); - break; -#endif #if defined(BACAPP_HOST_N_PORT) case BACNET_APPLICATION_TAG_HOST_N_PORT: - /* BACnetHostNPort */ - if (value->type.Host_Address.host_ip_address) { - uint8_t *octet_str; - octet_str = octetstring_value( - &value->type.Host_Address.host.ip_address); - slen = snprintf( - str, str_len, "%u.%u.%u.%u:%u", (unsigned)octet_str[0], - (unsigned)octet_str[1], (unsigned)octet_str[2], - (unsigned)octet_str[3], - (unsigned)value->type.Host_Address.port); - ret_val += slen; - } else if (value->type.Host_Address.host_name) { - BACNET_CHARACTER_STRING *name; - name = &value->type.Host_Address.host.name; - len = characterstring_length(name); - char_str = characterstring_value(name); - slen = snprintf(str, str_len, "\""); - ret_val += bacapp_snprintf_shift(slen, &str, &str_len); - for (i = 0; i < len; i++) { - if (isprint(*((unsigned char *)char_str))) { - slen = snprintf(str, str_len, "%c", *char_str); - } else { - slen = snprintf(str, str_len, "%c", '.'); - } - ret_val += bacapp_snprintf_shift(slen, &str, &str_len); - char_str++; - } - slen = snprintf(str, str_len, "\""); - ret_val += slen; - } + ret_val = bacapp_snprintf_host_n_port( + str, str_len, &value->type.Host_Address); + break; +#endif +#if defined(BACAPP_DEVICE_OBJECT_PROPERTY_REFERENCE) + case BACNET_APPLICATION_TAG_DEVICE_OBJECT_PROPERTY_REFERENCE: + ret_val = bacapp_snprintf_device_object_property_reference( + str, str_len, + &value->type.Device_Object_Property_Reference); + break; +#endif +#if defined(BACAPP_DEVICE_OBJECT_REFERENCE) + case BACNET_APPLICATION_TAG_DEVICE_OBJECT_REFERENCE: + ret_val = bacapp_snprintf_device_object_reference( + str, str_len, &value->type.Device_Object_Reference); + break; +#endif +#if defined(BACAPP_OBJECT_PROPERTY_REFERENCE) + case BACNET_APPLICATION_TAG_OBJECT_PROPERTY_REFERENCE: + ret_val = bacapp_snprintf_object_property_reference( + str, str_len, &value->type.Object_Property_Reference); break; #endif #if defined(BACAPP_DESTINATION) @@ -2568,21 +2967,61 @@ int bacapp_snprintf_value( &value->type.Destination, str, str_len); break; #endif +#if defined(BACAPP_CALENDAR_ENTRY) + case BACNET_APPLICATION_TAG_CALENDAR_ENTRY: + ret_val = bacapp_snprintf_calendar_entry( + str, str_len, &value->type.Calendar_Entry); + break; +#endif +#if defined(BACAPP_SPECIAL_EVENT) + case BACNET_APPLICATION_TAG_SPECIAL_EVENT: + ret_val = bacapp_snprintf_special_event( + str, str_len, &value->type.Special_Event); + break; +#endif #if defined(BACAPP_BDT_ENTRY) case BACNET_APPLICATION_TAG_BDT_ENTRY: - ret_val = bacnet_bdt_entry_to_ascii( + slen = bacapp_snprintf(str, str_len, "{"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacnet_bdt_entry_to_ascii( str, str_len, &value->type.BDT_Entry); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, "}"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); break; #endif #if defined(BACAPP_FDT_ENTRY) case BACNET_APPLICATION_TAG_FDT_ENTRY: - ret_val = bacnet_fdt_entry_to_ascii( + slen = bacapp_snprintf(str, str_len, "{"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacnet_fdt_entry_to_ascii( str, str_len, &value->type.FDT_Entry); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + slen = bacapp_snprintf(str, str_len, "}"); + ret_val += bacapp_snprintf_shift(slen, &str, &str_len); + break; +#endif +#if defined(BACAPP_ACTION_COMMAND) + case BACNET_APPLICATION_TAG_ACTION_COMMAND: + ret_val = bacapp_snprintf_action_command( + str, str_len, &value->type.Action_Command); + break; +#endif +#if defined(BACAPP_SCALE) + case BACNET_APPLICATION_TAG_SCALE: + if (value->type.Scale.float_scale) { + ret_val = bacapp_snprintf( + str, str_len, "%f", value->type.Scale.type.real_scale); + } else { + ret_val = bacapp_snprintf( + str, str_len, "%ld", + (long)value->type.Scale.type.integer_scale); + } break; #endif default: - ret_val = - snprintf(str, str_len, "UnknownType(tag=%d)", value->tag); + ret_val = bacapp_snprintf( + str, str_len, "UnknownType(tag=%d)", value->tag); break; } } @@ -3081,6 +3520,16 @@ bool bacapp_parse_application_data( status = bacnet_fdt_entry_from_ascii(&value->type.FDT_Entry, argv); break; +#endif +#if defined(BACAPP_ACTION_COMMAND) + case BACNET_APPLICATION_TAG_ACTION_COMMAND: + /* BACnetActionCommand - not implemented */ + break; +#endif +#if defined(BACAPP_SCALE) + case BACNET_APPLICATION_TAG_SCALE: + /* BACnetScale - not implement */ + break; #endif default: break; @@ -3346,9 +3795,8 @@ int bacapp_property_value_decode( However, it returns the len between the tags. Therefore, store the length of the opening tag first */ tag_len = len; - len = bacapp_data_len( - &apdu[apdu_len], apdu_size - apdu_len, - (BACNET_PROPERTY_ID)property_identifier); + len = bacnet_enclosed_data_length( + &apdu[apdu_len], apdu_size - apdu_len); apdu_len += len; /* add the opening tag length to the totals */ apdu_len += tag_len; @@ -3614,6 +4062,19 @@ bool bacapp_same_value( status = bacnet_fdt_entry_same( &value->type.FDT_Entry, &test_value->type.FDT_Entry); break; +#endif +#if defined(BACAPP_ACTION_COMMAND) + case BACNET_APPLICATION_TAG_ACTION_COMMAND: + status = bacnet_action_command_same( + &value->type.Action_Command, + &test_value->type.Action_Command); + break; +#endif +#if defined(BACAPP_SCALE) + case BACNET_APPLICATION_TAG_SCALE: + status = bacnet_scale_same( + &value->type.Scale, &test_value->type.Scale); + break; #endif case BACNET_APPLICATION_TAG_EMPTYLIST: status = true; diff --git a/src/bacnet/bacapp.h b/src/bacnet/bacapp.h index 79575188..be4eae2d 100644 --- a/src/bacnet/bacapp.h +++ b/src/bacnet/bacapp.h @@ -8,12 +8,14 @@ #ifndef BACNET_APP_H #define BACNET_APP_H +#include #include #include #include /* BACnet Stack defines - first */ #include "bacnet/bacdef.h" /* BACnet Stack API */ +#include "bacnet/bacaction.h" #include "bacnet/bacdest.h" #include "bacnet/bacint.h" #include "bacnet/bacstr.h" @@ -32,6 +34,19 @@ #endif #endif +/** BACnetScale ::= CHOICE { + float-scale [0] REAL, + integer-scale [1] INTEGER + } +*/ +typedef struct BACnetScale { + bool float_scale; + union { + float real_scale; + int32_t integer_scale; + } type; +} BACNET_SCALE; + struct BACnet_Application_Data_Value; typedef struct BACnet_Application_Data_Value { bool context_specific; /* true if context specific data */ @@ -125,6 +140,12 @@ typedef struct BACnet_Application_Data_Value { #endif #if defined (BACAPP_FDT_ENTRY) BACNET_FDT_ENTRY FDT_Entry; +#endif +#if defined (BACAPP_ACTION_COMMAND) + BACNET_ACTION_LIST Action_Command; +#endif +#if defined (BACAPP_SCALE) + BACNET_SCALE Scale; #endif } type; /* simple linked list if needed */ @@ -203,6 +224,12 @@ extern "C" { uint8_t * apdu, BACNET_APPLICATION_DATA_VALUE * value); BACNET_STACK_EXPORT + int bacapp_encode_known_property( + uint8_t *apdu, + BACNET_APPLICATION_DATA_VALUE *value, + BACNET_OBJECT_TYPE object_type, + BACNET_PROPERTY_ID property); + BACNET_STACK_EXPORT int bacapp_data_decode( uint8_t * apdu, uint32_t apdu_size, @@ -241,6 +268,7 @@ extern "C" { BACNET_APPLICATION_DATA_VALUE * value, BACNET_PROPERTY_ID property); + BACNET_STACK_DEPRECATED("Use bacapp_encode_known_property() instead") BACNET_STACK_EXPORT int bacapp_encode_context_data( uint8_t * apdu, @@ -253,17 +281,25 @@ extern "C" { uint8_t context_tag_number, BACNET_APPLICATION_DATA_VALUE * value); + BACNET_STACK_DEPRECATED("Use bacapp_known_property_tag() instead") BACNET_STACK_EXPORT BACNET_APPLICATION_TAG bacapp_context_tag_type( BACNET_PROPERTY_ID property, uint8_t tag_number); - + BACNET_STACK_DEPRECATED("Use bacapp_encode_known_property() instead") BACNET_STACK_EXPORT int bacapp_decode_generic_property( uint8_t * apdu, int max_apdu_len, BACNET_APPLICATION_DATA_VALUE * value, BACNET_PROPERTY_ID prop); + + BACNET_STACK_EXPORT + int bacapp_decode_application_tag_value( + uint8_t *apdu, + size_t apdu_size, + BACNET_APPLICATION_TAG tag, + BACNET_APPLICATION_DATA_VALUE *value); BACNET_STACK_EXPORT int bacapp_decode_known_property(uint8_t *apdu, int max_apdu_len, @@ -281,24 +317,27 @@ extern "C" { BACNET_APPLICATION_DATA_VALUE * dest_value, BACNET_APPLICATION_DATA_VALUE * src_value); - /* returns the length of data between an opening tag and a closing tag. - Expects that the first octet contain the opening tag. - Include a value property identifier for context specific data - such as the value received in a WriteProperty request */ + BACNET_STACK_DEPRECATED("Use bacnet_enclosed_data_length() instead") BACNET_STACK_EXPORT int bacapp_data_len( uint8_t * apdu, unsigned max_apdu_len, BACNET_PROPERTY_ID property); + + BACNET_STACK_DEPRECATED("Use bacnet_application_data_length() instead") BACNET_STACK_EXPORT int bacapp_decode_data_len( uint8_t * apdu, uint8_t tag_data_type, uint32_t len_value_type); + + BACNET_STACK_DEPRECATED("Use bacnet_enclosed_data_length() instead") BACNET_STACK_EXPORT int bacapp_decode_application_data_len( uint8_t * apdu, unsigned max_apdu_len); + + BACNET_STACK_DEPRECATED("Use bacnet_enclosed_data_length() instead") BACNET_STACK_EXPORT int bacapp_decode_context_data_len( uint8_t * apdu, @@ -306,10 +345,15 @@ extern "C" { BACNET_PROPERTY_ID property); BACNET_STACK_EXPORT + int bacapp_snprintf( + char *buffer, + size_t count, + const char *format, ...); + BACNET_STACK_EXPORT int bacapp_snprintf_shift( int len, char **buf, - size_t *buf_size); + size_t *buf_size); BACNET_STACK_EXPORT int bacapp_snprintf_value( char *str, diff --git a/src/bacnet/bacdcode.c b/src/bacnet/bacdcode.c index fbc8367e..b0994246 100644 --- a/src/bacnet/bacdcode.c +++ b/src/bacnet/bacdcode.c @@ -756,6 +756,137 @@ int bacnet_tag_number_and_value_decode( return len; } +/** + * @brief Determine the data length from the application tag number + * @param tag_number application tag number to be evaluated. + * @param len_value_type Length of the data in bytes. + * @return datalength for the given tag, or INT_MAX if out of range. + */ +int bacnet_application_data_length( + uint8_t tag_number, uint32_t len_value_type) +{ + int len = 0; + + switch (tag_number) { + case BACNET_APPLICATION_TAG_NULL: + break; + case BACNET_APPLICATION_TAG_BOOLEAN: + break; + case BACNET_APPLICATION_TAG_UNSIGNED_INT: + case BACNET_APPLICATION_TAG_SIGNED_INT: + case BACNET_APPLICATION_TAG_REAL: + case BACNET_APPLICATION_TAG_DOUBLE: + case BACNET_APPLICATION_TAG_OCTET_STRING: + case BACNET_APPLICATION_TAG_CHARACTER_STRING: + case BACNET_APPLICATION_TAG_BIT_STRING: + case BACNET_APPLICATION_TAG_ENUMERATED: + case BACNET_APPLICATION_TAG_DATE: + case BACNET_APPLICATION_TAG_TIME: + case BACNET_APPLICATION_TAG_OBJECT_ID: + len = INT_MAX; + if (len_value_type < INT_MAX) { + len = (int)len_value_type; + } + break; + default: + break; + } + + return len; +} + +/** + * @brief Returns the length of data between an opening tag and a closing tag. + * @note Expects that the first octet contain the opening tag. + * @param apdu Pointer to the APDU buffer + * @param apdu_size Bytes valid in the buffer + * @param property ID of the property to get the length for. + * @return length of data between an opening tag and a closing tag 0..N, + * or BACNET_STATUS_ERROR. + */ +int bacnet_enclosed_data_length( + uint8_t *apdu, size_t apdu_size) +{ + int len = 0; + int total_len = 0; + int apdu_len = 0; + BACNET_TAG tag = { 0 }; + uint8_t opening_tag_number = 0; + uint8_t opening_tag_number_counter = 0; + bool total_len_enable = false; + + if (!apdu) { + return BACNET_STATUS_ERROR; + } + if (apdu_size <= apdu_len) { + /* error: exceeding our buffer limit */ + return BACNET_STATUS_ERROR; + } + if (!bacnet_is_opening_tag(apdu, apdu_size)) { + /* error: opening tag is missing */ + return BACNET_STATUS_ERROR; + } + do { + len = bacnet_tag_decode(apdu, apdu_size - apdu_len, &tag); + if (len == 0) { + return BACNET_STATUS_ERROR; + } + if (tag.opening) { + if (opening_tag_number_counter == 0) { + opening_tag_number = tag.number; + opening_tag_number_counter = 1; + total_len_enable = false; + } else if (tag.number == opening_tag_number) { + total_len_enable = true; + opening_tag_number_counter++; + } else { + total_len_enable = true; + } + } else if (tag.closing) { + if (tag.number == opening_tag_number) { + if (opening_tag_number_counter > 0) { + opening_tag_number_counter--; + } + } + total_len_enable = true; + } else if (tag.context) { + if (tag.len_value_type > INT_MAX) { + /* error: length is out of range */ + return BACNET_STATUS_ERROR; + } + len += tag.len_value_type; + total_len_enable = true; + } else { + if (tag.len_value_type > INT_MAX) { + /* error: length is out of range */ + return BACNET_STATUS_ERROR; + } + /* application tagged data */ + len += bacnet_application_data_length(tag.number, + tag.len_value_type); + total_len_enable = true; + } + if (opening_tag_number_counter > 0) { + if (len > 0) { + if (total_len_enable) { + total_len += len; + } + } else { + /* error: len is not incrementing */ + return BACNET_STATUS_ERROR; + } + apdu_len += len; + if (apdu_size <= apdu_len) { + /* error: exceeding our buffer limit */ + return BACNET_STATUS_ERROR; + } + apdu += len; + } + } while (opening_tag_number_counter > 0); + + return total_len; +} + /** * @brief Returns true if the tag is context specific * and matches, as defined in clause 20.2.1.3.2 Constructed diff --git a/src/bacnet/bacdcode.h b/src/bacnet/bacdcode.h index 3afad873..3b7a94fe 100644 --- a/src/bacnet/bacdcode.h +++ b/src/bacnet/bacdcode.h @@ -84,6 +84,13 @@ BACNET_STACK_EXPORT bool bacnet_is_closing_tag_number( uint8_t *apdu, uint32_t apdu_size, uint8_t tag_number, int *tag_length); +BACNET_STACK_EXPORT +int bacnet_application_data_length( + uint8_t tag_number, uint32_t len_value_type); +BACNET_STACK_EXPORT +int bacnet_enclosed_data_length( + uint8_t *apdu, size_t apdu_size); + BACNET_STACK_DEPRECATED("Use bacnet_tag_decode() instead") BACNET_STACK_EXPORT int bacnet_tag_number_and_value_decode( diff --git a/src/bacnet/bacdef.h b/src/bacnet/bacdef.h index 8957e04f..a8212283 100644 --- a/src/bacnet/bacdef.h +++ b/src/bacnet/bacdef.h @@ -10,6 +10,7 @@ #include #include +#include /* config is always first to allow developers to override */ #include "bacnet/config.h" /* BACnet Stack core enumerations */ diff --git a/src/bacnet/bacenum.h b/src/bacnet/bacenum.h index 9659f536..c64007f1 100644 --- a/src/bacnet/bacenum.h +++ b/src/bacnet/bacenum.h @@ -1557,7 +1557,7 @@ typedef enum { BACNET_APPLICATION_TAG_RESERVE3 = 15, MAX_BACNET_APPLICATION_TAG = 16, - /* Extra stuff - complex tagged data - not specifically enumerated */ + /* Complex tagged constructed data types - not specifically enumerated */ /* Means : "nothing", an empty list, not even a null character */ BACNET_APPLICATION_TAG_EMPTYLIST, @@ -1602,7 +1602,11 @@ typedef enum { /* BACnetBDTEntry */ BACNET_APPLICATION_TAG_BDT_ENTRY, /* BACnetFDTEntry */ - BACNET_APPLICATION_TAG_FDT_ENTRY + BACNET_APPLICATION_TAG_FDT_ENTRY, + /* BACnetActionCommand */ + BACNET_APPLICATION_TAG_ACTION_COMMAND, + /* BACnetScale */ + BACNET_APPLICATION_TAG_SCALE } BACNET_APPLICATION_TAG; /* note: these are not the real values, */ diff --git a/src/bacnet/bacstr.c b/src/bacnet/bacstr.c index f088eb7c..18d9a70f 100644 --- a/src/bacnet/bacstr.c +++ b/src/bacnet/bacstr.c @@ -6,6 +6,8 @@ * @date 2004 * @copyright SPDX-License-Identifier: GPL-2.0-or-later WITH GCC-exception-2.0 */ +#include +#include #include #include #include @@ -393,6 +395,31 @@ bool characterstring_init(BACNET_CHARACTER_STRING *char_string, return status; } +/** + * @brief Return the length of a string, within a maximum length + * @note The strnlen function is non-standard and not available in + * all libc implementations. This function is a workaround for that. + * @details The strnlen function computes the smaller of the number + * of characters in the array pointed to by s, not including any + * terminating null character, or the value of the maxlen argument. + * The strnlen function examines no more than maxlen bytes of the + * array pointed to by s. + * @param s - string to check + * @param maxlen - maximum length to check + * @return The strnlen function returns the number of bytes that + * precede the first null character in the array pointed to by s, + * if s contains a null character within the first maxlen characters; + * otherwise, it returns maxlen. + */ +size_t characterstring_strnlen(const char *str, size_t maxlen) +{ + char* p = memchr(str, 0, maxlen); + if (p == NULL) { + return maxlen; + } + return (p - str); +} + /** * Initialize a BACnet characater string. * Returns false if the string exceeds capacity. @@ -408,7 +435,7 @@ bool characterstring_init_ansi_safe( BACNET_CHARACTER_STRING *char_string, const char *value, size_t tmax) { return characterstring_init(char_string, CHARACTER_ANSI_X34, value, - value ? bacnet_strnlen(value, tmax) : 0); + value ? characterstring_strnlen(value, tmax) : 0); } /** @@ -1191,44 +1218,3 @@ bool octetstring_value_same( return false; } #endif - -/** - * @brief Compare two strings ignoring case - * @param s1 - first string - * @param s2 - second string - * @return 0 if the strings are equal, otherwise non-zero - */ -int bacnet_stricmp(const char *s1, const char *s2) -{ - unsigned char c1, c2; - - do { - c1 = (unsigned char)*s1; - c2 = (unsigned char)*s2; - c1 = (unsigned char)tolower(c1); - c2 = (unsigned char)tolower(c2); - s1++; - s2++; - } while ((c1 == c2) && (c1 != '\0')); - - return (int)c1 - c2; -} - -/** - * @brief non-standard strnlen function - * @param s - string to check - * @param maxlen - maximum length to check - * @return length of string, up to maxlen - */ -size_t bacnet_strnlen(const char *s, size_t maxlen) -{ - size_t len; - - for (len = 0; len < maxlen; len++, s++) { - if (!*s) { - break; - } - } - - return len; -} diff --git a/src/bacnet/bacstr.h b/src/bacnet/bacstr.h index 8b2e3b38..867cf44b 100644 --- a/src/bacnet/bacstr.h +++ b/src/bacnet/bacstr.h @@ -8,7 +8,6 @@ */ #ifndef BACNET_STRING_H #define BACNET_STRING_H - #include #include #include @@ -95,15 +94,21 @@ extern "C" { uint8_t encoding, const char *value, size_t length); -/* used for ANSI C-Strings */ + /* used for ANSI C-Strings */ BACNET_STACK_EXPORT bool characterstring_init_ansi( BACNET_CHARACTER_STRING * char_string, const char *value); + BACNET_STACK_EXPORT + size_t characterstring_strnlen( + const char *str, + size_t maxlen); + BACNET_STACK_EXPORT bool characterstring_init_ansi_safe( BACNET_CHARACTER_STRING * char_string, const char *value, size_t tmax); + BACNET_STACK_EXPORT bool characterstring_copy( BACNET_CHARACTER_STRING * dest, BACNET_CHARACTER_STRING * src); @@ -215,11 +220,6 @@ extern "C" { BACNET_OCTET_STRING * octet_string1, BACNET_OCTET_STRING * octet_string2); - BACNET_STACK_EXPORT - int bacnet_stricmp(const char *s1, const char *s2); - BACNET_STACK_EXPORT - size_t bacnet_strnlen(const char *s, size_t maxlen); - #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/src/bacnet/bactext.c b/src/bacnet/bactext.c index 66bc6a45..38471939 100644 --- a/src/bacnet/bactext.c +++ b/src/bacnet/bactext.c @@ -138,8 +138,12 @@ INDTEXT_DATA bacnet_application_tag_names[] = { { BACNET_APPLICATION_TAG_NULL, "BACnetReadAccessSpecification" }, { BACNET_APPLICATION_TAG_LIGHTING_COMMAND, "BACnetLightingCommand" }, { BACNET_APPLICATION_TAG_HOST_N_PORT, "BACnetHostNPort" }, + { BACNET_APPLICATION_TAG_XY_COLOR, "BACnetxyColor" }, + { BACNET_APPLICATION_TAG_COLOR_COMMAND, "BACnetColorCommand" }, { BACNET_APPLICATION_TAG_BDT_ENTRY, "BACnetBDTEntry" }, { BACNET_APPLICATION_TAG_FDT_ENTRY, "BACnetFDTEntry" }, + { BACNET_APPLICATION_TAG_ACTION_COMMAND, "BACnetActionCommand" }, + { BACNET_APPLICATION_TAG_SCALE, "BACnetScale" }, { 0, NULL } }; const char *bactext_application_tag_name(unsigned index) diff --git a/src/bacnet/basic/object/bi.c b/src/bacnet/basic/object/bi.c index 71b9f473..5fef62e2 100644 --- a/src/bacnet/basic/object/bi.c +++ b/src/bacnet/basic/object/bi.c @@ -151,13 +151,17 @@ unsigned Binary_Input_Count(void) /** * @brief Determines the object instance-number for a given 0..N index - * of Binary Input objects where N is Binary_Input_Count(). - * @param index - 0..MAX_BINARY_INPUTS value - * @return object instance-number for the given index + * of objects where N is the count. + * @param index - 0..N value + * @return object instance-number for a valid given index, or UINT32_MAX */ uint32_t Binary_Input_Index_To_Instance(unsigned index) { - return Keylist_Key(Object_List, index); + uint32_t instance = UINT32_MAX; + + (void)Keylist_Index_Key(Object_List, index, &instance); + + return instance; } /** diff --git a/src/bacnet/basic/object/bitstring_value.c b/src/bacnet/basic/object/bitstring_value.c index 34daedce..66ba54e9 100644 --- a/src/bacnet/basic/object/bitstring_value.c +++ b/src/bacnet/basic/object/bitstring_value.c @@ -116,17 +116,18 @@ unsigned BitString_Value_Count(void) } /** - * We simply have 0-n object instances. Yours might be - * more complex, and then you need to return the index - * that correlates to the correct instance number - * - * @param index Object index - * - * @return Index in the object table. + * @brief Determines the object instance-number for a given 0..N index + * of objects where N is the count. + * @param index - 0..N value + * @return object instance-number for a valid given index, or UINT32_MAX */ uint32_t BitString_Value_Index_To_Instance(unsigned index) { - return Keylist_Key(Object_List, index); + uint32_t instance = UINT32_MAX; + + (void)Keylist_Index_Key(Object_List, index, &instance); + + return instance; } /** diff --git a/src/bacnet/basic/object/bv.c b/src/bacnet/basic/object/bv.c index 12f92e28..989c9d8f 100644 --- a/src/bacnet/basic/object/bv.c +++ b/src/bacnet/basic/object/bv.c @@ -154,12 +154,16 @@ unsigned Binary_Value_Count(void) /** * @brief Determines the object instance-number for a given 0..N index * of objects where N is the count. - * @param index - 0..count value - * @return object instance-number for the given index + * @param index - 0..N value + * @return object instance-number for a valid given index, or UINT32_MAX */ uint32_t Binary_Value_Index_To_Instance(unsigned index) { - return Keylist_Key(Object_List, index); + uint32_t instance = UINT32_MAX; + + (void)Keylist_Index_Key(Object_List, index, &instance); + + return instance; } /** diff --git a/src/bacnet/basic/object/command.c b/src/bacnet/basic/object/command.c index dbeb6e35..e390f019 100644 --- a/src/bacnet/basic/object/command.c +++ b/src/bacnet/basic/object/command.c @@ -21,316 +21,34 @@ /* BACnet Stack defines - first */ #include "bacnet/bacdef.h" /* BACnet Stack API */ +#include "bacnet/bacaction.h" #include "bacnet/bacdcode.h" #include "bacnet/bactext.h" #include "bacnet/lighting.h" #include "bacnet/proplist.h" #include "bacnet/timestamp.h" -#include "bacnet/basic/object/device.h" #include "bacnet/basic/services.h" /* me!*/ #include "bacnet/basic/object/command.h" -/* - BACnetActionCommand ::= SEQUENCE { - deviceIdentifier [0] BACnetObjectIdentifier OPTIONAL, - objectIdentifier [1] BACnetObjectIdentifier, - propertyIdentifier [2] BACnetPropertyIdentifier, - propertyArrayIndex [3] Unsigned OPTIONAL, - --used only with array datatype - propertyValue [4] ABSTRACT-SYNTAX.&Type, - priority [5] Unsigned (1..16) OPTIONAL, - --used only when property is commandable - postDelay [6] Unsigned OPTIONAL, - quitOnFailure [7] BOOLEAN, - writeSuccessful [8] BOOLEAN - } -*/ - -int cl_encode_apdu(uint8_t *apdu, BACNET_ACTION_LIST *bcl) -{ - int len = 0; - int apdu_len = 0; - - if (bcl->Device_Id.instance <= BACNET_MAX_INSTANCE) { - len = encode_context_object_id( - &apdu[apdu_len], 0, bcl->Device_Id.type, bcl->Device_Id.instance); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - apdu_len += len; - } - /* TODO: Check for object type and instance limits */ - len = encode_context_object_id( - &apdu[apdu_len], 1, bcl->Object_Id.type, bcl->Object_Id.instance); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - apdu_len += len; - len = - encode_context_enumerated(&apdu[apdu_len], 2, bcl->Property_Identifier); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - apdu_len += len; - if (bcl->Property_Array_Index != BACNET_ARRAY_ALL) { - len = encode_context_unsigned( - &apdu[apdu_len], 3, bcl->Property_Array_Index); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - apdu_len += len; - } - - /* BACnet Testing Observed Incident oi00108 - Command Action not correctly formatted - Revealed by BACnet Test Client v1.8.16 ( - www.bac-test.com/bacnet-test-client-download ) BITS: BIT00031 BC - 135.1: 9.20.1.7 BC 135.1: 9.20.1.9 Any discussions can be directed to - edward@bac-test.com Please feel free to remove this comment when my - changes have been reviewed by all interested parties. Say 6 months -> - September 2016 */ - - len = encode_opening_tag(&apdu[apdu_len], 4); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - apdu_len += len; - len = bacapp_encode_application_data(&apdu[apdu_len], &bcl->Value); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - apdu_len += len; - len = encode_closing_tag(&apdu[apdu_len], 4); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - apdu_len += len; - - if (bcl->Priority != BACNET_NO_PRIORITY) { - len = encode_context_unsigned(&apdu[apdu_len], 5, bcl->Priority); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - apdu_len += len; - } - if (bcl->Post_Delay != 0xFFFFFFFFU) { - len = encode_context_unsigned(&apdu[apdu_len], 6, bcl->Post_Delay); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - apdu_len += len; - } - len = encode_context_boolean(&apdu[apdu_len], 7, bcl->Quit_On_Failure); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - apdu_len += len; - len = encode_context_boolean(&apdu[apdu_len], 8, bcl->Write_Successful); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - apdu_len += len; - - return apdu_len; -} - -int cl_decode_apdu(uint8_t *apdu, - unsigned apdu_len, - BACNET_APPLICATION_TAG tag, - BACNET_ACTION_LIST *bcl) -{ - int len = 0; - int dec_len = 0; - uint8_t tag_number = 0; - uint32_t len_value_type = 0; - uint32_t enum_value = 0; - BACNET_UNSIGNED_INTEGER unsigned_value = 0; - - if (decode_is_context_tag(&apdu[dec_len], 0)) { - /* Tag 0: Device ID */ - dec_len++; - len = decode_object_id( - &apdu[dec_len], &bcl->Device_Id.type, &bcl->Device_Id.instance); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - dec_len += len; - } - if (!decode_is_context_tag(&apdu[dec_len++], 1)) { - return BACNET_STATUS_REJECT; - } - len = decode_object_id( - &apdu[dec_len], &bcl->Object_Id.type, &bcl->Object_Id.instance); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - dec_len += len; - len = decode_tag_number_and_value( - &apdu[dec_len], &tag_number, &len_value_type); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - dec_len += len; - if (tag_number != 2) { - return BACNET_STATUS_REJECT; - } - len = decode_enumerated(&apdu[dec_len], len_value_type, &enum_value); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - bcl->Property_Identifier = enum_value; - dec_len += len; - if (decode_is_context_tag(&apdu[dec_len], 3)) { - len = decode_tag_number_and_value( - &apdu[dec_len], &tag_number, &len_value_type); - dec_len += len; - len = decode_unsigned(&apdu[dec_len], len_value_type, &unsigned_value); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - bcl->Property_Array_Index = unsigned_value; - dec_len += len; - } else { - bcl->Property_Array_Index = BACNET_ARRAY_ALL; - } - if (!decode_is_context_tag(&apdu[dec_len], 4)) { - return BACNET_STATUS_REJECT; - } - bcl->Value.context_specific = true; - bcl->Value.context_tag = 4; - bcl->Value.tag = tag; - switch (tag) { - case BACNET_APPLICATION_TAG_NULL: - len = 1; - break; - case BACNET_APPLICATION_TAG_BOOLEAN: - len = decode_context_boolean2( - &apdu[dec_len], 4, &bcl->Value.type.Boolean); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - break; - case BACNET_APPLICATION_TAG_UNSIGNED_INT: - len = decode_context_unsigned(&apdu[dec_len], 4, &unsigned_value); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - bcl->Value.type.Unsigned_Int = unsigned_value; - break; - case BACNET_APPLICATION_TAG_SIGNED_INT: - len = decode_context_signed( - &apdu[dec_len], 4, &bcl->Value.type.Signed_Int); - break; - case BACNET_APPLICATION_TAG_REAL: - len = decode_context_real(&apdu[dec_len], 4, &bcl->Value.type.Real); - break; - case BACNET_APPLICATION_TAG_DOUBLE: - len = decode_context_double( - &apdu[dec_len], 4, &bcl->Value.type.Double); - break; - case BACNET_APPLICATION_TAG_OCTET_STRING: - len = decode_context_octet_string( - &apdu[dec_len], 4, &bcl->Value.type.Octet_String); - break; - case BACNET_APPLICATION_TAG_CHARACTER_STRING: - len = decode_context_character_string( - &apdu[dec_len], 4, &bcl->Value.type.Character_String); - break; - case BACNET_APPLICATION_TAG_BIT_STRING: - len = decode_context_bitstring( - &apdu[dec_len], 4, &bcl->Value.type.Bit_String); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - break; - case BACNET_APPLICATION_TAG_ENUMERATED: - len = decode_context_enumerated( - &apdu[dec_len], 4, &bcl->Value.type.Enumerated); - break; - case BACNET_APPLICATION_TAG_DATE: - len = decode_context_date(&apdu[dec_len], 4, &bcl->Value.type.Date); - break; - case BACNET_APPLICATION_TAG_TIME: - len = decode_context_bacnet_time( - &apdu[dec_len], 4, &bcl->Value.type.Time); - break; - case BACNET_APPLICATION_TAG_OBJECT_ID: - len = decode_context_object_id(&apdu[dec_len], 4, - &bcl->Value.type.Object_Id.type, - &bcl->Value.type.Object_Id.instance); - break; -#if defined(BACAPP_TYPES_EXTRA) - case BACNET_APPLICATION_TAG_LIGHTING_COMMAND: - len = lighting_command_decode(&apdu[dec_len], apdu_len - dec_len, - &bcl->Value.type.Lighting_Command); - break; -#endif - default: - return BACNET_STATUS_REJECT; - } - if (len > 0) { - dec_len += len; - } - if (decode_is_context_tag(&apdu[dec_len], 5)) { - len = decode_tag_number_and_value( - &apdu[dec_len], &tag_number, &len_value_type); - dec_len += len; - len = decode_unsigned(&apdu[dec_len], len_value_type, &unsigned_value); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - bcl->Priority = (uint8_t)unsigned_value; - dec_len += len; - } else { - bcl->Priority = BACNET_NO_PRIORITY; - } - if (decode_is_context_tag(&apdu[dec_len], 6)) { - len = decode_tag_number_and_value( - &apdu[dec_len], &tag_number, &len_value_type); - dec_len += len; - len = decode_unsigned(&apdu[dec_len], len_value_type, &unsigned_value); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - bcl->Post_Delay = unsigned_value; - dec_len += len; - } else { - bcl->Post_Delay = 0xFFFFFFFFU; - } - if (!decode_is_context_tag(&apdu[dec_len], 7)) { - return BACNET_STATUS_REJECT; - } - len = decode_context_boolean2(&apdu[dec_len], 7, &bcl->Quit_On_Failure); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - dec_len += len; - if (!decode_is_context_tag(&apdu[dec_len], 8)) { - return BACNET_STATUS_REJECT; - } - len = decode_context_boolean2(&apdu[dec_len], 8, &bcl->Write_Successful); - if (len < 0) { - return BACNET_STATUS_REJECT; - } - dec_len += len; - if (dec_len < apdu_len) { - return BACNET_STATUS_REJECT; - } - - return dec_len; -} - -COMMAND_DESCR Command_Descr[MAX_COMMANDS]; +static COMMAND_DESCR Command_Descr[MAX_COMMANDS]; +/* clang-format off */ /* These arrays are used by the ReadPropertyMultiple handler */ -static const int Command_Properties_Required[] = { PROP_OBJECT_IDENTIFIER, - PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_PRESENT_VALUE, PROP_IN_PROCESS, - PROP_ALL_WRITES_SUCCESSFUL, PROP_ACTION, -1 }; +static const int Command_Properties_Required[] = { + PROP_OBJECT_IDENTIFIER, + PROP_OBJECT_NAME, + PROP_OBJECT_TYPE, + PROP_PRESENT_VALUE, + PROP_IN_PROCESS, + PROP_ALL_WRITES_SUCCESSFUL, + PROP_ACTION, + -1 }; -static const int Command_Properties_Optional[] = { PROP_DESCRIPTION, -1 }; +static const int Command_Properties_Optional[] = { -1 }; static const int Command_Properties_Proprietary[] = { -1 }; +/* clang-format on */ /** * Returns the list of required, optional, and proprietary properties. @@ -584,14 +302,78 @@ bool Command_Object_Name( index = Command_Instance_To_Index(object_instance); if (index < MAX_COMMANDS) { - snprintf(text, sizeof(text), "COMMAND %lu", - (unsigned long)object_instance); + snprintf( + text, sizeof(text), "COMMAND %lu", (unsigned long)object_instance); status = characterstring_init_ansi(object_name, text); } return status; } +/** + * @brief For a given object instance-number, returns the object data + * @param object_instance [in] BACnet network port object instance number + * @return pointer to the object data + */ +static COMMAND_DESCR *Object_Data(uint32_t object_instance) +{ + unsigned int index = Command_Instance_To_Index(object_instance); + if (index < MAX_COMMANDS) { + return &Command_Descr[index]; + } + + return NULL; +} + +BACNET_ACTION_LIST * Command_Action_List_Entry( + uint32_t instance, unsigned index) +{ + COMMAND_DESCR *pObject; + BACNET_ACTION_LIST *pAction = NULL; + + pObject = Object_Data(instance); + if (pObject && (index < MAX_COMMAND_ACTIONS)) { + pAction = &pObject->Action[index]; + } + + return pAction; +} + +/** + * @brief For a given object instance-number, returns the number of actions + */ +unsigned Command_Action_List_Count( + uint32_t instance) +{ + (void)instance; + return MAX_COMMAND_ACTIONS; +} + +/** + * @brief Encode a BACnetARRAY property element + * @param object_instance [in] BACnet network port object instance number + * @param index [in] array index requested: + * 0 to N for individual array members + * @param apdu [out] Buffer in which the APDU contents are built, or NULL to + * return the length of buffer if it had been built + * @return The length of the apdu encoded or + * BACNET_STATUS_ERROR for ERROR_CODE_INVALID_ARRAY_INDEX + */ +static int Command_Action_List_Encode( + uint32_t object_instance, BACNET_ARRAY_INDEX index, uint8_t *apdu) +{ + int apdu_len = BACNET_STATUS_ERROR; + COMMAND_DESCR *pObject; + + pObject = Object_Data(object_instance); + if (pObject && (index < MAX_COMMAND_ACTIONS)) { + apdu_len = bacnet_action_command_encode( + apdu, &pObject->Action[index]); + } + + return apdu_len; +} + /** * ReadProperty handler for this object. For the given ReadProperty * data, the application_data is loaded or the error flags are set. @@ -605,26 +387,16 @@ bool Command_Object_Name( int Command_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) { int apdu_len = 0; /* return value */ - int len = 0; BACNET_CHARACTER_STRING char_string; - unsigned object_index = 0; uint8_t *apdu = NULL; - uint16_t apdu_max = 0; - COMMAND_DESCR *CurrentCommand; + int apdu_size = 0; if ((rpdata == NULL) || (rpdata->application_data == NULL) || (rpdata->application_data_len == 0)) { return 0; } - apdu_max = rpdata->application_data_len; - object_index = Command_Instance_To_Index(rpdata->object_instance); - if (object_index < MAX_COMMANDS) { - CurrentCommand = &Command_Descr[object_index]; - } else { - return false; - } - apdu = rpdata->application_data; + apdu_size = rpdata->application_data_len; switch ((int)rpdata->object_property) { case PROP_OBJECT_IDENTIFIER: apdu_len = encode_application_object_id( @@ -632,7 +404,6 @@ int Command_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) break; case PROP_OBJECT_NAME: - case PROP_DESCRIPTION: Command_Object_Name(rpdata->object_instance, &char_string); apdu_len = encode_application_character_string(&apdu[0], &char_string); @@ -651,60 +422,20 @@ int Command_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) &apdu[0], Command_In_Process(rpdata->object_instance)); break; case PROP_ALL_WRITES_SUCCESSFUL: - apdu_len = encode_application_boolean(&apdu[0], + apdu_len = encode_application_boolean( + &apdu[0], Command_All_Writes_Successful(rpdata->object_instance)); break; case PROP_ACTION: - /* TODO */ - if (rpdata->array_index == 0) { - apdu_len = - encode_application_unsigned(&apdu[0], MAX_COMMAND_ACTIONS); - } else if (rpdata->array_index == BACNET_ARRAY_ALL) { - int i; - for (i = 0; i < MAX_COMMAND_ACTIONS; i++) { - BACNET_ACTION_LIST *Curr_CL_Member = - &CurrentCommand->Action[0]; - /* another loop, for additional actions in the list */ - for (; Curr_CL_Member != NULL; - Curr_CL_Member = Curr_CL_Member->next) { - len = cl_encode_apdu( - &apdu[apdu_len], &CurrentCommand->Action[0]); - apdu_len += len; - /* assume the next one is of the same length, which need - * not be the case */ - if ((i != MAX_COMMAND_ACTIONS - 1) && - (apdu_len + len) >= apdu_max) { - rpdata->error_code = - ERROR_CODE_ABORT_SEGMENTATION_NOT_SUPPORTED; - apdu_len = BACNET_STATUS_ABORT; - break; - } - } - } - } else { - if (rpdata->array_index < MAX_COMMAND_ACTIONS) { - BACNET_ACTION_LIST *Curr_CL_Member = - &CurrentCommand->Action[rpdata->array_index]; - /* another loop, for additional actions in the list */ - for (; Curr_CL_Member != NULL; - Curr_CL_Member = Curr_CL_Member->next) { - len = cl_encode_apdu( - &apdu[apdu_len], &CurrentCommand->Action[0]); - apdu_len += len; - /* assume the next one is of the same length, which need - * not be the case */ - if ((apdu_len + len) >= apdu_max) { - rpdata->error_code = - ERROR_CODE_ABORT_SEGMENTATION_NOT_SUPPORTED; - apdu_len = BACNET_STATUS_ABORT; - break; - } - } - } else { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX; - apdu_len = BACNET_STATUS_ERROR; - } + apdu_len = bacnet_array_encode(rpdata->object_instance, + rpdata->array_index, Command_Action_List_Encode, + MAX_COMMAND_ACTIONS, apdu, apdu_size); + if (apdu_len == BACNET_STATUS_ABORT) { + rpdata->error_code = + ERROR_CODE_ABORT_SEGMENTATION_NOT_SUPPORTED; + } else if (apdu_len == BACNET_STATUS_ERROR) { + rpdata->error_class = ERROR_CLASS_PROPERTY; + rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX; } break; default: @@ -781,8 +512,8 @@ bool Command_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) break; default: if (property_lists_member( - Command_Properties_Required, Command_Properties_Optional, - Command_Properties_Proprietary, wp_data->object_property)) { + Command_Properties_Required, Command_Properties_Optional, + Command_Properties_Proprietary, wp_data->object_property)) { wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED; } else { diff --git a/src/bacnet/basic/object/command.h b/src/bacnet/basic/object/command.h index 190dc64c..21dbfecb 100644 --- a/src/bacnet/basic/object/command.h +++ b/src/bacnet/basic/object/command.h @@ -12,6 +12,7 @@ /* BACnet Stack defines - first */ #include "bacnet/bacdef.h" /* BACnet Stack API */ +#include "bacnet/bacaction.h" #include "bacnet/rp.h" #include "bacnet/wp.h" @@ -27,29 +28,6 @@ extern "C" { #endif /* __cplusplus */ - typedef struct bacnet_action_list { - BACNET_OBJECT_ID Device_Id; /* Optional */ - BACNET_OBJECT_ID Object_Id; - BACNET_PROPERTY_ID Property_Identifier; - uint32_t Property_Array_Index; /* Conditional */ - BACNET_APPLICATION_DATA_VALUE Value; - uint8_t Priority; /* Conditional */ - uint32_t Post_Delay; /* Optional */ - bool Quit_On_Failure; - bool Write_Successful; - struct bacnet_action_list *next; - } BACNET_ACTION_LIST; - - int cl_encode_apdu( - uint8_t * apdu, - BACNET_ACTION_LIST * bcl); - - int cl_decode_apdu( - uint8_t * apdu, - unsigned apdu_len, - BACNET_APPLICATION_TAG tag, - BACNET_ACTION_LIST * bcl); - typedef struct command_descr { uint32_t Present_Value; bool In_Process; @@ -144,6 +122,13 @@ extern "C" { uint32_t instance, float value); + BACNET_STACK_EXPORT + BACNET_ACTION_LIST * Command_Action_List_Entry( + uint32_t instance, unsigned index); + BACNET_STACK_EXPORT + unsigned Command_Action_List_Count( + uint32_t instance); + /* note: header of Intrinsic_Reporting function is required even when INTRINSIC_REPORTING is not defined */ BACNET_STACK_EXPORT diff --git a/src/bacnet/basic/object/lo.c b/src/bacnet/basic/object/lo.c index ae37236e..d2774e7e 100644 --- a/src/bacnet/basic/object/lo.c +++ b/src/bacnet/basic/object/lo.c @@ -188,33 +188,6 @@ unsigned Lighting_Output_Instance_To_Index(uint32_t object_instance) return Keylist_Index(Object_List, object_instance); } -/** - * For a given object instance-number, determines the present-value - * - * @param object_instance - object-instance number of the object - * - * @return present-value of the object - */ -float Lighting_Output_Present_Value(uint32_t object_instance) -{ - float value = 0.0; - unsigned p = 0; - struct object_data *pObject; - - pObject = Keylist_Data(Object_List, object_instance); - if (pObject) { - value = pObject->Relinquish_Default; - for (p = 0; p < BACNET_MAX_PRIORITY; p++) { - if (BIT_CHECK(pObject->Priority_Active_Bits, p)) { - value = pObject->Priority_Array[p]; - break; - } - } - } - - return value; -} - /** * @brief Get the priority-array active status for the specific priority * @param object [in] BACnet object instance @@ -236,6 +209,27 @@ Priority_Array_Active(struct object_data *pObject, BACNET_ARRAY_INDEX priority) return active; } +/** + * @brief Get the priority-array value for the specific priority + * @param object [in] BACnet object instance + * @param priority [in] array index requested: + * 0 to N for individual array members + * @return The priority-array value for the specific priority + */ +static float +Priority_Array_Value(struct object_data *pObject, BACNET_ARRAY_INDEX priority) +{ + float real_value = 0.0; + + if (priority < BACNET_MAX_PRIORITY) { + if (BIT_CHECK(pObject->Priority_Active_Bits, priority)) { + real_value = pObject->Priority_Array[priority]; + } + } + + return real_value; +} + /** * @brief Get the value of the next highest non-NULL priority, including * Relinquish_Default @@ -262,24 +256,23 @@ static float Priority_Array_Next_Value( } /** - * @brief Get the priority-array value for the specific priority - * @param object [in] BACnet object instance - * @param priority [in] array index requested: - * 0 to N for individual array members - * @return The priority-array value for the specific priority + * For a given object instance-number, determines the present-value + * + * @param object_instance - object-instance number of the object + * + * @return present-value of the object */ -static float -Priority_Array_Value(struct object_data *pObject, BACNET_ARRAY_INDEX priority) +float Lighting_Output_Present_Value(uint32_t object_instance) { - float real_value = 0.0; + float value = 0.0; + struct object_data *pObject; - if (priority < BACNET_MAX_PRIORITY) { - if (BIT_CHECK(pObject->Priority_Active_Bits, priority)) { - real_value = pObject->Priority_Array[priority]; - } + pObject = Keylist_Data(Object_List, object_instance); + if (pObject) { + value = Priority_Array_Next_Value(pObject, 0); } - return real_value; + return value; } /** @@ -437,6 +430,181 @@ bool Lighting_Output_Present_Value_Set( return status; } +/** + * @brief Set the lighting command if the priority is active + * @param object [in] BACnet object instance + * @param priority [in] BACnet priority array value 1..16 + */ +static void +Lighting_Command_Warn(struct object_data *pObject, unsigned priority) +{ + unsigned current_priority; + + if (!pObject) { + return; + } + current_priority = Present_Value_Priority(pObject); + if ((priority <= current_priority) && + (Priority_Array_Active(pObject, priority - 1)) && + (isgreater(Priority_Array_Value(pObject, priority - 1), 0.0))) { + /* The blink-warn notification shall not occur + if any of the following conditions occur: + (a) The specified priority is not the highest + active priority, or + (b) The value at the specified priority is 0.0%, or + (c) Blink_Warn_Enable is FALSE. */ + pObject->Lighting_Command.operation = BACNET_LIGHTS_WARN; + } +} + +/** + * @brief Set the lighting command if the priority is active + * @param object [in] BACnet object instance + * @param priority [in] BACnet priority array value 1..16 + */ +static void +Lighting_Command_Warn_Off(struct object_data *pObject, unsigned priority) +{ + unsigned current_priority; + + if (!pObject) { + return; + } + current_priority = Present_Value_Priority(pObject); + if ((priority <= current_priority) && + (Priority_Array_Active(pObject, priority - 1)) && + (isgreater(Priority_Array_Value(pObject, priority - 1), 0.0)) && + (isgreater(Priority_Array_Next_Value(pObject, priority - 1), 0.0))) { + /* The blink-warn notification shall not occur and + the value 0.0% written at the specified + priority immediately if any of the following + conditions occur: + (a) The specified priority is not the highest + active priority, or + (b) The Present_Value is 0.0%, or + (c) Blink_Warn_Enable is FALSE. */ + pObject->Lighting_Command.operation = BACNET_LIGHTS_WARN_OFF; + } else { + Present_Value_Set(pObject, 0.0, priority); + } +} + +/** + * @brief Set the lighting command if the priority is active + * @param object [in] BACnet object instance + * @param priority [in] BACnet priority array value 1..16 + */ +static void +Lighting_Command_Warn_Relinquish(struct object_data *pObject, unsigned priority) +{ + unsigned current_priority; + + if (!pObject) { + return; + } + current_priority = Present_Value_Priority(pObject); + if ((priority <= current_priority) && + (Priority_Array_Active(pObject, priority - 1)) && + (isgreater(Priority_Array_Value(pObject, priority - 1), 0.0)) && + (isgreater(Priority_Array_Next_Value(pObject, priority - 1), 0.0))) { + /* The blink-warn notification shall not occur, + and the value at the specified priority shall be + relinquished immediately if any of the following + conditions occur: + (a) The specified priority is not the highest + active priority, or + (b) The value at the specified priority + is 0.0% or NULL, or + (c) The value of the next highest non-NULL + priority, including Relinquish_Default, + is greater than 0.0%, or + (d) Blink_Warn_Enable is FALSE. */ + pObject->Lighting_Command.operation = BACNET_LIGHTS_WARN_RELINQUISH; + } else { + Present_Value_Relinquish(pObject, priority); + } +} + +/** + * @brief Set the lighting command if the priority is active + * @param object [in] BACnet object instance + * @param priority [in] BACnet priority array value 1..16 + * @param value [in] BACnet lighting value + * @param fade_time [in] BACnet lighting fade time + */ +static void +Lighting_Command_Fade_To(struct object_data *pObject, + unsigned priority, float value, uint32_t fade_time) +{ + unsigned current_priority; + + if (!pObject) { + return; + } + Present_Value_Set(pObject, value, priority); + current_priority = Present_Value_Priority(pObject); + if (priority <= current_priority) { + /* we have priority - configure the Lighting Command */ + pObject->Lighting_Command.fade_time = fade_time; + pObject->Lighting_Command.operation = BACNET_LIGHTS_FADE_TO; + pObject->Lighting_Command.target_level = value; + } +} + +/** + * @brief Set the lighting command if the priority is active + * @param object [in] BACnet object instance + * @param priority [in] BACnet priority array value 1..16 + * @param value [in] BACnet lighting value + * @param ramp_rate [in] BACnet lighting ramp rate + */ +static void +Lighting_Command_Ramp_To(struct object_data *pObject, + unsigned priority, float value, float ramp_rate) +{ + unsigned current_priority; + + if (!pObject) { + return; + } + Present_Value_Set(pObject, value, priority); + current_priority = Present_Value_Priority(pObject); + if (priority <= current_priority) { + /* we have priority - configure the Lighting Command */ + pObject->Lighting_Command.ramp_rate = ramp_rate; + pObject->Lighting_Command.operation = BACNET_LIGHTS_RAMP_TO; + pObject->Lighting_Command.target_level = value; + } +} + +/** + * @brief Set the lighting command if the priority is active + * @param object [in] BACnet object instance + * @param priority [in] BACnet priority array value 1..16 + * @param operation [in] BACnet lighting operation + * @param step_increment [in] BACnet lighting step increment value + */ +static void Lighting_Command_Step( + struct object_data *pObject, + unsigned priority, + BACNET_LIGHTING_OPERATION operation, + float step_increment) +{ + unsigned current_priority; + + if (!pObject) { + return; + } + current_priority = Present_Value_Priority(pObject); + if (priority <= current_priority) { + /* we have priority - configure the Lighting Command */ + pObject->Lighting_Command.operation = operation; + pObject->Lighting_Command.fade_time = 0; + pObject->Lighting_Command.ramp_rate = 0.0f; + pObject->Lighting_Command.step_increment = step_increment; + } +} + /** * For a given object instance-number, writes the present-value * @@ -475,73 +643,17 @@ static bool Lighting_Output_Present_Value_Write( if (!islessgreater(value, -1.0)) { /* Provides the same functionality as the WARN lighting command. */ - current_priority = Present_Value_Priority(pObject); - if ((priority <= current_priority) && - (Priority_Array_Active(pObject, priority - 1)) && - (isgreater( - Priority_Array_Value(pObject, priority - 1), 0.0))) { - /* The blink-warn notification shall not occur - if any of the following conditions occur: - (a) The specified priority is not the highest - active priority, or - (b) The value at the specified priority is 0.0%, or - (c) Blink_Warn_Enable is FALSE. */ - pObject->Lighting_Command.operation = BACNET_LIGHTS_WARN; - } + Lighting_Command_Warn(pObject, priority); status = true; } else if (!islessgreater(value, -2.0)) { /* Provides the same functionality as the WARN_RELINQUISH lighting command. */ - current_priority = Present_Value_Priority(pObject); - if ((priority <= current_priority) && - (Priority_Array_Active(pObject, priority - 1)) && - (isgreater( - Priority_Array_Value(pObject, priority - 1), 0.0)) && - (isgreater( - Priority_Array_Next_Value(pObject, priority - 1), - 0.0))) { - /* The blink-warn notification shall not occur, - and the value at the specified priority shall be - relinquished immediately if any of the following - conditions occur: - (a) The specified priority is not the highest - active priority, or - (b) The value at the specified priority - is 0.0% or NULL, or - (c) The value of the next highest non-NULL - priority, including Relinquish_Default, - is greater than 0.0%, or - (d) Blink_Warn_Enable is FALSE. */ - pObject->Lighting_Command.operation = - BACNET_LIGHTS_WARN_RELINQUISH; - } else { - Present_Value_Relinquish(pObject, priority); - } + Lighting_Command_Warn_Relinquish(pObject, priority); status = true; } else if (!islessgreater(value, -3.0)) { /* Provides the same functionality as the WARN_OFF lighting command. */ - current_priority = Present_Value_Priority(pObject); - if ((priority <= current_priority) && - (Priority_Array_Active(pObject, priority - 1)) && - (isgreater( - Priority_Array_Value(pObject, priority - 1), 0.0)) && - (isgreater( - Priority_Array_Next_Value(pObject, priority - 1), - 0.0))) { - /* The blink-warn notification shall not occur and - the value 0.0% written at the specified - priority immediately if any of the following - conditions occur: - (a) The specified priority is not the highest - active priority, or - (b) The Present_Value is 0.0%, or - (c) Blink_Warn_Enable is FALSE. */ - pObject->Lighting_Command.operation = - BACNET_LIGHTS_WARN_OFF; - } else { - Present_Value_Set(pObject, 0.0, priority); - } + Lighting_Command_Warn_Off(pObject, priority); status = true; } else if ( isgreaterequal(value, 0.0) && islessequal(value, 100.0)) { @@ -799,9 +911,131 @@ bool Lighting_Output_Lighting_Command_Set( pObject = Keylist_Data(Object_List, object_instance); if (pObject) { - /* FIXME: check lighting command member values */ status = lighting_command_copy(&pObject->Lighting_Command, value); - /* FIXME: set all the other values, and get the light levels moving */ + } + + return status; +} + +/** + * @brief Set the lighting command if the priority is active + * @param object [in] BACnet object instance + * @param priority [in] BACnet priority array value 1..16 + */ +static void +Lighting_Command_Stop(struct object_data *pObject, unsigned priority) +{ + unsigned current_priority; + + if (!pObject) { + return; + } + current_priority = Present_Value_Priority(pObject); + if (priority <= current_priority) { + /* we have priority - configure the Lighting Command */ + pObject->Lighting_Command.operation = BACNET_LIGHTS_STOP; + } +} + +/** + * For a given object instance-number, writes the present-value + * + * @param object_instance - object-instance number of the object + * @param value - property value to write + * @param priority - priority-array index value 1..16 + * @param error_class - the BACnet error class + * @param error_code - BACnet Error code + * + * @return true if values are within range and present-value is set. + */ +static bool Lighting_Output_Lighting_Command_Write( + uint32_t object_instance, + BACNET_LIGHTING_COMMAND *value, + uint8_t priority, + BACNET_ERROR_CLASS *error_class, + BACNET_ERROR_CODE *error_code) +{ + bool status = false; + struct object_data *pObject; + + if (!value) { + *error_class = ERROR_CLASS_PROPERTY; + *error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; + return status; + } + if (priority == 6) { + /* Command priority 6 is reserved for use by Minimum On/Off + algorithm and may not be used for other purposes in any + object. */ + *error_class = ERROR_CLASS_PROPERTY; + *error_code = ERROR_CODE_WRITE_ACCESS_DENIED; + return status; + } + if ((priority < BACNET_MIN_PRIORITY) || + (priority > BACNET_MAX_PRIORITY)) { + *error_class = ERROR_CLASS_PROPERTY; + *error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; + return status; + } + if (value->operation >= MAX_BACNET_LIGHTING_OPERATION) { + *error_class = ERROR_CLASS_PROPERTY; + *error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; + return status; + } + pObject = Keylist_Data(Object_List, object_instance); + if (pObject) { + switch (value->operation) { + case BACNET_LIGHTS_NONE: + status = true; + break; + case BACNET_LIGHTS_FADE_TO: + Lighting_Command_Fade_To(pObject, priority, + value->target_level, value->fade_time); + status = true; + break; + case BACNET_LIGHTS_RAMP_TO: + Lighting_Command_Ramp_To(pObject, priority, + value->target_level, value->ramp_rate); + status = true; + break; + case BACNET_LIGHTS_STEP_UP: + case BACNET_LIGHTS_STEP_DOWN: + case BACNET_LIGHTS_STEP_ON: + case BACNET_LIGHTS_STEP_OFF: + Lighting_Command_Step(pObject,priority, + value->operation,value->step_increment); + status = true; + break; + case BACNET_LIGHTS_WARN: + /* Provides the same functionality as the + WARN lighting command. */ + Lighting_Command_Warn(pObject, priority); + status = true; + break; + case BACNET_LIGHTS_WARN_OFF: + /* Provides the same functionality as the + WARN_OFF lighting command. */ + Lighting_Command_Warn_Off(pObject, priority); + status = true; + break; + case BACNET_LIGHTS_WARN_RELINQUISH: + /* Provides the same functionality as the + WARN_RELINQUISH lighting command. */ + Lighting_Command_Warn_Relinquish(pObject, priority); + status = true; + break; + case BACNET_LIGHTS_STOP: + Lighting_Command_Stop(pObject, priority); + status = true; + break; + default: + *error_class = ERROR_CLASS_PROPERTY; + *error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; + break; + } + } else { + *error_class = ERROR_CLASS_OBJECT; + *error_code = ERROR_CODE_UNKNOWN_OBJECT; } return status; @@ -1866,9 +2100,11 @@ bool Lighting_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) BACNET_APPLICATION_DATA_VALUE value; /* decode the some of the request */ - len = bacapp_decode_application_data( - wp_data->application_data, wp_data->application_data_len, &value); - /* FIXME: len < application_data_len: more data? */ + len = bacapp_decode_known_property( + wp_data->application_data, wp_data->application_data_len, &value, + wp_data->object_type, wp_data->object_property); + /* note: len < application_data_len means there is more data, + such as an array or list */ if (len < 0) { /* error while decoding - a value larger than we can handle */ wp_data->error_class = ERROR_CLASS_PROPERTY; @@ -1905,8 +2141,10 @@ bool Lighting_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) status = write_property_type_valid( wp_data, &value, BACNET_APPLICATION_TAG_LIGHTING_COMMAND); if (status) { - status = Lighting_Output_Lighting_Command_Set( - wp_data->object_instance, &value.type.Lighting_Command); + status = Lighting_Output_Lighting_Command_Write( + wp_data->object_instance, &value.type.Lighting_Command, + wp_data->priority, + &wp_data->error_class, &wp_data->error_code); if (!status) { wp_data->error_class = ERROR_CLASS_PROPERTY; wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; @@ -1997,8 +2235,7 @@ bool Lighting_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) /** * Handles the timing for a single Lighting Output object Fade * - * @param pLight - Lighting Output object - * @param pCommand - BACNET_LIGHTING_COMMAND of the Lighting Output object + * @param object_instance - Lighting Output object * @param milliseconds - number of milliseconds elapsed since previously * called. Works best when called about every 10 milliseconds. */ diff --git a/src/bacnet/basic/object/ms-input.c b/src/bacnet/basic/object/ms-input.c index b2152135..cba41e9f 100644 --- a/src/bacnet/basic/object/ms-input.c +++ b/src/bacnet/basic/object/ms-input.c @@ -101,13 +101,17 @@ unsigned Multistate_Input_Instance_To_Index(uint32_t object_instance) /** * @brief Determines the object instance-number for a given 0..N index - * of Multistate Input objects where N is Multistate_Input_Count(). - * @param index - 0..Multistate_Input_Count() value - * @return object instance-number for the given index + * of objects where N is the count. + * @param index - 0..N value + * @return object instance-number for a valid given index, or UINT32_MAX */ uint32_t Multistate_Input_Index_To_Instance(unsigned index) { - return Keylist_Key(Object_List, index); + uint32_t instance = UINT32_MAX; + + (void)Keylist_Index_Key(Object_List, index, &instance); + + return instance; } /** diff --git a/src/bacnet/basic/object/msv.c b/src/bacnet/basic/object/msv.c index eb514e02..0937ba5a 100644 --- a/src/bacnet/basic/object/msv.c +++ b/src/bacnet/basic/object/msv.c @@ -103,13 +103,17 @@ unsigned Multistate_Value_Instance_To_Index(uint32_t object_instance) /** * @brief Determines the object instance-number for a given 0..N index - * of Multistate Input objects where N is Multistate_Value_Count(). - * @param index - 0..Multistate_Value_Count() value - * @return object instance-number for the given index + * of objects where N is the count. + * @param index - 0..N value + * @return object instance-number for a valid given index, or UINT32_MAX */ uint32_t Multistate_Value_Index_To_Instance(unsigned index) { - return Keylist_Key(Object_List, index); + uint32_t instance = UINT32_MAX; + + (void)Keylist_Index_Key(Object_List, index, &instance); + + return instance; } /** diff --git a/src/bacnet/basic/object/netport.c b/src/bacnet/basic/object/netport.c index 1613a00f..c6e671ac 100644 --- a/src/bacnet/basic/object/netport.c +++ b/src/bacnet/basic/object/netport.c @@ -2,7 +2,7 @@ * @file * @author Steve Karg * @date 2016 - * @brief A basic BACnet Network Port object provides access to the + * @brief A basic BACnet Network Port object provides access to the * configuration and properties of any network ports of a device. * @copyright SPDX-License-Identifier: MIT */ @@ -2898,7 +2898,75 @@ static bool Network_Port_FD_BBMD_Address_Write( #endif default: *error_class = ERROR_CLASS_PROPERTY; - *error_code = ERROR_CODE_INVALID_ARRAY_INDEX; + *error_code = ERROR_CODE_WRITE_ACCESS_DENIED; + break; + } + + return status; +} + +/** + * @brief Write the FD Subscription Lifetime + * @param object_instance [in] BACnet network port object instance number + * @param value [in] BACnet IP address and port + * @param error_class [out] BACnet error class + * @param error_code [out] BACnet error code + * @return true if the value was written + */ +static bool Network_Port_FD_Subscription_Lifetime_Write( + uint32_t object_instance, + BACNET_UNSIGNED_INTEGER value, + BACNET_ERROR_CLASS *error_class, + BACNET_ERROR_CODE *error_code) +{ + bool status = false; + uint16_t lifetime = 0; + + if (!error_class || !error_code) { + return status; + } + if (value > UINT16_MAX) { + *error_class = ERROR_CLASS_PROPERTY; + *error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; + return status; + } + lifetime = (uint16_t)value; + switch (Network_Port_Type(object_instance)) { +#if (defined(BACDL_ALL) || defined(BACDL_BIP)) + case PORT_TYPE_BIP: + if (Network_Port_BIP_Mode(object_instance) == + BACNET_IP_MODE_FOREIGN) { + status = Network_Port_Remote_BBMD_BIP_Lifetime_Set( + object_instance, lifetime); + if (!status) { + *error_class = ERROR_CLASS_PROPERTY; + *error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; + } + } else { + *error_class = ERROR_CLASS_PROPERTY; + *error_code = ERROR_CODE_WRITE_ACCESS_DENIED; + } + break; +#endif +#if (defined(BACDL_ALL) || defined(BACDL_BIP6)) + case PORT_TYPE_BIP6: + if (Network_Port_BIP6_Mode(object_instance) == + BACNET_IP_MODE_FOREIGN) { + status = Network_Port_Remote_BBMD_BIP6_Lifetime_Set( + object_instance, lifetime); + if (!status) { + *error_class = ERROR_CLASS_PROPERTY; + *error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; + } + } else { + *error_class = ERROR_CLASS_PROPERTY; + *error_code = ERROR_CODE_WRITE_ACCESS_DENIED; + } + break; +#endif + default: + *error_class = ERROR_CLASS_PROPERTY; + *error_code = ERROR_CODE_WRITE_ACCESS_DENIED; break; } @@ -3379,13 +3447,13 @@ bool Network_Port_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) return false; } /* decode the some of the request */ -#if !defined(BACAPP_COMPLEX_TYPES) +#if defined(BACAPP_COMPLEX_TYPES) + len = bacapp_decode_known_property( + wp_data->application_data, wp_data->application_data_len, &value, + wp_data->object_type, wp_data->object_property); +#else len = bacapp_decode_application_data( wp_data->application_data, wp_data->application_data_len, &value); -#else - len = bacapp_decode_generic_property( - wp_data->application_data, wp_data->application_data_len, &value, - wp_data->object_property); #endif if (len < 0) { /* error while decoding - a value larger than we can handle */ @@ -3462,60 +3530,12 @@ bool Network_Port_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) case PROP_FD_SUBSCRIPTION_LIFETIME: if (write_property_type_valid( wp_data, &value, BACNET_APPLICATION_TAG_UNSIGNED_INT)) { - if (value.type.Unsigned_Int <= 65535) { - switch (Network_Port_Type(wp_data->object_instance)) { -#if (defined(BACDL_ALL) || defined(BACDL_BIP)) - case PORT_TYPE_BIP: - if (Network_Port_BIP_Mode( - wp_data->object_instance) == - BACNET_IP_MODE_FOREIGN) { - status = - Network_Port_Remote_BBMD_BIP_Lifetime_Set( - wp_data->object_instance, - value.type.Unsigned_Int); - if (!status) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = - ERROR_CODE_VALUE_OUT_OF_RANGE; - } - } else { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = - ERROR_CODE_WRITE_ACCESS_DENIED; - } - break; -#endif -#if (defined(BACDL_ALL) || defined(BACDL_BIP6)) - case PORT_TYPE_BIP6: - if (Network_Port_BIP6_Mode( - wp_data->object_instance) == - BACNET_IP_MODE_FOREIGN) { - status = - Network_Port_Remote_BBMD_BIP6_Lifetime_Set( - wp_data->object_instance, - value.type.Unsigned_Int); - if (!status) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = - ERROR_CODE_VALUE_OUT_OF_RANGE; - } - } else { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = - ERROR_CODE_WRITE_ACCESS_DENIED; - } - break; -#endif - default: - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = - ERROR_CODE_INVALID_ARRAY_INDEX; - break; - } - } else { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; - } + status = Network_Port_FD_Subscription_Lifetime_Write( + wp_data->object_instance, value.type.Unsigned_Int, + &wp_data->error_class, &wp_data->error_code); + } else { + wp_data->error_class = ERROR_CLASS_PROPERTY; + wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; } break; #endif diff --git a/src/bacnet/basic/object/objects.c b/src/bacnet/basic/object/objects.c index 204ebdc4..d57f1fd7 100644 --- a/src/bacnet/basic/object/objects.c +++ b/src/bacnet/basic/object/objects.c @@ -31,7 +31,11 @@ int objects_device_count(void) uint32_t objects_device_id(int index) { - return Keylist_Key(Device_List, index); + uint32_t instance = UINT32_MAX; + + (void)Keylist_Index_Key(Device_List, index, &instance); + + return instance; } OBJECT_DEVICE_T *objects_device_data(int index) diff --git a/src/bacnet/basic/service/h_rpm_a.c b/src/bacnet/basic/service/h_rpm_a.c index e3d69fb9..b3dd12fd 100644 --- a/src/bacnet/basic/service/h_rpm_a.c +++ b/src/bacnet/basic/service/h_rpm_a.c @@ -112,8 +112,7 @@ int rpm_ack_decode_service_request( apdu_len -= len; apdu += len; if (apdu_len && decode_is_opening_tag_number(apdu, 4)) { - data_len = bacapp_data_len(apdu, (unsigned)apdu_len, - rpm_property->propertyIdentifier); + data_len = bacnet_enclosed_data_length(apdu, apdu_len); /* propertyValue */ decoded_len++; apdu_len--; diff --git a/src/bacnet/basic/sys/platform.h b/src/bacnet/basic/sys/platform.h index 9d67fc4b..c33edb1c 100644 --- a/src/bacnet/basic/sys/platform.h +++ b/src/bacnet/basic/sys/platform.h @@ -10,8 +10,14 @@ #ifndef BACNET_SYS_PLATFORM_H #define BACNET_SYS_PLATFORM_H #include +#include +#include #include +#ifndef INT_MAX +#define INT_MAX (~0U >> 1U) +#endif + #ifndef islessgreater #define islessgreater(x, y) ((x) < (y) || (x) > (y)) #endif diff --git a/src/bacnet/config.h b/src/bacnet/config.h index c91e3a75..e2aa6011 100644 --- a/src/bacnet/config.h +++ b/src/bacnet/config.h @@ -160,6 +160,8 @@ defined(BACAPP_DESTINATION) || \ defined(BACAPP_BDT_ENTRY) || \ defined(BACAPP_FDT_ENTRY) || \ + defined(BACAPP_ACTION_COMMAND) || \ + defined(BACAPP_SCALE) || \ defined(BACAPP_TYPES_EXTRA)) #define BACAPP_ALL #endif @@ -202,6 +204,8 @@ #define BACAPP_DESTINATION #define BACAPP_BDT_ENTRY #define BACAPP_FDT_ENTRY +#define BACAPP_ACTION_COMMAND +#define BACAPP_SCALE #endif #if defined(BACAPP_DOUBLE) || \ @@ -219,7 +223,9 @@ defined(BACAPP_OBJECT_PROPERTY_REFERENCE) || \ defined(BACAPP_DESTINATION) || \ defined(BACAPP_BDT_ENTRY) || \ - defined(BACAPP_FDT_ENTRY) + defined(BACAPP_FDT_ENTRY) || \ + defined(BACAPP_ACTION_COMMAND) || \ + defined(BACAPP_SCALE) #define BACAPP_COMPLEX_TYPES #endif diff --git a/src/bacnet/cov.c b/src/bacnet/cov.c index 02c10d51..03cce9e4 100644 --- a/src/bacnet/cov.c +++ b/src/bacnet/cov.c @@ -208,7 +208,6 @@ int cov_notify_decode_service_request( BACNET_UNSIGNED_INTEGER decoded_value = 0; BACNET_OBJECT_TYPE decoded_type = OBJECT_NONE; uint32_t decoded_instance = 0; - BACNET_PROPERTY_ID property_identifier = PROP_ALL; BACNET_PROPERTY_VALUE *value = NULL; /* subscriber-process-identifier [0] Unsigned32 */ @@ -292,8 +291,7 @@ int cov_notify_decode_service_request( /* this len function needs to start at the opening tag to match opening/closing tags like a stack. However, it returns the len between the tags. */ - value_len = bacapp_data_len(&apdu[len], apdu_size - len, - (BACNET_PROPERTY_ID)property_identifier); + value_len = bacnet_enclosed_data_length(&apdu[len], apdu_size - len); len += value_len; /* add the opening tag length to the totals */ len += tag_len; diff --git a/src/bacnet/indtext.c b/src/bacnet/indtext.c index 37677a38..fa2c67ae 100644 --- a/src/bacnet/indtext.c +++ b/src/bacnet/indtext.c @@ -7,7 +7,7 @@ */ #include #include -#include "bacnet/bacstr.h" +#include "bacnet/bacdef.h" #include "bacnet/indtext.h" /** @@ -56,7 +56,7 @@ bool indtext_by_istring( if (data_list && search_name) { while (data_list->pString) { - if (bacnet_stricmp(data_list->pString, search_name) == 0) { + if (strcasecmp(data_list->pString, search_name) == 0) { index = data_list->index; found = true; break; diff --git a/src/bacnet/rp.c b/src/bacnet/rp.c index 1da004b4..05bd9ca1 100644 --- a/src/bacnet/rp.c +++ b/src/bacnet/rp.c @@ -120,73 +120,88 @@ int rp_encode_apdu( /** Decode the service request only * * @param apdu Pointer to the buffer for encoding. - * @param apdu_len Count of valid bytes in the buffer. + * @param apdu_size Count of valid bytes in the buffer. * @param rpdata Pointer to the property data to be encoded. * - * @return Bytes decoded or zero on error. + * @return number of bytes decoded, or #BACNET_STATUS_REJECT */ int rp_decode_service_request( - uint8_t *apdu, unsigned apdu_len, BACNET_READ_PROPERTY_DATA *rpdata) + uint8_t *apdu, unsigned apdu_size, BACNET_READ_PROPERTY_DATA *data) { - unsigned len = 0; - uint8_t tag_number = 0; - uint32_t len_value_type = 0; + int len = 0; + int apdu_len = 0; + uint32_t instance = 0; BACNET_OBJECT_TYPE type = OBJECT_NONE; /* for decoding */ uint32_t property = 0; /* for decoding */ BACNET_UNSIGNED_INTEGER unsigned_value = 0; /* for decoding */ /* check for value pointers */ - if (rpdata) { - /* Must have at least 2 tags, an object id and a property identifier - * of at least 1 byte in length to have any chance of parsing */ - if (apdu_len < 7) { - rpdata->error_code = ERROR_CODE_REJECT_MISSING_REQUIRED_PARAMETER; - return BACNET_STATUS_REJECT; + if (!apdu) { + if (data) { + data->error_code = ERROR_CODE_REJECT_MISSING_REQUIRED_PARAMETER; } - - /* Tag 0: Object ID */ - if (!decode_is_context_tag(&apdu[len++], 0)) { - rpdata->error_code = ERROR_CODE_REJECT_INVALID_TAG; - return BACNET_STATUS_REJECT; - } - len += decode_object_id(&apdu[len], &type, &rpdata->object_instance); - rpdata->object_type = type; - /* Tag 1: Property ID */ - len += decode_tag_number_and_value( - &apdu[len], &tag_number, &len_value_type); - if (tag_number != 1) { - rpdata->error_code = ERROR_CODE_REJECT_INVALID_TAG; - return BACNET_STATUS_REJECT; - } - len += decode_enumerated(&apdu[len], len_value_type, &property); - rpdata->object_property = (BACNET_PROPERTY_ID)property; - /* Tag 2: Optional Array Index */ - if (len < apdu_len) { - len += decode_tag_number_and_value( - &apdu[len], &tag_number, &len_value_type); - if ((tag_number == 2) && (len < apdu_len)) { - len += decode_unsigned( - &apdu[len], len_value_type, &unsigned_value); - rpdata->array_index = (BACNET_ARRAY_INDEX)unsigned_value; - } else { - rpdata->error_code = ERROR_CODE_REJECT_INVALID_TAG; - return BACNET_STATUS_REJECT; + return BACNET_STATUS_REJECT; + } + /* object-identifier [0] BACnetObjectIdentifier */ + len = bacnet_object_id_context_decode( + &apdu[apdu_len], apdu_size - apdu_len, 0, &type, &instance); + if (len > 0) { + if (instance > BACNET_MAX_INSTANCE) { + if (data) { + data->error_code = ERROR_CODE_REJECT_PARAMETER_OUT_OF_RANGE; } - } else { - rpdata->array_index = BACNET_ARRAY_ALL; + return BACNET_STATUS_REJECT; + } + apdu_len += len; + if (data) { + data->object_type = type; + data->object_instance = instance; + } + } else { + if (data) { + data->error_code = ERROR_CODE_REJECT_INVALID_TAG; + } + return BACNET_STATUS_REJECT; + } + /* property-identifier [1] BACnetPropertyIdentifier */ + len = bacnet_enumerated_context_decode( + &apdu[apdu_len], apdu_size - apdu_len, 1, &property); + if (len > 0) { + apdu_len += len; + if (data) { + data->object_property = (BACNET_PROPERTY_ID)property; + } + } else { + if (data) { + data->error_code = ERROR_CODE_REJECT_INVALID_TAG; + } + return BACNET_STATUS_REJECT; + } + /* property-array-index [2] Unsigned OPTIONAL */ + len = bacnet_unsigned_context_decode( + &apdu[apdu_len], apdu_size - apdu_len, 2, &unsigned_value); + if (len > 0) { + apdu_len += len; + if (data) { + data->array_index = unsigned_value; + } + } else { + /* wrong tag - skip apdu_len increment and go to next field */ + if (data) { + data->array_index = BACNET_ARRAY_ALL; } } - - if (len < apdu_len) { + if (apdu_len < apdu_size) { /* If something left over now, we have an invalid request */ - if (rpdata) { - rpdata->error_code = ERROR_CODE_REJECT_TOO_MANY_ARGUMENTS; + if (data) { + data->error_code = ERROR_CODE_REJECT_TOO_MANY_ARGUMENTS; } return BACNET_STATUS_REJECT; } - return (int)len; + return apdu_len; } + /** * @brief Encode APDU for ReadProperty-ACK * @@ -345,7 +360,7 @@ int rp_ack_encode_apdu_object_property_end(uint8_t *apdu) /** Encode the acknowledge. * - * @param apdu Pointer to the buffer for encoding. + * @param apdu Pointer to the buffer for encoding, or NULL for length * @param invoke_id Invoke Id * @param rpdata Pointer to the property data to be encoded. * @@ -389,85 +404,95 @@ int rp_ack_encode_apdu( * the application_data field points into the apdu buffer (is not allocated). * * @param apdu [in] The apdu portion of the ACK reply. - * @param apdu_len [in] The total length of the apdu. + * @param apdu_size [in] The total length of the apdu. * @param rpdata [out] The structure holding the partially decoded result. * @return Number of decoded bytes (could be less than apdu_len), * or -1 on decoding error. */ int rp_ack_decode_service_request(uint8_t *apdu, - int apdu_len, /* total length of the apdu */ - BACNET_READ_PROPERTY_DATA *rpdata) + int apdu_size, + BACNET_READ_PROPERTY_DATA *data) { - uint8_t tag_number = 0; - uint32_t len_value_type = 0; - int tag_len = 0; /* length of tag decode */ - int len = 0; /* total length of decodes */ - BACNET_OBJECT_TYPE object_type = OBJECT_NONE; /* object type */ + int apdu_len = 0; /* return value */ + int len = 0; + uint32_t instance = 0; + BACNET_OBJECT_TYPE type = OBJECT_NONE; /* for decoding */ uint32_t property = 0; /* for decoding */ BACNET_UNSIGNED_INTEGER unsigned_value = 0; /* for decoding */ + int data_len = 0; - /* Check basics. */ - if (apdu && (apdu_len >= 8 /*minimum*/)) { - /* Tag 0: Object ID */ - if (!decode_is_context_tag(&apdu[0], 0)) { - return -1; + if (!apdu) { + return -BACNET_STATUS_ERROR; + } + /* object-identifier [0] BACnetObjectIdentifier */ + len = bacnet_object_id_context_decode( + &apdu[apdu_len], apdu_size - apdu_len, 0, &type, &instance); + if (len > 0) { + if (instance > BACNET_MAX_INSTANCE) { + return BACNET_STATUS_ERROR; } - len = 1; - len += decode_object_id( - &apdu[len], &object_type, &rpdata->object_instance); - rpdata->object_type = object_type; - /* Tag 1: Property ID */ - if (len >= apdu_len) { - return -1; - } - len += decode_tag_number_and_value( - &apdu[len], &tag_number, &len_value_type); - if (tag_number != 1) { - return -1; - } - if (len >= apdu_len) { - return -1; - } - len += decode_enumerated(&apdu[len], len_value_type, &property); - rpdata->object_property = (BACNET_PROPERTY_ID)property; - /* Tag 2: Optional Array Index */ - if (len >= apdu_len) { - return -1; - } - tag_len = decode_tag_number_and_value( - &apdu[len], &tag_number, &len_value_type); - if (tag_number == 2) { - len += tag_len; - len += decode_unsigned(&apdu[len], len_value_type, &unsigned_value); - rpdata->array_index = (BACNET_ARRAY_INDEX)unsigned_value; - } else { - rpdata->array_index = BACNET_ARRAY_ALL; - } - /* Tag 3: opening context tag */ - if (len >= apdu_len) { - return -1; - } - if (decode_is_opening_tag_number(&apdu[len], 3)) { - /* a tag number of 3 is not extended so only one octet */ - len++; - /* don't decode the application tag number or its data here */ - rpdata->application_data = &apdu[len]; - /* Just to ensure we do not create a wrapped over value here. */ - if (len < apdu_len) { - rpdata->application_data_len = - apdu_len - len - 1 /*closing tag */; - } else { - rpdata->application_data_len = 0; - } - /* len includes the data and the closing tag */ - len = apdu_len; - } else { - return -1; + apdu_len += len; + if (data) { + data->object_type = type; + data->object_instance = instance; } } else { - return -1; + return BACNET_STATUS_ERROR; } + /* property-identifier [1] BACnetPropertyIdentifier */ + len = bacnet_enumerated_context_decode( + &apdu[apdu_len], apdu_size - apdu_len, 1, &property); + if (len > 0) { + apdu_len += len; + if (data) { + data->object_property = (BACNET_PROPERTY_ID)property; + } + } else { + return BACNET_STATUS_ERROR; + } + /* property-array-index [2] Unsigned OPTIONAL */ + len = bacnet_unsigned_context_decode( + &apdu[apdu_len], apdu_size - apdu_len, 2, &unsigned_value); + if (len > 0) { + apdu_len += len; + if (data) { + data->array_index = unsigned_value; + } + } else { + /* wrong tag - skip apdu_len increment and go to next field */ + if (data) { + data->array_index = BACNET_ARRAY_ALL; + } + } + /* property-value [3] ABSTRACT-SYNTAX.&Type */ + if (!bacnet_is_opening_tag_number( + &apdu[apdu_len], apdu_size - apdu_len, 3, &len)) { + return BACNET_STATUS_ERROR; + } + /* determine the length of the data blob */ + data_len = bacnet_enclosed_data_length(&apdu[apdu_len], + apdu_size - apdu_len); + if (data_len == BACNET_STATUS_ERROR) { + return BACNET_STATUS_ERROR; + } + /* count the opening tag number length */ + apdu_len += len; + if (data_len > MAX_APDU) { + /* not enough size in application_data to store the data chunk */ + return BACNET_STATUS_ERROR; + } else if (data) { + /* don't decode the application tag number or its data here */ + data->application_data = &apdu[apdu_len]; + data->application_data_len = data_len; + } + apdu_len += data_len; + if (!bacnet_is_closing_tag_number( + &apdu[apdu_len], apdu_size - apdu_len, 3, &len)) { + return BACNET_STATUS_ERROR; + } + /* count the closing tag number length */ + apdu_len += len; - return len; + return apdu_len; } #endif diff --git a/src/bacnet/rpm.c b/src/bacnet/rpm.c index 7204225b..8b136e2b 100644 --- a/src/bacnet/rpm.c +++ b/src/bacnet/rpm.c @@ -692,7 +692,7 @@ void rpm_ack_object_property_process( apdu += len; if (bacnet_is_opening_tag_number(apdu, apdu_len, 4, &len)) { application_data_len = - bacapp_data_len(apdu, apdu_len, rp_data->object_property); + bacnet_enclosed_data_length(apdu, apdu_len); /* propertyValue */ apdu_len -= len; apdu += len; diff --git a/src/bacnet/wp.c b/src/bacnet/wp.c index 143c7a4e..e85e89d7 100644 --- a/src/bacnet/wp.c +++ b/src/bacnet/wp.c @@ -245,8 +245,7 @@ int wp_decode_service_request( return BACNET_STATUS_ERROR; } /* determine the length of the data blob */ - imax = bacapp_data_len( - &apdu[apdu_len], apdu_size - apdu_len, (BACNET_PROPERTY_ID)property); + imax = bacnet_enclosed_data_length(&apdu[apdu_len], apdu_size - apdu_len); if (imax == BACNET_STATUS_ERROR) { return BACNET_STATUS_ERROR; } diff --git a/src/bacnet/wpm.c b/src/bacnet/wpm.c index 327f2b46..277df7a6 100644 --- a/src/bacnet/wpm.c +++ b/src/bacnet/wpm.c @@ -133,10 +133,8 @@ int wpm_decode_object_property( /* tag 2 - Property Value */ if ((tag_number == 2) && (decode_is_opening_tag(&apdu[len - 1]))) { len--; - imax = bacapp_data_len(&apdu[len], (unsigned)(apdu_len - len), - wp_data->object_property); + imax = bacnet_enclosed_data_length(&apdu[len], apdu_len - len); len++; - if (imax != BACNET_STATUS_ERROR) { /* copy application data, check max length */ if (imax > (apdu_len - len)) { diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 5c3ee1cb..17efc950 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -29,8 +29,6 @@ if (CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID MATCHES "GNU") add_compile_options(-Wno-unused-variable) add_compile_options(-Wno-unused-function) add_compile_options(-Wno-unused-parameter) - # FIXME: zephyr ztest has a strnlen hack in platform.h which triggers this warning - add_compile_options(-Wno-redundant-decls) add_link_options(-fprofile-arcs -ftest-coverage) endif() diff --git a/test/bacnet/bacaddr/CMakeLists.txt b/test/bacnet/bacaddr/CMakeLists.txt index 1b687838..a586f3fa 100644 --- a/test/bacnet/bacaddr/CMakeLists.txt +++ b/test/bacnet/bacaddr/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/bacaddr.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacdcode.c ${SRC_DIR}/bacnet/bacreal.c ${SRC_DIR}/bacnet/bacstr.c diff --git a/test/bacnet/bacapp/CMakeLists.txt b/test/bacnet/bacapp/CMakeLists.txt index beca62ad..e3302221 100644 --- a/test/bacnet/bacapp/CMakeLists.txt +++ b/test/bacnet/bacapp/CMakeLists.txt @@ -36,6 +36,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/bacapp.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacdest.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/bacapp/src/main.c b/test/bacnet/bacapp/src/main.c index 6206413d..aa10472c 100644 --- a/test/bacnet/bacapp/src/main.c +++ b/test/bacnet/bacapp/src/main.c @@ -16,44 +16,15 @@ #include static const BACNET_APPLICATION_TAG tag_list[] = { - BACNET_APPLICATION_TAG_NULL, -#if defined(BACAPP_BOOLEAN) - BACNET_APPLICATION_TAG_BOOLEAN, -#endif -#if defined(BACAPP_UNSIGNED) - BACNET_APPLICATION_TAG_UNSIGNED_INT, -#endif -#if defined(BACAPP_SIGNED) - BACNET_APPLICATION_TAG_SIGNED_INT, -#endif -#if defined(BACAPP_REAL) - BACNET_APPLICATION_TAG_REAL, -#endif -#if defined(BACAPP_DOUBLE) - BACNET_APPLICATION_TAG_DOUBLE, -#endif -#if defined(BACAPP_OCTET_STRING) + /* primitive tags */ + BACNET_APPLICATION_TAG_NULL, BACNET_APPLICATION_TAG_BOOLEAN, + BACNET_APPLICATION_TAG_UNSIGNED_INT, BACNET_APPLICATION_TAG_SIGNED_INT, + BACNET_APPLICATION_TAG_REAL, BACNET_APPLICATION_TAG_DOUBLE, BACNET_APPLICATION_TAG_OCTET_STRING, -#endif -#if defined(BACAPP_CHARACTER_STRING) - BACNET_APPLICATION_TAG_CHARACTER_STRING, -#endif -#if defined(BACAPP_BIT_STRING) - BACNET_APPLICATION_TAG_BIT_STRING, -#endif -#if defined(BACAPP_ENUMERATED) - BACNET_APPLICATION_TAG_ENUMERATED, -#endif -#if defined(BACAPP_DATE) - BACNET_APPLICATION_TAG_DATE, -#endif -#if defined(BACAPP_TIME) - BACNET_APPLICATION_TAG_TIME, -#endif -#if defined(BACAPP_OBJECT_ID) - BACNET_APPLICATION_TAG_OBJECT_ID, -#endif -#if defined(BACAPP_TYPES_EXTRA) + BACNET_APPLICATION_TAG_CHARACTER_STRING, BACNET_APPLICATION_TAG_BIT_STRING, + BACNET_APPLICATION_TAG_ENUMERATED, BACNET_APPLICATION_TAG_DATE, + BACNET_APPLICATION_TAG_TIME, BACNET_APPLICATION_TAG_OBJECT_ID, + /* non-primitive tags */ BACNET_APPLICATION_TAG_EMPTYLIST, /* BACnetWeeknday */ /* BACNET_APPLICATION_TAG_WEEKNDAY, --> not implemented! */ @@ -96,8 +67,11 @@ static const BACNET_APPLICATION_TAG tag_list[] = { /* BACnetBDTEntry */ BACNET_APPLICATION_TAG_BDT_ENTRY, /* BACnetFDTEntry */ - BACNET_APPLICATION_TAG_FDT_ENTRY -#endif + BACNET_APPLICATION_TAG_FDT_ENTRY, + /* BACnetActionCommand */ + BACNET_APPLICATION_TAG_ACTION_COMMAND, + /* BACnetScale */ + BACNET_APPLICATION_TAG_SCALE }; /** @@ -138,7 +112,7 @@ static void test_bacapp_decode_data_len(void) zassert_equal( bacapp_decode_data_len(apdu, UINT8_MAX, sizeof(apdu)), 0, NULL); - expected_value = (int)(~0U >> 1); /* INT_MAX is not universally defined */ + expected_value = INT_MAX; zassert_equal( bacapp_decode_data_len( apdu, BACNET_APPLICATION_TAG_UNSIGNED_INT, UINT32_MAX), @@ -250,7 +224,7 @@ static void test_bacapp_copy(void) zassert_equal(dest_value.tag, src_value.tag, NULL); zassert_equal(dest_value.next, src_value.next, NULL); - for (i = 0; i < sizeof(tag_list) / sizeof(tag_list[0]); ++i) { + for (i = 0; i < ARRAY_SIZE(tag_list); ++i) { BACNET_APPLICATION_TAG tag = tag_list[i]; bool result; bool expected_result = true; @@ -739,8 +713,7 @@ static void testBACnetApplicationDataLength(void) len = encode_closing_tag(&apdu[apdu_len], 3); apdu_len += len; /* verify the length of the data inside the opening/closing tags */ - len = bacapp_data_len( - &apdu[0], apdu_len, PROP_LIST_OF_OBJECT_PROPERTY_REFERENCES); + len = bacnet_enclosed_data_length(&apdu[0], apdu_len); zassert_equal(test_len, len, NULL); /* 2. application tagged data, one element */ @@ -754,7 +727,7 @@ static void testBACnetApplicationDataLength(void) len = encode_closing_tag(&apdu[apdu_len], 3); apdu_len += len; /* verify the length of the data inside the opening/closing tags */ - len = bacapp_data_len(&apdu[0], apdu_len, PROP_OBJECT_IDENTIFIER); + len = bacnet_enclosed_data_length(&apdu[0], apdu_len); zassert_equal(test_len, len, NULL); /* 3. application tagged data, multiple elements */ @@ -813,7 +786,7 @@ static void testBACnetApplicationDataLength(void) len = encode_closing_tag(&apdu[apdu_len], 3); apdu_len += len; /* verify the length of the data inside the opening/closing tags */ - len = bacapp_data_len(&apdu[0], apdu_len, PROP_PRIORITY_ARRAY); + len = bacnet_enclosed_data_length(&apdu[0], apdu_len); zassert_equal(test_len, len, NULL); /* 4. complex datatype - one element */ @@ -844,7 +817,7 @@ static void testBACnetApplicationDataLength(void) len = encode_closing_tag(&apdu[apdu_len], 3); apdu_len += len; /* verify the length of the data inside the opening/closing tags */ - len = bacapp_data_len(&apdu[0], apdu_len, PROP_START_TIME); + len = bacnet_enclosed_data_length(&apdu[0], apdu_len); zassert_equal(test_len, len, NULL); /* 5. complex datatype - multiple elements */ @@ -860,7 +833,7 @@ static void testBACnetApplicationDataLength(void) len = encode_closing_tag(&apdu[apdu_len], 3); apdu_len += len; /* verify the length of the data inside the opening/closing tags */ - len = bacapp_data_len(&apdu[0], apdu_len, PROP_REQUESTED_SHED_LEVEL); + len = bacnet_enclosed_data_length(&apdu[0], apdu_len); zassert_equal(test_len, len, NULL); /* 7. context opening & closing tag */ @@ -877,7 +850,7 @@ static void testBACnetApplicationDataLength(void) len = encode_closing_tag(&apdu[apdu_len], 3); apdu_len += len; /* verify the length of the data inside the opening/closing tags */ - len = bacapp_data_len(&apdu[0], apdu_len, PROP_WEEKLY_SCHEDULE); + len = bacnet_enclosed_data_length(&apdu[0], apdu_len); zassert_equal(test_len, len, NULL); } @@ -891,16 +864,20 @@ verifyBACnetApplicationDataValue(BACNET_APPLICATION_DATA_VALUE *value) int apdu_len = 0; int null_len = 0; int test_len = 0; + int len = 0; bool status = false; BACNET_APPLICATION_DATA_VALUE test_value = { 0 }; + /* 1. test that encode length matches NULL */ apdu_len = bacapp_encode_application_data(&apdu[0], value); zassert_true(apdu_len > 0, NULL); null_len = bacapp_encode_application_data(NULL, value); zassert_equal(apdu_len, null_len, NULL); + /* 2. test that value decoded from buffer matches incoming value */ test_len = bacapp_decode_application_data(&apdu[0], apdu_len, &test_value); zassert_true(test_len != BACNET_STATUS_ERROR, NULL); status = bacapp_same_value(value, &test_value); + /* 3. test that decoded buffer matches encoded buffer */ while (apdu_len) { apdu_len--; test_len = @@ -916,6 +893,20 @@ verifyBACnetApplicationDataValue(BACNET_APPLICATION_DATA_VALUE *value) apdu_len, test_len, null_len); } } + /* 4. test bacnet_enclosed_data_length() matches APDU buffer length */ + apdu_len = 0; + test_len = 0; + len = encode_opening_tag(&apdu[0], 3); + apdu_len += len; + len = bacapp_encode_application_data(&apdu[apdu_len], value); + test_len += len; + apdu_len += len; + len = encode_closing_tag(&apdu[apdu_len], 3); + apdu_len += len; + /* verify the length of the data inside the opening/closing tags */ + len = bacnet_enclosed_data_length(&apdu[0], apdu_len); + zassert_equal(test_len, len, NULL); + zassert_equal(null_len, len, NULL); return status; } @@ -924,32 +915,50 @@ verifyBACnetApplicationDataValue(BACNET_APPLICATION_DATA_VALUE *value) * @brief Test */ static void verifyBACnetComplexDataValue( - BACNET_APPLICATION_DATA_VALUE *value, + BACNET_APPLICATION_DATA_VALUE *value, BACNET_OBJECT_TYPE object_type, BACNET_PROPERTY_ID prop) { uint8_t apdu[480] = { 0 }; int apdu_len = 0; int null_len = 0; + int test_len = 0; + int len = 0; BACNET_APPLICATION_DATA_VALUE test_value = { 0 }; bool status = false; + /* 1. test that encode length matches NULL */ apdu_len = bacapp_encode_application_data(&apdu[0], value); zassert_true(apdu_len > 0, NULL); null_len = bacapp_encode_application_data(NULL, value); zassert_equal(apdu_len, null_len, "encoded length=%d", apdu_len); - apdu_len = - bacapp_decode_known_property(&apdu[0], apdu_len, &test_value, - object_type, prop); - zassert_true(apdu_len != BACNET_STATUS_ERROR, "decoded length=%d", apdu_len); + /* 2. test that value decoded from buffer matches incoming value */ + apdu_len = bacapp_decode_known_property( + &apdu[0], apdu_len, &test_value, object_type, prop); + zassert_true( + apdu_len != BACNET_STATUS_ERROR, "decoded length=%d", apdu_len); zassert_true(apdu_len > 0, "decoded length=%d", apdu_len); - status = bacapp_same_value(value, &test_value); if (!status) { - null_len = 0; + null_len = 0; } - zassert_true(status, "bacapp: same-value of tag=%s[%u]\n", - bactext_application_tag_name(value->tag), value->tag); + zassert_true( + status, "bacapp: same-value of tag=%s[%u]\n", + bactext_application_tag_name(value->tag), value->tag); + /* 3. test bacnet_enclosed_data_length() matches APDU buffer length */ + apdu_len = 0; + test_len = 0; + len = encode_opening_tag(&apdu[0], 3); + apdu_len += len; + len = bacapp_encode_application_data(&apdu[apdu_len], value); + test_len += len; + apdu_len += len; + len = encode_closing_tag(&apdu[apdu_len], 3); + apdu_len += len; + /* verify the length of the data inside the opening/closing tags */ + len = bacnet_enclosed_data_length(&apdu[0], apdu_len); + zassert_equal(test_len, len, NULL); + zassert_equal(null_len, len, NULL); } /** @@ -1205,17 +1214,17 @@ static void testBACnetApplicationData(void) status = bacapp_parse_application_data( BACNET_APPLICATION_TAG_HOST_N_PORT, "192.168.1.1:47808", &value); zassert_true(status, NULL); - verifyBACnetComplexDataValue(&value, OBJECT_NETWORK_PORT, - PROP_FD_BBMD_ADDRESS); - verifyBACnetComplexDataValue(&value, OBJECT_NETWORK_PORT, - PROP_BACNET_IP_GLOBAL_ADDRESS); + verifyBACnetComplexDataValue( + &value, OBJECT_NETWORK_PORT, PROP_FD_BBMD_ADDRESS); + verifyBACnetComplexDataValue( + &value, OBJECT_NETWORK_PORT, PROP_BACNET_IP_GLOBAL_ADDRESS); status = bacapp_parse_application_data( - BACNET_APPLICATION_TAG_BDT_ENTRY, "192.168.1.1:47808,255.255.255.255", + BACNET_APPLICATION_TAG_BDT_ENTRY, "192.168.1.1:47808,255.255.255.255", &value); zassert_true(status, NULL); - verifyBACnetComplexDataValue(&value, OBJECT_NETWORK_PORT, - PROP_BBMD_BROADCAST_DISTRIBUTION_TABLE); + verifyBACnetComplexDataValue( + &value, OBJECT_NETWORK_PORT, PROP_BBMD_BROADCAST_DISTRIBUTION_TABLE); return; } @@ -1224,30 +1233,68 @@ static void testBACnetApplicationData(void) * @brief Test */ #if defined(CONFIG_ZTEST_NEW_API) -ZTEST(bacapp_tests, test_bacapp_context_data) +ZTEST(bacapp_tests, test_bacapp_data) #else -static void test_bacapp_context_data(void) +static void test_bacapp_data(void) #endif { - const uint8_t context_tag_number = 1; uint8_t apdu[480] = { 0 }; BACNET_APPLICATION_DATA_VALUE value = { 0 }; - int apdu_len, null_len; + int apdu_len, null_len, test_len, len; unsigned i = 0; - for (i = 0; i < sizeof(tag_list) / sizeof(tag_list[0]); i++) { + for (i = 0; i < ARRAY_SIZE(tag_list); i++) { + /* 1. test encoding matches for NULL and APDU buffer */ BACNET_APPLICATION_TAG tag = tag_list[i]; value.tag = tag; null_len = - bacapp_encode_context_data_value(NULL, context_tag_number, &value); + bacapp_encode_application_data(NULL, &value); apdu_len = - bacapp_encode_context_data_value(apdu, context_tag_number, &value); + bacapp_encode_application_data(apdu, &value); if (apdu_len != null_len) { printf( "bacapp: NULL len=%d != APDU len=%d for tag=%s", null_len, apdu_len, bactext_application_tag_name(tag)); } zassert_equal(apdu_len, null_len, NULL); + /* 2. test bacnet_enclosed_data_length() matches APDU buffer or NULL */ + apdu_len = 0; + test_len = 0; + len = encode_opening_tag(apdu, 3); + apdu_len += len; + len = bacapp_encode_application_data( + &apdu[apdu_len], &value); + test_len += len; + apdu_len += len; + len = encode_closing_tag(&apdu[apdu_len], 3); + apdu_len += len; + /* verify the length of the data inside the opening/closing tags */ + len = bacnet_enclosed_data_length(apdu, apdu_len); + zassert_equal(test_len, len, NULL); + zassert_equal(null_len, len, NULL); + /* 3. application tagged */ + null_len = bacapp_encode_application_data(NULL, &value); + apdu_len = bacapp_encode_application_data(apdu, &value); + if (apdu_len != null_len) { + printf( + "bacapp: NULL len=%d != APDU len=%d for tag=%s", null_len, + apdu_len, bactext_application_tag_name(tag)); + } + zassert_equal(apdu_len, null_len, NULL); + /* 4. test bacnet_enclosed_data_length() matches APDU buffer or NULL */ + apdu_len = 0; + test_len = 0; + len = encode_opening_tag(apdu, 3); + apdu_len += len; + len = bacapp_encode_application_data(&apdu[apdu_len], &value); + test_len += len; + apdu_len += len; + len = encode_closing_tag(&apdu[apdu_len], 3); + apdu_len += len; + /* verify the length of the data inside the opening/closing tags */ + len = bacnet_enclosed_data_length(apdu, apdu_len); + zassert_equal(test_len, len, NULL); + zassert_equal(null_len, len, NULL); } } @@ -1301,7 +1348,7 @@ void test_main(void) ztest_unit_test(testBACnetApplicationData), ztest_unit_test(testBACnetApplicationDataLength), ztest_unit_test(testBACnetApplicationData_Safe), - ztest_unit_test(test_bacapp_context_data), + ztest_unit_test(test_bacapp_data), ztest_unit_test(test_bacapp_sprintf_data)); ztest_run_test_suite(bacapp_tests); diff --git a/test/bacnet/bacdest/CMakeLists.txt b/test/bacnet/bacdest/CMakeLists.txt index 02a0d97e..f79b1729 100644 --- a/test/bacnet/bacdest/CMakeLists.txt +++ b/test/bacnet/bacdest/CMakeLists.txt @@ -36,6 +36,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/bacdest.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/bacdevobjpropref/CMakeLists.txt b/test/bacnet/bacdevobjpropref/CMakeLists.txt index 7dd2967d..f28a2b4d 100644 --- a/test/bacnet/bacdevobjpropref/CMakeLists.txt +++ b/test/bacnet/bacdevobjpropref/CMakeLists.txt @@ -39,6 +39,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/bacdevobjpropref.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/bactimevalue/CMakeLists.txt b/test/bacnet/bactimevalue/CMakeLists.txt index 42f0c575..d4a06174 100644 --- a/test/bacnet/bactimevalue/CMakeLists.txt +++ b/test/bacnet/bactimevalue/CMakeLists.txt @@ -36,6 +36,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/bactimevalue.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/binding/address/CMakeLists.txt b/test/bacnet/basic/binding/address/CMakeLists.txt index 69ffce35..76711c3e 100644 --- a/test/bacnet/basic/binding/address/CMakeLists.txt +++ b/test/bacnet/basic/binding/address/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/binding/address.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/acc/CMakeLists.txt b/test/bacnet/basic/object/acc/CMakeLists.txt index aa386873..620d3fe0 100644 --- a/test/bacnet/basic/object/acc/CMakeLists.txt +++ b/test/bacnet/basic/object/acc/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/acc.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/access_credential/CMakeLists.txt b/test/bacnet/basic/object/access_credential/CMakeLists.txt index fc0fc72c..e2c3c453 100644 --- a/test/bacnet/basic/object/access_credential/CMakeLists.txt +++ b/test/bacnet/basic/object/access_credential/CMakeLists.txt @@ -36,6 +36,7 @@ add_executable(${PROJECT_NAME} # Support files and stubs (pathname alphabetical) ${SRC_DIR}/bacnet/assigned_access_rights.c ${SRC_DIR}/bacnet/authentication_factor.c + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/access_door/CMakeLists.txt b/test/bacnet/basic/object/access_door/CMakeLists.txt index 37682f26..0b87e530 100644 --- a/test/bacnet/basic/object/access_door/CMakeLists.txt +++ b/test/bacnet/basic/object/access_door/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/access_door.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/access_point/CMakeLists.txt b/test/bacnet/basic/object/access_point/CMakeLists.txt index d26a3c26..f791fd4d 100644 --- a/test/bacnet/basic/object/access_point/CMakeLists.txt +++ b/test/bacnet/basic/object/access_point/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/access_point.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/access_rights/CMakeLists.txt b/test/bacnet/basic/object/access_rights/CMakeLists.txt index bf8c3b51..a14389dc 100644 --- a/test/bacnet/basic/object/access_rights/CMakeLists.txt +++ b/test/bacnet/basic/object/access_rights/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/basic/object/access_rights.c # Support files and stubs (pathname alphabetical) ${SRC_DIR}/bacnet/access_rule.c + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/access_user/CMakeLists.txt b/test/bacnet/basic/object/access_user/CMakeLists.txt index 1cfa0724..3e9a70e8 100644 --- a/test/bacnet/basic/object/access_user/CMakeLists.txt +++ b/test/bacnet/basic/object/access_user/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/access_user.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/access_zone/CMakeLists.txt b/test/bacnet/basic/object/access_zone/CMakeLists.txt index bb3e9f11..ecdeee9a 100644 --- a/test/bacnet/basic/object/access_zone/CMakeLists.txt +++ b/test/bacnet/basic/object/access_zone/CMakeLists.txt @@ -36,6 +36,7 @@ add_executable(${PROJECT_NAME} # Support files and stubs (pathname alphabetical) ${SRC_DIR}/bacnet/authentication_factor.c ${SRC_DIR}/bacnet/assigned_access_rights.c + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/ai/CMakeLists.txt b/test/bacnet/basic/object/ai/CMakeLists.txt index aea0782b..d178cc02 100644 --- a/test/bacnet/basic/object/ai/CMakeLists.txt +++ b/test/bacnet/basic/object/ai/CMakeLists.txt @@ -36,6 +36,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/ai.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacdcode.c ${SRC_DIR}/bacnet/bacdest.c diff --git a/test/bacnet/basic/object/ao/CMakeLists.txt b/test/bacnet/basic/object/ao/CMakeLists.txt index 45647c9a..dde0ed10 100644 --- a/test/bacnet/basic/object/ao/CMakeLists.txt +++ b/test/bacnet/basic/object/ao/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/ao.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/av/CMakeLists.txt b/test/bacnet/basic/object/av/CMakeLists.txt index a06960df..e1ae7ecf 100644 --- a/test/bacnet/basic/object/av/CMakeLists.txt +++ b/test/bacnet/basic/object/av/CMakeLists.txt @@ -36,6 +36,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/av.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/bacfile/CMakeLists.txt b/test/bacnet/basic/object/bacfile/CMakeLists.txt index c7dc39e3..f15a0e22 100644 --- a/test/bacnet/basic/object/bacfile/CMakeLists.txt +++ b/test/bacnet/basic/object/bacfile/CMakeLists.txt @@ -37,6 +37,7 @@ add_executable(${PROJECT_NAME} # Support files and stubs (pathname alphabetical) ${SRC_DIR}/bacnet/arf.c ${SRC_DIR}/bacnet/awf.c + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/bi/CMakeLists.txt b/test/bacnet/basic/object/bi/CMakeLists.txt index 1fa382ef..eefc1846 100644 --- a/test/bacnet/basic/object/bi/CMakeLists.txt +++ b/test/bacnet/basic/object/bi/CMakeLists.txt @@ -37,6 +37,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/bi.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/bitstring_value/CMakeLists.txt b/test/bacnet/basic/object/bitstring_value/CMakeLists.txt index 4740ee3f..bf31c6cd 100644 --- a/test/bacnet/basic/object/bitstring_value/CMakeLists.txt +++ b/test/bacnet/basic/object/bitstring_value/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/bitstring_value.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/blo/CMakeLists.txt b/test/bacnet/basic/object/blo/CMakeLists.txt index b5490d64..79aed77f 100644 --- a/test/bacnet/basic/object/blo/CMakeLists.txt +++ b/test/bacnet/basic/object/blo/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/blo.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/bo/CMakeLists.txt b/test/bacnet/basic/object/bo/CMakeLists.txt index d6157c05..fa73d9d4 100644 --- a/test/bacnet/basic/object/bo/CMakeLists.txt +++ b/test/bacnet/basic/object/bo/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/bo.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/bv/CMakeLists.txt b/test/bacnet/basic/object/bv/CMakeLists.txt index 24d9903c..b65848a3 100644 --- a/test/bacnet/basic/object/bv/CMakeLists.txt +++ b/test/bacnet/basic/object/bv/CMakeLists.txt @@ -37,6 +37,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/bv.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/calendar/CMakeLists.txt b/test/bacnet/basic/object/calendar/CMakeLists.txt index fdefad68..c47bdd18 100644 --- a/test/bacnet/basic/object/calendar/CMakeLists.txt +++ b/test/bacnet/basic/object/calendar/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/calendar.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/channel/CMakeLists.txt b/test/bacnet/basic/object/channel/CMakeLists.txt index 59f024dd..dcbad153 100644 --- a/test/bacnet/basic/object/channel/CMakeLists.txt +++ b/test/bacnet/basic/object/channel/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/channel.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/color_object/CMakeLists.txt b/test/bacnet/basic/object/color_object/CMakeLists.txt index ca0707d1..995a1037 100644 --- a/test/bacnet/basic/object/color_object/CMakeLists.txt +++ b/test/bacnet/basic/object/color_object/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/color_object.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/color_temperature/CMakeLists.txt b/test/bacnet/basic/object/color_temperature/CMakeLists.txt index d146c96e..a1d3dcb8 100644 --- a/test/bacnet/basic/object/color_temperature/CMakeLists.txt +++ b/test/bacnet/basic/object/color_temperature/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/color_temperature.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/command/CMakeLists.txt b/test/bacnet/basic/object/command/CMakeLists.txt index 82cd6c31..f34c05e0 100644 --- a/test/bacnet/basic/object/command/CMakeLists.txt +++ b/test/bacnet/basic/object/command/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/command.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/command/src/main.c b/test/bacnet/basic/object/command/src/main.c index 802dad88..068c3435 100644 --- a/test/bacnet/basic/object/command/src/main.c +++ b/test/bacnet/basic/object/command/src/main.c @@ -27,12 +27,36 @@ static void test_object_command(void) bool status = false; unsigned count = 0; uint32_t object_instance = 0; - const int skip_fail_property_list[] = { PROP_ACTION, -1 }; + const int skip_fail_property_list[] = { -1 }; + BACNET_ACTION_LIST *pAction; Command_Init(); count = Command_Count(); zassert_true(count > 0, NULL); object_instance = Command_Index_To_Instance(0); + status = Command_Valid_Instance(object_instance); + zassert_true(status, NULL); + count = Command_Action_List_Count(object_instance); + zassert_true(count > 0, NULL); + /* configure the instance property values */ + pAction = Command_Action_List_Entry(object_instance, 0); + zassert_not_null(pAction, NULL); + pAction->Device_Id.type = OBJECT_DEVICE; + pAction->Device_Id.instance = 4194303; + pAction->Object_Id.type = OBJECT_ANALOG_INPUT; + pAction->Object_Id.instance = 4194303; + pAction->Property_Identifier = PROP_PRESENT_VALUE; + pAction->Property_Array_Index = BACNET_ARRAY_ALL; + pAction->Priority = 16; + pAction->Value.tag = BACNET_APPLICATION_TAG_REAL; + pAction->Value.type.Real = 3.14159; + pAction->Post_Delay = 0; + pAction->Quit_On_Failure = false; + pAction->Write_Successful = false; + pAction->next = NULL; + Command_In_Process_Set(object_instance, false); + Command_All_Writes_Successful_Set(object_instance, false); + /* perform a general test for RP/WP */ bacnet_object_properties_read_write_test( OBJECT_COMMAND, object_instance, Command_Property_Lists, Command_Read_Property, Command_Write_Property, skip_fail_property_list); diff --git a/test/bacnet/basic/object/credential_data_input/CMakeLists.txt b/test/bacnet/basic/object/credential_data_input/CMakeLists.txt index 460004ce..76041f29 100644 --- a/test/bacnet/basic/object/credential_data_input/CMakeLists.txt +++ b/test/bacnet/basic/object/credential_data_input/CMakeLists.txt @@ -37,6 +37,7 @@ add_executable(${PROJECT_NAME} # Support files and stubs (pathname alphabetical) ${SRC_DIR}/bacnet/authentication_factor.c ${SRC_DIR}/bacnet/authentication_factor_format.c + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/csv/CMakeLists.txt b/test/bacnet/basic/object/csv/CMakeLists.txt index 96edd4ba..2c3d68b6 100644 --- a/test/bacnet/basic/object/csv/CMakeLists.txt +++ b/test/bacnet/basic/object/csv/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/csv.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/device/CMakeLists.txt b/test/bacnet/basic/object/device/CMakeLists.txt index 71c85c0a..569281eb 100644 --- a/test/bacnet/basic/object/device/CMakeLists.txt +++ b/test/bacnet/basic/object/device/CMakeLists.txt @@ -36,6 +36,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/basic/object/device.c # Support files and stubs (pathname alphabetical) ${SRC_DIR}/bacnet/abort.c + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/iv/CMakeLists.txt b/test/bacnet/basic/object/iv/CMakeLists.txt index 293fa19e..762e4576 100644 --- a/test/bacnet/basic/object/iv/CMakeLists.txt +++ b/test/bacnet/basic/object/iv/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/iv.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/lc/CMakeLists.txt b/test/bacnet/basic/object/lc/CMakeLists.txt index 5a7ab937..8f5b1250 100644 --- a/test/bacnet/basic/object/lc/CMakeLists.txt +++ b/test/bacnet/basic/object/lc/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/lc.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/lo/CMakeLists.txt b/test/bacnet/basic/object/lo/CMakeLists.txt index ab56836c..96ee2c02 100644 --- a/test/bacnet/basic/object/lo/CMakeLists.txt +++ b/test/bacnet/basic/object/lo/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/lo.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/lsp/CMakeLists.txt b/test/bacnet/basic/object/lsp/CMakeLists.txt index 09a31b0c..ddd0bfbb 100644 --- a/test/bacnet/basic/object/lsp/CMakeLists.txt +++ b/test/bacnet/basic/object/lsp/CMakeLists.txt @@ -33,6 +33,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/lsp.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/lsz/CMakeLists.txt b/test/bacnet/basic/object/lsz/CMakeLists.txt index d8252089..12f12878 100644 --- a/test/bacnet/basic/object/lsz/CMakeLists.txt +++ b/test/bacnet/basic/object/lsz/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/lsz.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/ms-input/CMakeLists.txt b/test/bacnet/basic/object/ms-input/CMakeLists.txt index c4f032f4..15fe56d6 100644 --- a/test/bacnet/basic/object/ms-input/CMakeLists.txt +++ b/test/bacnet/basic/object/ms-input/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/ms-input.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/mso/CMakeLists.txt b/test/bacnet/basic/object/mso/CMakeLists.txt index 0d2af0af..bcbeb41b 100644 --- a/test/bacnet/basic/object/mso/CMakeLists.txt +++ b/test/bacnet/basic/object/mso/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/mso.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/msv/CMakeLists.txt b/test/bacnet/basic/object/msv/CMakeLists.txt index 0c8734dc..9dd8eda6 100644 --- a/test/bacnet/basic/object/msv/CMakeLists.txt +++ b/test/bacnet/basic/object/msv/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/msv.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/nc/CMakeLists.txt b/test/bacnet/basic/object/nc/CMakeLists.txt index 12cd7d91..c8739e9a 100644 --- a/test/bacnet/basic/object/nc/CMakeLists.txt +++ b/test/bacnet/basic/object/nc/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/nc.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/netport/CMakeLists.txt b/test/bacnet/basic/object/netport/CMakeLists.txt index c5194498..be8406bf 100644 --- a/test/bacnet/basic/object/netport/CMakeLists.txt +++ b/test/bacnet/basic/object/netport/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/netport.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/osv/CMakeLists.txt b/test/bacnet/basic/object/osv/CMakeLists.txt index 48ceed6b..7edd4bf5 100644 --- a/test/bacnet/basic/object/osv/CMakeLists.txt +++ b/test/bacnet/basic/object/osv/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/osv.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/piv/CMakeLists.txt b/test/bacnet/basic/object/piv/CMakeLists.txt index 973e4daf..2a62bf17 100644 --- a/test/bacnet/basic/object/piv/CMakeLists.txt +++ b/test/bacnet/basic/object/piv/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/piv.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/schedule/CMakeLists.txt b/test/bacnet/basic/object/schedule/CMakeLists.txt index 40288010..3e9eb476 100644 --- a/test/bacnet/basic/object/schedule/CMakeLists.txt +++ b/test/bacnet/basic/object/schedule/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/schedule.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/structured_view/CMakeLists.txt b/test/bacnet/basic/object/structured_view/CMakeLists.txt index b39c76da..faccb928 100644 --- a/test/bacnet/basic/object/structured_view/CMakeLists.txt +++ b/test/bacnet/basic/object/structured_view/CMakeLists.txt @@ -36,6 +36,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/structured_view.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/time_value/CMakeLists.txt b/test/bacnet/basic/object/time_value/CMakeLists.txt index 20b6e812..ec8df76c 100644 --- a/test/bacnet/basic/object/time_value/CMakeLists.txt +++ b/test/bacnet/basic/object/time_value/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/time_value.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/basic/object/trendlog/CMakeLists.txt b/test/bacnet/basic/object/trendlog/CMakeLists.txt index 37e9efd4..20951e78 100644 --- a/test/bacnet/basic/object/trendlog/CMakeLists.txt +++ b/test/bacnet/basic/object/trendlog/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/basic/object/trendlog.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/cov/CMakeLists.txt b/test/bacnet/cov/CMakeLists.txt index 5393faf1..72874194 100644 --- a/test/bacnet/cov/CMakeLists.txt +++ b/test/bacnet/cov/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/cov.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/create_object/CMakeLists.txt b/test/bacnet/create_object/CMakeLists.txt index bc7b0bed..b13fb243 100644 --- a/test/bacnet/create_object/CMakeLists.txt +++ b/test/bacnet/create_object/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/create_object.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/delete_object/CMakeLists.txt b/test/bacnet/delete_object/CMakeLists.txt index 2401806c..758cacd8 100644 --- a/test/bacnet/delete_object/CMakeLists.txt +++ b/test/bacnet/delete_object/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/delete_object.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/event/CMakeLists.txt b/test/bacnet/event/CMakeLists.txt index 5e88da85..dd1b6d7e 100644 --- a/test/bacnet/event/CMakeLists.txt +++ b/test/bacnet/event/CMakeLists.txt @@ -49,6 +49,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/basic/sys/days.c ${SRC_DIR}/bacnet/timestamp.c # Dependencies of bacapp.c + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bactext.c ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/weeklyschedule.c diff --git a/test/bacnet/getalarm/CMakeLists.txt b/test/bacnet/getalarm/CMakeLists.txt index e0105108..1c1336c1 100644 --- a/test/bacnet/getalarm/CMakeLists.txt +++ b/test/bacnet/getalarm/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/get_alarm_sum.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/getevent/CMakeLists.txt b/test/bacnet/getevent/CMakeLists.txt index 185c7445..822f7769 100644 --- a/test/bacnet/getevent/CMakeLists.txt +++ b/test/bacnet/getevent/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/getevent.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/hostnport/CMakeLists.txt b/test/bacnet/hostnport/CMakeLists.txt index c8e5e664..8b7fa56b 100644 --- a/test/bacnet/hostnport/CMakeLists.txt +++ b/test/bacnet/hostnport/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/hostnport.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/list_element/CMakeLists.txt b/test/bacnet/list_element/CMakeLists.txt index ff062724..e509ef74 100644 --- a/test/bacnet/list_element/CMakeLists.txt +++ b/test/bacnet/list_element/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/list_element.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/lso/CMakeLists.txt b/test/bacnet/lso/CMakeLists.txt index 6bfcce75..b48bc39e 100644 --- a/test/bacnet/lso/CMakeLists.txt +++ b/test/bacnet/lso/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/lso.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/npdu/CMakeLists.txt b/test/bacnet/npdu/CMakeLists.txt index c5b8f61b..e96ee51f 100644 --- a/test/bacnet/npdu/CMakeLists.txt +++ b/test/bacnet/npdu/CMakeLists.txt @@ -34,6 +34,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/npdu.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacdcode.c ${SRC_DIR}/bacnet/bacerror.c diff --git a/test/bacnet/ptransfer/CMakeLists.txt b/test/bacnet/ptransfer/CMakeLists.txt index 0eb72a88..c42ae209 100644 --- a/test/bacnet/ptransfer/CMakeLists.txt +++ b/test/bacnet/ptransfer/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/ptransfer.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/rpm/CMakeLists.txt b/test/bacnet/rpm/CMakeLists.txt index 34faa113..9aa44a96 100644 --- a/test/bacnet/rpm/CMakeLists.txt +++ b/test/bacnet/rpm/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/rpm.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/specialevent/CMakeLists.txt b/test/bacnet/specialevent/CMakeLists.txt index 1fbdfa22..52343027 100644 --- a/test/bacnet/specialevent/CMakeLists.txt +++ b/test/bacnet/specialevent/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/special_event.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/timesync/CMakeLists.txt b/test/bacnet/timesync/CMakeLists.txt index f39bded0..03e78326 100644 --- a/test/bacnet/timesync/CMakeLists.txt +++ b/test/bacnet/timesync/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/timesync.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/weeklyschedule/CMakeLists.txt b/test/bacnet/weeklyschedule/CMakeLists.txt index ac48a78e..15d949e7 100644 --- a/test/bacnet/weeklyschedule/CMakeLists.txt +++ b/test/bacnet/weeklyschedule/CMakeLists.txt @@ -37,6 +37,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/bactimevalue.c ${SRC_DIR}/bacnet/dailyschedule.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/wp/CMakeLists.txt b/test/bacnet/wp/CMakeLists.txt index c73c2e2a..2df22aab 100644 --- a/test/bacnet/wp/CMakeLists.txt +++ b/test/bacnet/wp/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/wp.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/test/bacnet/wpm/CMakeLists.txt b/test/bacnet/wpm/CMakeLists.txt index 40358b0e..0a0a20dc 100644 --- a/test/bacnet/wpm/CMakeLists.txt +++ b/test/bacnet/wpm/CMakeLists.txt @@ -35,6 +35,7 @@ add_executable(${PROJECT_NAME} # File(s) under test ${SRC_DIR}/bacnet/wpm.c # Support files and stubs (pathname alphabetical) + ${SRC_DIR}/bacnet/bacaction.c ${SRC_DIR}/bacnet/bacaddr.c ${SRC_DIR}/bacnet/bacapp.c ${SRC_DIR}/bacnet/bacdcode.c diff --git a/zephyr/CMakeLists.txt b/zephyr/CMakeLists.txt index d5384864..34ee325c 100644 --- a/zephyr/CMakeLists.txt +++ b/zephyr/CMakeLists.txt @@ -64,6 +64,8 @@ set(BACNETSTACK_SRCS ${BACNETSTACK_SRC}/bacnet/authentication_factor.h ${BACNETSTACK_SRC}/bacnet/awf.c ${BACNETSTACK_SRC}/bacnet/awf.h + ${BACNETSTACK_SRC}/bacnet/bacaction.c + ${BACNETSTACK_SRC}/bacnet/bacaction.h ${BACNETSTACK_SRC}/bacnet/bacaddr.c ${BACNETSTACK_SRC}/bacnet/bacaddr.h ${BACNETSTACK_SRC}/bacnet/bacapp.c diff --git a/zephyr/tests/bacnet/abort/CMakeLists.txt b/zephyr/tests/bacnet/abort/CMakeLists.txt index d7b0670a..39c88bde 100644 --- a/zephyr/tests/bacnet/abort/CMakeLists.txt +++ b/zephyr/tests/bacnet/abort/CMakeLists.txt @@ -39,4 +39,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/alarm_ack/CMakeLists.txt b/zephyr/tests/bacnet/alarm_ack/CMakeLists.txt index 2490170c..3edf94d1 100644 --- a/zephyr/tests/bacnet/alarm_ack/CMakeLists.txt +++ b/zephyr/tests/bacnet/alarm_ack/CMakeLists.txt @@ -52,4 +52,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/arf/CMakeLists.txt b/zephyr/tests/bacnet/arf/CMakeLists.txt index 2490170c..3edf94d1 100644 --- a/zephyr/tests/bacnet/arf/CMakeLists.txt +++ b/zephyr/tests/bacnet/arf/CMakeLists.txt @@ -52,4 +52,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/awf/CMakeLists.txt b/zephyr/tests/bacnet/awf/CMakeLists.txt index 2490170c..3edf94d1 100644 --- a/zephyr/tests/bacnet/awf/CMakeLists.txt +++ b/zephyr/tests/bacnet/awf/CMakeLists.txt @@ -52,4 +52,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/bacapp/CMakeLists.txt b/zephyr/tests/bacnet/bacapp/CMakeLists.txt index a1d42d53..82dd9438 100644 --- a/zephyr/tests/bacnet/bacapp/CMakeLists.txt +++ b/zephyr/tests/bacnet/bacapp/CMakeLists.txt @@ -30,6 +30,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_SRC ${BACNET_SRC_PATH} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacdcode.c ${BACNET_SRC}/bacdest.c @@ -67,4 +68,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/bacdcode/CMakeLists.txt b/zephyr/tests/bacnet/bacdcode/CMakeLists.txt index de0c8bcc..ebb71ed4 100644 --- a/zephyr/tests/bacnet/bacdcode/CMakeLists.txt +++ b/zephyr/tests/bacnet/bacdcode/CMakeLists.txt @@ -51,4 +51,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/bacdevobjpropref/CMakeLists.txt b/zephyr/tests/bacnet/bacdevobjpropref/CMakeLists.txt index 2490170c..3edf94d1 100644 --- a/zephyr/tests/bacnet/bacdevobjpropref/CMakeLists.txt +++ b/zephyr/tests/bacnet/bacdevobjpropref/CMakeLists.txt @@ -52,4 +52,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/bacerror/CMakeLists.txt b/zephyr/tests/bacnet/bacerror/CMakeLists.txt index d64338da..b527988e 100644 --- a/zephyr/tests/bacnet/bacerror/CMakeLists.txt +++ b/zephyr/tests/bacnet/bacerror/CMakeLists.txt @@ -53,4 +53,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/bacint/CMakeLists.txt b/zephyr/tests/bacnet/bacint/CMakeLists.txt index d7b0670a..39c88bde 100644 --- a/zephyr/tests/bacnet/bacint/CMakeLists.txt +++ b/zephyr/tests/bacnet/bacint/CMakeLists.txt @@ -39,4 +39,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/bacpropstates/CMakeLists.txt b/zephyr/tests/bacnet/bacpropstates/CMakeLists.txt index d64338da..b527988e 100644 --- a/zephyr/tests/bacnet/bacpropstates/CMakeLists.txt +++ b/zephyr/tests/bacnet/bacpropstates/CMakeLists.txt @@ -53,4 +53,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/bacreal/CMakeLists.txt b/zephyr/tests/bacnet/bacreal/CMakeLists.txt index dbfc9124..d953e379 100644 --- a/zephyr/tests/bacnet/bacreal/CMakeLists.txt +++ b/zephyr/tests/bacnet/bacreal/CMakeLists.txt @@ -41,4 +41,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/bacstr/CMakeLists.txt b/zephyr/tests/bacnet/bacstr/CMakeLists.txt index d7b0670a..39c88bde 100644 --- a/zephyr/tests/bacnet/bacstr/CMakeLists.txt +++ b/zephyr/tests/bacnet/bacstr/CMakeLists.txt @@ -39,4 +39,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/binding/address/CMakeLists.txt b/zephyr/tests/bacnet/basic/binding/address/CMakeLists.txt index 62de8d8f..d8990514 100644 --- a/zephyr/tests/bacnet/basic/binding/address/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/binding/address/CMakeLists.txt @@ -32,6 +32,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_BINDING_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacdcode.c ${BACNET_SRC}/bacint.c @@ -54,4 +55,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/acc/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/acc/CMakeLists.txt index e9595287..c1efdc73 100644 --- a/zephyr/tests/bacnet/basic/object/acc/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/acc/CMakeLists.txt @@ -32,6 +32,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -68,4 +69,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/access_credential/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/access_credential/CMakeLists.txt index 0636b1ee..9be95fcf 100644 --- a/zephyr/tests/bacnet/basic/object/access_credential/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/access_credential/CMakeLists.txt @@ -32,6 +32,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -72,4 +73,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/access_door/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/access_door/CMakeLists.txt index efa33480..7a5a9d93 100644 --- a/zephyr/tests/bacnet/basic/object/access_door/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/access_door/CMakeLists.txt @@ -32,6 +32,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -69,4 +70,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/access_point/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/access_point/CMakeLists.txt index e9595287..c1efdc73 100644 --- a/zephyr/tests/bacnet/basic/object/access_point/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/access_point/CMakeLists.txt @@ -32,6 +32,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -68,4 +69,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/access_rights/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/access_rights/CMakeLists.txt index 696a769a..085dd595 100644 --- a/zephyr/tests/bacnet/basic/object/access_rights/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/access_rights/CMakeLists.txt @@ -32,6 +32,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -70,4 +71,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/access_user/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/access_user/CMakeLists.txt index efa33480..7a5a9d93 100644 --- a/zephyr/tests/bacnet/basic/object/access_user/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/access_user/CMakeLists.txt @@ -32,6 +32,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -69,4 +70,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/access_zone/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/access_zone/CMakeLists.txt index efa33480..7a5a9d93 100644 --- a/zephyr/tests/bacnet/basic/object/access_zone/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/access_zone/CMakeLists.txt @@ -32,6 +32,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -69,4 +70,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/ai/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/ai/CMakeLists.txt index 41ed1095..b7a45ca4 100644 --- a/zephyr/tests/bacnet/basic/object/ai/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/ai/CMakeLists.txt @@ -38,6 +38,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -84,4 +85,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/ao/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/ao/CMakeLists.txt index bbd75f54..2d913fd0 100644 --- a/zephyr/tests/bacnet/basic/object/ao/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/ao/CMakeLists.txt @@ -37,6 +37,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -81,4 +82,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/av/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/av/CMakeLists.txt index 5c5e76d8..505c83e1 100644 --- a/zephyr/tests/bacnet/basic/object/av/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/av/CMakeLists.txt @@ -38,6 +38,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -83,4 +84,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/bi/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/bi/CMakeLists.txt index 37d7f398..f34790c1 100644 --- a/zephyr/tests/bacnet/basic/object/bi/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/bi/CMakeLists.txt @@ -37,6 +37,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -81,4 +82,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/bo/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/bo/CMakeLists.txt index cb63f6c6..ebcb03bc 100644 --- a/zephyr/tests/bacnet/basic/object/bo/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/bo/CMakeLists.txt @@ -37,6 +37,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -81,4 +82,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/bv/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/bv/CMakeLists.txt index 937e9416..9d175aeb 100644 --- a/zephyr/tests/bacnet/basic/object/bv/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/bv/CMakeLists.txt @@ -37,6 +37,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -81,4 +82,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/calendar/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/calendar/CMakeLists.txt index 4a8817bb..874025ab 100644 --- a/zephyr/tests/bacnet/basic/object/calendar/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/calendar/CMakeLists.txt @@ -34,6 +34,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -73,4 +74,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/color_object/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/color_object/CMakeLists.txt index e35890b7..890ff0ac 100644 --- a/zephyr/tests/bacnet/basic/object/color_object/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/color_object/CMakeLists.txt @@ -33,6 +33,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -72,4 +73,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/color_temperature/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/color_temperature/CMakeLists.txt index c2f6945f..c1931235 100644 --- a/zephyr/tests/bacnet/basic/object/color_temperature/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/color_temperature/CMakeLists.txt @@ -33,6 +33,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -72,4 +73,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/command/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/command/CMakeLists.txt index 98fd4012..57772894 100644 --- a/zephyr/tests/bacnet/basic/object/command/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/command/CMakeLists.txt @@ -37,6 +37,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -78,4 +79,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/credential_data_input/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/credential_data_input/CMakeLists.txt index 0cd43b97..ef3bdfde 100644 --- a/zephyr/tests/bacnet/basic/object/credential_data_input/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/credential_data_input/CMakeLists.txt @@ -37,6 +37,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -80,4 +81,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/device/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/device/CMakeLists.txt index 6a0f9f7e..8c5a2c9a 100644 --- a/zephyr/tests/bacnet/basic/object/device/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/device/CMakeLists.txt @@ -33,13 +33,16 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c + ${BACNET_SRC}/bacerror.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c ${BACNET_SRC}/bacdest.c - ${BACNET_SRC}/bacstr.c ${BACNET_SRC}/bacint.c ${BACNET_SRC}/bacreal.c + ${BACNET_SRC}/bacstr.c + ${BACNET_SRC}/bactimevalue.c ${BACNET_SRC}/calendar.c ${BACNET_SRC}/datetime.c ${BACNET_SRC}/timestamp.c @@ -58,9 +61,6 @@ if(BOARD STREQUAL unit_testing) ${BACNET_SRC}/proplist.c ${BACNET_SRC}/reject.c ${BACNET_SRC}/abort.c - ${BACNET_SRC}/bacaddr.c - ${BACNET_SRC}/bactimevalue.c - ${BACNET_SRC}/bacerror.c ${BACNET_SRC}/basic/binding/address.c ${BACNET_SRC}/basic/object/acc.c ${BACNET_SRC}/basic/object/ai.c @@ -118,4 +118,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/lc/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/lc/CMakeLists.txt index 319a81ca..ddafd7b2 100644 --- a/zephyr/tests/bacnet/basic/object/lc/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/lc/CMakeLists.txt @@ -33,6 +33,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -75,4 +76,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/lo/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/lo/CMakeLists.txt index eaa8a753..78114f86 100644 --- a/zephyr/tests/bacnet/basic/object/lo/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/lo/CMakeLists.txt @@ -33,6 +33,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -72,4 +73,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/lsp/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/lsp/CMakeLists.txt index 55ccb7be..4222fb0b 100644 --- a/zephyr/tests/bacnet/basic/object/lsp/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/lsp/CMakeLists.txt @@ -32,6 +32,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -70,4 +71,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/ms-input/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/ms-input/CMakeLists.txt index 937e9416..9d175aeb 100644 --- a/zephyr/tests/bacnet/basic/object/ms-input/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/ms-input/CMakeLists.txt @@ -37,6 +37,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -81,4 +82,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/mso/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/mso/CMakeLists.txt index c4ff5edd..6775b6e3 100644 --- a/zephyr/tests/bacnet/basic/object/mso/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/mso/CMakeLists.txt @@ -37,6 +37,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -81,4 +82,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/msv/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/msv/CMakeLists.txt index 3ab01401..f455c050 100644 --- a/zephyr/tests/bacnet/basic/object/msv/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/msv/CMakeLists.txt @@ -36,6 +36,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -80,4 +81,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/netport/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/netport/CMakeLists.txt index 033ba922..73b597c3 100644 --- a/zephyr/tests/bacnet/basic/object/netport/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/netport/CMakeLists.txt @@ -37,6 +37,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -80,4 +81,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/objects/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/objects/CMakeLists.txt index a8821a5e..ae909cb3 100644 --- a/zephyr/tests/bacnet/basic/object/objects/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/objects/CMakeLists.txt @@ -32,6 +32,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -70,4 +71,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/osv/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/osv/CMakeLists.txt index efa33480..7a5a9d93 100644 --- a/zephyr/tests/bacnet/basic/object/osv/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/osv/CMakeLists.txt @@ -32,6 +32,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -69,4 +70,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/piv/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/piv/CMakeLists.txt index efa33480..7a5a9d93 100644 --- a/zephyr/tests/bacnet/basic/object/piv/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/piv/CMakeLists.txt @@ -32,6 +32,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -69,4 +70,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/schedule/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/schedule/CMakeLists.txt index 76721db5..6e5c1800 100644 --- a/zephyr/tests/bacnet/basic/object/schedule/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/schedule/CMakeLists.txt @@ -37,6 +37,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -79,4 +80,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/object/time_value/CMakeLists.txt b/zephyr/tests/bacnet/basic/object/time_value/CMakeLists.txt index 312342b6..bc7c7364 100644 --- a/zephyr/tests/bacnet/basic/object/time_value/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/object/time_value/CMakeLists.txt @@ -39,6 +39,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_BASIC_SRC ${BACNET_OBJECT_SRC} PATH) get_filename_component(BACNET_SRC ${BACNET_BASIC_SRC} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -82,4 +83,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/sys/fifo/CMakeLists.txt b/zephyr/tests/bacnet/basic/sys/fifo/CMakeLists.txt index d7b0670a..39c88bde 100644 --- a/zephyr/tests/bacnet/basic/sys/fifo/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/sys/fifo/CMakeLists.txt @@ -39,4 +39,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/sys/filename/CMakeLists.txt b/zephyr/tests/bacnet/basic/sys/filename/CMakeLists.txt index d7b0670a..39c88bde 100644 --- a/zephyr/tests/bacnet/basic/sys/filename/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/sys/filename/CMakeLists.txt @@ -39,4 +39,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/sys/key/CMakeLists.txt b/zephyr/tests/bacnet/basic/sys/key/CMakeLists.txt index 2e4dcd27..fe2436e8 100644 --- a/zephyr/tests/bacnet/basic/sys/key/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/sys/key/CMakeLists.txt @@ -38,4 +38,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/sys/keylist/CMakeLists.txt b/zephyr/tests/bacnet/basic/sys/keylist/CMakeLists.txt index d7b0670a..39c88bde 100644 --- a/zephyr/tests/bacnet/basic/sys/keylist/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/sys/keylist/CMakeLists.txt @@ -39,4 +39,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/sys/ringbuf/CMakeLists.txt b/zephyr/tests/bacnet/basic/sys/ringbuf/CMakeLists.txt index d7b0670a..39c88bde 100644 --- a/zephyr/tests/bacnet/basic/sys/ringbuf/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/sys/ringbuf/CMakeLists.txt @@ -39,4 +39,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/basic/sys/sbuf/CMakeLists.txt b/zephyr/tests/bacnet/basic/sys/sbuf/CMakeLists.txt index d7b0670a..39c88bde 100644 --- a/zephyr/tests/bacnet/basic/sys/sbuf/CMakeLists.txt +++ b/zephyr/tests/bacnet/basic/sys/sbuf/CMakeLists.txt @@ -39,4 +39,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/cov/CMakeLists.txt b/zephyr/tests/bacnet/cov/CMakeLists.txt index fb72f59d..ac07fc98 100644 --- a/zephyr/tests/bacnet/cov/CMakeLists.txt +++ b/zephyr/tests/bacnet/cov/CMakeLists.txt @@ -30,6 +30,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_SRC ${BACNET_SRC_PATH} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -69,4 +70,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/datalink/bvlc/CMakeLists.txt b/zephyr/tests/bacnet/datalink/bvlc/CMakeLists.txt index ed92b061..a9a7d773 100644 --- a/zephyr/tests/bacnet/datalink/bvlc/CMakeLists.txt +++ b/zephyr/tests/bacnet/datalink/bvlc/CMakeLists.txt @@ -67,4 +67,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/datalink/cobs/CMakeLists.txt b/zephyr/tests/bacnet/datalink/cobs/CMakeLists.txt index 1adc3052..da6f2d31 100644 --- a/zephyr/tests/bacnet/datalink/cobs/CMakeLists.txt +++ b/zephyr/tests/bacnet/datalink/cobs/CMakeLists.txt @@ -45,4 +45,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/datalink/crc/CMakeLists.txt b/zephyr/tests/bacnet/datalink/crc/CMakeLists.txt index 29b1b81e..cd2e5fb6 100644 --- a/zephyr/tests/bacnet/datalink/crc/CMakeLists.txt +++ b/zephyr/tests/bacnet/datalink/crc/CMakeLists.txt @@ -41,4 +41,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/datalink/mock/CMakeLists.txt b/zephyr/tests/bacnet/datalink/mock/CMakeLists.txt index 766b17ac..23bb0949 100644 --- a/zephyr/tests/bacnet/datalink/mock/CMakeLists.txt +++ b/zephyr/tests/bacnet/datalink/mock/CMakeLists.txt @@ -54,4 +54,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/datetime/CMakeLists.txt b/zephyr/tests/bacnet/datetime/CMakeLists.txt index 237e6fac..62633986 100644 --- a/zephyr/tests/bacnet/datetime/CMakeLists.txt +++ b/zephyr/tests/bacnet/datetime/CMakeLists.txt @@ -51,4 +51,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/dcc/CMakeLists.txt b/zephyr/tests/bacnet/dcc/CMakeLists.txt index 2490170c..3edf94d1 100644 --- a/zephyr/tests/bacnet/dcc/CMakeLists.txt +++ b/zephyr/tests/bacnet/dcc/CMakeLists.txt @@ -52,4 +52,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/event/CMakeLists.txt b/zephyr/tests/bacnet/event/CMakeLists.txt index 29c88220..737326fb 100644 --- a/zephyr/tests/bacnet/event/CMakeLists.txt +++ b/zephyr/tests/bacnet/event/CMakeLists.txt @@ -44,6 +44,7 @@ if(BOARD STREQUAL unit_testing) ${BACNET_SRC}/authentication_factor.c ${BACNET_SRC}/bacpropstates.c # Dependencies of bacapp.c + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bactext.c ${BACNET_SRC}/indtext.c ${BACNET_SRC}/weeklyschedule.c @@ -69,4 +70,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/getevent/CMakeLists.txt b/zephyr/tests/bacnet/getevent/CMakeLists.txt index 2490170c..3edf94d1 100644 --- a/zephyr/tests/bacnet/getevent/CMakeLists.txt +++ b/zephyr/tests/bacnet/getevent/CMakeLists.txt @@ -52,4 +52,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/iam/CMakeLists.txt b/zephyr/tests/bacnet/iam/CMakeLists.txt index 2490170c..3edf94d1 100644 --- a/zephyr/tests/bacnet/iam/CMakeLists.txt +++ b/zephyr/tests/bacnet/iam/CMakeLists.txt @@ -52,4 +52,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/ihave/CMakeLists.txt b/zephyr/tests/bacnet/ihave/CMakeLists.txt index 2490170c..3edf94d1 100644 --- a/zephyr/tests/bacnet/ihave/CMakeLists.txt +++ b/zephyr/tests/bacnet/ihave/CMakeLists.txt @@ -52,4 +52,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/lighting/CMakeLists.txt b/zephyr/tests/bacnet/lighting/CMakeLists.txt index ffc0cce2..5c0a44b0 100644 --- a/zephyr/tests/bacnet/lighting/CMakeLists.txt +++ b/zephyr/tests/bacnet/lighting/CMakeLists.txt @@ -54,4 +54,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/lso/CMakeLists.txt b/zephyr/tests/bacnet/lso/CMakeLists.txt index 2490170c..3edf94d1 100644 --- a/zephyr/tests/bacnet/lso/CMakeLists.txt +++ b/zephyr/tests/bacnet/lso/CMakeLists.txt @@ -52,4 +52,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/memcopy/CMakeLists.txt b/zephyr/tests/bacnet/memcopy/CMakeLists.txt index d7b0670a..39c88bde 100644 --- a/zephyr/tests/bacnet/memcopy/CMakeLists.txt +++ b/zephyr/tests/bacnet/memcopy/CMakeLists.txt @@ -39,4 +39,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/npdu/CMakeLists.txt b/zephyr/tests/bacnet/npdu/CMakeLists.txt index 1ee0e845..3ccb619f 100644 --- a/zephyr/tests/bacnet/npdu/CMakeLists.txt +++ b/zephyr/tests/bacnet/npdu/CMakeLists.txt @@ -46,4 +46,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/property/CMakeLists.txt b/zephyr/tests/bacnet/property/CMakeLists.txt index c356e803..5dd325ca 100644 --- a/zephyr/tests/bacnet/property/CMakeLists.txt +++ b/zephyr/tests/bacnet/property/CMakeLists.txt @@ -58,4 +58,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/ptransfer/CMakeLists.txt b/zephyr/tests/bacnet/ptransfer/CMakeLists.txt index f2f21d01..b0ae886f 100644 --- a/zephyr/tests/bacnet/ptransfer/CMakeLists.txt +++ b/zephyr/tests/bacnet/ptransfer/CMakeLists.txt @@ -30,6 +30,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_SRC ${BACNET_SRC_PATH} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -68,4 +69,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/rd/CMakeLists.txt b/zephyr/tests/bacnet/rd/CMakeLists.txt index 346e606b..ac2a23c1 100644 --- a/zephyr/tests/bacnet/rd/CMakeLists.txt +++ b/zephyr/tests/bacnet/rd/CMakeLists.txt @@ -49,4 +49,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/reject/CMakeLists.txt b/zephyr/tests/bacnet/reject/CMakeLists.txt index d7b0670a..39c88bde 100644 --- a/zephyr/tests/bacnet/reject/CMakeLists.txt +++ b/zephyr/tests/bacnet/reject/CMakeLists.txt @@ -39,4 +39,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/rp/CMakeLists.txt b/zephyr/tests/bacnet/rp/CMakeLists.txt index 346e606b..ac2a23c1 100644 --- a/zephyr/tests/bacnet/rp/CMakeLists.txt +++ b/zephyr/tests/bacnet/rp/CMakeLists.txt @@ -49,4 +49,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/rpm/CMakeLists.txt b/zephyr/tests/bacnet/rpm/CMakeLists.txt index 26afcd20..cb01ef9a 100644 --- a/zephyr/tests/bacnet/rpm/CMakeLists.txt +++ b/zephyr/tests/bacnet/rpm/CMakeLists.txt @@ -30,6 +30,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_SRC ${BACNET_SRC_PATH} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -68,4 +69,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/timestamp/CMakeLists.txt b/zephyr/tests/bacnet/timestamp/CMakeLists.txt index 899036d3..50a44f24 100644 --- a/zephyr/tests/bacnet/timestamp/CMakeLists.txt +++ b/zephyr/tests/bacnet/timestamp/CMakeLists.txt @@ -51,4 +51,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/timesync/CMakeLists.txt b/zephyr/tests/bacnet/timesync/CMakeLists.txt index 2490170c..3edf94d1 100644 --- a/zephyr/tests/bacnet/timesync/CMakeLists.txt +++ b/zephyr/tests/bacnet/timesync/CMakeLists.txt @@ -52,4 +52,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/whohas/CMakeLists.txt b/zephyr/tests/bacnet/whohas/CMakeLists.txt index 346e606b..ac2a23c1 100644 --- a/zephyr/tests/bacnet/whohas/CMakeLists.txt +++ b/zephyr/tests/bacnet/whohas/CMakeLists.txt @@ -49,4 +49,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/whois/CMakeLists.txt b/zephyr/tests/bacnet/whois/CMakeLists.txt index 346e606b..ac2a23c1 100644 --- a/zephyr/tests/bacnet/whois/CMakeLists.txt +++ b/zephyr/tests/bacnet/whois/CMakeLists.txt @@ -49,4 +49,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/bacnet/wp/CMakeLists.txt b/zephyr/tests/bacnet/wp/CMakeLists.txt index e683b357..6aeffea2 100644 --- a/zephyr/tests/bacnet/wp/CMakeLists.txt +++ b/zephyr/tests/bacnet/wp/CMakeLists.txt @@ -30,6 +30,7 @@ if(BOARD STREQUAL unit_testing) get_filename_component(BACNET_SRC ${BACNET_SRC_PATH} PATH) list(APPEND SOURCES + ${BACNET_SRC}/bacaction.c ${BACNET_SRC}/bacaddr.c ${BACNET_SRC}/bacapp.c ${BACNET_SRC}/bacdcode.c @@ -66,4 +67,7 @@ else() ) endif() -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig +add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) diff --git a/zephyr/tests/unit/bacnet/bits/CMakeLists.txt b/zephyr/tests/unit/bacnet/bits/CMakeLists.txt index 0036193c..3a5b3283 100644 --- a/zephyr/tests/unit/bacnet/bits/CMakeLists.txt +++ b/zephyr/tests/unit/bacnet/bits/CMakeLists.txt @@ -25,4 +25,8 @@ target_include_directories(testbinary PRIVATE ${ZEPHYR_CURRENT_MODULE_DIR}/src ) -add_compile_definitions(CONFIG_ZTEST_NEW_API) # For exposing deprecated Kconfig + add_compile_definitions( + CONFIG_ZTEST_NEW_API + BACNET_STACK_DEPRECATED_DISABLE + ) + \ No newline at end of file