Skip to content

Commit 851d03a

Browse files
authored
Feature/read only analog value present value (bacnet-stack#1424)
* feat: analog value min/max and read-only options. - Move Analog Value object structure into the C module and add get/set for the members. - Add `Min_Pres_Value` and `Max_Pres_Value` properties to Analog Value object - Implement write enable/disable functionality for the Analog Value object. - Enhance the test suite to cover new property APIs and validate their functionality. - Update float initialization to use 'f' suffix for consistency in analog objects - Remove write-enabled for present-value coupling to out-of-service flag in value objects - Change writable properties for value objects to conditionally skip Present_Value and allow writing when out-of-service is TRUE. - Enable write by default for value objects that support the Write_Enable flag. - Add writable property list tests for various BACnet object types
1 parent 73584d6 commit 851d03a

19 files changed

Lines changed: 1490 additions & 433 deletions

File tree

src/bacnet/basic/object/ai.c

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,25 @@ static const int32_t Properties_Proprietary[] = { -1 };
7272
/* Every object shall have a Writable Property_List property
7373
which is a BACnetARRAY of property identifiers,
7474
one property identifier for each property within this object
75-
that is always writable. */
75+
that is always writable.
76+
Properties that are only conditionally writable, for example,
77+
a Present_Value property whose writability is conditionally
78+
based on the Out_Of_Service property value, shall not be included. */
7679
static const int32_t Writable_Properties[] = {
7780
/* unordered list of always writable properties */
81+
PROP_OUT_OF_SERVICE,
82+
PROP_UNITS,
83+
PROP_COV_INCREMENT,
84+
#if defined(INTRINSIC_REPORTING)
85+
PROP_TIME_DELAY,
86+
PROP_NOTIFICATION_CLASS,
87+
PROP_HIGH_LIMIT,
88+
PROP_LOW_LIMIT,
89+
PROP_DEADBAND,
90+
PROP_LIMIT_ENABLE,
91+
PROP_EVENT_ENABLE,
92+
PROP_NOTIFY_TYPE,
93+
#endif
7894
-1
7995
};
8096

@@ -1000,7 +1016,7 @@ int Analog_Input_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata)
10001016
uint8_t *apdu = NULL;
10011017
BACNET_BIT_STRING bit_string;
10021018
BACNET_CHARACTER_STRING char_string;
1003-
float real_value = (float)1.414;
1019+
float real_value = 1.414f;
10041020
bool state = false;
10051021
#if defined(INTRINSIC_REPORTING)
10061022
int apdu_size = 0;
@@ -2094,9 +2110,9 @@ uint32_t Analog_Input_Create(uint32_t object_instance)
20942110
pObject->Object_Name = NULL;
20952111
pObject->Description = NULL;
20962112
pObject->Reliability = RELIABILITY_NO_FAULT_DETECTED;
2097-
pObject->COV_Increment = 1.0;
2113+
pObject->COV_Increment = 1.0f;
20982114
pObject->Present_Value = 0.0f;
2099-
pObject->Prior_Value = 0.0;
2115+
pObject->Prior_Value = 0.0f;
21002116
pObject->Units = UNITS_PERCENT;
21012117
pObject->Out_Of_Service = false;
21022118
pObject->Changed = false;

