diff --git a/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/main.c b/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/main.c index f2d89d8db3af3..914cfa6a9dd2a 100644 --- a/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/main.c +++ b/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/main.c @@ -252,6 +252,7 @@ void update_light_state(void) if (*ptr_counter == 0 || reset == false) { reset = true; + reassign_last_target_values(); k_work_submit(&no_transition_work); } } diff --git a/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/mesh/device_composition.c b/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/mesh/device_composition.c index 6cf317c85a069..d453b432d0720 100644 --- a/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/mesh/device_composition.c +++ b/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/mesh/device_composition.c @@ -153,21 +153,14 @@ static void gen_onoff_set_unack(struct bt_mesh_model *model, struct net_buf_simple *buf) { u8_t tid, onoff, tt, delay; - s64_t now; struct generic_onoff_state *state = model->user_data; onoff = net_buf_simple_pull_u8(buf); - tid = net_buf_simple_pull_u8(buf); - if (onoff > STATE_ON) { return; } - now = k_uptime_get(); - if (state->last_tid == tid && state->last_tx_addr == ctx->addr && - (now - state->last_msg_timestamp <= K_SECONDS(6))) { - return; - } + tid = net_buf_simple_pull_u8(buf); switch (buf->len) { case 0x00: /* No optional fields are available */ @@ -186,15 +179,12 @@ static void gen_onoff_set_unack(struct bt_mesh_model *model, return; } - *ptr_counter = 0U; - k_timer_stop(ptr_timer); - - state->last_tid = tid; - state->last_tx_addr = ctx->addr; - state->last_msg_timestamp = now; state->target_onoff = onoff; - if (state->target_onoff != state->onoff) { + if (state->target_onoff != state->last_target_onoff) { + state->last_target_onoff = state->target_onoff; + *ptr_counter = 0U; + k_timer_stop(ptr_timer); onoff_tt_values(state, tt, delay); } else { gen_onoff_publish(model); @@ -216,21 +206,14 @@ static void gen_onoff_set(struct bt_mesh_model *model, struct net_buf_simple *buf) { u8_t tid, onoff, tt, delay; - s64_t now; struct generic_onoff_state *state = model->user_data; onoff = net_buf_simple_pull_u8(buf); - tid = net_buf_simple_pull_u8(buf); - if (onoff > STATE_ON) { return; } - now = k_uptime_get(); - if (state->last_tid == tid && state->last_tx_addr == ctx->addr && - (now - state->last_msg_timestamp <= K_SECONDS(6))) { - return; - } + tid = net_buf_simple_pull_u8(buf); switch (buf->len) { case 0x00: /* No optional fields are available */ @@ -249,15 +232,12 @@ static void gen_onoff_set(struct bt_mesh_model *model, return; } - *ptr_counter = 0U; - k_timer_stop(ptr_timer); - - state->last_tid = tid; - state->last_tx_addr = ctx->addr; - state->last_msg_timestamp = now; state->target_onoff = onoff; - if (state->target_onoff != state->onoff) { + if (state->target_onoff != state->last_target_onoff) { + state->last_target_onoff = state->target_onoff; + *ptr_counter = 0U; + k_timer_stop(ptr_timer); onoff_tt_values(state, tt, delay); } else { gen_onoff_get(model, ctx, buf); @@ -343,18 +323,11 @@ static void gen_level_set_unack(struct bt_mesh_model *model, { u8_t tid, tt, delay; s16_t level; - s64_t now; struct generic_level_state *state = model->user_data; level = (s16_t) net_buf_simple_pull_le16(buf); tid = net_buf_simple_pull_u8(buf); - now = k_uptime_get(); - if (state->last_tid == tid && state->last_tx_addr == ctx->addr && - (now - state->last_msg_timestamp <= K_SECONDS(6))) { - return; - } - switch (buf->len) { case 0x00: /* No optional fields are available */ tt = default_tt; @@ -372,15 +345,12 @@ static void gen_level_set_unack(struct bt_mesh_model *model, return; } - *ptr_counter = 0U; - k_timer_stop(ptr_timer); - - state->last_tid = tid; - state->last_tx_addr = ctx->addr; - state->last_msg_timestamp = now; state->target_level = level; - if (state->target_level != state->level) { + if (state->target_level != state->last_target_level) { + state->last_target_level = state->target_level; + *ptr_counter = 0U; + k_timer_stop(ptr_timer); level_tt_values(state, tt, delay); } else { gen_level_publish(model); @@ -412,18 +382,11 @@ static void gen_level_set(struct bt_mesh_model *model, { u8_t tid, tt, delay; s16_t level; - s64_t now; struct generic_level_state *state = model->user_data; level = (s16_t) net_buf_simple_pull_le16(buf); tid = net_buf_simple_pull_u8(buf); - now = k_uptime_get(); - if (state->last_tid == tid && state->last_tx_addr == ctx->addr && - (now - state->last_msg_timestamp <= K_SECONDS(6))) { - return; - } - switch (buf->len) { case 0x00: /* No optional fields are available */ tt = default_tt; @@ -441,15 +404,12 @@ static void gen_level_set(struct bt_mesh_model *model, return; } - *ptr_counter = 0U; - k_timer_stop(ptr_timer); - - state->last_tid = tid; - state->last_tx_addr = ctx->addr; - state->last_msg_timestamp = now; state->target_level = level; - if (state->target_level != state->level) { + if (state->target_level != state->last_target_level) { + state->last_target_level = state->target_level; + *ptr_counter = 0U; + k_timer_stop(ptr_timer); level_tt_values(state, tt, delay); } else { gen_level_get(model, ctx, buf); @@ -520,13 +480,10 @@ static void gen_delta_set_unack(struct bt_mesh_model *model, return; } - *ptr_counter = 0U; - k_timer_stop(ptr_timer); - - state->last_delta = delta; state->last_tid = tid; state->last_tx_addr = ctx->addr; state->last_msg_timestamp = now; + state->last_delta = delta; if (tmp32 < INT16_MIN) { tmp32 = INT16_MIN; @@ -536,7 +493,10 @@ static void gen_delta_set_unack(struct bt_mesh_model *model, state->target_level = tmp32; - if (state->target_level != state->level) { + if (state->target_level != state->last_target_level) { + state->last_target_level = state->target_level; + *ptr_counter = 0U; + k_timer_stop(ptr_timer); level_tt_values(state, tt, delay); } else { gen_level_publish(model); @@ -606,13 +566,10 @@ static void gen_delta_set(struct bt_mesh_model *model, return; } - *ptr_counter = 0U; - k_timer_stop(ptr_timer); - - state->last_delta = delta; state->last_tid = tid; state->last_tx_addr = ctx->addr; state->last_msg_timestamp = now; + state->last_delta = delta; if (tmp32 < INT16_MIN) { tmp32 = INT16_MIN; @@ -622,7 +579,10 @@ static void gen_delta_set(struct bt_mesh_model *model, state->target_level = tmp32; - if (state->target_level != state->level) { + if (state->target_level != state->last_target_level) { + state->last_target_level = state->target_level; + *ptr_counter = 0U; + k_timer_stop(ptr_timer); level_tt_values(state, tt, delay); } else { gen_level_get(model, ctx, buf); @@ -711,18 +671,11 @@ static void gen_move_set_unack(struct bt_mesh_model *model, u8_t tid, tt, delay; s16_t delta; s32_t tmp32; - s64_t now; struct generic_level_state *state = model->user_data; delta = (s16_t) net_buf_simple_pull_le16(buf); tid = net_buf_simple_pull_u8(buf); - now = k_uptime_get(); - if (state->last_tid == tid && state->last_tx_addr == ctx->addr && - (now - state->last_msg_timestamp <= K_SECONDS(6))) { - return; - } - switch (buf->len) { case 0x00: /* No optional fields are available */ tt = default_tt; @@ -740,13 +693,7 @@ static void gen_move_set_unack(struct bt_mesh_model *model, return; } - *ptr_counter = 0U; - k_timer_stop(ptr_timer); - state->last_delta = delta; - state->last_tid = tid; - state->last_tx_addr = ctx->addr; - state->last_msg_timestamp = now; tmp32 = state->level + delta; if (tmp32 < INT16_MIN) { @@ -757,8 +704,14 @@ static void gen_move_set_unack(struct bt_mesh_model *model, state->target_level = tmp32; - if (state->target_level != state->level) { + if (state->target_level != state->last_target_level) { + state->last_target_level = state->target_level; + *ptr_counter = 0U; + k_timer_stop(ptr_timer); level_tt_values(state, tt, delay); + } else { + gen_level_move_publish(model); + return; } state->transition->just_started = true; @@ -787,18 +740,11 @@ static void gen_move_set(struct bt_mesh_model *model, u8_t tid, tt, delay; s16_t delta; s32_t tmp32; - s64_t now; struct generic_level_state *state = model->user_data; delta = (s16_t) net_buf_simple_pull_le16(buf); tid = net_buf_simple_pull_u8(buf); - now = k_uptime_get(); - if (state->last_tid == tid && state->last_tx_addr == ctx->addr && - (now - state->last_msg_timestamp <= K_SECONDS(6))) { - return; - } - switch (buf->len) { case 0x00: /* No optional fields are available */ tt = default_tt; @@ -816,13 +762,7 @@ static void gen_move_set(struct bt_mesh_model *model, return; } - *ptr_counter = 0U; - k_timer_stop(ptr_timer); - state->last_delta = delta; - state->last_tid = tid; - state->last_tx_addr = ctx->addr; - state->last_msg_timestamp = now; tmp32 = state->level + delta; if (tmp32 < INT16_MIN) { @@ -833,8 +773,15 @@ static void gen_move_set(struct bt_mesh_model *model, state->target_level = tmp32; - if (state->target_level != state->level) { + if (state->target_level != state->last_target_level) { + state->last_target_level = state->target_level; + *ptr_counter = 0U; + k_timer_stop(ptr_timer); level_tt_values(state, tt, delay); + } else { + gen_level_move_get(model, ctx, buf); + gen_level_move_publish(model); + return; } state->transition->just_started = true; @@ -1057,6 +1004,9 @@ static void vnd_get(struct bt_mesh_model *model, struct net_buf_simple *msg = NET_BUF_SIMPLE(3 + 6 + 4); struct vendor_state *state = model->user_data; + /* This is dummy response for demo purpose */ + state->response = 0xA578FEB3; + bt_mesh_model_msg_init(msg, BT_MESH_MODEL_OP_3(0x04, CID_ZEPHYR)); net_buf_simple_add_le16(msg, state->current); net_buf_simple_add_le32(msg, state->response); @@ -1071,26 +1021,16 @@ static void vnd_set_unack(struct bt_mesh_model *model, struct net_buf_simple *buf) { u8_t tid; - int current; - s64_t now; struct vendor_state *state = model->user_data; - current = net_buf_simple_pull_le16(buf); + state->current = net_buf_simple_pull_le16(buf); tid = net_buf_simple_pull_u8(buf); - now = k_uptime_get(); - if (state->last_tid == tid && state->last_tx_addr == ctx->addr && - (now - state->last_msg_timestamp <= 6000)) { + if (state->last == state->current) { return; } - state->last_tid = tid; - state->last_tx_addr = ctx->addr; - state->last_msg_timestamp = now; - state->current = current; - - /* This is dummy response for demo purpose */ - state->response = 0xA578FEB3; + state->last = state->current; printk("Vendor model message = %04x\n", state->current); @@ -1173,18 +1113,11 @@ static void light_lightness_set_unack(struct bt_mesh_model *model, { u8_t tid, tt, delay; u16_t actual; - s64_t now; struct light_lightness_state *state = model->user_data; actual = net_buf_simple_pull_le16(buf); tid = net_buf_simple_pull_u8(buf); - now = k_uptime_get(); - if (state->last_tid == tid && state->last_tx_addr == ctx->addr && - (now - state->last_msg_timestamp <= K_SECONDS(6))) { - return; - } - switch (buf->len) { case 0x00: /* No optional fields are available */ tt = default_tt; @@ -1202,13 +1135,6 @@ static void light_lightness_set_unack(struct bt_mesh_model *model, return; } - *ptr_counter = 0U; - k_timer_stop(ptr_timer); - - state->last_tid = tid; - state->last_tx_addr = ctx->addr; - state->last_msg_timestamp = now; - if (actual > 0 && actual < state->light_range_min) { actual = state->light_range_min; } else if (actual > state->light_range_max) { @@ -1217,7 +1143,10 @@ static void light_lightness_set_unack(struct bt_mesh_model *model, state->target_actual = actual; - if (state->target_actual != state->actual) { + if (state->target_actual != state->last_target_actual) { + state->last_target_actual = state->target_actual; + *ptr_counter = 0U; + k_timer_stop(ptr_timer); light_lightness_actual_tt_values(state, tt, delay); } else { light_lightness_publish(model); @@ -1240,18 +1169,11 @@ static void light_lightness_set(struct bt_mesh_model *model, { u8_t tid, tt, delay; u16_t actual; - s64_t now; struct light_lightness_state *state = model->user_data; actual = net_buf_simple_pull_le16(buf); tid = net_buf_simple_pull_u8(buf); - now = k_uptime_get(); - if (state->last_tid == tid && state->last_tx_addr == ctx->addr && - (now - state->last_msg_timestamp <= K_SECONDS(6))) { - return; - } - switch (buf->len) { case 0x00: /* No optional fields are available */ tt = default_tt; @@ -1269,13 +1191,6 @@ static void light_lightness_set(struct bt_mesh_model *model, return; } - *ptr_counter = 0U; - k_timer_stop(ptr_timer); - - state->last_tid = tid; - state->last_tx_addr = ctx->addr; - state->last_msg_timestamp = now; - if (actual > 0 && actual < state->light_range_min) { actual = state->light_range_min; } else if (actual > state->light_range_max) { @@ -1284,7 +1199,10 @@ static void light_lightness_set(struct bt_mesh_model *model, state->target_actual = actual; - if (state->target_actual != state->actual) { + if (state->target_actual != state->last_target_actual) { + state->last_target_actual = state->target_actual; + *ptr_counter = 0U; + k_timer_stop(ptr_timer); light_lightness_actual_tt_values(state, tt, delay); } else { light_lightness_get(model, ctx, buf); @@ -1357,18 +1275,11 @@ static void light_lightness_linear_set_unack(struct bt_mesh_model *model, { u8_t tid, tt, delay; u16_t linear; - s64_t now; struct light_lightness_state *state = model->user_data; linear = net_buf_simple_pull_le16(buf); tid = net_buf_simple_pull_u8(buf); - now = k_uptime_get(); - if (state->last_tid == tid && state->last_tx_addr == ctx->addr && - (now - state->last_msg_timestamp <= K_SECONDS(6))) { - return; - } - switch (buf->len) { case 0x00: /* No optional fields are available */ tt = default_tt; @@ -1386,15 +1297,12 @@ static void light_lightness_linear_set_unack(struct bt_mesh_model *model, return; } - *ptr_counter = 0U; - k_timer_stop(ptr_timer); - - state->last_tid = tid; - state->last_tx_addr = ctx->addr; - state->last_msg_timestamp = now; state->target_linear = linear; - if (state->target_linear != state->linear) { + if (state->target_linear != state->last_target_linear) { + state->last_target_linear = state->target_linear; + *ptr_counter = 0U; + k_timer_stop(ptr_timer); light_lightness_linear_tt_values(state, tt, delay); } else { light_lightness_linear_publish(model); @@ -1417,18 +1325,11 @@ static void light_lightness_linear_set(struct bt_mesh_model *model, { u8_t tid, tt, delay; u16_t linear; - s64_t now; struct light_lightness_state *state = model->user_data; linear = net_buf_simple_pull_le16(buf); tid = net_buf_simple_pull_u8(buf); - now = k_uptime_get(); - if (state->last_tid == tid && state->last_tx_addr == ctx->addr && - (now - state->last_msg_timestamp <= K_SECONDS(6))) { - return; - } - switch (buf->len) { case 0x00: /* No optional fields are available */ tt = default_tt; @@ -1446,15 +1347,12 @@ static void light_lightness_linear_set(struct bt_mesh_model *model, return; } - *ptr_counter = 0U; - k_timer_stop(ptr_timer); - - state->last_tid = tid; - state->last_tx_addr = ctx->addr; - state->last_msg_timestamp = now; state->target_linear = linear; - if (state->target_linear != state->linear) { + if (state->target_linear != state->last_target_linear) { + state->last_target_linear = state->target_linear; + *ptr_counter = 0U; + k_timer_stop(ptr_timer); light_lightness_linear_tt_values(state, tt, delay); } else { light_lightness_linear_get(model, ctx, buf); @@ -1768,23 +1666,17 @@ static void light_ctl_set_unack(struct bt_mesh_model *model, u8_t tid, tt, delay; s16_t delta_uv; u16_t lightness, temp; - s64_t now; struct light_ctl_state *state = model->user_data; lightness = net_buf_simple_pull_le16(buf); - temp = net_buf_simple_pull_le16(buf); - delta_uv = (s16_t) net_buf_simple_pull_le16(buf); - tid = net_buf_simple_pull_u8(buf); + temp = net_buf_simple_pull_le16(buf); if (temp < TEMP_MIN || temp > TEMP_MAX) { return; } - now = k_uptime_get(); - if (state->last_tid == tid && state->last_tx_addr == ctx->addr && - (now - state->last_msg_timestamp <= K_SECONDS(6))) { - return; - } + delta_uv = (s16_t) net_buf_simple_pull_le16(buf); + tid = net_buf_simple_pull_u8(buf); switch (buf->len) { case 0x00: /* No optional fields are available */ @@ -1803,12 +1695,6 @@ static void light_ctl_set_unack(struct bt_mesh_model *model, return; } - *ptr_counter = 0U; - k_timer_stop(ptr_timer); - - state->last_tid = tid; - state->last_tx_addr = ctx->addr; - state->last_msg_timestamp = now; state->target_lightness = lightness; if (temp < state->temp_range_min) { @@ -1820,9 +1706,15 @@ static void light_ctl_set_unack(struct bt_mesh_model *model, state->target_temp = temp; state->target_delta_uv = delta_uv; - if (state->target_lightness != state->lightness || - state->target_temp != state->temp || - state->target_delta_uv != state->delta_uv) { + if (state->target_lightness != state->last_target_lightness || + state->target_temp != state->last_target_temp || + state->target_delta_uv != state->last_target_delta_uv) { + + state->last_target_lightness = state->target_lightness; + state->last_target_temp = state->target_temp; + state->last_target_delta_uv = state->target_delta_uv; + *ptr_counter = 0U; + k_timer_stop(ptr_timer); light_ctl_tt_values(state, tt, delay); } else { light_ctl_publish(model); @@ -1848,23 +1740,17 @@ static void light_ctl_set(struct bt_mesh_model *model, u8_t tid, tt, delay; s16_t delta_uv; u16_t lightness, temp; - s64_t now; struct light_ctl_state *state = model->user_data; lightness = net_buf_simple_pull_le16(buf); - temp = net_buf_simple_pull_le16(buf); - delta_uv = (s16_t) net_buf_simple_pull_le16(buf); - tid = net_buf_simple_pull_u8(buf); + temp = net_buf_simple_pull_le16(buf); if (temp < TEMP_MIN || temp > TEMP_MAX) { return; } - now = k_uptime_get(); - if (state->last_tid == tid && state->last_tx_addr == ctx->addr && - (now - state->last_msg_timestamp <= K_SECONDS(6))) { - return; - } + delta_uv = (s16_t) net_buf_simple_pull_le16(buf); + tid = net_buf_simple_pull_u8(buf); switch (buf->len) { case 0x00: /* No optional fields are available */ @@ -1883,12 +1769,6 @@ static void light_ctl_set(struct bt_mesh_model *model, return; } - *ptr_counter = 0U; - k_timer_stop(ptr_timer); - - state->last_tid = tid; - state->last_tx_addr = ctx->addr; - state->last_msg_timestamp = now; state->target_lightness = lightness; if (temp < state->temp_range_min) { @@ -1900,9 +1780,15 @@ static void light_ctl_set(struct bt_mesh_model *model, state->target_temp = temp; state->target_delta_uv = delta_uv; - if (state->target_lightness != state->lightness || - state->target_temp != state->temp || - state->target_delta_uv != state->delta_uv) { + if (state->target_lightness != state->last_target_lightness || + state->target_temp != state->last_target_temp || + state->target_delta_uv != state->last_target_delta_uv) { + + state->last_target_lightness = state->target_lightness; + state->last_target_temp = state->target_temp; + state->last_target_delta_uv = state->target_delta_uv; + *ptr_counter = 0U; + k_timer_stop(ptr_timer); light_ctl_tt_values(state, tt, delay); } else { light_ctl_get(model, ctx, buf); @@ -2229,22 +2115,15 @@ static void light_ctl_temp_set_unack(struct bt_mesh_model *model, u8_t tid, tt, delay; s16_t delta_uv; u16_t temp; - s64_t now; struct light_ctl_state *state = model->user_data; temp = net_buf_simple_pull_le16(buf); - delta_uv = (s16_t) net_buf_simple_pull_le16(buf); - tid = net_buf_simple_pull_u8(buf); - if (temp < TEMP_MIN || temp > TEMP_MAX) { return; } - now = k_uptime_get(); - if (state->last_tid == tid && state->last_tx_addr == ctx->addr && - (now - state->last_msg_timestamp <= K_SECONDS(6))) { - return; - } + delta_uv = (s16_t) net_buf_simple_pull_le16(buf); + tid = net_buf_simple_pull_u8(buf); switch (buf->len) { case 0x00: /* No optional fields are available */ @@ -2263,13 +2142,6 @@ static void light_ctl_temp_set_unack(struct bt_mesh_model *model, return; } - *ptr_counter = 0U; - k_timer_stop(ptr_timer); - - state->last_tid = tid; - state->last_tx_addr = ctx->addr; - state->last_msg_timestamp = now; - if (temp < state->temp_range_min) { temp = state->temp_range_min; } else if (temp > state->temp_range_max) { @@ -2279,8 +2151,13 @@ static void light_ctl_temp_set_unack(struct bt_mesh_model *model, state->target_temp = temp; state->target_delta_uv = delta_uv; - if (state->target_temp != state->temp || - state->target_delta_uv != state->delta_uv) { + if (state->target_temp != state->last_target_temp || + state->target_delta_uv != state->last_target_delta_uv) { + + state->last_target_temp = state->target_temp; + state->last_target_delta_uv = state->target_delta_uv; + *ptr_counter = 0U; + k_timer_stop(ptr_timer); light_ctl_temp_tt_values(state, tt, delay); } else { light_ctl_temp_publish(model); @@ -2305,22 +2182,15 @@ static void light_ctl_temp_set(struct bt_mesh_model *model, u8_t tid, tt, delay; s16_t delta_uv; u16_t temp; - s64_t now; struct light_ctl_state *state = model->user_data; temp = net_buf_simple_pull_le16(buf); - delta_uv = (s16_t) net_buf_simple_pull_le16(buf); - tid = net_buf_simple_pull_u8(buf); - if (temp < TEMP_MIN || temp > TEMP_MAX) { return; } - now = k_uptime_get(); - if (state->last_tid == tid && state->last_tx_addr == ctx->addr && - (now - state->last_msg_timestamp <= K_SECONDS(6))) { - return; - } + delta_uv = (s16_t) net_buf_simple_pull_le16(buf); + tid = net_buf_simple_pull_u8(buf); switch (buf->len) { case 0x00: /* No optional fields are available */ @@ -2339,13 +2209,6 @@ static void light_ctl_temp_set(struct bt_mesh_model *model, return; } - *ptr_counter = 0U; - k_timer_stop(ptr_timer); - - state->last_tid = tid; - state->last_tx_addr = ctx->addr; - state->last_msg_timestamp = now; - if (temp < state->temp_range_min) { temp = state->temp_range_min; } else if (temp > state->temp_range_max) { @@ -2355,8 +2218,13 @@ static void light_ctl_temp_set(struct bt_mesh_model *model, state->target_temp = temp; state->target_delta_uv = delta_uv; - if (state->target_temp != state->temp || - state->target_delta_uv != state->delta_uv) { + if (state->target_temp != state->last_target_temp || + state->target_delta_uv != state->last_target_delta_uv) { + + state->last_target_temp = state->target_temp; + state->last_target_delta_uv = state->target_delta_uv; + *ptr_counter = 0U; + k_timer_stop(ptr_timer); light_ctl_temp_tt_values(state, tt, delay); } else { light_ctl_temp_get(model, ctx, buf); diff --git a/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/mesh/device_composition.h b/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/mesh/device_composition.h index 1e022a820917a..af126dfc23b40 100644 --- a/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/mesh/device_composition.h +++ b/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/mesh/device_composition.h @@ -29,10 +29,7 @@ struct generic_onoff_state { u8_t onoff; u8_t target_onoff; - - u8_t last_tid; - u16_t last_tx_addr; - s64_t last_msg_timestamp; + u8_t last_target_onoff; struct transition *transition; }; @@ -40,6 +37,7 @@ struct generic_onoff_state { struct generic_level_state { s16_t level; s16_t target_level; + s16_t last_target_level; s16_t last_level; s32_t last_delta; @@ -55,8 +53,6 @@ struct generic_level_state { struct generic_onpowerup_state { u8_t onpowerup; - u8_t last_tid; - u16_t last_tx_addr; }; struct gen_def_trans_time_state { @@ -65,18 +61,18 @@ struct gen_def_trans_time_state { struct vendor_state { int current; + int last; u32_t response; - u8_t last_tid; - u16_t last_tx_addr; - s64_t last_msg_timestamp; }; struct light_lightness_state { u16_t linear; u16_t target_linear; + u16_t last_target_linear; u16_t actual; u16_t target_actual; + u16_t last_target_actual; u16_t last; u16_t def; @@ -85,10 +81,6 @@ struct light_lightness_state { u16_t light_range_min; u16_t light_range_max; - u8_t last_tid; - u16_t last_tx_addr; - s64_t last_msg_timestamp; - s32_t tt_delta_actual; s32_t tt_delta_linear; @@ -98,12 +90,15 @@ struct light_lightness_state { struct light_ctl_state { u16_t lightness; u16_t target_lightness; + u16_t last_target_lightness; u16_t temp; u16_t target_temp; + u16_t last_target_temp; s16_t delta_uv; s16_t target_delta_uv; + s16_t last_target_delta_uv; u8_t status_code; u16_t temp_range_min; @@ -116,10 +111,6 @@ struct light_ctl_state { u32_t lightness_temp_last; - u8_t last_tid; - u16_t last_tx_addr; - s64_t last_msg_timestamp; - s32_t tt_delta_lightness; s32_t tt_delta_temp; s32_t tt_delta_duv; diff --git a/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/mesh/transition.c b/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/mesh/transition.c index 39c27bf97022c..468e758738cb7 100644 --- a/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/mesh/transition.c +++ b/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/mesh/transition.c @@ -19,6 +19,33 @@ struct k_timer *ptr_timer = &dummy_timer; struct transition lightness_transition, temp_transition; +void reassign_last_target_values(void) +{ + gen_onoff_srv_root_user_data.last_target_onoff = + gen_onoff_srv_root_user_data.onoff; + + gen_level_srv_root_user_data.last_target_level = + gen_level_srv_root_user_data.level; + + gen_level_srv_s0_user_data.last_target_level = + gen_level_srv_s0_user_data.level; + + light_lightness_srv_user_data.last_target_actual = + light_lightness_srv_user_data.actual; + + light_lightness_srv_user_data.last_target_linear = + light_lightness_srv_user_data.linear; + + light_ctl_srv_user_data.last_target_lightness = + light_ctl_srv_user_data.lightness; + + light_ctl_srv_user_data.last_target_temp = + light_ctl_srv_user_data.temp; + + light_ctl_srv_user_data.last_target_delta_uv = + light_ctl_srv_user_data.delta_uv; +} + /* Function to calculate Remaining Time (Start) */ void calculate_rt(struct transition *transition) @@ -624,7 +651,6 @@ K_TIMER_DEFINE(dummy_timer, NULL, NULL); void onoff_handler(struct generic_onoff_state *state) { ptr_timer = &state->transition->timer; - state->transition->just_started = true; k_timer_init(ptr_timer, onoff_tt_handler, NULL); @@ -636,7 +662,6 @@ void onoff_handler(struct generic_onoff_state *state) void level_lightness_handler(struct generic_level_state *state) { ptr_timer = &state->transition->timer; - state->transition->just_started = true; k_timer_init(ptr_timer, level_lightness_tt_handler, NULL); @@ -648,7 +673,6 @@ void level_lightness_handler(struct generic_level_state *state) void level_temp_handler(struct generic_level_state *state) { ptr_timer = &state->transition->timer; - state->transition->just_started = true; k_timer_init(ptr_timer, level_temp_tt_handler, NULL); @@ -660,7 +684,6 @@ void level_temp_handler(struct generic_level_state *state) void light_lightness_actual_handler(struct light_lightness_state *state) { ptr_timer = &state->transition->timer; - state->transition->just_started = true; k_timer_init(ptr_timer, light_lightness_actual_tt_handler, NULL); @@ -672,7 +695,6 @@ void light_lightness_actual_handler(struct light_lightness_state *state) void light_lightness_linear_handler(struct light_lightness_state *state) { ptr_timer = &state->transition->timer; - state->transition->just_started = true; k_timer_init(ptr_timer, light_lightness_linear_tt_handler, NULL); @@ -684,7 +706,6 @@ void light_lightness_linear_handler(struct light_lightness_state *state) void light_ctl_handler(struct light_ctl_state *state) { ptr_timer = &state->transition->timer; - state->transition->just_started = true; k_timer_init(ptr_timer, light_ctl_tt_handler, NULL); @@ -696,7 +717,6 @@ void light_ctl_handler(struct light_ctl_state *state) void light_ctl_temp_handler(struct light_ctl_state *state) { ptr_timer = &state->transition->timer; - state->transition->just_started = true; k_timer_init(ptr_timer, light_ctl_temp_tt_handler, NULL); diff --git a/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/mesh/transition.h b/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/mesh/transition.h index b16e49b401287..32320c6d280fe 100644 --- a/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/mesh/transition.h +++ b/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/mesh/transition.h @@ -42,6 +42,7 @@ extern struct transition lightness_transition, temp_transition; extern struct k_timer dummy_timer; +void reassign_last_target_values(void); void calculate_rt(struct transition *transition); diff --git a/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/storage.c b/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/storage.c index 66d5b228c1fe7..4ff5f179b8694 100644 --- a/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/storage.c +++ b/samples/boards/nrf52/mesh/onoff_level_lighting_vnd_app/src/storage.c @@ -89,7 +89,7 @@ static int ps_set(int argc, char **argv, void *val_ctx) { int len = 0; - if (argc != 1) { + if (argc == 1) { if (!strcmp(argv[0], "rc")) { len = settings_val_read_cb(val_ctx, &reset_counter, sizeof(reset_counter));