Fixed writing to the Channel object when no member value coercion was required. (#1176)

* Updated documentation for encode functions to accurately describe return values (0 on error instead of BACNET_STATUS_ERROR)

* Expanded property support, removed INPUT object types, added fallback encoding for non-coerced data types, and updated error handling in ReadProperty of present-value to check for 0 instead of BACNET_STATUS_ERROR.

* Expanded the validation tests and increased test code coverage.
This commit is contained in:
Steve Karg
2025-12-04 20:28:43 -06:00
committed by GitHub
parent 5758e511c8
commit b1c6a0e74b
5 changed files with 106 additions and 55 deletions
@@ -23,6 +23,7 @@ set(ZTST_DIR "${TST_DIR}/ztest/src")
add_compile_definitions(
BIG_ENDIAN=0
CONFIG_ZTEST=1
CHANNEL_MEMBERS_MAX=16
)
include_directories(
+51 -1
View File
@@ -16,6 +16,15 @@
* @addtogroup bacnet_tests
* @{
*/
static BACNET_WRITE_PROPERTY_DATA Write_Property_Internal_Data;
static bool Write_Property_Internal(BACNET_WRITE_PROPERTY_DATA *wp_data)
{
memcpy(
&Write_Property_Internal_Data, wp_data,
sizeof(BACNET_WRITE_PROPERTY_DATA));
return true;
}
/**
* @brief Test
@@ -32,9 +41,12 @@ static void test_Channel_Property_Read_Write(void)
const int32_t skip_fail_property_list[] = { -1 };
BACNET_CHANNEL_VALUE channel_value = { 0 };
BACNET_WRITE_PROPERTY_DATA wp_data = { 0 };
BACNET_WRITE_GROUP_DATA wg_data = { 0 };
BACNET_APPLICATION_DATA_VALUE value = { 0 };
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE member = { 0 };
Channel_Write_Property_Internal_Callback_Set(Write_Property_Internal);
Channel_Init();
Channel_Create(instance);
status = Channel_Valid_Instance(instance);
@@ -52,8 +64,8 @@ static void test_Channel_Property_Read_Write(void)
member.deviceIdentifier.instance = 0;
member.objectIdentifier.type = OBJECT_ANALOG_OUTPUT;
member.objectIdentifier.instance = 1;
member.propertyIdentifier = PROP_PRESENT_VALUE;
member.arrayIndex = BACNET_ARRAY_ALL;
member.propertyIdentifier = PROP_PRESENT_VALUE;
index = Channel_Reference_List_Member_Element_Add(instance, &member);
zassert_not_equal(index, 0, NULL);
status =
@@ -61,6 +73,9 @@ static void test_Channel_Property_Read_Write(void)
zassert_true(status, NULL);
status = Channel_Control_Groups_Element_Set(instance, 1, 1);
zassert_true(status, NULL);
member.propertyIdentifier = PROP_RELINQUISH_DEFAULT;
index = Channel_Reference_List_Member_Element_Add(instance, &member);
zassert_not_equal(index, 0, NULL);
member.deviceIdentifier.type = OBJECT_DEVICE;
member.deviceIdentifier.instance = 0;
member.objectIdentifier.type = OBJECT_BINARY_OUTPUT;
@@ -69,6 +84,9 @@ static void test_Channel_Property_Read_Write(void)
member.arrayIndex = BACNET_ARRAY_ALL;
index = Channel_Reference_List_Member_Element_Add(instance, &member);
zassert_not_equal(index, 0, NULL);
member.propertyIdentifier = PROP_RELINQUISH_DEFAULT;
index = Channel_Reference_List_Member_Element_Add(instance, &member);
zassert_not_equal(index, 0, NULL);
member.deviceIdentifier.type = OBJECT_DEVICE;
member.deviceIdentifier.instance = 0;
member.objectIdentifier.type = OBJECT_MULTI_STATE_OUTPUT;
@@ -77,6 +95,9 @@ static void test_Channel_Property_Read_Write(void)
member.arrayIndex = BACNET_ARRAY_ALL;
index = Channel_Reference_List_Member_Element_Add(instance, &member);
zassert_not_equal(index, 0, NULL);
member.propertyIdentifier = PROP_RELINQUISH_DEFAULT;
index = Channel_Reference_List_Member_Element_Add(instance, &member);
zassert_not_equal(index, 0, NULL);
member.deviceIdentifier.type = OBJECT_DEVICE;
member.deviceIdentifier.instance = 0;
member.objectIdentifier.type = OBJECT_LIGHTING_OUTPUT;
@@ -85,6 +106,12 @@ static void test_Channel_Property_Read_Write(void)
member.arrayIndex = BACNET_ARRAY_ALL;
index = Channel_Reference_List_Member_Element_Add(instance, &member);
zassert_not_equal(index, 0, NULL);
member.propertyIdentifier = PROP_RELINQUISH_DEFAULT;
index = Channel_Reference_List_Member_Element_Add(instance, &member);
zassert_not_equal(index, 0, NULL);
member.propertyIdentifier = PROP_HIGH_END_TRIM;
index = Channel_Reference_List_Member_Element_Add(instance, &member);
zassert_not_equal(index, 0, NULL);
member.deviceIdentifier.type = OBJECT_DEVICE;
member.deviceIdentifier.instance = 0;
member.objectIdentifier.type = OBJECT_COLOR;
@@ -93,6 +120,9 @@ static void test_Channel_Property_Read_Write(void)
member.arrayIndex = BACNET_ARRAY_ALL;
index = Channel_Reference_List_Member_Element_Add(instance, &member);
zassert_not_equal(index, 0, NULL);
member.propertyIdentifier = PROP_DEFAULT_COLOR;
index = Channel_Reference_List_Member_Element_Add(instance, &member);
zassert_not_equal(index, 0, NULL);
member.deviceIdentifier.type = OBJECT_DEVICE;
member.deviceIdentifier.instance = 0;
member.objectIdentifier.type = OBJECT_COLOR_TEMPERATURE;
@@ -101,6 +131,9 @@ static void test_Channel_Property_Read_Write(void)
member.arrayIndex = BACNET_ARRAY_ALL;
index = Channel_Reference_List_Member_Element_Add(instance, &member);
zassert_not_equal(index, 0, NULL);
member.propertyIdentifier = PROP_DEFAULT_COLOR_TEMPERATURE;
index = Channel_Reference_List_Member_Element_Add(instance, &member);
zassert_not_equal(index, 0, NULL);
/* perform a general test for RP/WP */
bacnet_object_properties_read_write_test(
OBJECT_CHANNEL, instance, Channel_Property_Lists, Channel_Read_Property,
@@ -129,6 +162,13 @@ static void test_Channel_Property_Read_Write(void)
bacapp_encode_application_data(wp_data.application_data, &value);
status = Channel_Write_Property(&wp_data);
zassert_true(status, NULL);
value.type.Channel_Value.tag = BACNET_APPLICATION_TAG_XY_COLOR;
value.type.Channel_Value.type.XY_Color.x_coordinate = 0.4590f;
value.type.Channel_Value.type.XY_Color.y_coordinate = 0.4101f;
wp_data.application_data_len =
bacapp_encode_application_data(wp_data.application_data, &value);
status = Channel_Write_Property(&wp_data);
zassert_true(status, NULL);
/* specific WriteProperty value */
wp_data.object_property = PROP_OUT_OF_SERVICE;
value.tag = BACNET_APPLICATION_TAG_BOOLEAN;
@@ -235,6 +275,16 @@ static void test_Channel_Property_Read_Write(void)
channel_value.type.Real = 3.14159f;
status = Channel_Present_Value_Set(instance, 1, &channel_value);
zassert_true(status, NULL);
/* context API */
Channel_Context_Set(instance, Channel_Context_Get(instance));
/* WriteGroup API */
wg_data.change_list.channel = 1;
wg_data.change_list.overriding_priority = BACNET_MAX_PRIORITY;
wg_data.change_list.value.tag = BACNET_APPLICATION_TAG_REAL;
wg_data.change_list.value.type.Real = 2.71828f;
wg_data.inhibit_delay = 0;
wg_data.write_priority = BACNET_MAX_PRIORITY;
Channel_Write_Group(&wg_data, 0, &wg_data.change_list);
/* cleanup */
status = Channel_Delete(instance);
zassert_true(status, NULL);