src/bacnet/basic/object/ao.c

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ unsigned Analog_Output_Instance_To_Index(uint32_t object_instance)
203203
*/
204204
float Analog_Output_Present_Value(uint32_t object_instance)
205205
{
206-
float value = 0.0;
206+
float value = 0.0f;
207207
uint8_t priority = 0; /* loop counter */
208208
struct object_data *pObject;
209209

@@ -284,7 +284,7 @@ static int Analog_Output_Priority_Array_Encode(
284284
*/
285285
float Analog_Output_Relinquish_Default(uint32_t object_instance)
286286
{
287-
float value = 0.0;
287+
float value = 0.0f;
288288
struct object_data *pObject;
289289

290290
pObject = Keylist_Data(Object_List, object_instance);
@@ -326,9 +326,9 @@ bool Analog_Output_Relinquish_Default_Set(uint32_t object_instance, float value)
326326
static void
327327
Analog_Output_Present_Value_COV_Detect(struct object_data *pObject, float value)
328328
{
329-
float prior_value = 0.0;
330-
float cov_increment = 0.0;
331-
float cov_delta = 0.0;
329+
float prior_value = 0.0f;
330+
float cov_increment = 0.0f;
331+
float cov_delta = 0.0f;
332332

333333
if (pObject) {
334334
prior_value = pObject->Prior_Value;
@@ -362,8 +362,8 @@ bool Analog_Output_Present_Value_Set(
362362
pObject = Keylist_Data(Object_List, object_instance);
363363
if (pObject) {
364364
if ((priority >= 1) && (priority <= BACNET_MAX_PRIORITY) &&
365-
(value >= pObject->Min_Pres_Value) &&
366-
(value <= pObject->Max_Pres_Value)) {
365+
isgreaterequal(value, pObject->Min_Pres_Value) &&
366+
islessequal(value, pObject->Max_Pres_Value)) {
367367
pObject->Relinquished[priority - 1] = false;
368368
pObject->Priority_Array[priority - 1] = value;
369369
Analog_Output_Present_Value_COV_Detect(
@@ -391,7 +391,7 @@ bool Analog_Output_Present_Value_Relinquish(
391391
if (pObject) {
392392
if ((priority >= 1) && (priority <= BACNET_MAX_PRIORITY)) {
393393
pObject->Relinquished[priority - 1] = true;
394-
pObject->Priority_Array[priority - 1] = 0.0;
394+
pObject->Priority_Array[priority - 1] = 0.0f;
395395
Analog_Output_Present_Value_COV_Detect(
396396
pObject, Analog_Output_Present_Value(object_instance));
397397
status = true;
@@ -462,14 +462,14 @@ static bool Analog_Output_Present_Value_Write(
462462
{
463463
bool status = false;
464464
struct object_data *pObject;
465-
float old_value = 0.0;
466-
float new_value = 0.0;
465+
float old_value = 0.0f;
466+
float new_value = 0.0f;
467467

468468
pObject = Keylist_Data(Object_List, object_instance);
469469
if (pObject) {
470470
if ((priority >= 1) && (priority <= BACNET_MAX_PRIORITY) &&
471-
(value >= pObject->Min_Pres_Value) &&
472-
(value <= pObject->Max_Pres_Value)) {
471+
isgreaterequal(value, pObject->Min_Pres_Value) &&
472+
islessequal(value, pObject->Max_Pres_Value)) {
473473
if (priority != 6) {
474474
old_value = Analog_Output_Present_Value(object_instance);
475475
Analog_Output_Present_Value_Set(
@@ -519,8 +519,8 @@ static bool Analog_Output_Present_Value_Relinquish_Write(
519519
{
520520
bool status = false;
521521
struct object_data *pObject;
522-
float old_value = 0.0;
523-
float new_value = 0.0;
522+
float old_value = 0.0f;
523+
float new_value = 0.0f;
524524

525525
pObject = Keylist_Data(Object_List, object_instance);
526526
if (pObject) {
@@ -876,7 +876,7 @@ bool Analog_Output_Description_Set(
876876
*/
877877
float Analog_Output_Min_Pres_Value(uint32_t object_instance)
878878
{
879-
float value = 0.0;
879+
float value = 0.0f;
880880
struct object_data *pObject;
881881

882882
pObject = Keylist_Data(Object_List, object_instance);
@@ -914,7 +914,7 @@ bool Analog_Output_Min_Pres_Value_Set(uint32_t object_instance, float value)
914914
*/
915915
float Analog_Output_Max_Pres_Value(uint32_t object_instance)
916916
{
917-
float value = 0.0;
917+
float value = 0.0f;
918918
struct object_data *pObject;
919919

920920
pObject = Keylist_Data(Object_List, object_instance);
@@ -1013,7 +1013,7 @@ bool Analog_Output_Encode_Value_List(
10131013
*/
10141014
float Analog_Output_COV_Increment(uint32_t object_instance)
10151015
{
1016-
float value = 0.0;
1016+
float value = 0.0f;
10171017
struct object_data *pObject;
10181018

10191019
pObject = Keylist_Data(Object_List, object_instance);
@@ -1056,7 +1056,7 @@ int Analog_Output_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata)
10561056
BACNET_CHARACTER_STRING char_string;
10571057
uint8_t *apdu = NULL;
10581058
uint32_t units = 0;
1059-
float real_value = 0.0;
1059+
float real_value = 0.0f;
10601060
unsigned i = 0;
10611061
bool state = false;
10621062

@@ -1361,16 +1361,16 @@ uint32_t Analog_Output_Create(uint32_t object_instance)
13611361
pObject->Overridden = false;
13621362
for (priority = 0; priority < BACNET_MAX_PRIORITY; priority++) {
13631363
pObject->Relinquished[priority] = true;
1364-
pObject->Priority_Array[priority] = 0.0;
1364+
pObject->Priority_Array[priority] = 0.0f;
13651365
}
1366-
pObject->Relinquish_Default = 0.0;
1367-
pObject->COV_Increment = 1.0;
1368-
pObject->Prior_Value = 0.0;
1366+
pObject->Relinquish_Default = 0.0f;
1367+
pObject->COV_Increment = 1.0f;
1368+
pObject->Prior_Value = 0.0f;
13691369
pObject->Units = UNITS_NO_UNITS;
13701370
pObject->Out_Of_Service = false;
13711371
pObject->Changed = false;
1372-
pObject->Min_Pres_Value = 0;
1373-
pObject->Max_Pres_Value = 100;
1372+
pObject->Min_Pres_Value = -FLT_MAX;
1373+
pObject->Max_Pres_Value = FLT_MAX;
13741374
/* add to list */
13751375
index = Keylist_Data_Add(Object_List, object_instance, pObject);
13761376
if (index < 0) {

0 commit comments

Comments
 (0)