Skip to content

Commit 6d9ca7d

Browse files
committed
add ucix_add_option_float function
convert float with precision
1 parent 471f96a commit 6d9ca7d

7 files changed

Lines changed: 96 additions & 190 deletions

File tree

apps/server-uci/bacnet/basic/object/ai.c

Lines changed: 22 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -625,8 +625,6 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
625625
int idx_c_len = 0;
626626
float value_f = 0.0f;
627627
float resolution = 0.1f;
628-
char *value_c = NULL;
629-
int value_c_len = 0;
630628

631629
struct object_data *pObject;
632630
/* Valid data? */
@@ -670,12 +668,9 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
670668
value.type.Real, wp_data->priority,
671669
&wp_data->error_class, &wp_data->error_code)) {
672670
value_f = Analog_Present_Value(pObject);
673-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
674-
value_c = malloc(value_c_len + 1);
675-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
676-
ucix_add_option(ctxw, sec, idx_c, "value", value_c);
671+
ucix_add_option_float(ctxw, sec, idx_c, "value",
672+
value_f, resolution);
677673
ucix_commit(ctxw,sec);
678-
free(value_c);
679674
}
680675
} else {
681676
status = write_property_type_valid(wp_data, &value,
@@ -685,12 +680,9 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
685680
pObject, wp_data->priority,
686681
&wp_data->error_class, &wp_data->error_code)) {
687682
value_f = Analog_Present_Value(pObject);
688-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
689-
value_c = malloc(value_c_len + 1);
690-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
691-
ucix_add_option(ctxw, sec, idx_c, "value", value_c);
683+
ucix_add_option_float(ctxw, sec, idx_c, "value",
684+
value_f, resolution);
692685
ucix_commit(ctxw,sec);
693-
free(value_c);
694686
}
695687
}
696688
}
@@ -719,13 +711,10 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
719711
if (status) {
720712
Analog_COV_Increment_Set(pObject,
721713
value.type.Real);
722-
value_f = pObject->COV_Increment;
723-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
724-
value_c = malloc(value_c_len + 1);
725-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
726-
ucix_add_option(ctxw, sec, idx_c, "cov_increment", value_c);
714+
ucix_add_option_float(
715+
ctxw, sec, idx_c, "cov_increment",
716+
pObject->COV_Increment, resolution);
727717
ucix_commit(ctxw,sec);
728-
free(value_c);
729718
}
730719
break;
731720
case PROP_OBJECT_IDENTIFIER:
@@ -738,9 +727,10 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
738727
BACNET_APPLICATION_TAG_CHARACTER_STRING);
739728
if (status) {
740729
if (Analog_Name_Set(
741-
pObject, value.type.Character_String.value, Object_Type, wp_data->object_instance)) {
730+
pObject, value.type.Character_String.value,
731+
Object_Type, wp_data->object_instance)) {
742732
ucix_add_option(ctxw, sec, idx_c, "name",
743-
strndup(value.type.Character_String.value,value.type.Character_String.length));
733+
characterstring_value_const(&value.type.Character_String));
744734
ucix_commit(ctxw,sec);
745735
}
746736
}
@@ -774,13 +764,10 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
774764
if (status) {
775765
if (Analog_Max_Pres_Value_Set(pObject,
776766
value.type.Real)) {
777-
value_f = pObject->Max_Pres_Value;
778-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
779-
value_c = malloc(value_c_len + 1);
780-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
781-
ucix_add_option(ctxw, sec, idx_c, "max_value", value_c);
767+
ucix_add_option_float(
768+
ctxw, sec, idx_c, "max_value",
769+
pObject->Max_Pres_Value, resolution);
782770
ucix_commit(ctxw,sec);
783-
free(value_c);
784771
}
785772
}
786773
break;
@@ -790,13 +777,10 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
790777
if (status) {
791778
if (Analog_Min_Pres_Value_Set(pObject,
792779
value.type.Real)) {
793-
value_f = pObject->Min_Pres_Value;
794-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
795-
value_c = malloc(value_c_len + 1);
796-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
797-
ucix_add_option(ctxw, sec, idx_c, "min_value", value_c);
780+
ucix_add_option_float(
781+
ctxw, sec, idx_c, "min_value",
782+
pObject->Min_Pres_Value, resolution);
798783
ucix_commit(ctxw,sec);
799-
free(value_c);
800784
}
801785
}
802786
break;
@@ -805,13 +789,10 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
805789
BACNET_APPLICATION_TAG_REAL);
806790
if (status) {
807791
pObject->Resolution = value.type.Real;
808-
value_f = pObject->Resolution;
809-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
810-
value_c = malloc(value_c_len + 1);
811-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
812-
ucix_add_option(ctxw, sec, idx_c, "resolution", value_c);
792+
ucix_add_option_float(
793+
ctxw, sec, idx_c, "resolution",
794+
pObject->Resolution, 0);
813795
ucix_commit(ctxw,sec);
814-
free(value_c);
815796
}
816797
break;
817798
case PROP_DESCRIPTION:
@@ -857,13 +838,8 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
857838
if (status) {
858839
if (Analog_High_Limit_Set(pObject,
859840
value.type.Real)) {
860-
value_f = pObject->High_Limit;
861-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
862-
value_c = malloc(value_c_len + 1);
863-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
864-
ucix_add_option(ctxw, sec, idx_c, "high_limit", value_c);
841+
ucix_add_option_float(ctxw, sec, idx_c, "high_limit", pObject->High_Limit, resolution);
865842
ucix_commit(ctxw,sec);
866-
free(value_c);
867843
}
868844
}
869845
break;
@@ -873,13 +849,8 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
873849
if (status) {
874850
if (Analog_Low_Limit_Set(pObject,
875851
value.type.Real)) {
876-
value_f = pObject->Low_Limit;
877-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
878-
value_c = malloc(value_c_len + 1);
879-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
880-
ucix_add_option(ctxw, sec, idx_c, "low_limit", value_c);
852+
ucix_add_option_float(ctxw, sec, idx_c, "low_limit", pObject->Low_Limit, resolution);
881853
ucix_commit(ctxw,sec);
882-
free(value_c);
883854
}
884855
}
885856
break;
@@ -890,12 +861,8 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
890861
if (Analog_Deadband_Set(pObject,
891862
value.type.Real)) {
892863
value_f = pObject->Deadband;
893-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
894-
value_c = malloc(value_c_len + 1);
895-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
896-
ucix_add_option(ctxw, sec, idx_c, "dead_limit", value_c);
864+
ucix_add_option_float(ctxw, sec, idx_c, "dead_limit", pObject->Deadband, resolution);
897865
ucix_commit(ctxw,sec);
898-
free(value_c);
899866
}
900867
}
901868
break;

