net: lwm2m: LwM2M engine time API update
Updated lwm2m_enigen_set/get_time API for support time_t. Updated LwM2M engine set/get resource time to time resource support time_t and uint32_t input. LwM2M engine put and get time API update to use time_t. Time series data cache entry have own type for time resource. Signed-off-by: Juha Heiskanen <juha.heiskanen@nordicsemi.no>
This commit is contained in:
parent
e1e2228e9c
commit
4bcc880670
12 changed files with 244 additions and 38 deletions
|
@ -749,6 +749,7 @@ int lwm2m_write_handler(struct lwm2m_engine_obj_inst *obj_inst, struct lwm2m_eng
|
|||
size_t total_size = 0;
|
||||
int64_t temp64 = 0;
|
||||
int32_t temp32 = 0;
|
||||
time_t temp_time = 0;
|
||||
int ret = 0;
|
||||
bool last_block = true;
|
||||
void *write_buf;
|
||||
|
@ -821,12 +822,22 @@ int lwm2m_write_handler(struct lwm2m_engine_obj_inst *obj_inst, struct lwm2m_eng
|
|||
break;
|
||||
|
||||
case LWM2M_RES_TYPE_TIME:
|
||||
ret = engine_get_time(&msg->in, &temp64);
|
||||
ret = engine_get_time(&msg->in, &temp_time);
|
||||
if (ret < 0) {
|
||||
break;
|
||||
}
|
||||
*(uint32_t *)write_buf = temp64;
|
||||
len = 4;
|
||||
|
||||
if (write_buf_len == sizeof(time_t)) {
|
||||
*(time_t *)write_buf = temp_time;
|
||||
len = 8;
|
||||
} else if (write_buf_len == sizeof(uint32_t)) {
|
||||
*(uint32_t *)write_buf = (uint32_t)temp_time;
|
||||
len = 4;
|
||||
} else {
|
||||
LOG_ERR("Time resource buf len not supported %d", write_buf_len);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case LWM2M_RES_TYPE_U32:
|
||||
|
@ -1002,7 +1013,16 @@ static int lwm2m_read_resource_data(struct lwm2m_message *msg, void *data_ptr, s
|
|||
break;
|
||||
|
||||
case LWM2M_RES_TYPE_TIME:
|
||||
ret = engine_put_time(&msg->out, &msg->path, (int64_t) *(uint32_t *)data_ptr);
|
||||
if (data_len == sizeof(time_t)) {
|
||||
ret = engine_put_time(&msg->out, &msg->path, *(time_t *)data_ptr);
|
||||
} else if (data_len == sizeof(uint32_t)) {
|
||||
ret = engine_put_time(&msg->out, &msg->path,
|
||||
(time_t) *((uint32_t *)data_ptr));
|
||||
} else {
|
||||
LOG_ERR("Resource time length not supported %d", data_len);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case LWM2M_RES_TYPE_BOOL:
|
||||
|
@ -1083,7 +1103,7 @@ static int lwm2m_read_cached_data(struct lwm2m_message *msg,
|
|||
break;
|
||||
|
||||
case LWM2M_RES_TYPE_TIME:
|
||||
ret = engine_put_time(&msg->out, &msg->path, (int64_t)buf.u32);
|
||||
ret = engine_put_time(&msg->out, &msg->path, buf.time);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -538,7 +538,7 @@ struct lwm2m_writer {
|
|||
int (*put_s64)(struct lwm2m_output_context *out,
|
||||
struct lwm2m_obj_path *path, int64_t value);
|
||||
int (*put_time)(struct lwm2m_output_context *out,
|
||||
struct lwm2m_obj_path *path, int64_t value);
|
||||
struct lwm2m_obj_path *path, time_t value);
|
||||
int (*put_string)(struct lwm2m_output_context *out,
|
||||
struct lwm2m_obj_path *path, char *buf,
|
||||
size_t buflen);
|
||||
|
@ -559,7 +559,7 @@ struct lwm2m_writer {
|
|||
struct lwm2m_reader {
|
||||
int (*get_s32)(struct lwm2m_input_context *in, int32_t *value);
|
||||
int (*get_s64)(struct lwm2m_input_context *in, int64_t *value);
|
||||
int (*get_time)(struct lwm2m_input_context *in, int64_t *value);
|
||||
int (*get_time)(struct lwm2m_input_context *in, time_t *value);
|
||||
int (*get_string)(struct lwm2m_input_context *in, uint8_t *buf,
|
||||
size_t buflen);
|
||||
int (*get_float)(struct lwm2m_input_context *in, double *value);
|
||||
|
@ -727,7 +727,7 @@ static inline int engine_put_float(struct lwm2m_output_context *out,
|
|||
}
|
||||
|
||||
static inline int engine_put_time(struct lwm2m_output_context *out,
|
||||
struct lwm2m_obj_path *path, int64_t value)
|
||||
struct lwm2m_obj_path *path, time_t value)
|
||||
{
|
||||
return out->writer->put_time(out, path, value);
|
||||
}
|
||||
|
@ -791,7 +791,7 @@ static inline int engine_get_string(struct lwm2m_input_context *in,
|
|||
return in->reader->get_string(in, buf, buflen);
|
||||
}
|
||||
|
||||
static inline int engine_get_time(struct lwm2m_input_context *in, int64_t *value)
|
||||
static inline int engine_get_time(struct lwm2m_input_context *in, time_t *value)
|
||||
{
|
||||
return in->reader->get_time(in, value);
|
||||
}
|
||||
|
|
|
@ -65,7 +65,7 @@ sys_slist_t *lwm2m_engine_obj_inst_list(void) { return &engine_obj_inst_list; }
|
|||
|
||||
#if defined(CONFIG_LWM2M_RESOURCE_DATA_CACHE_SUPPORT)
|
||||
static void lwm2m_engine_cache_write(struct lwm2m_engine_obj_field *obj_field, const char *pathstr,
|
||||
void *value);
|
||||
const void *value, uint16_t len);
|
||||
#endif
|
||||
/* Engine object */
|
||||
|
||||
|
@ -479,6 +479,19 @@ int lwm2m_engine_set_res_data(const char *pathstr, void *data_ptr, uint16_t data
|
|||
return lwm2m_engine_set_res_buf(pathstr, data_ptr, data_len, data_len, data_flags);
|
||||
}
|
||||
|
||||
static bool lwm2m_validate_time_resource_lenghts(uint16_t resource_length, uint16_t buf_length)
|
||||
{
|
||||
if (resource_length != sizeof(time_t) && resource_length != sizeof(uint32_t)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (buf_length != sizeof(time_t) && buf_length != sizeof(uint32_t)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int lwm2m_engine_set(const char *pathstr, const void *value, uint16_t len)
|
||||
{
|
||||
struct lwm2m_obj_path path;
|
||||
|
@ -577,7 +590,6 @@ static int lwm2m_engine_set(const char *pathstr, const void *value, uint16_t len
|
|||
break;
|
||||
|
||||
case LWM2M_RES_TYPE_U32:
|
||||
case LWM2M_RES_TYPE_TIME:
|
||||
*((uint32_t *)data_ptr) = *(uint32_t *)value;
|
||||
break;
|
||||
|
||||
|
@ -589,6 +601,32 @@ static int lwm2m_engine_set(const char *pathstr, const void *value, uint16_t len
|
|||
*((uint8_t *)data_ptr) = *(uint8_t *)value;
|
||||
break;
|
||||
|
||||
case LWM2M_RES_TYPE_TIME:
|
||||
if (!lwm2m_validate_time_resource_lenghts(max_data_len, len)) {
|
||||
LOG_ERR("Time Set: buffer length %u max data len %u not supported", len,
|
||||
max_data_len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (max_data_len == sizeof(time_t)) {
|
||||
if (len == sizeof(time_t)) {
|
||||
*((time_t *)data_ptr) = *(time_t *)value;
|
||||
} else {
|
||||
*((time_t *)data_ptr) = (time_t) *((uint32_t *)value);
|
||||
}
|
||||
} else {
|
||||
LOG_WRN("Converting time to 32bit may cause integer overflow on resource "
|
||||
"%s",
|
||||
pathstr);
|
||||
if (len == sizeof(uint32_t)) {
|
||||
*((uint32_t *)data_ptr) = *(uint32_t *)value;
|
||||
} else {
|
||||
*((uint32_t *)data_ptr) = (uint32_t) *((time_t *)value);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case LWM2M_RES_TYPE_S64:
|
||||
*((int64_t *)data_ptr) = *(int64_t *)value;
|
||||
break;
|
||||
|
@ -627,7 +665,7 @@ static int lwm2m_engine_set(const char *pathstr, const void *value, uint16_t len
|
|||
|
||||
/* Cache Data Write */
|
||||
#if defined(CONFIG_LWM2M_RESOURCE_DATA_CACHE_SUPPORT)
|
||||
lwm2m_engine_cache_write(obj_field, pathstr, value);
|
||||
lwm2m_engine_cache_write(obj_field, pathstr, value, len);
|
||||
#endif
|
||||
|
||||
if (res->post_write_cb) {
|
||||
|
@ -709,6 +747,11 @@ int lwm2m_engine_set_objlnk(const char *pathstr, const struct lwm2m_objlnk *valu
|
|||
return lwm2m_engine_set(pathstr, value, sizeof(struct lwm2m_objlnk));
|
||||
}
|
||||
|
||||
int lwm2m_engine_set_time(const char *pathstr, time_t value)
|
||||
{
|
||||
return lwm2m_engine_set(pathstr, &value, sizeof(time_t));
|
||||
}
|
||||
|
||||
int lwm2m_engine_set_res_data_len(const char *pathstr, uint16_t data_len)
|
||||
{
|
||||
int ret;
|
||||
|
@ -846,9 +889,35 @@ static int lwm2m_engine_get(const char *pathstr, void *buf, uint16_t buflen)
|
|||
break;
|
||||
|
||||
case LWM2M_RES_TYPE_U32:
|
||||
case LWM2M_RES_TYPE_TIME:
|
||||
*(uint32_t *)buf = *(uint32_t *)data_ptr;
|
||||
break;
|
||||
case LWM2M_RES_TYPE_TIME:
|
||||
if (!lwm2m_validate_time_resource_lenghts(data_len, buflen)) {
|
||||
LOG_ERR("Time get buffer length %u data len %u not supported",
|
||||
buflen, data_len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (data_len == sizeof(time_t)) {
|
||||
if (buflen == sizeof(time_t)) {
|
||||
*((time_t *)buf) = *(time_t *)data_ptr;
|
||||
} else {
|
||||
/* In this case get operation may not got correct value */
|
||||
LOG_WRN("Converting time to 32bit may cause integer "
|
||||
"overflow:%s",
|
||||
pathstr);
|
||||
*((uint32_t *)buf) = (uint32_t) *((time_t *)data_ptr);
|
||||
}
|
||||
} else {
|
||||
LOG_WRN("Converting time to 32bit may cause integer overflow:%s",
|
||||
pathstr);
|
||||
if (buflen == sizeof(uint32_t)) {
|
||||
*((uint32_t *)buf) = *(uint32_t *)data_ptr;
|
||||
} else {
|
||||
*((time_t *)buf) = (time_t) *((uint32_t *)data_ptr);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case LWM2M_RES_TYPE_U16:
|
||||
*(uint16_t *)buf = *(uint16_t *)data_ptr;
|
||||
|
@ -969,6 +1038,11 @@ int lwm2m_engine_get_objlnk(const char *pathstr, struct lwm2m_objlnk *buf)
|
|||
return lwm2m_engine_get(pathstr, buf, sizeof(struct lwm2m_objlnk));
|
||||
}
|
||||
|
||||
int lwm2m_engine_get_time(const char *pathstr, time_t *buf)
|
||||
{
|
||||
return lwm2m_engine_get(pathstr, buf, sizeof(time_t));
|
||||
}
|
||||
|
||||
int lwm2m_engine_get_resource(const char *pathstr, struct lwm2m_engine_res **res)
|
||||
{
|
||||
int ret;
|
||||
|
@ -1412,7 +1486,7 @@ static struct lwm2m_time_series_resource *lwm2m_cache_entry_allocate(char const
|
|||
}
|
||||
|
||||
static void lwm2m_engine_cache_write(struct lwm2m_engine_obj_field *obj_field, const char *pathstr,
|
||||
void *value)
|
||||
const void *value, uint16_t len)
|
||||
{
|
||||
struct lwm2m_time_series_resource *cache_entry;
|
||||
struct lwm2m_time_series_elem elements;
|
||||
|
@ -1431,7 +1505,6 @@ static void lwm2m_engine_cache_write(struct lwm2m_engine_obj_field *obj_field, c
|
|||
|
||||
switch (obj_field->data_type) {
|
||||
case LWM2M_RES_TYPE_U32:
|
||||
case LWM2M_RES_TYPE_TIME:
|
||||
elements.u32 = *(uint32_t *)value;
|
||||
break;
|
||||
|
||||
|
@ -1447,6 +1520,17 @@ static void lwm2m_engine_cache_write(struct lwm2m_engine_obj_field *obj_field, c
|
|||
elements.i64 = *(int64_t *)value;
|
||||
break;
|
||||
|
||||
case LWM2M_RES_TYPE_TIME:
|
||||
if (len == sizeof(time_t)) {
|
||||
elements.time = *(time_t *)value;
|
||||
} else if (len == sizeof(uint32_t)) {
|
||||
elements.time = (time_t) *((uint32_t *)value);
|
||||
} else {
|
||||
LOG_ERR("Not supporting size %d bytes for time", len);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
case LWM2M_RES_TYPE_S32:
|
||||
elements.i32 = *(int32_t *)value;
|
||||
break;
|
||||
|
|
|
@ -31,7 +31,7 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
|
|||
|
||||
#define ICTX_CBOR_R_SZ(pos, ictx) ((size_t)pos - (size_t)(ictx)->in_cpkt->data - (ictx)->offset)
|
||||
|
||||
static int put_time(struct lwm2m_output_context *out, struct lwm2m_obj_path *path, int64_t value)
|
||||
static int put_time(struct lwm2m_output_context *out, struct lwm2m_obj_path *path, time_t value)
|
||||
{
|
||||
/* CBOR time output format is unspecified but SenML CBOR uses string format.
|
||||
* Let's stick into the same format with plain CBOR
|
||||
|
@ -43,7 +43,7 @@ static int put_time(struct lwm2m_output_context *out, struct lwm2m_obj_path *pat
|
|||
int tag_sz;
|
||||
bool ret;
|
||||
|
||||
if (gmtime_r((time_t *)&value, &dt) != &dt) {
|
||||
if (gmtime_r(&value, &dt) != &dt) {
|
||||
LOG_ERR("unable to convert from secs since Epoch to a date/time construct");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -341,13 +341,14 @@ static int get_time_numerical(struct lwm2m_input_context *in, int64_t *value)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int get_time(struct lwm2m_input_context *in, int64_t *value)
|
||||
static int get_time(struct lwm2m_input_context *in, time_t *value)
|
||||
{
|
||||
uint32_t tag;
|
||||
int tag_sz = 0;
|
||||
int data_len;
|
||||
int ret;
|
||||
bool success;
|
||||
int64_t temp64;
|
||||
|
||||
ZCBOR_STATE_D(states, 0, ICTX_BUF_R_PTR(in), ICTX_BUF_R_LEFT_SZ(in), 1);
|
||||
|
||||
|
@ -359,13 +360,13 @@ static int get_time(struct lwm2m_input_context *in, int64_t *value)
|
|||
|
||||
switch (tag) {
|
||||
case ZCBOR_TAG_TIME_NUM:
|
||||
ret = get_time_numerical(in, value);
|
||||
ret = get_time_numerical(in, &temp64);
|
||||
if (ret < 0) {
|
||||
goto error;
|
||||
}
|
||||
break;
|
||||
case ZCBOR_TAG_TIME_TSTR:
|
||||
ret = get_time_string(in, value);
|
||||
ret = get_time_string(in, &temp64);
|
||||
if (ret < 0) {
|
||||
goto error;
|
||||
}
|
||||
|
@ -377,9 +378,9 @@ static int get_time(struct lwm2m_input_context *in, int64_t *value)
|
|||
} else { /* Assumption is that tags are optional */
|
||||
|
||||
/* Let's assume numeric string but in case that fails falls go back to numerical */
|
||||
ret = get_time_string(in, value);
|
||||
ret = get_time_string(in, &temp64);
|
||||
if (ret == -EBADMSG) {
|
||||
ret = get_time_numerical(in, value);
|
||||
ret = get_time_numerical(in, &temp64);
|
||||
}
|
||||
|
||||
if (ret < 0) {
|
||||
|
@ -389,6 +390,7 @@ static int get_time(struct lwm2m_input_context *in, int64_t *value)
|
|||
|
||||
data_len = ICTX_CBOR_R_SZ(states[0].payload, in);
|
||||
in->offset += data_len;
|
||||
*value = (time_t)temp64;
|
||||
|
||||
return tag_sz + data_len;
|
||||
|
||||
|
|
|
@ -549,6 +549,11 @@ static int put_s64(struct lwm2m_output_context *out,
|
|||
return json_float_object_write(out, fd, len);
|
||||
}
|
||||
|
||||
static int put_time(struct lwm2m_output_context *out, struct lwm2m_obj_path *path, time_t value)
|
||||
{
|
||||
return put_s64(out, path, (int64_t) value);
|
||||
}
|
||||
|
||||
static int put_string(struct lwm2m_output_context *out,
|
||||
struct lwm2m_obj_path *path, char *buf, size_t buflen)
|
||||
{
|
||||
|
@ -678,6 +683,17 @@ static int get_s64(struct lwm2m_input_context *in, int64_t *value)
|
|||
return read_int(in, value, true);
|
||||
}
|
||||
|
||||
static int get_time(struct lwm2m_input_context *in, time_t *value)
|
||||
{
|
||||
int64_t temp64;
|
||||
int ret;
|
||||
|
||||
ret = read_int(in, &temp64, true);
|
||||
*value = (time_t)temp64;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int get_s32(struct lwm2m_input_context *in, int32_t *value)
|
||||
{
|
||||
int64_t tmp = 0;
|
||||
|
@ -851,7 +867,7 @@ const struct lwm2m_writer json_writer = {
|
|||
.put_s64 = put_s64,
|
||||
.put_string = put_string,
|
||||
.put_float = put_float,
|
||||
.put_time = put_s64,
|
||||
.put_time = put_time,
|
||||
.put_bool = put_bool,
|
||||
.put_objlnk = put_objlnk,
|
||||
};
|
||||
|
@ -860,7 +876,7 @@ const struct lwm2m_reader json_reader = {
|
|||
.get_s32 = get_s32,
|
||||
.get_s64 = get_s64,
|
||||
.get_string = get_string,
|
||||
.get_time = get_s64,
|
||||
.get_time = get_time,
|
||||
.get_float = get_float,
|
||||
.get_bool = get_bool,
|
||||
.get_opaque = get_opaque,
|
||||
|
|
|
@ -497,6 +497,12 @@ static int put_s64(struct lwm2m_output_context *out,
|
|||
return len;
|
||||
}
|
||||
|
||||
|
||||
static int put_time(struct lwm2m_output_context *out, struct lwm2m_obj_path *path, time_t value)
|
||||
{
|
||||
return put_s64(out, path, (int64_t)value);
|
||||
}
|
||||
|
||||
static int put_string(struct lwm2m_output_context *out,
|
||||
struct lwm2m_obj_path *path, char *buf, size_t buflen)
|
||||
{
|
||||
|
@ -624,6 +630,17 @@ static int get_s64(struct lwm2m_input_context *in, int64_t *value)
|
|||
return get_number(in, value, 8);
|
||||
}
|
||||
|
||||
static int get_time(struct lwm2m_input_context *in, time_t *value)
|
||||
{
|
||||
int64_t temp64;
|
||||
int ret;
|
||||
|
||||
ret = get_number(in, &temp64, 8);
|
||||
*value = (time_t)temp64;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int get_s32(struct lwm2m_input_context *in, int32_t *value)
|
||||
{
|
||||
int64_t temp;
|
||||
|
@ -772,7 +789,7 @@ const struct lwm2m_writer oma_tlv_writer = {
|
|||
.put_s64 = put_s64,
|
||||
.put_string = put_string,
|
||||
.put_float = put_float,
|
||||
.put_time = put_s64,
|
||||
.put_time = put_time,
|
||||
.put_bool = put_bool,
|
||||
.put_opaque = put_opaque,
|
||||
.put_objlnk = put_objlnk,
|
||||
|
@ -782,7 +799,7 @@ const struct lwm2m_reader oma_tlv_reader = {
|
|||
.get_s32 = get_s32,
|
||||
.get_s64 = get_s64,
|
||||
.get_string = get_string,
|
||||
.get_time = get_s64,
|
||||
.get_time = get_time,
|
||||
.get_float = get_float,
|
||||
.get_bool = get_bool,
|
||||
.get_opaque = get_opaque,
|
||||
|
|
|
@ -121,6 +121,12 @@ static int put_s64(struct lwm2m_output_context *out,
|
|||
return plain_text_put_format(out, "%lld", value);
|
||||
}
|
||||
|
||||
static int put_time(struct lwm2m_output_context *out,
|
||||
struct lwm2m_obj_path *path, time_t value)
|
||||
{
|
||||
return plain_text_put_format(out, "%lld", (int64_t)value);
|
||||
}
|
||||
|
||||
int plain_text_put_float(struct lwm2m_output_context *out,
|
||||
struct lwm2m_obj_path *path, double *value)
|
||||
{
|
||||
|
@ -229,6 +235,17 @@ static int get_s64(struct lwm2m_input_context *in, int64_t *value)
|
|||
return plain_text_read_int(in, value, true);
|
||||
}
|
||||
|
||||
static int get_time(struct lwm2m_input_context *in, time_t *value)
|
||||
{
|
||||
int64_t temp64;
|
||||
int ret;
|
||||
|
||||
ret = plain_text_read_int(in, &temp64, true);
|
||||
*value = (time_t)temp64;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int get_string(struct lwm2m_input_context *in, uint8_t *value,
|
||||
size_t buflen)
|
||||
{
|
||||
|
@ -403,7 +420,7 @@ const struct lwm2m_writer plain_text_writer = {
|
|||
.put_s64 = put_s64,
|
||||
.put_string = put_string,
|
||||
.put_float = plain_text_put_float,
|
||||
.put_time = put_s64,
|
||||
.put_time = put_time,
|
||||
.put_bool = put_bool,
|
||||
.put_objlnk = put_objlnk,
|
||||
};
|
||||
|
@ -412,7 +429,7 @@ const struct lwm2m_reader plain_text_reader = {
|
|||
.get_s32 = get_s32,
|
||||
.get_s64 = get_s64,
|
||||
.get_string = get_string,
|
||||
.get_time = get_s64,
|
||||
.get_time = get_time,
|
||||
.get_float = get_float,
|
||||
.get_bool = get_bool,
|
||||
.get_opaque = get_opaque,
|
||||
|
|
|
@ -385,7 +385,7 @@ static int put_s64(struct lwm2m_output_context *out, struct lwm2m_obj_path *path
|
|||
return put_value(out, path, value);
|
||||
}
|
||||
|
||||
static int put_time(struct lwm2m_output_context *out, struct lwm2m_obj_path *path, int64_t value)
|
||||
static int put_time(struct lwm2m_output_context *out, struct lwm2m_obj_path *path, time_t value)
|
||||
{
|
||||
int ret = put_name_nth_ri(out, path);
|
||||
|
||||
|
@ -397,7 +397,7 @@ static int put_time(struct lwm2m_output_context *out, struct lwm2m_obj_path *pat
|
|||
|
||||
/* Write the value */
|
||||
record->_record_union._record_union_choice = _union_vi;
|
||||
record->_record_union._union_vi = value;
|
||||
record->_record_union._union_vi = (int64_t)value;
|
||||
record->_record_union_present = 1;
|
||||
|
||||
return 0;
|
||||
|
@ -550,6 +550,17 @@ static int get_s64(struct lwm2m_input_context *in, int64_t *value)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int get_time(struct lwm2m_input_context *in, time_t *value)
|
||||
{
|
||||
int64_t temp64;
|
||||
int ret;
|
||||
|
||||
ret = get_s64(in, &temp64);
|
||||
*value = (time_t)temp64;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int get_float(struct lwm2m_input_context *in, double *value)
|
||||
{
|
||||
struct cbor_in_fmt_data *fd;
|
||||
|
@ -739,7 +750,7 @@ const struct lwm2m_writer senml_cbor_writer = {
|
|||
const struct lwm2m_reader senml_cbor_reader = {
|
||||
.get_s32 = get_s32,
|
||||
.get_s64 = get_s64,
|
||||
.get_time = get_s64,
|
||||
.get_time = get_time,
|
||||
.get_string = get_string,
|
||||
.get_float = get_float,
|
||||
.get_bool = get_bool,
|
||||
|
|
|
@ -791,6 +791,11 @@ static int put_s64(struct lwm2m_output_context *out, struct lwm2m_obj_path *path
|
|||
return json_float_object_write(out, fd, len);
|
||||
}
|
||||
|
||||
static int put_time(struct lwm2m_output_context *out, struct lwm2m_obj_path *path, time_t value)
|
||||
{
|
||||
return put_s64(out, path, (int64_t)value);
|
||||
}
|
||||
|
||||
static int put_string(struct lwm2m_output_context *out, struct lwm2m_obj_path *path, char *buf,
|
||||
size_t buflen)
|
||||
{
|
||||
|
@ -1055,6 +1060,17 @@ static int get_s64(struct lwm2m_input_context *in, int64_t *value)
|
|||
return read_int(in, value, true);
|
||||
}
|
||||
|
||||
static int get_time(struct lwm2m_input_context *in, time_t *value)
|
||||
{
|
||||
int64_t temp64;
|
||||
int ret;
|
||||
|
||||
ret = read_int(in, &temp64, true);
|
||||
*value = (time_t)temp64;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int get_s32(struct lwm2m_input_context *in, int32_t *value)
|
||||
{
|
||||
int64_t tmp = 0;
|
||||
|
@ -1357,7 +1373,7 @@ const struct lwm2m_writer senml_json_writer = {
|
|||
.put_s32 = put_s32,
|
||||
.put_s64 = put_s64,
|
||||
.put_string = put_string,
|
||||
.put_time = put_s64,
|
||||
.put_time = put_time,
|
||||
.put_float = put_float,
|
||||
.put_bool = put_bool,
|
||||
.put_opaque = put_opaque,
|
||||
|
@ -1369,7 +1385,7 @@ const struct lwm2m_reader senml_json_reader = {
|
|||
.get_s32 = get_s32,
|
||||
.get_s64 = get_s64,
|
||||
.get_string = get_string,
|
||||
.get_time = get_s64,
|
||||
.get_time = get_time,
|
||||
.get_float = get_float,
|
||||
.get_bool = get_bool,
|
||||
.get_opaque = get_opaque,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue