From b6f69a6df1b8ef4e12b6800a914055a9e696b8d1 Mon Sep 17 00:00:00 2001 From: Robert Lubos Date: Tue, 20 Jul 2021 16:48:33 +0200 Subject: [PATCH] net: lwm2m: Align float handling with specification According to the specificaion, resources are not predefined to use 32 or 64 bit floating point numbers, but should rather accept any of them (as indicated by the size of the TLV in the message). This lead to issues for instance with Eclipse Leshan LWM2M server, where Leshan sent 64-bit value, while Zephyr expected 32-bit, making it impossible to write the resource. Therefore, unify the float usage to 32-bit float representation and fix the TLV parsing functions, to accept values sent as either 32 or 64 bit float. Signed-off-by: Robert Lubos --- include/net/lwm2m.h | 33 -------- subsys/net/lib/lwm2m/ipso_accelerometer.c | 12 +-- subsys/net/lib/lwm2m/ipso_buzzer.c | 16 ++-- subsys/net/lib/lwm2m/ipso_generic_sensor.c | 12 +-- subsys/net/lib/lwm2m/ipso_humidity_sensor.c | 12 +-- subsys/net/lib/lwm2m/ipso_light_control.c | 4 +- subsys/net/lib/lwm2m/ipso_onoff_switch.c | 2 +- subsys/net/lib/lwm2m/ipso_pressure_sensor.c | 14 ++-- subsys/net/lib/lwm2m/ipso_push_button.c | 2 +- subsys/net/lib/lwm2m/ipso_temp_sensor.c | 12 +-- subsys/net/lib/lwm2m/ipso_timer.c | 24 +++--- subsys/net/lib/lwm2m/lwm2m_engine.c | 43 +--------- subsys/net/lib/lwm2m/lwm2m_obj_location.c | 10 +-- subsys/net/lib/lwm2m/lwm2m_object.h | 23 +----- subsys/net/lib/lwm2m/lwm2m_rw_json.c | 29 ------- subsys/net/lib/lwm2m/lwm2m_rw_oma_tlv.c | 90 +++------------------ subsys/net/lib/lwm2m/lwm2m_rw_plain_text.c | 35 -------- subsys/net/lib/lwm2m/lwm2m_rw_plain_text.h | 3 - subsys/net/lib/lwm2m/lwm2m_util.c | 36 ++++----- subsys/net/lib/lwm2m/lwm2m_util.h | 4 +- 20 files changed, 99 insertions(+), 317 deletions(-) diff --git a/include/net/lwm2m.h b/include/net/lwm2m.h index 6a636d6b5b0..9f21b16ef09 100644 --- a/include/net/lwm2m.h +++ b/include/net/lwm2m.h @@ -378,19 +378,6 @@ typedef struct float32_value { int32_t val2; } float32_value_t; -/** - * @brief Maximum precision value for 64-bit LwM2M float val2 - */ -#define LWM2M_FLOAT64_DEC_MAX 1000000000LL - -/** - * @brief 32-bit variant of the LwM2M float structure - */ -typedef struct float64_value { - int64_t val1; - int64_t val2; -} float64_value_t; - /** * @brief Maximum value for ObjLnk resource fields */ @@ -579,16 +566,6 @@ int lwm2m_engine_set_bool(char *pathstr, bool value); */ int lwm2m_engine_set_float32(char *pathstr, float32_value_t *value); -/** - * @brief Set resource (instance) value (64-bit float structure) - * - * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)" - * @param[in] value 64-bit float value - * - * @return 0 for success or negative in case of error. - */ -int lwm2m_engine_set_float64(char *pathstr, float64_value_t *value); - /** * @brief Set resource (instance) value (ObjLnk) * @@ -721,16 +698,6 @@ int lwm2m_engine_get_bool(char *pathstr, bool *value); */ int lwm2m_engine_get_float32(char *pathstr, float32_value_t *buf); -/** - * @brief Get resource (instance) value (64-bit float structure) - * - * @param[in] pathstr LwM2M path string "obj/obj-inst/res(/res-inst)" - * @param[out] buf 64-bit float buffer to copy data into - * - * @return 0 for success or negative in case of error. - */ -int lwm2m_engine_get_float64(char *pathstr, float64_value_t *buf); - /** * @brief Get resource (instance) value (ObjLnk) * diff --git a/subsys/net/lib/lwm2m/ipso_accelerometer.c b/subsys/net/lib/lwm2m/ipso_accelerometer.c index 3e8c1281cb9..bd509cdf4d0 100644 --- a/subsys/net/lib/lwm2m/ipso_accelerometer.c +++ b/subsys/net/lib/lwm2m/ipso_accelerometer.c @@ -53,16 +53,16 @@ static struct ipso_accel_data accel_data[MAX_INSTANCE_COUNT]; static struct lwm2m_engine_obj accel; static struct lwm2m_engine_obj_field fields[] = { - OBJ_FIELD_DATA(X_VALUE_RID, R, FLOAT32), - OBJ_FIELD_DATA(Y_VALUE_RID, R_OPT, FLOAT32), - OBJ_FIELD_DATA(Z_VALUE_RID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(X_VALUE_RID, R, FLOAT), + OBJ_FIELD_DATA(Y_VALUE_RID, R_OPT, FLOAT), + OBJ_FIELD_DATA(Z_VALUE_RID, R_OPT, FLOAT), OBJ_FIELD_DATA(SENSOR_UNITS_RID, R_OPT, STRING), - OBJ_FIELD_DATA(MIN_RANGE_VALUE_RID, R_OPT, FLOAT32), - OBJ_FIELD_DATA(MAX_RANGE_VALUE_RID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(MIN_RANGE_VALUE_RID, R_OPT, FLOAT), + OBJ_FIELD_DATA(MAX_RANGE_VALUE_RID, R_OPT, FLOAT), #if defined(CONFIG_LWM2M_IPSO_ACCELEROMETER_VERSION_1_1) OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), OBJ_FIELD_DATA(TIMESTAMP_RID, R_OPT, TIME), - OBJ_FIELD_DATA(FRACTIONAL_TIMESTAMP_RID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(FRACTIONAL_TIMESTAMP_RID, R_OPT, FLOAT), OBJ_FIELD_DATA(MEASUREMENT_QUALITY_INDICATOR_RID, R_OPT, U8), OBJ_FIELD_DATA(MEASUREMENT_QUALITY_LEVEL_RID, R_OPT, U8), #endif diff --git a/subsys/net/lib/lwm2m/ipso_buzzer.c b/subsys/net/lib/lwm2m/ipso_buzzer.c index 6c6b337f4ba..21026bb3df7 100644 --- a/subsys/net/lib/lwm2m/ipso_buzzer.c +++ b/subsys/net/lib/lwm2m/ipso_buzzer.c @@ -44,8 +44,8 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); /* resource state */ struct ipso_buzzer_data { float32_value_t level; - float64_value_t delay_duration; - float64_value_t min_off_time; + float32_value_t delay_duration; + float32_value_t min_off_time; uint64_t trigger_offset; @@ -61,9 +61,9 @@ static struct ipso_buzzer_data buzzer_data[MAX_INSTANCE_COUNT]; static struct lwm2m_engine_obj buzzer; static struct lwm2m_engine_obj_field fields[] = { OBJ_FIELD_DATA(ON_OFF_RID, RW, BOOL), - OBJ_FIELD_DATA(LEVEL_RID, RW_OPT, FLOAT32), - OBJ_FIELD_DATA(DELAY_DURATION_RID, RW_OPT, FLOAT64), - OBJ_FIELD_DATA(MINIMUM_OFF_TIME_RID, RW, FLOAT64), + OBJ_FIELD_DATA(LEVEL_RID, RW_OPT, FLOAT), + OBJ_FIELD_DATA(DELAY_DURATION_RID, RW_OPT, FLOAT), + OBJ_FIELD_DATA(MINIMUM_OFF_TIME_RID, RW, FLOAT), OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), /* This field is actually not in the spec, so nothing sets it except * here users can listen for post_write events to it for buzzer on/off @@ -72,7 +72,7 @@ static struct lwm2m_engine_obj_field fields[] = { OBJ_FIELD_DATA(DIGITAL_INPUT_STATE_RID, R, BOOL), #if defined(CONFIG_LWM2M_IPSO_BUZZER_VERSION_1_1) OBJ_FIELD_DATA(TIMESTAMP_RID, R_OPT, TIME), - OBJ_FIELD_DATA(FRACTIONAL_TIMESTAMP_RID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(FRACTIONAL_TIMESTAMP_RID, R_OPT, FLOAT), #endif }; @@ -81,10 +81,10 @@ static struct lwm2m_engine_res res[MAX_INSTANCE_COUNT][BUZZER_MAX_ID]; static struct lwm2m_engine_res_inst res_inst[MAX_INSTANCE_COUNT][RESOURCE_INSTANCE_COUNT]; -static int float2ms(float64_value_t *f, uint32_t *ms) +static int float2ms(float32_value_t *f, uint32_t *ms) { *ms = f->val1 * MSEC_PER_SEC; - *ms += f->val2 / (LWM2M_FLOAT64_DEC_MAX / MSEC_PER_SEC); + *ms += f->val2 / (LWM2M_FLOAT32_DEC_MAX / MSEC_PER_SEC); return 0; } diff --git a/subsys/net/lib/lwm2m/ipso_generic_sensor.c b/subsys/net/lib/lwm2m/ipso_generic_sensor.c index 86fb7da3877..96cd6fae30c 100644 --- a/subsys/net/lib/lwm2m/ipso_generic_sensor.c +++ b/subsys/net/lib/lwm2m/ipso_generic_sensor.c @@ -67,18 +67,18 @@ static char sensor_type[MAX_INSTANCE_COUNT][SENSOR_TYPE_STR_MAX_SIZE]; static struct lwm2m_engine_obj sensor; static struct lwm2m_engine_obj_field fields[] = { - OBJ_FIELD_DATA(SENSOR_VALUE_RID, R, FLOAT32), + OBJ_FIELD_DATA(SENSOR_VALUE_RID, R, FLOAT), OBJ_FIELD_DATA(SENSOR_UNITS_RID, R_OPT, STRING), - OBJ_FIELD_DATA(MIN_MEASURED_VALUE_RID, R_OPT, FLOAT32), - OBJ_FIELD_DATA(MAX_MEASURED_VALUE_RID, R_OPT, FLOAT32), - OBJ_FIELD_DATA(MIN_RANGE_VALUE_RID, R_OPT, FLOAT32), - OBJ_FIELD_DATA(MAX_RANGE_VALUE_RID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(MIN_MEASURED_VALUE_RID, R_OPT, FLOAT), + OBJ_FIELD_DATA(MAX_MEASURED_VALUE_RID, R_OPT, FLOAT), + OBJ_FIELD_DATA(MIN_RANGE_VALUE_RID, R_OPT, FLOAT), + OBJ_FIELD_DATA(MAX_RANGE_VALUE_RID, R_OPT, FLOAT), OBJ_FIELD_EXECUTE_OPT(RESET_MIN_MAX_MEASURED_VALUES_RID), OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), OBJ_FIELD_DATA(SENSOR_TYPE_RID, R_OPT, STRING), #if defined(CONFIG_LWM2M_IPSO_GENERIC_SENSOR_VERSION_1_1) OBJ_FIELD_DATA(TIMESTAMP_RID, R_OPT, TIME), - OBJ_FIELD_DATA(FRACTIONAL_TIMESTAMP_RID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(FRACTIONAL_TIMESTAMP_RID, R_OPT, FLOAT), OBJ_FIELD_DATA(MEASUREMENT_QUALITY_INDICATOR_RID, R_OPT, U8), OBJ_FIELD_DATA(MEASUREMENT_QUALITY_LEVEL_RID, R_OPT, U8), #endif diff --git a/subsys/net/lib/lwm2m/ipso_humidity_sensor.c b/subsys/net/lib/lwm2m/ipso_humidity_sensor.c index 2ab0c6c0243..91a81500735 100644 --- a/subsys/net/lib/lwm2m/ipso_humidity_sensor.c +++ b/subsys/net/lib/lwm2m/ipso_humidity_sensor.c @@ -54,17 +54,17 @@ static float32_value_t max_range_value[MAX_INSTANCE_COUNT]; static struct lwm2m_engine_obj sensor; static struct lwm2m_engine_obj_field fields[] = { - OBJ_FIELD_DATA(SENSOR_VALUE_RID, R, FLOAT32), + OBJ_FIELD_DATA(SENSOR_VALUE_RID, R, FLOAT), OBJ_FIELD_DATA(SENSOR_UNITS_RID, R_OPT, STRING), - OBJ_FIELD_DATA(MIN_MEASURED_VALUE_RID, R_OPT, FLOAT32), - OBJ_FIELD_DATA(MAX_MEASURED_VALUE_RID, R_OPT, FLOAT32), - OBJ_FIELD_DATA(MIN_RANGE_VALUE_RID, R_OPT, FLOAT32), - OBJ_FIELD_DATA(MAX_RANGE_VALUE_RID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(MIN_MEASURED_VALUE_RID, R_OPT, FLOAT), + OBJ_FIELD_DATA(MAX_MEASURED_VALUE_RID, R_OPT, FLOAT), + OBJ_FIELD_DATA(MIN_RANGE_VALUE_RID, R_OPT, FLOAT), + OBJ_FIELD_DATA(MAX_RANGE_VALUE_RID, R_OPT, FLOAT), OBJ_FIELD_EXECUTE_OPT(RESET_MIN_MAX_MEASURED_VALUES_RID), #if defined(CONFIG_LWM2M_IPSO_HUMIDITY_SENSOR_VERSION_1_1) OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), OBJ_FIELD_DATA(TIMESTAMP_RID, R_OPT, TIME), - OBJ_FIELD_DATA(FRACTIONAL_TIMESTAMP_RID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(FRACTIONAL_TIMESTAMP_RID, R_OPT, FLOAT), OBJ_FIELD_DATA(MEASUREMENT_QUALITY_INDICATOR_RID, R_OPT, U8), OBJ_FIELD_DATA(MEASUREMENT_QUALITY_LEVEL_RID, R_OPT, U8), #endif diff --git a/subsys/net/lib/lwm2m/ipso_light_control.c b/subsys/net/lib/lwm2m/ipso_light_control.c index 9ef21e74b75..3a76b425a97 100644 --- a/subsys/net/lib/lwm2m/ipso_light_control.c +++ b/subsys/net/lib/lwm2m/ipso_light_control.c @@ -55,8 +55,8 @@ static struct lwm2m_engine_obj_field fields[] = { OBJ_FIELD_DATA(ON_OFF_RID, RW, BOOL), OBJ_FIELD_DATA(DIMMER_RID, RW_OPT, U8), OBJ_FIELD_DATA(ON_TIME_RID, RW_OPT, S32), - OBJ_FIELD_DATA(CUMULATIVE_ACTIVE_POWER_RID, R_OPT, FLOAT32), - OBJ_FIELD_DATA(POWER_FACTOR_RID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(CUMULATIVE_ACTIVE_POWER_RID, R_OPT, FLOAT), + OBJ_FIELD_DATA(POWER_FACTOR_RID, R_OPT, FLOAT), OBJ_FIELD_DATA(COLOUR_RID, RW_OPT, STRING), OBJ_FIELD_DATA(SENSOR_UNITS_RID, R_OPT, STRING), OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), diff --git a/subsys/net/lib/lwm2m/ipso_onoff_switch.c b/subsys/net/lib/lwm2m/ipso_onoff_switch.c index 89737422e79..1e23ef60cd4 100644 --- a/subsys/net/lib/lwm2m/ipso_onoff_switch.c +++ b/subsys/net/lib/lwm2m/ipso_onoff_switch.c @@ -62,7 +62,7 @@ static struct lwm2m_engine_obj_field fields[] = { OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), #if defined(CONFIG_LWM2M_IPSO_ONOFF_SWITCH_VERSION_1_1) OBJ_FIELD_DATA(TIMESTAMP_RID, R_OPT, TIME), - OBJ_FIELD_DATA(FRACTIONAL_TIMESTAMP_RID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(FRACTIONAL_TIMESTAMP_RID, R_OPT, FLOAT), #endif }; diff --git a/subsys/net/lib/lwm2m/ipso_pressure_sensor.c b/subsys/net/lib/lwm2m/ipso_pressure_sensor.c index b71667202bc..72b115b0b8a 100644 --- a/subsys/net/lib/lwm2m/ipso_pressure_sensor.c +++ b/subsys/net/lib/lwm2m/ipso_pressure_sensor.c @@ -54,18 +54,18 @@ static float32_value_t max_range_value[MAX_INSTANCE_COUNT]; static struct lwm2m_engine_obj sensor; static struct lwm2m_engine_obj_field fields[] = { - OBJ_FIELD_DATA(SENSOR_VALUE_RID, R, FLOAT32), + OBJ_FIELD_DATA(SENSOR_VALUE_RID, R, FLOAT), OBJ_FIELD_DATA(SENSOR_UNITS_RID, R_OPT, STRING), - OBJ_FIELD_DATA(MIN_MEASURED_VALUE_RID, R_OPT, FLOAT32), - OBJ_FIELD_DATA(MAX_MEASURED_VALUE_RID, R_OPT, FLOAT32), - OBJ_FIELD_DATA(MIN_RANGE_VALUE_RID, R_OPT, FLOAT32), - OBJ_FIELD_DATA(MAX_RANGE_VALUE_RID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(MIN_MEASURED_VALUE_RID, R_OPT, FLOAT), + OBJ_FIELD_DATA(MAX_MEASURED_VALUE_RID, R_OPT, FLOAT), + OBJ_FIELD_DATA(MIN_RANGE_VALUE_RID, R_OPT, FLOAT), + OBJ_FIELD_DATA(MAX_RANGE_VALUE_RID, R_OPT, FLOAT), OBJ_FIELD_EXECUTE_OPT(RESET_MIN_MAX_MEASURED_VALUES_RID), - OBJ_FIELD_DATA(CURRENT_CALIBRATION_RID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(CURRENT_CALIBRATION_RID, R_OPT, FLOAT), OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), #if defined(CONFIG_LWM2M_IPSO_PRESSURE_SENSOR_VERSION_1_1) OBJ_FIELD_DATA(TIMESTAMP_RID, R_OPT, TIME), - OBJ_FIELD_DATA(FRACTIONAL_TIMESTAMP_RID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(FRACTIONAL_TIMESTAMP_RID, R_OPT, FLOAT), OBJ_FIELD_DATA(MEASUREMENT_QUALITY_INDICATOR_RID, R_OPT, U8), OBJ_FIELD_DATA(MEASUREMENT_QUALITY_LEVEL_RID, R_OPT, U8), #endif diff --git a/subsys/net/lib/lwm2m/ipso_push_button.c b/subsys/net/lib/lwm2m/ipso_push_button.c index c0092f44476..c1224c7ab0b 100644 --- a/subsys/net/lib/lwm2m/ipso_push_button.c +++ b/subsys/net/lib/lwm2m/ipso_push_button.c @@ -57,7 +57,7 @@ static struct lwm2m_engine_obj_field fields[] = { OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), #if defined(CONFIG_LWM2M_IPSO_PUSH_BUTTON_VERSION_1_1) OBJ_FIELD_DATA(TIMESTAMP_RID, R_OPT, TIME), - OBJ_FIELD_DATA(FRACTIONAL_TIMESTAMP_RID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(FRACTIONAL_TIMESTAMP_RID, R_OPT, FLOAT), #endif }; diff --git a/subsys/net/lib/lwm2m/ipso_temp_sensor.c b/subsys/net/lib/lwm2m/ipso_temp_sensor.c index 0577482e068..7bcb65e91bf 100644 --- a/subsys/net/lib/lwm2m/ipso_temp_sensor.c +++ b/subsys/net/lib/lwm2m/ipso_temp_sensor.c @@ -55,17 +55,17 @@ static float32_value_t max_range_value[MAX_INSTANCE_COUNT]; static struct lwm2m_engine_obj temp_sensor; static struct lwm2m_engine_obj_field fields[] = { - OBJ_FIELD_DATA(SENSOR_VALUE_RID, R, FLOAT32), + OBJ_FIELD_DATA(SENSOR_VALUE_RID, R, FLOAT), OBJ_FIELD_DATA(SENSOR_UNITS_RID, R_OPT, STRING), - OBJ_FIELD_DATA(MIN_MEASURED_VALUE_RID, R_OPT, FLOAT32), - OBJ_FIELD_DATA(MAX_MEASURED_VALUE_RID, R_OPT, FLOAT32), - OBJ_FIELD_DATA(MIN_RANGE_VALUE_RID, R_OPT, FLOAT32), - OBJ_FIELD_DATA(MAX_RANGE_VALUE_RID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(MIN_MEASURED_VALUE_RID, R_OPT, FLOAT), + OBJ_FIELD_DATA(MAX_MEASURED_VALUE_RID, R_OPT, FLOAT), + OBJ_FIELD_DATA(MIN_RANGE_VALUE_RID, R_OPT, FLOAT), + OBJ_FIELD_DATA(MAX_RANGE_VALUE_RID, R_OPT, FLOAT), OBJ_FIELD_EXECUTE_OPT(RESET_MIN_MAX_MEASURED_VALUES_RID), #if defined(CONFIG_LWM2M_IPSO_TEMP_SENSOR_VERSION_1_1) OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), OBJ_FIELD_DATA(TIMESTAMP_RID, R_OPT, TIME), - OBJ_FIELD_DATA(FRACTIONAL_TIMESTAMP_RID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(FRACTIONAL_TIMESTAMP_RID, R_OPT, FLOAT), OBJ_FIELD_DATA(MEASUREMENT_QUALITY_INDICATOR_RID, R_OPT, U8), OBJ_FIELD_DATA(MEASUREMENT_QUALITY_LEVEL_RID, R_OPT, U8), #endif diff --git a/subsys/net/lib/lwm2m/ipso_timer.c b/subsys/net/lib/lwm2m/ipso_timer.c index 50d26deb048..d62f2707340 100644 --- a/subsys/net/lib/lwm2m/ipso_timer.c +++ b/subsys/net/lib/lwm2m/ipso_timer.c @@ -46,10 +46,10 @@ enum ipso_timer_mode { /* resource state */ struct ipso_timer_data { - float64_value_t delay_duration; - float64_value_t remaining_time; - float64_value_t min_off_time; - float64_value_t cumulative_time; + float32_value_t delay_duration; + float32_value_t remaining_time; + float32_value_t min_off_time; + float32_value_t cumulative_time; uint64_t trigger_offset; uint32_t trigger_counter; @@ -67,13 +67,13 @@ static struct ipso_timer_data timer_data[MAX_INSTANCE_COUNT]; static struct lwm2m_engine_obj timer; static struct lwm2m_engine_obj_field fields[] = { - OBJ_FIELD_DATA(DELAY_DURATION_RID, RW, FLOAT64), - OBJ_FIELD_DATA(REMAINING_TIME_RID, R_OPT, FLOAT64), - OBJ_FIELD_DATA(MINIMUM_OFF_TIME_RID, RW_OPT, FLOAT64), + OBJ_FIELD_DATA(DELAY_DURATION_RID, RW, FLOAT), + OBJ_FIELD_DATA(REMAINING_TIME_RID, R_OPT, FLOAT), + OBJ_FIELD_DATA(MINIMUM_OFF_TIME_RID, RW_OPT, FLOAT), OBJ_FIELD_EXECUTE_OPT(TRIGGER_RID), OBJ_FIELD_DATA(ON_OFF_RID, RW_OPT, BOOL), OBJ_FIELD_DATA(DIGITAL_INPUT_COUNTER_RID, RW_OPT, U32), /* TODO */ - OBJ_FIELD_DATA(CUMULATIVE_TIME_RID, RW_OPT, FLOAT64), + OBJ_FIELD_DATA(CUMULATIVE_TIME_RID, RW_OPT, FLOAT), OBJ_FIELD_DATA(DIGITAL_STATE_RID, R_OPT, BOOL), OBJ_FIELD_DATA(COUNTER_RID, R_OPT, U32), OBJ_FIELD_DATA(TIMER_MODE_RID, RW_OPT, U8), @@ -85,18 +85,18 @@ static struct lwm2m_engine_res res[MAX_INSTANCE_COUNT][TIMER_MAX_ID]; static struct lwm2m_engine_res_inst res_inst[MAX_INSTANCE_COUNT][RESOURCE_INSTANCE_COUNT]; -static int ms2float(uint32_t ms, float64_value_t *f) +static int ms2float(uint32_t ms, float32_value_t *f) { f->val1 = ms / MSEC_PER_SEC; - f->val2 = (ms % MSEC_PER_SEC) * (LWM2M_FLOAT64_DEC_MAX / MSEC_PER_SEC); + f->val2 = (ms % MSEC_PER_SEC) * (LWM2M_FLOAT32_DEC_MAX / MSEC_PER_SEC); return 0; } -static int float2ms(float64_value_t *f, uint32_t *ms) +static int float2ms(float32_value_t *f, uint32_t *ms) { *ms = f->val1 * MSEC_PER_SEC; - *ms += f->val2 / (LWM2M_FLOAT64_DEC_MAX / MSEC_PER_SEC); + *ms += f->val2 / (LWM2M_FLOAT32_DEC_MAX / MSEC_PER_SEC); return 0; } diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.c b/subsys/net/lib/lwm2m/lwm2m_engine.c index 7640c681ced..3de2aca8a77 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.c +++ b/subsys/net/lib/lwm2m/lwm2m_engine.c @@ -1638,20 +1638,13 @@ static int lwm2m_engine_set(char *pathstr, void *value, uint16_t len) *((bool *)data_ptr) = *(bool *)value; break; - case LWM2M_RES_TYPE_FLOAT32: + case LWM2M_RES_TYPE_FLOAT: ((float32_value_t *)data_ptr)->val1 = ((float32_value_t *)value)->val1; ((float32_value_t *)data_ptr)->val2 = ((float32_value_t *)value)->val2; break; - case LWM2M_RES_TYPE_FLOAT64: - ((float64_value_t *)data_ptr)->val1 = - ((float64_value_t *)value)->val1; - ((float64_value_t *)data_ptr)->val2 = - ((float64_value_t *)value)->val2; - break; - case LWM2M_RES_TYPE_OBJLNK: *((struct lwm2m_objlnk *)data_ptr) = *(struct lwm2m_objlnk *)value; @@ -1740,11 +1733,6 @@ int lwm2m_engine_set_float32(char *pathstr, float32_value_t *value) return lwm2m_engine_set(pathstr, value, sizeof(float32_value_t)); } -int lwm2m_engine_set_float64(char *pathstr, float64_value_t *value) -{ - return lwm2m_engine_set(pathstr, value, sizeof(float64_value_t)); -} - int lwm2m_engine_set_objlnk(char *pathstr, struct lwm2m_objlnk *value) { return lwm2m_engine_set(pathstr, value, sizeof(struct lwm2m_objlnk)); @@ -1884,20 +1872,13 @@ static int lwm2m_engine_get(char *pathstr, void *buf, uint16_t buflen) *(bool *)buf = *(bool *)data_ptr; break; - case LWM2M_RES_TYPE_FLOAT32: + case LWM2M_RES_TYPE_FLOAT: ((float32_value_t *)buf)->val1 = ((float32_value_t *)data_ptr)->val1; ((float32_value_t *)buf)->val2 = ((float32_value_t *)data_ptr)->val2; break; - case LWM2M_RES_TYPE_FLOAT64: - ((float64_value_t *)buf)->val1 = - ((float64_value_t *)data_ptr)->val1; - ((float64_value_t *)buf)->val2 = - ((float64_value_t *)data_ptr)->val2; - break; - case LWM2M_RES_TYPE_OBJLNK: *(struct lwm2m_objlnk *)buf = *(struct lwm2m_objlnk *)data_ptr; @@ -1982,11 +1963,6 @@ int lwm2m_engine_get_float32(char *pathstr, float32_value_t *buf) return lwm2m_engine_get(pathstr, buf, sizeof(float32_value_t)); } -int lwm2m_engine_get_float64(char *pathstr, float64_value_t *buf) -{ - return lwm2m_engine_get(pathstr, buf, sizeof(float64_value_t)); -} - int lwm2m_engine_get_objlnk(char *pathstr, struct lwm2m_objlnk *buf) { return lwm2m_engine_get(pathstr, buf, sizeof(struct lwm2m_objlnk)); @@ -2391,16 +2367,11 @@ static int lwm2m_read_handler(struct lwm2m_engine_obj_inst *obj_inst, *(bool *)data_ptr); break; - case LWM2M_RES_TYPE_FLOAT32: + case LWM2M_RES_TYPE_FLOAT: engine_put_float32fix(&msg->out, &msg->path, (float32_value_t *)data_ptr); break; - case LWM2M_RES_TYPE_FLOAT64: - engine_put_float64fix(&msg->out, &msg->path, - (float64_value_t *)data_ptr); - break; - case LWM2M_RES_TYPE_OBJLNK: engine_put_objlnk(&msg->out, &msg->path, (struct lwm2m_objlnk *)data_ptr); @@ -2665,18 +2636,12 @@ int lwm2m_write_handler(struct lwm2m_engine_obj_inst *obj_inst, len = 1; break; - case LWM2M_RES_TYPE_FLOAT32: + case LWM2M_RES_TYPE_FLOAT: engine_get_float32fix(&msg->in, (float32_value_t *)write_buf); len = sizeof(float32_value_t); break; - case LWM2M_RES_TYPE_FLOAT64: - engine_get_float64fix(&msg->in, - (float64_value_t *)write_buf); - len = sizeof(float64_value_t); - break; - case LWM2M_RES_TYPE_OBJLNK: engine_get_objlnk(&msg->in, (struct lwm2m_objlnk *)write_buf); diff --git a/subsys/net/lib/lwm2m/lwm2m_obj_location.c b/subsys/net/lib/lwm2m/lwm2m_obj_location.c index 848a94b5cc3..c682f28386e 100644 --- a/subsys/net/lib/lwm2m/lwm2m_obj_location.c +++ b/subsys/net/lib/lwm2m/lwm2m_obj_location.c @@ -46,13 +46,13 @@ static int32_t timestamp; static struct lwm2m_engine_obj location; static struct lwm2m_engine_obj_field fields[] = { - OBJ_FIELD_DATA(LOCATION_LATITUDE_ID, R, FLOAT32), - OBJ_FIELD_DATA(LOCATION_LONGITUDE_ID, R, FLOAT32), - OBJ_FIELD_DATA(LOCATION_ALTITUDE_ID, R_OPT, FLOAT32), - OBJ_FIELD_DATA(LOCATION_RADIUS_ID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(LOCATION_LATITUDE_ID, R, FLOAT), + OBJ_FIELD_DATA(LOCATION_LONGITUDE_ID, R, FLOAT), + OBJ_FIELD_DATA(LOCATION_ALTITUDE_ID, R_OPT, FLOAT), + OBJ_FIELD_DATA(LOCATION_RADIUS_ID, R_OPT, FLOAT), OBJ_FIELD_DATA(LOCATION_VELOCITY_ID, R_OPT, OPAQUE), OBJ_FIELD_DATA(LOCATION_TIMESTAMP_ID, R, TIME), - OBJ_FIELD_DATA(LOCATION_SPEED_ID, R_OPT, FLOAT32), + OBJ_FIELD_DATA(LOCATION_SPEED_ID, R_OPT, FLOAT), }; static struct lwm2m_engine_obj_inst inst; diff --git a/subsys/net/lib/lwm2m/lwm2m_object.h b/subsys/net/lib/lwm2m/lwm2m_object.h index b8db79c51cc..67eb5b62da6 100644 --- a/subsys/net/lib/lwm2m/lwm2m_object.h +++ b/subsys/net/lib/lwm2m/lwm2m_object.h @@ -121,9 +121,8 @@ #define LWM2M_RES_TYPE_S8 9 #define LWM2M_RES_TYPE_BOOL 10 #define LWM2M_RES_TYPE_TIME 11 -#define LWM2M_RES_TYPE_FLOAT32 12 -#define LWM2M_RES_TYPE_FLOAT64 13 -#define LWM2M_RES_TYPE_OBJLNK 14 +#define LWM2M_RES_TYPE_FLOAT 12 +#define LWM2M_RES_TYPE_OBJLNK 13 /* remember that we have already output a value - can be between two block's */ #define WRITER_OUTPUT_VALUE 1 @@ -516,9 +515,6 @@ struct lwm2m_writer { size_t (*put_float32fix)(struct lwm2m_output_context *out, struct lwm2m_obj_path *path, float32_value_t *value); - size_t (*put_float64fix)(struct lwm2m_output_context *out, - struct lwm2m_obj_path *path, - float64_value_t *value); size_t (*put_bool)(struct lwm2m_output_context *out, struct lwm2m_obj_path *path, bool value); @@ -541,8 +537,6 @@ struct lwm2m_reader { uint8_t *buf, size_t buflen); size_t (*get_float32fix)(struct lwm2m_input_context *in, float32_value_t *value); - size_t (*get_float64fix)(struct lwm2m_input_context *in, - float64_value_t *value); size_t (*get_bool)(struct lwm2m_input_context *in, bool *value); size_t (*get_opaque)(struct lwm2m_input_context *in, @@ -713,13 +707,6 @@ static inline size_t engine_put_float32fix(struct lwm2m_output_context *out, return out->writer->put_float32fix(out, path, value); } -static inline size_t engine_put_float64fix(struct lwm2m_output_context *out, - struct lwm2m_obj_path *path, - float64_value_t *value) -{ - return out->writer->put_float64fix(out, path, value); -} - static inline size_t engine_put_bool(struct lwm2m_output_context *out, struct lwm2m_obj_path *path, bool value) @@ -779,12 +766,6 @@ static inline size_t engine_get_float32fix(struct lwm2m_input_context *in, return in->reader->get_float32fix(in, value); } -static inline size_t engine_get_float64fix(struct lwm2m_input_context *in, - float64_value_t *value) -{ - return in->reader->get_float64fix(in, value); -} - static inline size_t engine_get_bool(struct lwm2m_input_context *in, bool *value) { diff --git a/subsys/net/lib/lwm2m/lwm2m_rw_json.c b/subsys/net/lib/lwm2m/lwm2m_rw_json.c index 4ea9c625af7..5b56b5f6b25 100644 --- a/subsys/net/lib/lwm2m/lwm2m_rw_json.c +++ b/subsys/net/lib/lwm2m/lwm2m_rw_json.c @@ -502,18 +502,6 @@ static size_t put_float32fix(struct lwm2m_output_context *out, return len; } -static size_t put_float64fix(struct lwm2m_output_context *out, - struct lwm2m_obj_path *path, - float64_value_t *value) -{ - size_t len; - - len = put_json_prefix(out, path, "\"v\""); - len += plain_text_put_float64fix(out, path, value); - len += put_json_postfix(out); - return len; -} - static size_t put_bool(struct lwm2m_output_context *out, struct lwm2m_obj_path *path, bool value) @@ -648,21 +636,6 @@ static size_t get_float32fix(struct lwm2m_input_context *in, return len; } -static size_t get_float64fix(struct lwm2m_input_context *in, - float64_value_t *value) -{ - int64_t tmp1, tmp2; - size_t len; - - len = read_number(in, &tmp1, &tmp2, true, true); - if (len > 0) { - value->val1 = tmp1; - value->val2 = tmp2; - } - - return len; -} - static size_t get_bool(struct lwm2m_input_context *in, bool *value) { struct json_in_formatter_data *fd; @@ -734,7 +707,6 @@ const struct lwm2m_writer json_writer = { .put_s64 = put_s64, .put_string = put_string, .put_float32fix = put_float32fix, - .put_float64fix = put_float64fix, .put_bool = put_bool, .put_objlnk = put_objlnk, }; @@ -744,7 +716,6 @@ const struct lwm2m_reader json_reader = { .get_s64 = get_s64, .get_string = get_string, .get_float32fix = get_float32fix, - .get_float64fix = get_float64fix, .get_bool = get_bool, .get_opaque = get_opaque, .get_objlnk = get_objlnk, diff --git a/subsys/net/lib/lwm2m/lwm2m_rw_oma_tlv.c b/subsys/net/lib/lwm2m/lwm2m_rw_oma_tlv.c index 3326c3266d2..2639dddc7cb 100644 --- a/subsys/net/lib/lwm2m/lwm2m_rw_oma_tlv.c +++ b/subsys/net/lib/lwm2m/lwm2m_rw_oma_tlv.c @@ -537,33 +537,6 @@ static size_t put_float32fix(struct lwm2m_output_context *out, return len; } -static size_t put_float64fix(struct lwm2m_output_context *out, - struct lwm2m_obj_path *path, - float64_value_t *value) -{ - struct tlv_out_formatter_data *fd; - size_t len; - struct oma_tlv tlv; - uint8_t b64[8]; - int ret; - - fd = engine_get_out_user_data(out); - if (!fd) { - return 0; - } - - ret = lwm2m_f64_to_b64(value, b64, sizeof(b64)); - if (ret < 0) { - LOG_ERR("float64 conversion error: %d", ret); - return 0; - } - - tlv_setup(&tlv, tlv_calc_type(fd->writer_flags), - tlv_calc_id(fd->writer_flags, path), sizeof(b64)); - len = oma_tlv_put(&tlv, out, b64, false); - return len; -} - static size_t put_bool(struct lwm2m_output_context *out, struct lwm2m_obj_path *path, bool value) { @@ -679,16 +652,16 @@ static size_t get_float32fix(struct lwm2m_input_context *in, { struct oma_tlv tlv; size_t size = oma_tlv_get(&tlv, in, false); - uint8_t b32[4]; + uint8_t buf[8]; int ret; if (size > 0) { - if (tlv.length != 4U) { - LOG_ERR("Invalid float32 length: %d", tlv.length); + if (tlv.length != 4U && tlv.length != 8U) { + LOG_ERR("Invalid float length: %d", tlv.length); /* dummy read */ while (tlv.length--) { - if (buf_read_u8(b32, + if (buf_read_u8(buf, CPKT_BUF_READ(in->in_cpkt), &in->offset) < 0) { break; @@ -699,56 +672,21 @@ static size_t get_float32fix(struct lwm2m_input_context *in, } /* read b32 in network byte order */ - if (buf_read(b32, tlv.length, CPKT_BUF_READ(in->in_cpkt), + if (buf_read(buf, tlv.length, CPKT_BUF_READ(in->in_cpkt), &in->offset) < 0) { /* TODO: Generate error? */ return 0; } - ret = lwm2m_b32_to_f32(b32, sizeof(b32), value); + if (tlv.length == 4U) { + ret = lwm2m_b32_to_f32(buf, 4, value); + } else { + ret = lwm2m_b64_to_f32(buf, 8, value); + } + if (ret < 0) { - LOG_ERR("binary32 conversion error: %d", ret); - return 0; - } - } - - return size; -} - -static size_t get_float64fix(struct lwm2m_input_context *in, - float64_value_t *value) -{ - struct oma_tlv tlv; - size_t size = oma_tlv_get(&tlv, in, false); - uint8_t b64[8]; - int ret; - - if (size > 0) { - if (tlv.length != 8U) { - LOG_ERR("invalid float64 length: %d", tlv.length); - - /* dummy read */ - while (tlv.length--) { - if (buf_read_u8(b64, - CPKT_BUF_READ(in->in_cpkt), - &in->offset) < 0) { - break; - } - } - - return 0; - } - - /* read b64 in network byte order */ - if (buf_read(b64, tlv.length, CPKT_BUF_READ(in->in_cpkt), - &in->offset) < 0) { - /* TODO: Generate error? */ - return 0; - } - - ret = lwm2m_b64_to_f64(b64, sizeof(b64), value); - if (ret < 0) { - LOG_ERR("binary64 conversion error: %d", ret); + LOG_ERR("binary%s conversion error: %d", + tlv.length == 4U ? "32" : "64", ret); return 0; } } @@ -815,7 +753,6 @@ const struct lwm2m_writer oma_tlv_writer = { .put_s64 = put_s64, .put_string = put_string, .put_float32fix = put_float32fix, - .put_float64fix = put_float64fix, .put_bool = put_bool, .put_opaque = put_opaque, .put_objlnk = put_objlnk, @@ -826,7 +763,6 @@ const struct lwm2m_reader oma_tlv_reader = { .get_s64 = get_s64, .get_string = get_string, .get_float32fix = get_float32fix, - .get_float64fix = get_float64fix, .get_bool = get_bool, .get_opaque = get_opaque, .get_objlnk = get_objlnk, diff --git a/subsys/net/lib/lwm2m/lwm2m_rw_plain_text.c b/subsys/net/lib/lwm2m/lwm2m_rw_plain_text.c index 23aeff14712..af19e16c3af 100644 --- a/subsys/net/lib/lwm2m/lwm2m_rw_plain_text.c +++ b/subsys/net/lib/lwm2m/lwm2m_rw_plain_text.c @@ -146,32 +146,6 @@ size_t plain_text_put_float32fix(struct lwm2m_output_context *out, value->val1, buf); } -size_t plain_text_put_float64fix(struct lwm2m_output_context *out, - struct lwm2m_obj_path *path, - float64_value_t *value) -{ - size_t len; - char buf[sizeof("000000000")]; - - /* value of 123 -> "000000123" -- ignore sign */ - len = snprintf(buf, sizeof(buf), "%09lld", - (long long int)abs(value->val2)); - if (len != 9U) { - strcpy(buf, "0"); - } else { - /* clear ending zeroes, but leave 1 if needed */ - while (len > 1U && buf[len - 1] == '0') { - buf[--len] = '\0'; - } - } - - return plain_text_put_format(out, "%s%lld.%s", - /* handle negative val2 when val1 is 0 */ - (value->val1 == 0 && value->val2 < 0) ? - "-" : "", - value->val1, buf); -} - static size_t put_string(struct lwm2m_output_context *out, struct lwm2m_obj_path *path, char *buf, size_t buflen) @@ -304,13 +278,6 @@ static size_t get_float32fix(struct lwm2m_input_context *in, return len; } -static size_t get_float64fix(struct lwm2m_input_context *in, - float64_value_t *value) -{ - return plain_text_read_number(in, &value->val1, &value->val2, - true, true); -} - static size_t get_bool(struct lwm2m_input_context *in, bool *value) { @@ -395,7 +362,6 @@ const struct lwm2m_writer plain_text_writer = { .put_s64 = put_s64, .put_string = put_string, .put_float32fix = plain_text_put_float32fix, - .put_float64fix = plain_text_put_float64fix, .put_bool = put_bool, .put_objlnk = put_objlnk, }; @@ -405,7 +371,6 @@ const struct lwm2m_reader plain_text_reader = { .get_s64 = get_s64, .get_string = get_string, .get_float32fix = get_float32fix, - .get_float64fix = get_float64fix, .get_bool = get_bool, .get_opaque = get_opaque, .get_objlnk = get_objlnk, diff --git a/subsys/net/lib/lwm2m/lwm2m_rw_plain_text.h b/subsys/net/lib/lwm2m/lwm2m_rw_plain_text.h index 6e80be9d978..6f1ec53886c 100644 --- a/subsys/net/lib/lwm2m/lwm2m_rw_plain_text.h +++ b/subsys/net/lib/lwm2m/lwm2m_rw_plain_text.h @@ -55,9 +55,6 @@ size_t plain_text_put_format(struct lwm2m_output_context *out, size_t plain_text_put_float32fix(struct lwm2m_output_context *out, struct lwm2m_obj_path *path, float32_value_t *value); -size_t plain_text_put_float64fix(struct lwm2m_output_context *out, - struct lwm2m_obj_path *path, - float64_value_t *value); int do_read_op_plain_text(struct lwm2m_message *msg, int content_format); diff --git a/subsys/net/lib/lwm2m/lwm2m_util.c b/subsys/net/lib/lwm2m/lwm2m_util.c index 87e783d28a5..a5be1f5448b 100644 --- a/subsys/net/lib/lwm2m/lwm2m_util.c +++ b/subsys/net/lib/lwm2m/lwm2m_util.c @@ -90,8 +90,8 @@ int lwm2m_f32_to_b32(float32_value_t *f32, uint8_t *b32, size_t len) return 0; } -/* convert from float64 to binary64 */ -int lwm2m_f64_to_b64(float64_value_t *f64, uint8_t *b64, size_t len) +/* convert from float32 to binary64 */ +int lwm2m_f32_to_b64(float32_value_t *f32, uint8_t *b64, size_t len) { int64_t v, f = 0; int32_t e = -1; @@ -102,13 +102,13 @@ int lwm2m_f64_to_b64(float64_value_t *f64, uint8_t *b64, size_t len) } /* handle zero value special case */ - if (f64->val1 == 0LL && f64->val2 == 0LL) { + if (f32->val1 == 0 && f32->val2 == 0) { memset(b64, 0, len); return 0; } /* sign handled later */ - v = abs(f64->val1); + v = abs(f32->val1); /* add whole value to fraction */ while (v > 0) { @@ -123,18 +123,18 @@ int lwm2m_f64_to_b64(float64_value_t *f64, uint8_t *b64, size_t len) } /* sign handled later */ - v = abs(f64->val2); + v = abs(f32->val2); /* add decimal to fraction */ i = e; while (v > 0 && i < 52) { v *= 2; - if (!f && e < 0 && v < LWM2M_FLOAT64_DEC_MAX) { + if (!f && e < 0 && v < LWM2M_FLOAT32_DEC_MAX) { /* handle -e */ e--; continue; - } else if (v >= LWM2M_FLOAT64_DEC_MAX) { - v -= LWM2M_FLOAT64_DEC_MAX; + } else if (v >= LWM2M_FLOAT32_DEC_MAX) { + v -= LWM2M_FLOAT32_DEC_MAX; f |= (int64_t)1 << (51 - i); } @@ -151,10 +151,10 @@ int lwm2m_f64_to_b64(float64_value_t *f64, uint8_t *b64, size_t len) memset(b64, 0, len); /* sign: bit 63 */ - if (f64->val1 == 0) { - b64[0] = f64->val2 < 0 ? 0x80 : 0; + if (f32->val1 == 0) { + b64[0] = f32->val2 < 0 ? 0x80 : 0; } else { - b64[0] = f64->val1 < 0 ? 0x80 : 0; + b64[0] = f32->val1 < 0 ? 0x80 : 0; } /* exponent: bits 62-52 */ @@ -233,8 +233,8 @@ int lwm2m_b32_to_f32(uint8_t *b32, size_t len, float32_value_t *f32) return 0; } -/* convert from binary64 to float64 */ -int lwm2m_b64_to_f64(uint8_t *b64, size_t len, float64_value_t *f64) +/* convert from binary64 to float32 */ +int lwm2m_b64_to_f32(uint8_t *b64, size_t len, float32_value_t *f32) { int64_t f, k; int i, e; @@ -244,8 +244,8 @@ int lwm2m_b64_to_f64(uint8_t *b64, size_t len, float64_value_t *f64) return -EINVAL; } - f64->val1 = 0LL; - f64->val2 = 0LL; + f32->val1 = 0LL; + f32->val2 = 0LL; /* calc sign: bit 63 */ sign = SHIFT_RIGHT(b64[0], 7, 0x1); @@ -274,11 +274,11 @@ int lwm2m_b64_to_f64(uint8_t *b64, size_t len, float64_value_t *f64) e = 52; } - f64->val1 = (f >> (52 - e)) * (sign ? -1 : 1); + f32->val1 = (f >> (52 - e)) * (sign ? -1 : 1); } /* calculate the rest of the decimal */ - k = LWM2M_FLOAT64_DEC_MAX; + k = LWM2M_FLOAT32_DEC_MAX; /* account for -e */ while (e < -1) { @@ -289,7 +289,7 @@ int lwm2m_b64_to_f64(uint8_t *b64, size_t len, float64_value_t *f64) for (i = 51 - e; i >= 0; i--) { k /= 2; if (f & ((int64_t)1 << i)) { - f64->val2 += k; + f32->val2 += k; } } diff --git a/subsys/net/lib/lwm2m/lwm2m_util.h b/subsys/net/lib/lwm2m/lwm2m_util.h index 9fbaada91a1..068597b7f40 100644 --- a/subsys/net/lib/lwm2m/lwm2m_util.h +++ b/subsys/net/lib/lwm2m/lwm2m_util.h @@ -11,10 +11,10 @@ /* convert float struct to binary format */ int lwm2m_f32_to_b32(float32_value_t *f32, uint8_t *b32, size_t len); -int lwm2m_f64_to_b64(float64_value_t *f64, uint8_t *b64, size_t len); +int lwm2m_f32_to_b64(float32_value_t *f32, uint8_t *b64, size_t len); /* convert binary format to float struct */ int lwm2m_b32_to_f32(uint8_t *b32, size_t len, float32_value_t *f32); -int lwm2m_b64_to_f64(uint8_t *b64, size_t len, float64_value_t *f64); +int lwm2m_b64_to_f32(uint8_t *b64, size_t len, float32_value_t *f32); #endif /* LWM2M_UTIL_H_ */