apps/server-uci/bacnet/basic/object/analog.c

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -98,39 +98,21 @@ int bacnet_array_encode_analog(
9898
/**
9999
* @brief Set zero depends on resolution / precision
100100
* @param value_f - Value
101-
* @param resolution - Resolution
101+
* @param resolution - Resolution 0 = Float, 1=Integer, betwen 0 and 1 = Places after the decimal point
102102
* @return rounded value
103103
*/
104104
float limit_value_by_resolution(float value_f, float resolution) {
105105
float ret = 0.0;
106106
float prec = 0.0;
107-
if (resolution < 1) {
107+
if (resolution < 1 && resolution > 0) {
108108
prec = roundf(1 / resolution);
109109
ret = roundf(value_f * prec);
110110
ret = ret / prec;
111-
} else {
111+
} else if (resolution > 0) {
112112
ret = roundf(value_f / resolution);
113113
ret = ret * resolution;
114-
}
115-
return ret;
116-
}
117-
118-
/**
119-
* @brief snprintf with resolution / precision
120-
* @param value_c - Value
121-
* @param value_c_len - Value Len
122-
* @param resolution - Resolution
123-
* @param value_f - Real Value
124-
* @return rounded value
125-
*/
126-
int snprintf_res(char *value_c, int value_c_len, float resolution, float value_f) {
127-
int ret = 0;
128-
int prec = 0;
129-
if (resolution < 1) {
130-
prec = (int)log10((double)roundf(1 / resolution));
131-
ret = snprintf(value_c, value_c_len, "%.*f", prec, (double)value_f);
132114
} else {
133-
ret = snprintf(value_c, value_c_len, "%i", (int)value_f);
115+
ret = value_f;
134116
}
135117
return ret;
136118
}

apps/server-uci/bacnet/basic/object/analog.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,6 @@ int bacnet_array_encode_analog(
121121
BACNET_STACK_EXPORT
122122
float limit_value_by_resolution(float value_f, float resolution);
123123
BACNET_STACK_EXPORT
124-
int snprintf_res(char *value_c, int value_c_len, float resolution, float value_f);
125-
BACNET_STACK_EXPORT
126124
bool Analog_Object_Name(
127125
const struct object_data *pObject, BACNET_CHARACTER_STRING *object_name);
128126
BACNET_STACK_EXPORT

apps/server-uci/bacnet/basic/object/ao.c

Lines changed: 21 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -633,8 +633,6 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
633633
int idx_c_len = 0;
634634
float value_f = 0.0;
635635
float resolution = 0.1f;
636-
char *value_c = NULL;
637-
int value_c_len = 0;
638636

639637
struct object_data *pObject;
640638
/* Valid data? */
@@ -678,12 +676,9 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
678676
value.type.Real, wp_data->priority,
679677
&wp_data->error_class, &wp_data->error_code)) {
680678
value_f = Analog_Present_Value(pObject);
681-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
682-
value_c = malloc(value_c_len + 1);
683-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
684-
ucix_add_option(ctxw, sec, idx_c, "value", value_c);
679+
ucix_add_option_float(ctxw, sec, idx_c, "value",
680+
value_f, resolution);
685681
ucix_commit(ctxw,sec);
686-
free(value_c);
687682
}
688683
} else {
689684
status = write_property_type_valid(wp_data, &value,
@@ -693,12 +688,9 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
693688
pObject, wp_data->priority,
694689
&wp_data->error_class, &wp_data->error_code)) {
695690
value_f = Analog_Present_Value(pObject);
696-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
697-
value_c = malloc(value_c_len + 1);
698-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
699-
ucix_add_option(ctxw, sec, idx_c, "value", value_c);
691+
ucix_add_option_float(ctxw, sec, idx_c, "value",
692+
value_f, resolution);
700693
ucix_commit(ctxw,sec);
701-
free(value_c);
702694
}
703695
}
704696
}
@@ -727,13 +719,9 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
727719
if (status) {
728720
Analog_COV_Increment_Set(pObject,
729721
value.type.Real);
730-
value_f = pObject->COV_Increment;
731-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
732-
value_c = malloc(value_c_len + 1);
733-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
734-
ucix_add_option(ctxw, sec, idx_c, "cov_increment", value_c);
722+
ucix_add_option_float(ctxw, sec, idx_c, "cov_increment",
723+
pObject->COV_Increment, resolution);
735724
ucix_commit(ctxw,sec);
736-
free(value_c);
737725
}
738726
break;
739727
case PROP_OBJECT_IDENTIFIER:
@@ -746,9 +734,10 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
746734
BACNET_APPLICATION_TAG_CHARACTER_STRING);
747735
if (status) {
748736
if (Analog_Name_Set(
749-
pObject, value.type.Character_String.value, Object_Type, wp_data->object_instance)) {
737+
pObject, value.type.Character_String.value,
738+
Object_Type, wp_data->object_instance)) {
750739
ucix_add_option(ctxw, sec, idx_c, "name",
751-
strndup(value.type.Character_String.value,value.type.Character_String.length));
740+
characterstring_value_const(&value.type.Character_String));
752741
ucix_commit(ctxw,sec);
753742
}
754743
}
@@ -782,13 +771,9 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
782771
if (status) {
783772
if (Analog_Max_Pres_Value_Set(pObject,
784773
value.type.Real)) {
785-
value_f = pObject->Max_Pres_Value;
786-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
787-
value_c = malloc(value_c_len + 1);
788-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
789-
ucix_add_option(ctxw, sec, idx_c, "max_value", value_c);
774+
ucix_add_option_float(ctxw, sec, idx_c, "max_value",
775+
pObject->Max_Pres_Value, resolution);
790776
ucix_commit(ctxw,sec);
791-
free(value_c);
792777
}
793778
}
794779
break;
@@ -798,13 +783,9 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
798783
if (status) {
799784
if (Analog_Min_Pres_Value_Set(pObject,
800785
value.type.Real)) {
801-
value_f = pObject->Min_Pres_Value;
802-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
803-
value_c = malloc(value_c_len + 1);
804-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
805-
ucix_add_option(ctxw, sec, idx_c, "min_value", value_c);
786+
ucix_add_option_float(ctxw, sec, idx_c, "min_value",
787+
pObject->Min_Pres_Value, resolution);
806788
ucix_commit(ctxw,sec);
807-
free(value_c);
808789
}
809790
}
810791
break;
@@ -813,13 +794,9 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
813794
BACNET_APPLICATION_TAG_REAL);
814795
if (status) {
815796
pObject->Resolution = value.type.Real;
816-
value_f = pObject->Resolution;
817-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
818-
value_c = malloc(value_c_len + 1);
819-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
820-
ucix_add_option(ctxw, sec, idx_c, "resolution", value_c);
797+
ucix_add_option_float(ctxw, sec, idx_c, "resolution",
798+
pObject->Resolution, 0);
821799
ucix_commit(ctxw,sec);
822-
free(value_c);
823800
}
824801
break;
825802
case PROP_DESCRIPTION:
@@ -866,12 +843,9 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
866843
if (Analog_High_Limit_Set(pObject,
867844
value.type.Real)) {
868845
value_f = pObject->High_Limit;
869-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
870-
value_c = malloc(value_c_len + 1);
871-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
872-
ucix_add_option(ctxw, sec, idx_c, "high_limit", value_c);
846+
ucix_add_option_float(ctxw, sec, idx_c, "high_limit",
847+
pObject->High_Limit, resolution);
873848
ucix_commit(ctxw,sec);
874-
free(value_c);
875849
}
876850
}
877851
break;
@@ -881,13 +855,9 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
881855
if (status) {
882856
if (Analog_Low_Limit_Set(pObject,
883857
value.type.Real)) {
884-
value_f = pObject->Low_Limit;
885-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
886-
value_c = malloc(value_c_len + 1);
887-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
888-
ucix_add_option(ctxw, sec, idx_c, "low_limit", value_c);
858+
ucix_add_option_float(ctxw, sec, idx_c, "low_limit",
859+
pObject->Low_Limit, resolution);
889860
ucix_commit(ctxw,sec);
890-
free(value_c);
891861
}
892862
}
893863
break;
@@ -897,13 +867,9 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
897867
if (status) {
898868
if (Analog_Deadband_Set(pObject,
899869
value.type.Real)) {
900-
value_f = pObject->Deadband;
901-
value_c_len = snprintf_res(NULL, 0, resolution, value_f);
902-
value_c = malloc(value_c_len + 1);
903-
snprintf_res(value_c, value_c_len + 1, resolution, value_f);
904-
ucix_add_option(ctxw, sec, idx_c, "dead_limit", value_c);
870+
ucix_add_option_float(ctxw, sec, idx_c, "dead_limit",
871+
pObject->Deadband, resolution);
905872
ucix_commit(ctxw,sec);
906-
free(value_c);
907873
}
908874
}
909875
break;

0 commit comments

Comments
 (0)