Fixed out-of-service writability to be consistent with present-value in objects using Write_Enabled flag (#921)

This commit is contained in:
Steve Karg
2025-02-20 09:42:15 -06:00
committed by GitHub
parent 97490dacb1
commit 08f152b4ac
7 changed files with 301 additions and 35 deletions
+48 -7
View File
@@ -317,7 +317,7 @@ uint32_t Multistate_Input_Present_Value(uint32_t object_instance)
/**
* @brief For a given object instance-number, checks the present-value for COV
* @param pObject - specific object with valid data
* @param value - floating point analog value
* @param value - multistate value
*/
static void Multistate_Input_Present_Value_COV_Detect(
struct object_data *pObject, uint32_t value)
@@ -359,7 +359,7 @@ bool Multistate_Input_Present_Value_Set(
* For a given object instance-number, sets the present-value
*
* @param object_instance - object-instance number of the object
* @param value - floating point analog value
* @param value - state value 1..N
* @param error_class - the BACnet error class
* @param error_code - BACnet Error code
*
@@ -372,12 +372,14 @@ static bool Multistate_Input_Present_Value_Write(
BACNET_ERROR_CODE *error_code)
{
bool status = false;
struct object_data *pObject;
uint32_t old_value = 1;
unsigned max_states;
struct object_data *pObject;
pObject = Multistate_Input_Object(object_instance);
if (pObject) {
if (value <= UINT32_MAX) {
max_states = state_name_count(pObject->State_Text);
if ((value >= 1) && (value <= max_states)) {
if (pObject->Write_Enabled) {
old_value = pObject->Present_Value;
Multistate_Input_Present_Value_COV_Detect(pObject, value);
@@ -439,13 +441,51 @@ void Multistate_Input_Out_Of_Service_Set(uint32_t object_instance, bool value)
pObject = Multistate_Input_Object(object_instance);
if (pObject) {
if (pObject->Out_Of_Service != value) {
pObject->Change_Of_Value = true;
}
pObject->Out_Of_Service = value;
pObject->Change_Of_Value = true;
}
return;
}
/**
* For a given object instance-number, sets the out-of-service state
*
* @param object_instance - object-instance number of the object
* @param value - out-of-service state
* @param error_class - the BACnet error class
* @param error_code - BACnet Error code
*
* @return true if value is set, false if error occurred
*/
static bool Multistate_Input_Out_Of_Service_Write(
uint32_t object_instance,
bool value,
BACNET_ERROR_CLASS *error_class,
BACNET_ERROR_CODE *error_code)
{
bool status = false;
struct object_data *pObject;
pObject = Multistate_Input_Object(object_instance);
if (pObject) {
if (pObject->Write_Enabled) {
Multistate_Input_Out_Of_Service_Set(object_instance, value);
status = true;
} else {
*error_class = ERROR_CLASS_PROPERTY;
*error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
}
} else {
*error_class = ERROR_CLASS_OBJECT;
*error_code = ERROR_CODE_UNKNOWN_OBJECT;
}
return status;
}
/**
* @brief For a given object instance-number, loads the object-name into
* a characterstring. Note that the object name must be unique
@@ -831,8 +871,9 @@ bool Multistate_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
status = write_property_type_valid(
wp_data, &value, BACNET_APPLICATION_TAG_BOOLEAN);
if (status) {
Multistate_Input_Out_Of_Service_Set(
wp_data->object_instance, value.type.Boolean);
status = Multistate_Input_Out_Of_Service_Write(
wp_data->object_instance, value.type.Boolean,
&wp_data->error_class, &wp_data->error_code);
}
break;
default: