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 <robert.lubos@nordicsemi.no>
This commit is contained in:
Robert Lubos 2021-07-20 16:48:33 +02:00 committed by Christopher Friedt
commit b6f69a6df1
20 changed files with 99 additions and 317 deletions

View file

@ -378,19 +378,6 @@ typedef struct float32_value {
int32_t val2; int32_t val2;
} float32_value_t; } 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 * @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); 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) * @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); 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) * @brief Get resource (instance) value (ObjLnk)
* *

View file

@ -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 accel;
static struct lwm2m_engine_obj_field fields[] = { static struct lwm2m_engine_obj_field fields[] = {
OBJ_FIELD_DATA(X_VALUE_RID, R, FLOAT32), OBJ_FIELD_DATA(X_VALUE_RID, R, FLOAT),
OBJ_FIELD_DATA(Y_VALUE_RID, R_OPT, FLOAT32), OBJ_FIELD_DATA(Y_VALUE_RID, R_OPT, FLOAT),
OBJ_FIELD_DATA(Z_VALUE_RID, R_OPT, FLOAT32), OBJ_FIELD_DATA(Z_VALUE_RID, R_OPT, FLOAT),
OBJ_FIELD_DATA(SENSOR_UNITS_RID, R_OPT, STRING), OBJ_FIELD_DATA(SENSOR_UNITS_RID, R_OPT, STRING),
OBJ_FIELD_DATA(MIN_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, FLOAT32), OBJ_FIELD_DATA(MAX_RANGE_VALUE_RID, R_OPT, FLOAT),
#if defined(CONFIG_LWM2M_IPSO_ACCELEROMETER_VERSION_1_1) #if defined(CONFIG_LWM2M_IPSO_ACCELEROMETER_VERSION_1_1)
OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING),
OBJ_FIELD_DATA(TIMESTAMP_RID, R_OPT, TIME), 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_INDICATOR_RID, R_OPT, U8),
OBJ_FIELD_DATA(MEASUREMENT_QUALITY_LEVEL_RID, R_OPT, U8), OBJ_FIELD_DATA(MEASUREMENT_QUALITY_LEVEL_RID, R_OPT, U8),
#endif #endif

View file

