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:
parent
9cdc1bb944
commit
b6f69a6df1
20 changed files with 99 additions and 317 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue