Skip to content

Commit 098f1c9

Browse files
mike-scottioannisg
authored andcommitted
net: lwm2m: tlv: fix float32/64 sign handling
When val1 is 0, we need to handle a negative val2 value so that we generate correct TLV value. Example: val1 = 0, val2 = -500000 is equivalent to -0.5 decimal. Currently we generate: 0.5 (losing the sign). Fixes: #16154 Signed-off-by: Michael Scott <[email protected]>
1 parent d52b584 commit 098f1c9

File tree

1 file changed

+15
-18
lines changed

1 file changed

+15
-18
lines changed

subsys/net/lib/lwm2m/lwm2m_util.c

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66

77
#include <kernel.h>
8+
#include <stdlib.h>
89
#include "lwm2m_util.h"
910

1011
#define SHIFT_LEFT(v, o, m) (((v) << (o)) & (m))
@@ -26,11 +27,8 @@ int lwm2m_f32_to_b32(float32_value_t *f32, u8_t *b32, size_t len)
2627
return 0;
2728
}
2829

29-
v = f32->val1;
3030
/* sign handled later */
31-
if (v < 0) {
32-
v = -v;
33-
}
31+
v = abs(f32->val1);
3432

3533
/* add whole value to fraction */
3634
while (v > 0) {
@@ -44,11 +42,8 @@ int lwm2m_f32_to_b32(float32_value_t *f32, u8_t *b32, size_t len)
4442
e++;
4543
}
4644

47-
v = f32->val2;
4845
/* sign handled later */
49-
if (v < 0) {
50-
v = -v;
51-
}
46+
v = abs(f32->val2);
5247

5348
/* add decimal to fraction */
5449
i = e;
@@ -76,7 +71,11 @@ int lwm2m_f32_to_b32(float32_value_t *f32, u8_t *b32, size_t len)
7671
memset(b32, 0, len);
7772

7873
/* sign: bit 31 */
79-
b32[0] = f32->val1 < 0 ? 0x80 : 0;
74+
if (f32->val1 == 0) {
75+
b32[0] = f32->val2 < 0 ? 0x80 : 0;
76+
} else {
77+
b32[0] = f32->val1 < 0 ? 0x80 : 0;
78+
}
8079

8180
/* exponent: bits 30-23 */
8281
b32[0] |= e >> 1;
@@ -108,11 +107,8 @@ int lwm2m_f64_to_b64(float64_value_t *f64, u8_t *b64, size_t len)
108107
return 0;
109108
}
110109

111-
v = f64->val1;
112110
/* sign handled later */
113-
if (v < 0) {
114-
v = -v;
115-
}
111+
v = abs(f64->val1);
116112

117113
/* add whole value to fraction */
118114
while (v > 0) {
@@ -126,11 +122,8 @@ int lwm2m_f64_to_b64(float64_value_t *f64, u8_t *b64, size_t len)
126122
e++;
127123
}
128124

129-
v = f64->val2;
130125
/* sign handled later */
131-
if (v < 0) {
132-
v = -v;
133-
}
126+
v = abs(f64->val2);
134127

135128
/* add decimal to fraction */
136129
i = e;
@@ -158,7 +151,11 @@ int lwm2m_f64_to_b64(float64_value_t *f64, u8_t *b64, size_t len)
158151
memset(b64, 0, len);
159152

160153
/* sign: bit 63 */
161-
b64[0] = f64->val1 < 0 ? 0x80 : 0;
154+
if (f64->val1 == 0) {
155+
b64[0] = f64->val2 < 0 ? 0x80 : 0;
156+
} else {
157+
b64[0] = f64->val1 < 0 ? 0x80 : 0;
158+
}
162159

163160
/* exponent: bits 62-52 */
164161
b64[0] |= (e >> 4);

0 commit comments

Comments
 (0)