@ -44,8 +44,8 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
/* resource state */ /* resource state */
struct ipso_buzzer_data { struct ipso_buzzer_data {
float32_value_t level; float32_value_t level;
float64_value_t delay_duration; float32_value_t delay_duration;
float64_value_t min_off_time; float32_value_t min_off_time;
uint64_t trigger_offset; 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 buzzer;
static struct lwm2m_engine_obj_field fields[] = { static struct lwm2m_engine_obj_field fields[] = {
OBJ_FIELD_DATA(ON_OFF_RID, RW, BOOL), OBJ_FIELD_DATA(ON_OFF_RID, RW, BOOL),
OBJ_FIELD_DATA(LEVEL_RID, RW_OPT, FLOAT32), OBJ_FIELD_DATA(LEVEL_RID, RW_OPT, FLOAT),
OBJ_FIELD_DATA(DELAY_DURATION_RID, RW_OPT, FLOAT64), OBJ_FIELD_DATA(DELAY_DURATION_RID, RW_OPT, FLOAT),
OBJ_FIELD_DATA(MINIMUM_OFF_TIME_RID, RW, FLOAT64), OBJ_FIELD_DATA(MINIMUM_OFF_TIME_RID, RW, FLOAT),
OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING),
/* This field is actually not in the spec, so nothing sets it except /* 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 * 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), OBJ_FIELD_DATA(DIGITAL_INPUT_STATE_RID, R, BOOL),
#if defined(CONFIG_LWM2M_IPSO_BUZZER_VERSION_1_1) #if defined(CONFIG_LWM2M_IPSO_BUZZER_VERSION_1_1)
OBJ_FIELD_DATA(TIMESTAMP_RID, R_OPT, TIME), 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 #endif
}; };
@ -81,10 +81,10 @@ static struct lwm2m_engine_res res[MAX_INSTANCE_COUNT][BUZZER_MAX_ID];
static struct lwm2m_engine_res_inst static struct lwm2m_engine_res_inst
res_inst[MAX_INSTANCE_COUNT][RESOURCE_INSTANCE_COUNT]; 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->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; return 0;
} }

View file

@ -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 sensor;
static struct lwm2m_engine_obj_field fields[] = { 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(SENSOR_UNITS_RID, R_OPT, STRING),
OBJ_FIELD_DATA(MIN_MEASURED_VALUE_RID, R_OPT, FLOAT32), OBJ_FIELD_DATA(MIN_MEASURED_VALUE_RID, R_OPT, FLOAT),
OBJ_FIELD_DATA(MAX_MEASURED_VALUE_RID, R_OPT, FLOAT32), OBJ_FIELD_DATA(MAX_MEASURED_VALUE_RID, R_OPT, FLOAT),
OBJ_FIELD_DATA(MIN_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, FLOAT32), OBJ_FIELD_DATA(MAX_RANGE_VALUE_RID, R_OPT, FLOAT),
OBJ_FIELD_EXECUTE_OPT(RESET_MIN_MAX_MEASURED_VALUES_RID), OBJ_FIELD_EXECUTE_OPT(RESET_MIN_MAX_MEASURED_VALUES_RID),
OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING),
OBJ_FIELD_DATA(SENSOR_TYPE_RID, R_OPT, STRING), OBJ_FIELD_DATA(SENSOR_TYPE_RID, R_OPT, STRING),
#if defined(CONFIG_LWM2M_IPSO_GENERIC_SENSOR_VERSION_1_1) #if defined(CONFIG_LWM2M_IPSO_GENERIC_SENSOR_VERSION_1_1)
OBJ_FIELD_DATA(TIMESTAMP_RID, R_OPT, TIME), 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_INDICATOR_RID, R_OPT, U8),
OBJ_FIELD_DATA(MEASUREMENT_QUALITY_LEVEL_RID, R_OPT, U8), OBJ_FIELD_DATA(MEASUREMENT_QUALITY_LEVEL_RID, R_OPT, U8),
#endif #endif

View file

@ -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 sensor;
static struct lwm2m_engine_obj_field fields[] = { 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(SENSOR_UNITS_RID, R_OPT, STRING),
OBJ_FIELD_DATA(MIN_MEASURED_VALUE_RID, R_OPT, FLOAT32), OBJ_FIELD_DATA(MIN_MEASURED_VALUE_RID, R_OPT, FLOAT),
OBJ_FIELD_DATA(MAX_MEASURED_VALUE_RID, R_OPT, FLOAT32), OBJ_FIELD_DATA(MAX_MEASURED_VALUE_RID, R_OPT, FLOAT),
OBJ_FIELD_DATA(MIN_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, FLOAT32), OBJ_FIELD_DATA(MAX_RANGE_VALUE_RID, R_OPT, FLOAT),
OBJ_FIELD_EXECUTE_OPT(RESET_MIN_MAX_MEASURED_VALUES_RID), OBJ_FIELD_EXECUTE_OPT(RESET_MIN_MAX_MEASURED_VALUES_RID),
#if defined(CONFIG_LWM2M_IPSO_HUMIDITY_SENSOR_VERSION_1_1) #if defined(CONFIG_LWM2M_IPSO_HUMIDITY_SENSOR_VERSION_1_1)
OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING),
OBJ_FIELD_DATA(TIMESTAMP_RID, R_OPT, TIME), 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_INDICATOR_RID, R_OPT, U8),
OBJ_FIELD_DATA(MEASUREMENT_QUALITY_LEVEL_RID, R_OPT, U8), OBJ_FIELD_DATA(MEASUREMENT_QUALITY_LEVEL_RID, R_OPT, U8),
#endif #endif

View file

@ -55,8 +55,8 @@ static struct lwm2m_engine_obj_field fields[] = {
OBJ_FIELD_DATA(ON_OFF_RID, RW, BOOL), OBJ_FIELD_DATA(ON_OFF_RID, RW, BOOL),
OBJ_FIELD_DATA(DIMMER_RID, RW_OPT, U8), OBJ_FIELD_DATA(DIMMER_RID, RW_OPT, U8),
OBJ_FIELD_DATA(ON_TIME_RID, RW_OPT, S32), OBJ_FIELD_DATA(ON_TIME_RID, RW_OPT, S32),
OBJ_FIELD_DATA(CUMULATIVE_ACTIVE_POWER_RID, R_OPT, FLOAT32), OBJ_FIELD_DATA(CUMULATIVE_ACTIVE_POWER_RID, R_OPT, FLOAT),
OBJ_FIELD_DATA(POWER_FACTOR_RID, R_OPT, FLOAT32), OBJ_FIELD_DATA(POWER_FACTOR_RID, R_OPT, FLOAT),
OBJ_FIELD_DATA(COLOUR_RID, RW_OPT, STRING), OBJ_FIELD_DATA(COLOUR_RID, RW_OPT, STRING),
OBJ_FIELD_DATA(SENSOR_UNITS_RID, R_OPT, STRING), OBJ_FIELD_DATA(SENSOR_UNITS_RID, R_OPT, STRING),
OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING),

View file

@ -62,7 +62,7 @@ static struct lwm2m_engine_obj_field fields[] = {
OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING),
#if defined(CONFIG_LWM2M_IPSO_ONOFF_SWITCH_VERSION_1_1) #if defined(CONFIG_LWM2M_IPSO_ONOFF_SWITCH_VERSION_1_1)
OBJ_FIELD_DATA(TIMESTAMP_RID, R_OPT, TIME), 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 #endif
}; };

View file

@ -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 sensor;
static struct lwm2m_engine_obj_field fields[] = { 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(SENSOR_UNITS_RID, R_OPT, STRING),
OBJ_FIELD_DATA(MIN_MEASURED_VALUE_RID, R_OPT, FLOAT32), OBJ_FIELD_DATA(MIN_MEASURED_VALUE_RID, R_OPT, FLOAT),
OBJ_FIELD_DATA(MAX_MEASURED_VALUE_RID, R_OPT, FLOAT32), OBJ_FIELD_DATA(MAX_MEASURED_VALUE_RID, R_OPT, FLOAT),
OBJ_FIELD_DATA(MIN_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, FLOAT32), OBJ_FIELD_DATA(MAX_RANGE_VALUE_RID, R_OPT, FLOAT),
OBJ_FIELD_EXECUTE_OPT(RESET_MIN_MAX_MEASURED_VALUES_RID), 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), OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING),
#if defined(CONFIG_LWM2M_IPSO_PRESSURE_SENSOR_VERSION_1_1) #if defined(CONFIG_LWM2M_IPSO_PRESSURE_SENSOR_VERSION_1_1)
OBJ_FIELD_DATA(TIMESTAMP_RID, R_OPT, TIME), 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_INDICATOR_RID, R_OPT, U8),
OBJ_FIELD_DATA(MEASUREMENT_QUALITY_LEVEL_RID, R_OPT, U8), OBJ_FIELD_DATA(MEASUREMENT_QUALITY_LEVEL_RID, R_OPT, U8),
#endif #endif

View file

@ -57,7 +57,7 @@ static struct lwm2m_engine_obj_field fields[] = {
OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING),
#if defined(CONFIG_LWM2M_IPSO_PUSH_BUTTON_VERSION_1_1) #if defined(CONFIG_LWM2M_IPSO_PUSH_BUTTON_VERSION_1_1)
OBJ_FIELD_DATA(TIMESTAMP_RID, R_OPT, TIME), 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 #endif
}; };

View file

@ -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 temp_sensor;
static struct lwm2m_engine_obj_field fields[] = { 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(SENSOR_UNITS_RID, R_OPT, STRING),
OBJ_FIELD_DATA(MIN_MEASURED_VALUE_RID, R_OPT, FLOAT32), OBJ_FIELD_DATA(MIN_MEASURED_VALUE_RID, R_OPT, FLOAT),
OBJ_FIELD_DATA(MAX_MEASURED_VALUE_RID, R_OPT, FLOAT32), OBJ_FIELD_DATA(MAX_MEASURED_VALUE_RID, R_OPT, FLOAT),
OBJ_FIELD_DATA(MIN_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, FLOAT32), OBJ_FIELD_DATA(MAX_RANGE_VALUE_RID, R_OPT, FLOAT),
OBJ_FIELD_EXECUTE_OPT(RESET_MIN_MAX_MEASURED_VALUES_RID), OBJ_FIELD_EXECUTE_OPT(RESET_MIN_MAX_MEASURED_VALUES_RID),
#if defined(CONFIG_LWM2M_IPSO_TEMP_SENSOR_VERSION_1_1) #if defined(CONFIG_LWM2M_IPSO_TEMP_SENSOR_VERSION_1_1)
OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING), OBJ_FIELD_DATA(APPLICATION_TYPE_RID, RW_OPT, STRING),
OBJ_FIELD_DATA(TIMESTAMP_RID, R_OPT, TIME), 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_INDICATOR_RID, R_OPT, U8),
OBJ_FIELD_DATA(MEASUREMENT_QUALITY_LEVEL_RID, R_OPT, U8), OBJ_FIELD_DATA(MEASUREMENT_QUALITY_LEVEL_RID, R_OPT, U8),
#endif #endif

View file

@ -46,10 +46,10 @@ enum ipso_timer_mode {
/* resource state */ /* resource state */
struct ipso_timer_data { struct ipso_timer_data {
float64_value_t delay_duration; float32_value_t delay_duration;
float64_value_t remaining_time; float32_value_t remaining_time;
float64_value_t min_off_time; float32_value_t min_off_time;
float64_value_t cumulative_time; float32_value_t cumulative_time;
uint64_t trigger_offset; uint64_t trigger_offset;
uint32_t trigger_counter; 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 timer;
static struct lwm2m_engine_obj_field fields[] = { static struct lwm2m_engine_obj_field fields[] = {
OBJ_FIELD_DATA(DELAY_DURATION_RID, RW, FLOAT64), OBJ_FIELD_DATA(DELAY_DURATION_RID, RW, FLOAT),
OBJ_FIELD_DATA(REMAINING_TIME_RID, R_OPT, FLOAT64), OBJ_FIELD_DATA(REMAINING_TIME_RID, R_OPT, FLOAT),
OBJ_FIELD_DATA(MINIMUM_OFF_TIME_RID, RW_OPT, FLOAT64), OBJ_FIELD_DATA(MINIMUM_OFF_TIME_RID, RW_OPT, FLOAT),
OBJ_FIELD_EXECUTE_OPT(TRIGGER_RID), OBJ_FIELD_EXECUTE_OPT(TRIGGER_RID),
OBJ_FIELD_DATA(ON_OFF_RID, RW_OPT, BOOL), OBJ_FIELD_DATA(ON_OFF_RID, RW_OPT, BOOL),
OBJ_FIELD_DATA(DIGITAL_INPUT_COUNTER_RID, RW_OPT, U32), /* TODO */ 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(DIGITAL_STATE_RID, R_OPT, BOOL),
OBJ_FIELD_DATA(COUNTER_RID, R_OPT, U32), OBJ_FIELD_DATA(COUNTER_RID, R_OPT, U32),
OBJ_FIELD_DATA(TIMER_MODE_RID, RW_OPT, U8), 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 static struct lwm2m_engine_res_inst
res_inst[MAX_INSTANCE_COUNT][RESOURCE_INSTANCE_COUNT]; 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->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; 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->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; return 0;
} }

View file

@ -1638,20 +1638,13 @@ static int lwm2m_engine_set(char *pathstr, void *value, uint16_t len)
*((bool *)data_ptr) = *(bool *)value; *((bool *)data_ptr) = *(bool *)value;
break; break;
case LWM2M_RES_TYPE_FLOAT32: case LWM2M_RES_TYPE_FLOAT:
((float32_value_t *)data_ptr)->val1 = ((float32_value_t *)data_ptr)->val1 =
((float32_value_t *)value)->val1; ((float32_value_t *)value)->val1;
((float32_value_t *)data_ptr)->val2 = ((float32_value_t *)data_ptr)->val2 =
((float32_value_t *)value)->val2; ((float32_value_t *)value)->val2;
break; 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: case LWM2M_RES_TYPE_OBJLNK:
*((struct lwm2m_objlnk *)data_ptr) = *((struct lwm2m_objlnk *)data_ptr) =
*(struct lwm2m_objlnk *)value; *(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)); 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) int lwm2m_engine_set_objlnk(char *pathstr, struct lwm2m_objlnk *value)
{ {
return lwm2m_engine_set(pathstr, value, sizeof(struct lwm2m_objlnk)); 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; *(bool *)buf = *(bool *)data_ptr;
break; break;
case LWM2M_RES_TYPE_FLOAT32: case LWM2M_RES_TYPE_FLOAT:
((float32_value_t *)buf)->val1 = ((float32_value_t *)buf)->val1 =
((float32_value_t *)data_ptr)->val1; ((float32_value_t *)data_ptr)->val1;
((float32_value_t *)buf)->val2 = ((float32_value_t *)buf)->val2 =
((float32_value_t *)data_ptr)->val2; ((float32_value_t *)data_ptr)->val2;
break; 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: case LWM2M_RES_TYPE_OBJLNK:
*(struct lwm2m_objlnk *)buf = *(struct lwm2m_objlnk *)buf =
*(struct lwm2m_objlnk *)data_ptr; *(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)); 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) int lwm2m_engine_get_objlnk(char *pathstr, struct lwm2m_objlnk *buf)
{ {
return lwm2m_engine_get(pathstr, buf, sizeof(struct lwm2m_objlnk)); 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); *(bool *)data_ptr);
break; break;
case LWM2M_RES_TYPE_FLOAT32: case LWM2M_RES_TYPE_FLOAT:
engine_put_float32fix(&msg->out, &msg->path, engine_put_float32fix(&msg->out, &msg->path,
(float32_value_t *)data_ptr); (float32_value_t *)data_ptr);
break; break;
case LWM2M_RES_TYPE_FLOAT64:
engine_put_float64fix(&msg->out, &msg->path,
(float64_value_t *)data_ptr);
break;
case LWM2M_RES_TYPE_OBJLNK: case LWM2M_RES_TYPE_OBJLNK:
engine_put_objlnk(&msg->out, &msg->path, engine_put_objlnk(&msg->out, &msg->path,
(struct lwm2m_objlnk *)data_ptr); (struct lwm2m_objlnk *)data_ptr);
@ -2665,18 +2636,12 @@ int lwm2m_write_handler(struct lwm2m_engine_obj_inst *obj_inst,
len = 1; len = 1;
break; break;
case LWM2M_RES_TYPE_FLOAT32: case LWM2M_RES_TYPE_FLOAT:
engine_get_float32fix(&msg->in, engine_get_float32fix(&msg->in,
(float32_value_t *)write_buf); (float32_value_t *)write_buf);
len = sizeof(float32_value_t); len = sizeof(float32_value_t);
break; 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: case LWM2M_RES_TYPE_OBJLNK:
engine_get_objlnk(&msg->in, engine_get_objlnk(&msg->in,
(struct lwm2m_objlnk *)write_buf); (struct lwm2m_objlnk *)write_buf);

View file

@ -46,13 +46,13 @@ static int32_t timestamp;
static struct lwm2m_engine_obj location; static struct lwm2m_engine_obj location;
static struct lwm2m_engine_obj_field fields[] = { static struct lwm2m_engine_obj_field fields[] = {
OBJ_FIELD_DATA(LOCATION_LATITUDE_ID, R, FLOAT32), OBJ_FIELD_DATA(LOCATION_LATITUDE_ID, R, FLOAT),
OBJ_FIELD_DATA(LOCATION_LONGITUDE_ID, R, FLOAT32), OBJ_FIELD_DATA(LOCATION_LONGITUDE_ID, R, FLOAT),
OBJ_FIELD_DATA(LOCATION_ALTITUDE_ID, R_OPT, FLOAT32), OBJ_FIELD_DATA(LOCATION_ALTITUDE_ID, R_OPT, FLOAT),
OBJ_FIELD_DATA(LOCATION_RADIUS_ID, R_OPT, FLOAT32), OBJ_FIELD_DATA(LOCATION_RADIUS_ID, R_OPT, FLOAT),
OBJ_FIELD_DATA(LOCATION_VELOCITY_ID, R_OPT, OPAQUE), OBJ_FIELD_DATA(LOCATION_VELOCITY_ID, R_OPT, OPAQUE),
OBJ_FIELD_DATA(LOCATION_TIMESTAMP_ID, R, TIME), 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; static struct lwm2m_engine_obj_inst inst;

View file

@ -121,9 +121,8 @@
#define LWM2M_RES_TYPE_S8 9 #define LWM2M_RES_TYPE_S8 9
#define LWM2M_RES_TYPE_BOOL 10 #define LWM2M_RES_TYPE_BOOL 10
#define LWM2M_RES_TYPE_TIME 11 #define LWM2M_RES_TYPE_TIME 11
#define LWM2M_RES_TYPE_FLOAT32 12 #define LWM2M_RES_TYPE_FLOAT 12
#define LWM2M_RES_TYPE_FLOAT64 13 #define LWM2M_RES_TYPE_OBJLNK 13
#define LWM2M_RES_TYPE_OBJLNK 14
/* remember that we have already output a value - can be between two block's */ /* remember that we have already output a value - can be between two block's */
#define WRITER_OUTPUT_VALUE 1 #define WRITER_OUTPUT_VALUE 1
@ -516,9 +515,6 @@ struct lwm2m_writer {
size_t (*put_float32fix)(struct lwm2m_output_context *out, size_t (*put_float32fix)(struct lwm2m_output_context *out,
struct lwm2m_obj_path *path, struct lwm2m_obj_path *path,
float32_value_t *value); 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, size_t (*put_bool)(struct lwm2m_output_context *out,
struct lwm2m_obj_path *path, struct lwm2m_obj_path *path,
bool value); bool value);
@ -541,8 +537,6 @@ struct lwm2m_reader {
uint8_t *buf, size_t buflen); uint8_t *buf, size_t buflen);
size_t (*get_float32fix)(struct lwm2m_input_context *in, size_t (*get_float32fix)(struct lwm2m_input_context *in,
float32_value_t *value); 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, size_t (*get_bool)(struct lwm2m_input_context *in,
bool *value); bool *value);
size_t (*get_opaque)(struct lwm2m_input_context *in, 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); 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, static inline size_t engine_put_bool(struct lwm2m_output_context *out,
struct lwm2m_obj_path *path, struct lwm2m_obj_path *path,
bool value) 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); 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, static inline size_t engine_get_bool(struct lwm2m_input_context *in,
bool *value) bool *value)
{ {

View file

@ -502,18 +502,6 @@ static size_t put_float32fix(struct lwm2m_output_context *out,
return len; 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, static size_t put_bool(struct lwm2m_output_context *out,
struct lwm2m_obj_path *path, struct lwm2m_obj_path *path,
bool value) bool value)
@ -648,21 +636,6 @@ static size_t get_float32fix(struct lwm2m_input_context *in,
return len; 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) static size_t get_bool(struct lwm2m_input_context *in, bool *value)
{ {
struct json_in_formatter_data *fd; struct json_in_formatter_data *fd;
@ -734,7 +707,6 @@ const struct lwm2m_writer json_writer = {
.put_s64 = put_s64, .put_s64 = put_s64,
.put_string = put_string, .put_string = put_string,
.put_float32fix = put_float32fix, .put_float32fix = put_float32fix,
.put_float64fix = put_float64fix,
.put_bool = put_bool, .put_bool = put_bool,
.put_objlnk = put_objlnk, .put_objlnk = put_objlnk,
}; };
@ -744,7 +716,6 @@ const struct lwm2m_reader json_reader = {
.get_s64 = get_s64, .get_s64 = get_s64,
.get_string = get_string, .get_string = get_string,
.get_float32fix = get_float32fix, .get_float32fix = get_float32fix,
.get_float64fix = get_float64fix,
.get_bool = get_bool, .get_bool = get_bool,
.get_opaque = get_opaque, .get_opaque = get_opaque,
.get_objlnk = get_objlnk, .get_objlnk = get_objlnk,

View file

@ -537,33 +537,6 @@ static size_t put_float32fix(struct lwm2m_output_context *out,
return len; 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, static size_t put_bool(struct lwm2m_output_context *out,
struct lwm2m_obj_path *path, bool value) 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; struct oma_tlv tlv;
size_t size = oma_tlv_get(&tlv, in, false); size_t size = oma_tlv_get(&tlv, in, false);
uint8_t b32[4]; uint8_t buf[8];
int ret; int ret;
if (size > 0) { if (size > 0) {
if (tlv.length != 4U) { if (tlv.length != 4U && tlv.length != 8U) {
LOG_ERR("Invalid float32 length: %d", tlv.length); LOG_ERR("Invalid float length: %d", tlv.length);
/* dummy read */ /* dummy read */
while (tlv.length--) { while (tlv.length--) {
if (buf_read_u8(b32, if (buf_read_u8(buf,
CPKT_BUF_READ(in->in_cpkt), CPKT_BUF_READ(in->in_cpkt),
&in->offset) < 0) { &in->offset) < 0) {
break; break;
@ -699,56 +672,21 @@ static size_t get_float32fix(struct lwm2m_input_context *in,
} }
/* read b32 in network byte order */ /* 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) { &in->offset) < 0) {
/* TODO: Generate error? */ /* TODO: Generate error? */
return 0; 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) { if (ret < 0) {
LOG_ERR("binary32 conversion error: %d", ret); LOG_ERR("binary%s conversion error: %d",
return 0; tlv.length == 4U ? "32" : "64", ret);
}
}
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);
return 0; return 0;
} }
} }
@ -815,7 +753,6 @@ const struct lwm2m_writer oma_tlv_writer = {
.put_s64 = put_s64, .put_s64 = put_s64,
.put_string = put_string, .put_string = put_string,
.put_float32fix = put_float32fix, .put_float32fix = put_float32fix,
.put_float64fix = put_float64fix,
.put_bool = put_bool, .put_bool = put_bool,
.put_opaque = put_opaque, .put_opaque = put_opaque,
.put_objlnk = put_objlnk, .put_objlnk = put_objlnk,
@ -826,7 +763,6 @@ const struct lwm2m_reader oma_tlv_reader = {
.get_s64 = get_s64, .get_s64 = get_s64,
.get_string = get_string, .get_string = get_string,
.get_float32fix = get_float32fix, .get_float32fix = get_float32fix,
.get_float64fix = get_float64fix,
.get_bool = get_bool, .get_bool = get_bool,
.get_opaque = get_opaque, .get_opaque = get_opaque,
.get_objlnk = get_objlnk, .get_objlnk = get_objlnk,

View file

@ -146,32 +146,6 @@ size_t plain_text_put_float32fix(struct lwm2m_output_context *out,
value->val1, buf); 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, static size_t put_string(struct lwm2m_output_context *out,
struct lwm2m_obj_path *path, struct lwm2m_obj_path *path,
char *buf, size_t buflen) char *buf, size_t buflen)
@ -304,13 +278,6 @@ static size_t get_float32fix(struct lwm2m_input_context *in,
return len; 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, static size_t get_bool(struct lwm2m_input_context *in,
bool *value) bool *value)
{ {
@ -395,7 +362,6 @@ const struct lwm2m_writer plain_text_writer = {
.put_s64 = put_s64, .put_s64 = put_s64,
.put_string = put_string, .put_string = put_string,
.put_float32fix = plain_text_put_float32fix, .put_float32fix = plain_text_put_float32fix,
.put_float64fix = plain_text_put_float64fix,
.put_bool = put_bool, .put_bool = put_bool,
.put_objlnk = put_objlnk, .put_objlnk = put_objlnk,
}; };
@ -405,7 +371,6 @@ const struct lwm2m_reader plain_text_reader = {
.get_s64 = get_s64, .get_s64 = get_s64,
.get_string = get_string, .get_string = get_string,
.get_float32fix = get_float32fix, .get_float32fix = get_float32fix,
.get_float64fix = get_float64fix,
.get_bool = get_bool, .get_bool = get_bool,
.get_opaque = get_opaque, .get_opaque = get_opaque,
.get_objlnk = get_objlnk, .get_objlnk = get_objlnk,

View file

@ -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, size_t plain_text_put_float32fix(struct lwm2m_output_context *out,
struct lwm2m_obj_path *path, struct lwm2m_obj_path *path,
float32_value_t *value); 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); int do_read_op_plain_text(struct lwm2m_message *msg, int content_format);

View file

@ -90,8 +90,8 @@ int lwm2m_f32_to_b32(float32_value_t *f32, uint8_t *b32, size_t len)
return 0; return 0;
} }
/* convert from float64 to binary64 */ /* convert from float32 to binary64 */
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)
{ {
int64_t v, f = 0; int64_t v, f = 0;
int32_t e = -1; 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 */ /* handle zero value special case */
if (f64->val1 == 0LL && f64->val2 == 0LL) { if (f32->val1 == 0 && f32->val2 == 0) {
memset(b64, 0, len); memset(b64, 0, len);
return 0; return 0;
} }
/* sign handled later */ /* sign handled later */
v = abs(f64->val1); v = abs(f32->val1);
/* add whole value to fraction */ /* add whole value to fraction */
while (v > 0) { 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 */ /* sign handled later */
v = abs(f64->val2); v = abs(f32->val2);
/* add decimal to fraction */ /* add decimal to fraction */
i = e; i = e;
while (v > 0 && i < 52) { while (v > 0 && i < 52) {
v *= 2; v *= 2;
if (!f && e < 0 && v < LWM2M_FLOAT64_DEC_MAX) { if (!f && e < 0 && v < LWM2M_FLOAT32_DEC_MAX) {
/* handle -e */ /* handle -e */
e--; e--;
continue; continue;
} else if (v >= LWM2M_FLOAT64_DEC_MAX) { } else if (v >= LWM2M_FLOAT32_DEC_MAX) {
v -= LWM2M_FLOAT64_DEC_MAX; v -= LWM2M_FLOAT32_DEC_MAX;
f |= (int64_t)1 << (51 - i); 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); memset(b64, 0, len);
/* sign: bit 63 */ /* sign: bit 63 */
if (f64->val1 == 0) { if (f32->val1 == 0) {
b64[0] = f64->val2 < 0 ? 0x80 : 0; b64[0] = f32->val2 < 0 ? 0x80 : 0;
} else { } else {
b64[0] = f64->val1 < 0 ? 0x80 : 0; b64[0] = f32->val1 < 0 ? 0x80 : 0;
} }
/* exponent: bits 62-52 */ /* 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; return 0;
} }
/* convert from binary64 to float64 */ /* convert from binary64 to float32 */
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)
{ {
int64_t f, k; int64_t f, k;
int i, e; int i, e;
@ -244,8 +244,8 @@ int lwm2m_b64_to_f64(uint8_t *b64, size_t len, float64_value_t *f64)
return -EINVAL; return -EINVAL;
} }
f64->val1 = 0LL; f32->val1 = 0LL;
f64->val2 = 0LL; f32->val2 = 0LL;
/* calc sign: bit 63 */ /* calc sign: bit 63 */
sign = SHIFT_RIGHT(b64[0], 7, 0x1); 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; e = 52;
} }
f64->val1 = (f >> (52 - e)) * (sign ? -1 : 1); f32->val1 = (f >> (52 - e)) * (sign ? -1 : 1);
} }
/* calculate the rest of the decimal */ /* calculate the rest of the decimal */
k = LWM2M_FLOAT64_DEC_MAX; k = LWM2M_FLOAT32_DEC_MAX;
/* account for -e */ /* account for -e */
while (e < -1) { 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--) { for (i = 51 - e; i >= 0; i--) {
k /= 2; k /= 2;
if (f & ((int64_t)1 << i)) { if (f & ((int64_t)1 << i)) {
f64->val2 += k; f32->val2 += k;
} }
} }

View file

@ -11,10 +11,10 @@
/* convert float struct to binary format */ /* convert float struct to binary format */
int lwm2m_f32_to_b32(float32_value_t *f32, uint8_t *b32, size_t len); 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 */ /* convert binary format to float struct */
int lwm2m_b32_to_f32(uint8_t *b32, size_t len, float32_value_t *f32); 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_ */ #endif /* LWM2M_UTIL_H_ */