Fixed COV detection in the basic Binary Output object example. (#751)

This commit is contained in:
Steve Karg
2024-08-26 15:03:58 -05:00
committed by GitHub
parent 3e0370eee1
commit b3c8c10c03
+45 -15
View File
@@ -37,7 +37,6 @@ static const char *Default_Inactive_Text = "Inactive";
struct object_data {
bool Out_Of_Service : 1;
bool Changed : 1;
bool Present_Value : 1;
bool Relinquish_Default : 1;
bool Polarity : 1;
uint16_t Priority_Array;
@@ -159,19 +158,16 @@ unsigned Binary_Output_Instance_To_Index(uint32_t 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
* @brief Calculated the present-value property from the priority array.
* @param pObject - pointer to the object data
* @return The present-value of the object
*/
BACNET_BINARY_PV Binary_Output_Present_Value(uint32_t object_instance)
static BACNET_BINARY_PV Object_Present_Value(
struct object_data *pObject)
{
BACNET_BINARY_PV value = BINARY_INACTIVE;
unsigned p = 0;
struct object_data *pObject;
pObject = Keylist_Data(Object_List, object_instance);
if (pObject) {
if (pObject->Relinquish_Default) {
value = BINARY_ACTIVE;
@@ -191,6 +187,26 @@ BACNET_BINARY_PV Binary_Output_Present_Value(uint32_t object_instance)
return value;
}
/**
* 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
*/
BACNET_BINARY_PV Binary_Output_Present_Value(uint32_t object_instance)
{
BACNET_BINARY_PV value = BINARY_INACTIVE;
struct object_data *pObject;
pObject = Keylist_Data(Object_List, object_instance);
if (pObject) {
value = Object_Present_Value(pObject);
}
return value;
}
/**
* @brief Encode a BACnetARRAY property element
* @param object_instance [in] BACnet network port object instance number
@@ -264,12 +280,14 @@ bool Binary_Output_Present_Value_Set(
{
bool status = false;
struct object_data *pObject;
BACNET_BINARY_PV old_value, new_value;
pObject = Keylist_Data(Object_List, object_instance);
if (pObject) {
if (priority && (priority <= BACNET_MAX_PRIORITY) &&
(priority != 6 /* reserved */)) {
priority--;
old_value = Object_Present_Value(pObject);
if (binary_value <= MAX_BINARY_PV) {
BIT_SET(pObject->Priority_Active_Bits, priority);
if (binary_value == BINARY_ACTIVE) {
@@ -279,6 +297,10 @@ bool Binary_Output_Present_Value_Set(
}
status = true;
}
new_value = Object_Present_Value(pObject);
if (old_value != new_value) {
pObject->Changed = true;
}
}
}
@@ -299,14 +321,20 @@ bool Binary_Output_Present_Value_Relinquish(
{
bool status = false;
struct object_data *pObject;
BACNET_BINARY_PV old_value, new_value;
pObject = Keylist_Data(Object_List, object_instance);
if (pObject) {
if (priority && (priority <= BACNET_MAX_PRIORITY) &&
(priority != 6 /* reserved */)) {
priority--;
old_value = Object_Present_Value(pObject);
BIT_CLEAR(pObject->Priority_Active_Bits, priority);
BIT_CLEAR(pObject->Priority_Array, priority);
new_value = Object_Present_Value(pObject);
if (old_value != new_value) {
pObject->Changed = true;
}
status = true;
}
}
@@ -340,9 +368,10 @@ static bool Binary_Output_Present_Value_Write(uint32_t object_instance,
if ((priority >= 1) && (priority <= BACNET_MAX_PRIORITY) &&
(value <= MAX_BINARY_PV)) {
if (priority != 6) {
old_value = Binary_Output_Present_Value(object_instance);
old_value = Object_Present_Value(pObject);
Binary_Output_Present_Value_Set(
object_instance, value, priority);
new_value = Object_Present_Value(pObject);
if (pObject->Out_Of_Service) {
/* The physical point that the object represents
is not in service. This means that changes to the
@@ -350,7 +379,6 @@ static bool Binary_Output_Present_Value_Write(uint32_t object_instance,
physical output when the value of Out_Of_Service
is true. */
} else if (Binary_Output_Write_Present_Value_Callback) {
new_value = Binary_Output_Present_Value(object_instance);
Binary_Output_Write_Present_Value_Callback(
object_instance, old_value, new_value);
}
@@ -395,9 +423,10 @@ static bool Binary_Output_Present_Value_Relinquish_Write(
if (pObject) {
if ((priority >= 1) && (priority <= BACNET_MAX_PRIORITY)) {
if (priority != 6) {
old_value = Binary_Output_Present_Value(object_instance);
old_value = Object_Present_Value(pObject);
Binary_Output_Present_Value_Relinquish(
object_instance, priority);
new_value = Object_Present_Value(pObject);
if (pObject->Out_Of_Service) {
/* The physical point that the object represents
is not in service. This means that changes to the
@@ -405,7 +434,6 @@ static bool Binary_Output_Present_Value_Relinquish_Write(
physical output when the value of Out_Of_Service
is true. */
} else if (Binary_Output_Write_Present_Value_Callback) {
new_value = Binary_Output_Present_Value(object_instance);
Binary_Output_Write_Present_Value_Callback(
object_instance, old_value, new_value);
}
@@ -891,12 +919,15 @@ bool Binary_Output_Encode_Value_List(
const bool in_alarm = false;
bool fault = false;
const bool overridden = false;
BACNET_BINARY_PV value;
pObject = Keylist_Data(Object_List, object_instance);
if (pObject) {
fault = Binary_Output_Object_Fault(pObject);
value = Object_Present_Value(pObject);
status =
cov_value_list_encode_enumerated(value_list, pObject->Present_Value,
cov_value_list_encode_enumerated(value_list, value,
in_alarm, fault, overridden, pObject->Out_Of_Service);
}
return status;
@@ -1149,7 +1180,6 @@ uint32_t Binary_Output_Create(uint32_t object_instance)
if (pObject) {
pObject->Object_Name = NULL;
pObject->Reliability = RELIABILITY_NO_FAULT_DETECTED;
pObject->Present_Value = false;
pObject->Out_Of_Service = false;
pObject->Active_Text = Default_Active_Text;
pObject->Inactive_Text = Default_Inactive_Text;