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
+46 -51
View File
@@ -581,10 +581,10 @@ bool Channel_Write_Member_Value(
int apdu_len = 0;
if (wp_data && value) {
if (((wp_data->object_type == OBJECT_ANALOG_INPUT) ||
(wp_data->object_type == OBJECT_ANALOG_OUTPUT) ||
if (((wp_data->object_type == OBJECT_ANALOG_OUTPUT) ||
(wp_data->object_type == OBJECT_ANALOG_VALUE)) &&
(wp_data->object_property == PROP_PRESENT_VALUE) &&
((wp_data->object_property == PROP_PRESENT_VALUE) ||
(wp_data->object_property == PROP_RELINQUISH_DEFAULT)) &&
(wp_data->array_index == BACNET_ARRAY_ALL)) {
apdu_len = bacnet_channel_value_coerce_data_encode(
wp_data->application_data, wp_data->application_data_len, value,
@@ -594,10 +594,10 @@ bool Channel_Write_Member_Value(
status = true;
}
} else if (
((wp_data->object_type == OBJECT_BINARY_INPUT) ||
(wp_data->object_type == OBJECT_BINARY_OUTPUT) ||
((wp_data->object_type == OBJECT_BINARY_OUTPUT) ||
(wp_data->object_type == OBJECT_BINARY_VALUE)) &&
(wp_data->object_property == PROP_PRESENT_VALUE) &&
((wp_data->object_property == PROP_PRESENT_VALUE) ||
(wp_data->object_property == PROP_RELINQUISH_DEFAULT)) &&
(wp_data->array_index == BACNET_ARRAY_ALL)) {
apdu_len = bacnet_channel_value_coerce_data_encode(
wp_data->application_data, wp_data->application_data_len, value,
@@ -607,10 +607,10 @@ bool Channel_Write_Member_Value(
status = true;
}
} else if (
((wp_data->object_type == OBJECT_MULTI_STATE_INPUT) ||
(wp_data->object_type == OBJECT_MULTI_STATE_OUTPUT) ||
((wp_data->object_type == OBJECT_MULTI_STATE_OUTPUT) ||
(wp_data->object_type == OBJECT_MULTI_STATE_VALUE)) &&
(wp_data->object_property == PROP_PRESENT_VALUE) &&
((wp_data->object_property == PROP_PRESENT_VALUE) ||
(wp_data->object_property == PROP_RELINQUISH_DEFAULT)) &&
(wp_data->array_index == BACNET_ARRAY_ALL)) {
apdu_len = bacnet_channel_value_coerce_data_encode(
wp_data->application_data, wp_data->application_data_len, value,
@@ -619,49 +619,35 @@ bool Channel_Write_Member_Value(
wp_data->application_data_len = apdu_len;
status = true;
}
} else if (wp_data->object_type == OBJECT_LIGHTING_OUTPUT) {
if ((wp_data->object_property == PROP_PRESENT_VALUE) &&
(wp_data->array_index == BACNET_ARRAY_ALL)) {
apdu_len = bacnet_channel_value_coerce_data_encode(
wp_data->application_data, wp_data->application_data_len,
value, BACNET_APPLICATION_TAG_REAL);
if (apdu_len != BACNET_STATUS_ERROR) {
wp_data->application_data_len = apdu_len;
status = true;
}
} else if (
(wp_data->object_property == PROP_LIGHTING_COMMAND) &&
(wp_data->array_index == BACNET_ARRAY_ALL)) {
apdu_len = bacnet_channel_value_coerce_data_encode(
wp_data->application_data, wp_data->application_data_len,
value, BACNET_APPLICATION_TAG_LIGHTING_COMMAND);
if (apdu_len != BACNET_STATUS_ERROR) {
wp_data->application_data_len = apdu_len;
status = true;
}
} else if (
(wp_data->object_type == OBJECT_LIGHTING_OUTPUT) &&
((wp_data->object_property == PROP_PRESENT_VALUE) ||
(wp_data->object_property == PROP_RELINQUISH_DEFAULT)) &&
(wp_data->array_index == BACNET_ARRAY_ALL)) {
apdu_len = bacnet_channel_value_coerce_data_encode(
wp_data->application_data, wp_data->application_data_len, value,
BACNET_APPLICATION_TAG_REAL);
if (apdu_len != BACNET_STATUS_ERROR) {
wp_data->application_data_len = apdu_len;
status = true;
}
} else if (wp_data->object_type == OBJECT_COLOR) {
if ((wp_data->object_property == PROP_PRESENT_VALUE) &&
(wp_data->array_index == BACNET_ARRAY_ALL)) {
apdu_len = bacnet_channel_value_coerce_data_encode(
wp_data->application_data, wp_data->application_data_len,
value, BACNET_APPLICATION_TAG_XY_COLOR);
if (apdu_len != BACNET_STATUS_ERROR) {
wp_data->application_data_len = apdu_len;
status = true;
}
} else if (
(wp_data->object_property == PROP_COLOR_COMMAND) &&
(wp_data->array_index == BACNET_ARRAY_ALL)) {
apdu_len = bacnet_channel_value_coerce_data_encode(
wp_data->application_data, wp_data->application_data_len,
value, BACNET_APPLICATION_TAG_COLOR_COMMAND);
if (apdu_len != BACNET_STATUS_ERROR) {
wp_data->application_data_len = apdu_len;
status = true;
}
} else if (
(wp_data->object_type == OBJECT_COLOR) &&
((wp_data->object_property == PROP_PRESENT_VALUE) ||
(wp_data->object_property == PROP_DEFAULT_COLOR)) &&
(wp_data->array_index == BACNET_ARRAY_ALL)) {
apdu_len = bacnet_channel_value_coerce_data_encode(
wp_data->application_data, wp_data->application_data_len, value,
BACNET_APPLICATION_TAG_XY_COLOR);
if (apdu_len != BACNET_STATUS_ERROR) {
wp_data->application_data_len = apdu_len;
status = true;
}
} else if (wp_data->object_type == OBJECT_COLOR_TEMPERATURE) {
} else if (
(wp_data->object_type == OBJECT_COLOR_TEMPERATURE) &&
((wp_data->object_property == PROP_PRESENT_VALUE) ||
(wp_data->object_property == PROP_DEFAULT_COLOR_TEMPERATURE)) &&
(wp_data->array_index == BACNET_ARRAY_ALL)) {
apdu_len = bacnet_channel_value_coerce_data_encode(
wp_data->application_data, wp_data->application_data_len, value,
BACNET_APPLICATION_TAG_UNSIGNED_INT);
@@ -669,6 +655,15 @@ bool Channel_Write_Member_Value(
wp_data->application_data_len = apdu_len;
status = true;
}
} else {
/* no coercion */
apdu_len = bacnet_channel_value_encode(
wp_data->application_data, wp_data->application_data_len,
value);
if (apdu_len > 0) {
wp_data->application_data_len = apdu_len;
status = true;
}
}
}
@@ -991,7 +986,7 @@ int Channel_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata)
case PROP_PRESENT_VALUE:
cvalue = Channel_Present_Value(rpdata->object_instance);
apdu_len = bacnet_channel_value_encode(apdu, apdu_size, cvalue);
if (apdu_len == BACNET_STATUS_ERROR) {
if (apdu_len == 0) {
apdu_len = encode_application_null(apdu);
}
break;