diff --git a/subsys/net/lib/lwm2m/ipso_buzzer.c b/subsys/net/lib/lwm2m/ipso_buzzer.c index 8497a841403..21ab78f997e 100644 --- a/subsys/net/lib/lwm2m/ipso_buzzer.c +++ b/subsys/net/lib/lwm2m/ipso_buzzer.c @@ -213,7 +213,7 @@ static struct lwm2m_engine_obj_inst *buzzer_create(uint16_t obj_inst_id) /* initialize instance resource data */ INIT_OBJ_RES(BUZZER_ON_OFF_ID, res[avail], i, - res_inst[avail], j, 1, true, + res_inst[avail], j, 1, false, true, &buzzer_data[avail].onoff, sizeof(buzzer_data[avail].onoff), NULL, NULL, onoff_post_write_cb, NULL); diff --git a/subsys/net/lib/lwm2m/ipso_generic_sensor.c b/subsys/net/lib/lwm2m/ipso_generic_sensor.c index dea0fefc06e..311f009c4ad 100644 --- a/subsys/net/lib/lwm2m/ipso_generic_sensor.c +++ b/subsys/net/lib/lwm2m/ipso_generic_sensor.c @@ -206,8 +206,8 @@ static struct lwm2m_engine_obj_inst *generic_sensor_create(uint16_t obj_inst_id) /* initialize instance resource data */ INIT_OBJ_RES(SENSOR_VALUE_RID, res[index], i, res_inst[index], j, 1, - true, &sensor_value[index], sizeof(*sensor_value), NULL, - NULL, sensor_value_write_cb, NULL); + false, true, &sensor_value[index], sizeof(*sensor_value), + NULL, NULL, sensor_value_write_cb, NULL); INIT_OBJ_RES_DATA(SENSOR_UNITS_RID, res[index], i, res_inst[index], j, units[index], UNIT_STR_MAX_SIZE); INIT_OBJ_RES_DATA(MIN_MEASURED_VALUE_RID, res[index], i, diff --git a/subsys/net/lib/lwm2m/ipso_humidity_sensor.c b/subsys/net/lib/lwm2m/ipso_humidity_sensor.c index 4820bde2d47..b39a2a31d31 100644 --- a/subsys/net/lib/lwm2m/ipso_humidity_sensor.c +++ b/subsys/net/lib/lwm2m/ipso_humidity_sensor.c @@ -189,8 +189,8 @@ humidity_sensor_create(uint16_t obj_inst_id) /* initialize instance resource data */ INIT_OBJ_RES(SENSOR_VALUE_RID, res[index], i, res_inst[index], j, 1, - true, &sensor_value[index], sizeof(*sensor_value), NULL, - NULL, sensor_value_write_cb, NULL); + false, true, &sensor_value[index], sizeof(*sensor_value), + NULL, NULL, sensor_value_write_cb, NULL); INIT_OBJ_RES_DATA(SENSOR_UNITS_RID, res[index], i, res_inst[index], j, units[index], UNIT_STR_MAX_SIZE); INIT_OBJ_RES_DATA(MIN_MEASURED_VALUE_RID, res[index], i, diff --git a/subsys/net/lib/lwm2m/ipso_light_control.c b/subsys/net/lib/lwm2m/ipso_light_control.c index 5ed74d8c6a1..a75006177a8 100644 --- a/subsys/net/lib/lwm2m/ipso_light_control.c +++ b/subsys/net/lib/lwm2m/ipso_light_control.c @@ -171,7 +171,7 @@ static struct lwm2m_engine_obj_inst *light_control_create(uint16_t obj_inst_id) INIT_OBJ_RES_DATA(LIGHT_DIMMER_ID, res[avail], i, res_inst[avail], j, &dimmer_value[avail], sizeof(*dimmer_value)); INIT_OBJ_RES(LIGHT_ON_TIME_ID, res[avail], i, - res_inst[avail], j, 1, true, + res_inst[avail], j, 1, false, true, &on_time_value[avail], sizeof(*on_time_value), on_time_read_cb, NULL, on_time_post_write_cb, NULL); INIT_OBJ_RES_DATA(LIGHT_CUMULATIVE_ACTIVE_POWER_ID, res[avail], i, diff --git a/subsys/net/lib/lwm2m/ipso_onoff_switch.c b/subsys/net/lib/lwm2m/ipso_onoff_switch.c index 5c5f915580c..9d85e8055f1 100644 --- a/subsys/net/lib/lwm2m/ipso_onoff_switch.c +++ b/subsys/net/lib/lwm2m/ipso_onoff_switch.c @@ -211,7 +211,7 @@ static struct lwm2m_engine_obj_inst *switch_create(uint16_t obj_inst_id) /* initialize instance resource data */ INIT_OBJ_RES(SWITCH_DIGITAL_STATE_ID, res[avail], i, - res_inst[avail], j, 1, true, + res_inst[avail], j, 1, false, true, &switch_data[avail].state, sizeof(switch_data[avail].state), NULL, NULL, state_post_write_cb, NULL); @@ -220,10 +220,10 @@ static struct lwm2m_engine_obj_inst *switch_create(uint16_t obj_inst_id) &switch_data[avail].counter, sizeof(switch_data[avail].counter)); INIT_OBJ_RES_OPT(SWITCH_ON_TIME_ID, res[avail], i, - res_inst[avail], j, 1, true, + res_inst[avail], j, 1, false, true, on_time_read_cb, NULL, time_post_write_cb, NULL); INIT_OBJ_RES_OPT(SWITCH_OFF_TIME_ID, res[avail], i, - res_inst[avail], j, 1, true, + res_inst[avail], j, 1, false, true, off_time_read_cb, NULL, time_post_write_cb, NULL); INIT_OBJ_RES_OPTDATA(SWITCH_APPLICATION_TYPE_ID, res[avail], i, res_inst[avail], j); diff --git a/subsys/net/lib/lwm2m/ipso_pressure_sensor.c b/subsys/net/lib/lwm2m/ipso_pressure_sensor.c index f901b5383eb..ed1f7e2cc17 100644 --- a/subsys/net/lib/lwm2m/ipso_pressure_sensor.c +++ b/subsys/net/lib/lwm2m/ipso_pressure_sensor.c @@ -189,8 +189,8 @@ pressure_sensor_create(uint16_t obj_inst_id) /* initialize instance resource data */ INIT_OBJ_RES(SENSOR_VALUE_RID, res[index], i, res_inst[index], j, 1, - true, &sensor_value[index], sizeof(*sensor_value), NULL, - NULL, sensor_value_write_cb, NULL); + false, true, &sensor_value[index], sizeof(*sensor_value), + NULL, NULL, sensor_value_write_cb, NULL); INIT_OBJ_RES_DATA(SENSOR_UNITS_RID, res[index], i, res_inst[index], j, units[index], UNIT_STR_MAX_SIZE); INIT_OBJ_RES_DATA(MIN_MEASURED_VALUE_RID, res[index], i, diff --git a/subsys/net/lib/lwm2m/ipso_push_button.c b/subsys/net/lib/lwm2m/ipso_push_button.c index 04c2403c5e3..9ad883fcfac 100644 --- a/subsys/net/lib/lwm2m/ipso_push_button.c +++ b/subsys/net/lib/lwm2m/ipso_push_button.c @@ -143,7 +143,7 @@ static struct lwm2m_engine_obj_inst *button_create(uint16_t obj_inst_id) /* initialize instance resource data */ INIT_OBJ_RES(BUTTON_DIGITAL_STATE_ID, res[avail], i, - res_inst[avail], j, 1, true, + res_inst[avail], j, 1, false, true, &button_data[avail].state, sizeof(button_data[avail].state), NULL, NULL, state_post_write_cb, NULL); diff --git a/subsys/net/lib/lwm2m/ipso_temp_sensor.c b/subsys/net/lib/lwm2m/ipso_temp_sensor.c index 08b342b4b01..11e50805642 100644 --- a/subsys/net/lib/lwm2m/ipso_temp_sensor.c +++ b/subsys/net/lib/lwm2m/ipso_temp_sensor.c @@ -203,7 +203,7 @@ static struct lwm2m_engine_obj_inst *temp_sensor_create(uint16_t obj_inst_id) /* initialize instance resource data */ INIT_OBJ_RES(TEMP_SENSOR_VALUE_ID, res[index], i, - res_inst[index], j, 1, true, + res_inst[index], j, 1, false, true, &sensor_value[index], sizeof(*sensor_value), NULL, NULL, sensor_value_write_cb, NULL); INIT_OBJ_RES_DATA(TEMP_UNITS_ID, res[index], i, res_inst[index], j, diff --git a/subsys/net/lib/lwm2m/ipso_timer.c b/subsys/net/lib/lwm2m/ipso_timer.c index 1a6c3b5062c..c3cb0c45d3c 100644 --- a/subsys/net/lib/lwm2m/ipso_timer.c +++ b/subsys/net/lib/lwm2m/ipso_timer.c @@ -341,7 +341,7 @@ static struct lwm2m_engine_obj_inst *timer_create(uint16_t obj_inst_id) res_inst[avail], j, &timer_data[avail].delay_duration, sizeof(timer_data[avail].delay_duration)); INIT_OBJ_RES(TIMER_REMAINING_TIME_ID, res[avail], i, - res_inst[avail], j, 1, true, + res_inst[avail], j, 1, false, true, &timer_data[avail].remaining_time, sizeof(timer_data[avail].remaining_time), remaining_time_read_cb, NULL, NULL, NULL); @@ -351,12 +351,12 @@ static struct lwm2m_engine_obj_inst *timer_create(uint16_t obj_inst_id) INIT_OBJ_RES_EXECUTE(TIMER_TRIGGER_ID, res[avail], i, timer_trigger_cb); INIT_OBJ_RES(TIMER_ON_OFF_ID, res[avail], i, - res_inst[avail], j, 1, true, + res_inst[avail], j, 1, false, true, &timer_data[avail].enabled, sizeof(timer_data[avail].enabled), NULL, NULL, enabled_post_write_cb, NULL); INIT_OBJ_RES(TIMER_CUMULATIVE_TIME_ID, res[avail], i, - res_inst[avail], j, 1, true, + res_inst[avail], j, 1, false, true, &timer_data[avail].cumulative_time, sizeof(timer_data[avail].cumulative_time), cumulative_time_read_cb, NULL, @@ -365,7 +365,7 @@ static struct lwm2m_engine_obj_inst *timer_create(uint16_t obj_inst_id) res_inst[avail], j, &timer_data[avail].active, sizeof(timer_data[avail].active)); INIT_OBJ_RES(TIMER_COUNTER_ID, res[avail], i, - res_inst[avail], j, 1, true, + res_inst[avail], j, 1, false, true, &timer_data[avail].trigger_counter, sizeof(timer_data[avail].trigger_counter), NULL, NULL, trigger_counter_post_write_cb, NULL); diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.c b/subsys/net/lib/lwm2m/lwm2m_engine.c index 91138fad14d..7a138a6003d 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.c +++ b/subsys/net/lib/lwm2m/lwm2m_engine.c @@ -3089,6 +3089,31 @@ static int print_attr(struct lwm2m_output_context *out, return 0; } +static int print_resource_dimension(struct lwm2m_output_context *out, + uint8_t *buf, uint16_t buflen, + struct lwm2m_engine_res *res) +{ + int ret, i, inst_count = 0; + + if (res->multi_res_inst) { + for (i = 0; i < res->res_inst_count; i++) { + if (res->res_instances[i].res_inst_id != + RES_INSTANCE_NOT_CREATED) { + inst_count++; + } + } + + snprintk(buf, buflen, ";dim=%d", inst_count); + ret = buf_append(CPKT_BUF_WRITE(out->out_cpkt), buf, + strlen(buf)); + if (ret < 0) { + return ret; + } + } + + return 0; +} + static int do_discover_op(struct lwm2m_message *msg, bool well_known) { static char disc_buf[24]; @@ -3233,6 +3258,13 @@ static int do_discover_op(struct lwm2m_message *msg, bool well_known) /* report resource attrs when path > 1 (5.4.2) */ if (msg->path.level > 1) { + ret = print_resource_dimension( + &msg->out, disc_buf, sizeof(disc_buf), + &obj_inst->resources[i]); + if (ret < 0) { + return ret; + } + ret = print_attr(&msg->out, disc_buf, sizeof(disc_buf), &obj_inst->resources[i]); diff --git a/subsys/net/lib/lwm2m/lwm2m_obj_device.c b/subsys/net/lib/lwm2m/lwm2m_obj_device.c index 88889d729f4..c1aa3772eb6 100644 --- a/subsys/net/lib/lwm2m/lwm2m_obj_device.c +++ b/subsys/net/lib/lwm2m/lwm2m_obj_device.c @@ -227,9 +227,8 @@ static struct lwm2m_engine_obj_inst *device_create(uint16_t obj_inst_id) error_code_list, sizeof(*error_code_list)); INIT_OBJ_RES_EXECUTE(DEVICE_RESET_ERROR_CODE_ID, res, i, reset_error_list_cb); - INIT_OBJ_RES_OPT(DEVICE_CURRENT_TIME_ID, res, i, res_inst, j, 1, true, - current_time_read_cb, - current_time_pre_write_cb, + INIT_OBJ_RES_OPT(DEVICE_CURRENT_TIME_ID, res, i, res_inst, j, 1, false, + true, current_time_read_cb, current_time_pre_write_cb, current_time_post_write_cb, NULL); INIT_OBJ_RES_OPTDATA(DEVICE_UTC_OFFSET_ID, res, i, res_inst, j); INIT_OBJ_RES_OPTDATA(DEVICE_TIMEZONE_ID, res, i, res_inst, j); diff --git a/subsys/net/lib/lwm2m/lwm2m_obj_firmware.c b/subsys/net/lib/lwm2m/lwm2m_obj_firmware.c index 4a78f4338f7..0e9cf19c09e 100644 --- a/subsys/net/lib/lwm2m/lwm2m_obj_firmware.c +++ b/subsys/net/lib/lwm2m/lwm2m_obj_firmware.c @@ -319,10 +319,10 @@ static struct lwm2m_engine_obj_inst *firmware_create(uint16_t obj_inst_id) init_res_instance(res_inst, ARRAY_SIZE(res_inst)); /* initialize instance resource data */ - INIT_OBJ_RES_OPT(FIRMWARE_PACKAGE_ID, res, i, res_inst, j, 1, true, - NULL, NULL, package_write_cb, NULL); - INIT_OBJ_RES(FIRMWARE_PACKAGE_URI_ID, res, i, res_inst, j, 1, true, - package_uri, PACKAGE_URI_LEN, + INIT_OBJ_RES_OPT(FIRMWARE_PACKAGE_ID, res, i, res_inst, j, 1, false, + true, NULL, NULL, package_write_cb, NULL); + INIT_OBJ_RES(FIRMWARE_PACKAGE_URI_ID, res, i, res_inst, j, 1, false, + true, package_uri, PACKAGE_URI_LEN, NULL, NULL, package_uri_write_cb, NULL); INIT_OBJ_RES_EXECUTE(FIRMWARE_UPDATE_ID, res, i, firmware_update_cb); INIT_OBJ_RES_DATA(FIRMWARE_STATE_ID, res, i, res_inst, j, diff --git a/subsys/net/lib/lwm2m/lwm2m_obj_server.c b/subsys/net/lib/lwm2m/lwm2m_obj_server.c index d698ace0ae1..89c0917f261 100644 --- a/subsys/net/lib/lwm2m/lwm2m_obj_server.c +++ b/subsys/net/lib/lwm2m/lwm2m_obj_server.c @@ -212,7 +212,7 @@ static struct lwm2m_engine_obj_inst *server_create(uint16_t obj_inst_id) res_inst[index], j, &server_id[index], sizeof(*server_id)); INIT_OBJ_RES(SERVER_LIFETIME_ID, res[index], i, res_inst[index], j, - 1U, true, &lifetime[index], sizeof(*lifetime), + 1U, false, true, &lifetime[index], sizeof(*lifetime), NULL, NULL, lifetime_write_cb, NULL); INIT_OBJ_RES_DATA(SERVER_DEFAULT_MIN_PERIOD_ID, res[index], i, res_inst[index], j, diff --git a/subsys/net/lib/lwm2m/lwm2m_object.h b/subsys/net/lib/lwm2m/lwm2m_object.h index f66454ec5fc..70aeb78156d 100644 --- a/subsys/net/lib/lwm2m/lwm2m_object.h +++ b/subsys/net/lib/lwm2m/lwm2m_object.h @@ -197,11 +197,12 @@ struct lwm2m_engine_obj { #define RES_INSTANCE_NOT_CREATED 65535 /* Resource macros */ -#define _INIT_OBJ_RES(_id, _r_ptr, _r_idx, _ri_ptr, _ri_count, \ +#define _INIT_OBJ_RES(_id, _r_ptr, _r_idx, _ri_ptr, _ri_count, _multi_ri, \ _r_cb, _pre_w_cb, _post_w_cb, _ex_cb) \ _r_ptr[_r_idx].res_id = _id; \ _r_ptr[_r_idx].res_instances = _ri_ptr; \ _r_ptr[_r_idx].res_inst_count = _ri_count; \ + _r_ptr[_r_idx].multi_res_inst = _multi_ri; \ _r_ptr[_r_idx].read_cb = _r_cb; \ _r_ptr[_r_idx].pre_write_cb = _pre_w_cb; \ _r_ptr[_r_idx].post_write_cb = _post_w_cb; \ @@ -250,12 +251,12 @@ struct lwm2m_engine_obj { } while (false) #define INIT_OBJ_RES(_id, _r_ptr, _r_idx, \ - _ri_ptr, _ri_idx, _ri_count, _ri_create, \ + _ri_ptr, _ri_idx, _ri_count, _multi_ri, _ri_create, \ _data_ptr, _data_len, \ _r_cb, _pre_w_cb, _post_w_cb, _ex_cb) \ do { \ _INIT_OBJ_RES(_id, _r_ptr, _r_idx, \ - (_ri_ptr + _ri_idx), _ri_count, \ + (_ri_ptr + _ri_idx), _ri_count, _multi_ri, \ _r_cb, _pre_w_cb, _post_w_cb, _ex_cb); \ _INIT_OBJ_RES_INST(_ri_ptr, _ri_idx, _ri_count, _ri_create, \ _data_ptr, _data_len); \ @@ -264,11 +265,11 @@ struct lwm2m_engine_obj { #define INIT_OBJ_RES_OPT(_id, _r_ptr, _r_idx, \ - _ri_ptr, _ri_idx, _ri_count, _ri_create, \ + _ri_ptr, _ri_idx, _ri_count, _multi_ri, _ri_create, \ _r_cb, _pre_w_cb, _post_w_cb, _ex_cb) \ do { \ _INIT_OBJ_RES(_id, _r_ptr, _r_idx, \ - (_ri_ptr + _ri_idx), _ri_count, \ + (_ri_ptr + _ri_idx), _ri_count, _multi_ri, \ _r_cb, _pre_w_cb, _post_w_cb, _ex_cb); \ _INIT_OBJ_RES_INST_OPT(_ri_ptr, _ri_idx, _ri_count, _ri_create); \ ++_r_idx; \ @@ -278,27 +279,27 @@ struct lwm2m_engine_obj { _ri_ptr, _ri_idx, _ri_count, _ri_create, \ _data_ptr, _data_len) \ INIT_OBJ_RES(_id, _r_ptr, _r_idx, \ - _ri_ptr, _ri_idx, _ri_count, _ri_create, \ + _ri_ptr, _ri_idx, _ri_count, true, _ri_create, \ _data_ptr, _data_len, NULL, NULL, NULL, NULL) #define INIT_OBJ_RES_MULTI_OPTDATA(_id, _r_ptr, _r_idx, \ _ri_ptr, _ri_idx, _ri_count, _ri_create) \ INIT_OBJ_RES_OPT(_id, _r_ptr, _r_idx, \ - _ri_ptr, _ri_idx, _ri_count, _ri_create, \ + _ri_ptr, _ri_idx, _ri_count, true, _ri_create, \ NULL, NULL, NULL, NULL) #define INIT_OBJ_RES_DATA(_id, _r_ptr, _r_idx, _ri_ptr, _ri_idx, \ _data_ptr, _data_len) \ - INIT_OBJ_RES(_id, _r_ptr, _r_idx, _ri_ptr, _ri_idx, 1U, true, \ + INIT_OBJ_RES(_id, _r_ptr, _r_idx, _ri_ptr, _ri_idx, 1U, false, true, \ _data_ptr, _data_len, NULL, NULL, NULL, NULL) #define INIT_OBJ_RES_OPTDATA(_id, _r_ptr, _r_idx, _ri_ptr, _ri_idx) \ - INIT_OBJ_RES_OPT(_id, _r_ptr, _r_idx, _ri_ptr, _ri_idx, 1U, true, \ - NULL, NULL, NULL, NULL) + INIT_OBJ_RES_OPT(_id, _r_ptr, _r_idx, _ri_ptr, _ri_idx, 1U, false, \ + true, NULL, NULL, NULL, NULL) #define INIT_OBJ_RES_EXECUTE(_id, _r_ptr, _r_idx, _ex_cb) \ do { \ - _INIT_OBJ_RES(_id, _r_ptr, _r_idx, NULL, 0, \ + _INIT_OBJ_RES(_id, _r_ptr, _r_idx, NULL, 0, false, \ NULL, NULL, NULL, _ex_cb); \ ++_r_idx; \ } while (false) @@ -341,6 +342,7 @@ struct lwm2m_engine_res { struct lwm2m_engine_res_inst *res_instances; uint16_t res_id; uint8_t res_inst_count; + bool multi_res_inst; }; struct lwm2m_engine_obj_inst {