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

@ -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);