Skip to content

Commit c22ea45

Browse files
committed
Binary mode: Add support for importing reports
1 parent d4a4540 commit c22ea45

6 files changed

Lines changed: 173 additions & 2 deletions

File tree

include/thingset.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1822,6 +1822,25 @@ struct thingset_data_object *thingset_iterate_subsets(struct thingset_context *t
18221822
int thingset_import_data(struct thingset_context *ts, const uint8_t *data, size_t len,
18231823
uint8_t auth_flags, enum thingset_data_format format);
18241824

1825+
/**
1826+
* Import report into data objects.
1827+
*
1828+
* This function allows importing data objects from a received report.
1829+
*
1830+
* Unknown data items are silently ignored.
1831+
*
1832+
* @param ts Pointer to ThingSet context.
1833+
* @param data Buffer containing ID/value map that should be written to the data objects
1834+
* @param len Length of the data in the buffer
1835+
* @param auth_flags Authentication flags to be used in this function (to override auth_flags)
1836+
* @param format Protocol data format to be used (text, binary with IDs or binary with names)
1837+
* @param subset The subset associated with the published report
1838+
*
1839+
* @returns 0 for success or negative ThingSet response code in case of error
1840+
*/
1841+
int thingset_import_report(struct thingset_context *ts, const uint8_t *data, size_t len,
1842+
uint8_t auth_flags, enum thingset_data_format format, uint16_t subset);
1843+
18251844
/**
18261845
* EXPERIMENTAL
18271846
*

src/thingset.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,41 @@ int thingset_import_data(struct thingset_context *ts, const uint8_t *data, size_
349349
return err;
350350
}
351351

352+
int thingset_import_report(struct thingset_context *ts, const uint8_t *data, size_t len,
353+
uint8_t auth_flags, enum thingset_data_format format, uint16_t subset)
354+
{
355+
int err;
356+
357+
if (k_sem_take(&ts->lock, K_MSEC(THINGSET_CONTEXT_LOCK_TIMEOUT_MS)) != 0) {
358+
LOG_ERR("ThingSet context lock timed out");
359+
return -THINGSET_ERR_INTERNAL_SERVER_ERR;
360+
}
361+
362+
ts->msg = data;
363+
ts->msg_len = len;
364+
ts->msg_pos = 0;
365+
ts->rsp = NULL;
366+
ts->rsp_size = 0;
367+
ts->rsp_pos = 0;
368+
369+
switch (format) {
370+
case THINGSET_BIN_IDS_VALUES:
371+
ts->endpoint.use_ids = true;
372+
thingset_bin_setup(ts, 0);
373+
ts->decoder->elem_count = 2;
374+
ts->msg_payload = data;
375+
err = thingset_bin_import_report(ts, auth_flags, subset);
376+
break;
377+
default:
378+
err = -THINGSET_ERR_NOT_IMPLEMENTED;
379+
break;
380+
}
381+
382+
k_sem_give(&ts->lock);
383+
384+
return err;
385+
}
386+
352387
static int deserialize_value_callback(struct thingset_context *ts,
353388
const struct thingset_data_object *item_offset)
354389
{

src/thingset_bin.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,22 @@ int thingset_bin_import_data(struct thingset_context *ts, uint8_t auth_flags,
931931
return ts->api->deserialize_finish(ts);
932932
}
933933

934+
int thingset_bin_import_report(struct thingset_context *ts, uint8_t auth_flags, uint16_t subset)
935+
{
936+
uint32_t id = 0;
937+
938+
if (ts->msg_payload[0] != THINGSET_BIN_REPORT) {
939+
return -THINGSET_ERR_UNSUPPORTED_FORMAT;
940+
}
941+
942+
zcbor_uint32_decode(ts->decoder, &id);
943+
if (id != subset) {
944+
return -THINGSET_ERR_NOT_FOUND;
945+
}
946+
947+
return thingset_bin_import_data(ts, auth_flags, subset);
948+
}
949+
934950
int thingset_bin_process(struct thingset_context *ts)
935951
{
936952
int ret;

src/thingset_internal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,8 @@ void thingset_bin_setup(struct thingset_context *ts, size_t buf_offset);
377377
int thingset_bin_import_data(struct thingset_context *ts, uint8_t auth_flags,
378378
enum thingset_data_format format);
379379

380+
int thingset_bin_import_report(struct thingset_context *ts, uint8_t auth_flags, uint16_t subset);
381+
380382
int thingset_bin_import_data_progressively(struct thingset_context *ts, uint8_t auth_flags,
381383
size_t size, uint32_t *last_id, size_t *consumed);
382384

tests/common/data.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,12 +188,12 @@ static void dyn_records_callback(enum thingset_callback_reason reason, int index
188188
THINGSET_DEFINE_DYN_RECORDS(dyn_records_obj, &dyn_records, 10, dyn_records_callback);
189189

190190
/* Nested */
191-
static int32_t nested_beginning = 1;
191+
int32_t nested_beginning = 1;
192192
static float nested_obj1_item1 = 1.1F;
193193
static float nested_obj1_item2 = 1.2F;
194194
static int32_t nested_between = 2;
195195
static float nested_obj2_item1 = 2.1F;
196-
static float nested_obj2_item2 = 2.2F;
196+
float nested_obj2_item2 = 2.2F;
197197
static int32_t nested_end = 3;
198198

199199
/*

tests/protocol/src/bin.c

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313
#include "data.h"
1414
#include "test_utils.h"
1515

16+
extern struct thingset_data_object data_objects[];
17+
extern size_t data_objects_size;
18+
extern int32_t nested_beginning;
19+
extern float nested_obj2_item2;
20+
1621
static struct thingset_context ts;
1722

1823
ZTEST(thingset_bin, test_get_root_ids)
@@ -985,6 +990,100 @@ ZTEST(thingset_bin, test_import_data)
985990
b = true;
986991
}
987992

993+
ZTEST(thingset_bin, test_import_report)
994+
{
995+
996+
uint8_t data[THINGSET_TEST_BUF_SIZE];
997+
998+
const char rpt_exp_hex[] =
999+
"1F 19 08 00 A5 "
1000+
"10 19 03 E8 " /* t_s */
1001+
"19 02 01 F5 " /* Types/wBool */
1002+
"19 06 00 02 " /* Records: 2 */
1003+
"19 07 01 01 " /* Nested/rBeginning */
1004+
"19 07 08 FA 40 0C CC CD"; /* Nested/Obj2/rItem2_V */
1005+
1006+
struct thingset_context ts_local;
1007+
thingset_init(&ts_local, data_objects, data_objects_size);
1008+
1009+
int data_len = hex2bin_spaced(rpt_exp_hex, data, sizeof(data));
1010+
1011+
/* save old values */
1012+
uint32_t timestamp_old = timestamp;
1013+
bool b_old = b;
1014+
int32_t nested_beginning_old = nested_beginning;
1015+
float nested_obj2_item2_old = nested_obj2_item2;
1016+
1017+
/* set values to zero/false */
1018+
timestamp = 0;
1019+
b = false;
1020+
nested_obj2_item2 = 0.0;
1021+
nested_beginning = 0;
1022+
1023+
int status = thingset_import_report(&ts_local, data, data_len, THINGSET_WRITE_MASK,
1024+
THINGSET_BIN_IDS_VALUES, 0x800);
1025+
zassert_equal(status, 0);
1026+
zassert_equal(timestamp, timestamp_old);
1027+
zassert_equal(b, b_old);
1028+
zassert_equal(nested_beginning, nested_beginning_old);
1029+
zassert_equal(nested_obj2_item2, nested_obj2_item2_old);
1030+
1031+
/* set to originial values */
1032+
timestamp = timestamp_old;
1033+
b = b_old;
1034+
nested_beginning = nested_beginning_old;
1035+
nested_obj2_item2 = nested_obj2_item2_old;
1036+
}
1037+
1038+
ZTEST(thingset_bin, test_import_report_error)
1039+
{
1040+
1041+
uint8_t data[THINGSET_TEST_BUF_SIZE];
1042+
1043+
const char rpt_exp_hex[] =
1044+
"1F 19 08 00 A5 "
1045+
"10 19 03 E8 " /* t_s */
1046+
"19 02 01 F5 " /* Types/wBool */
1047+
"19 06 00 02 " /* Records: 2 */
1048+
"19 07 01 01 " /* Nested/rBeginning */
1049+
"19 07 08 FA 40 0C CC CD"; /* Nested/Obj2/rItem2_V */
1050+
1051+
struct thingset_context ts_local;
1052+
thingset_init(&ts_local, data_objects, data_objects_size);
1053+
1054+
int data_len = hex2bin_spaced(rpt_exp_hex, data, sizeof(data));
1055+
1056+
/* save old values */
1057+
uint32_t timestamp_old = timestamp;
1058+
bool b_old = b;
1059+
int32_t nested_beginning_old = nested_beginning;
1060+
float nested_obj2_item2_old = nested_obj2_item2;
1061+
1062+
/* set values to zero/false */
1063+
timestamp = 0;
1064+
b = false;
1065+
nested_obj2_item2 = 0.0;
1066+
nested_beginning = 0;
1067+
1068+
/* no report */
1069+
data[0] = 0x00;
1070+
int status = thingset_import_report(&ts_local, data, data_len, THINGSET_WRITE_MASK,
1071+
THINGSET_BIN_IDS_VALUES, 0x800);
1072+
zassert_equal(status, -THINGSET_ERR_UNSUPPORTED_FORMAT);
1073+
1074+
/* wrong subset */
1075+
data[0] = 0x1f;
1076+
status = thingset_import_report(&ts_local, data, data_len, THINGSET_WRITE_MASK,
1077+
THINGSET_BIN_IDS_VALUES, 0x0);
1078+
zassert_equal(status, -THINGSET_ERR_NOT_FOUND);
1079+
1080+
/* set to originial values */
1081+
timestamp = timestamp_old;
1082+
b = b_old;
1083+
nested_beginning = nested_beginning_old;
1084+
nested_obj2_item2 = nested_obj2_item2_old;
1085+
}
1086+
9881087
ZTEST(thingset_bin, test_import_record)
9891088
{
9901089
struct thingset_endpoint endpoint;

0 commit comments

Comments
 (0)