Commit 24304436 authored by Vikrant More's avatar Vikrant More Committed by Johan Hedberg
Browse files

samples: mesh: single timer to handle all transitions



This commit upgrade the implementation to reduce complexity in
algorithm. Previously there was different timers for lightness
as well as temperature transitions. But at time only single
transition is remain activated & hence there is no need
of multiple timer for each entiity.

Signed-off-by: default avatarVikrant More <vikrant8051@gmail.com>
parent 9cea26ae
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -110,8 +110,8 @@ static void light_default_status_init(void)

	default_tt = gen_def_trans_time_srv_user_data.tt;

	target_lightness = lightness;
	target_temperature = temperature;
	init_lightness_target_values();
	init_temp_target_values();
}

void update_led_gpio(void)
+117 −21
Original line number Diff line number Diff line
@@ -72,11 +72,11 @@ BT_MESH_MODEL_PUB_DEFINE(gen_level_cli_pub_s0, NULL, 2 + 7);

/* Definitions of models user data (Start) */
struct generic_onoff_state gen_onoff_srv_root_user_data = {
	.transition = &lightness_transition,
	.transition = &transition,
};

struct generic_level_state gen_level_srv_root_user_data = {
	.transition = &lightness_transition,
	.transition = &transition,
};

struct gen_def_trans_time_state gen_def_trans_time_srv_user_data;
@@ -84,17 +84,17 @@ struct gen_def_trans_time_state gen_def_trans_time_srv_user_data;
struct generic_onpowerup_state gen_power_onoff_srv_user_data;

struct light_lightness_state light_lightness_srv_user_data = {
	.transition = &lightness_transition,
	.transition = &transition,
};

struct light_ctl_state light_ctl_srv_user_data = {
	.transition = &lightness_transition,
	.transition = &transition,
};

struct vendor_state vnd_user_data;

struct generic_level_state gen_level_srv_s0_user_data = {
	.transition = &temp_transition,
	.transition = &transition,
};
/* Definitions of models user data (End) */

@@ -113,12 +113,17 @@ static void gen_onoff_get(struct bt_mesh_model *model,
	bt_mesh_model_msg_init(msg, BT_MESH_MODEL_OP_GEN_ONOFF_STATUS);
	net_buf_simple_add_u8(msg, state->onoff);

	if (lightness == target_lightness) {
		goto send;
	}

	if (state->transition->counter) {
		calculate_rt(state->transition);
		net_buf_simple_add_u8(msg, state->target_onoff);
		net_buf_simple_add_u8(msg, state->transition->rt);
	}

send:
	if (bt_mesh_model_send(model, ctx, msg, NULL, NULL)) {
		printk("Unable to send GEN_ONOFF_SRV Status response\n");
	}
@@ -137,12 +142,17 @@ void gen_onoff_publish(struct bt_mesh_model *model)
	bt_mesh_model_msg_init(msg, BT_MESH_MODEL_OP_GEN_ONOFF_STATUS);
	net_buf_simple_add_u8(msg, state->onoff);

	if (lightness == target_lightness) {
		goto publish;
	}

	if (state->transition->counter) {
		calculate_rt(state->transition);
		net_buf_simple_add_u8(msg, state->target_onoff);
		net_buf_simple_add_u8(msg, state->transition->rt);
	}

publish:
	err = bt_mesh_model_publish(model);
	if (err) {
		printk("bt_mesh_model_publish err %d\n", err);
@@ -197,9 +207,11 @@ static void gen_onoff_set_unack(struct bt_mesh_model *model,
	state->last_dst_addr = ctx->recv_dst;
	state->last_msg_timestamp = now;
	state->target_onoff = onoff;
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (state->target_onoff != state->onoff) {
		onoff_tt_values(state, tt, delay);
		onoff_tt_values(state);
	} else {
		gen_onoff_publish(model);
		return;
@@ -264,9 +276,11 @@ static void gen_onoff_set(struct bt_mesh_model *model,
	state->last_dst_addr = ctx->recv_dst;
	state->last_msg_timestamp = now;
	state->target_onoff = onoff;
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (state->target_onoff != state->onoff) {
		onoff_tt_values(state, tt, delay);
		onoff_tt_values(state);
	} else {
		gen_onoff_get(model, ctx, buf);
		gen_onoff_publish(model);
@@ -309,12 +323,17 @@ static void gen_level_get(struct bt_mesh_model *model,
	bt_mesh_model_msg_init(msg, BT_MESH_MODEL_OP_GEN_LEVEL_STATUS);
	net_buf_simple_add_le16(msg, state->level);

	if (state->level == state->target_level) {
		goto send;
	}

	if (state->transition->counter) {
		calculate_rt(state->transition);
		net_buf_simple_add_le16(msg, state->target_level);
		net_buf_simple_add_u8(msg, state->transition->rt);
	}

send:
	if (bt_mesh_model_send(model, ctx, msg, NULL, NULL)) {
		printk("Unable to send GEN_LEVEL_SRV Status response\n");
	}
@@ -333,12 +352,17 @@ void gen_level_publish(struct bt_mesh_model *model)
	bt_mesh_model_msg_init(msg, BT_MESH_MODEL_OP_GEN_LEVEL_STATUS);
	net_buf_simple_add_le16(msg, state->level);

	if (state->level == state->target_level) {
		goto publish;
	}

	if (state->transition->counter) {
		calculate_rt(state->transition);
		net_buf_simple_add_le16(msg, state->target_level);
		net_buf_simple_add_u8(msg, state->transition->rt);
	}

publish:
	err = bt_mesh_model_publish(model);
	if (err) {
		printk("bt_mesh_model_publish err %d\n", err);
@@ -390,9 +414,11 @@ static void gen_level_set_unack(struct bt_mesh_model *model,
	state->last_dst_addr = ctx->recv_dst;
	state->last_msg_timestamp = now;
	state->target_level = level;
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (state->target_level != state->level) {
		level_tt_values(state, tt, delay);
		level_tt_values(state);
	} else {
		gen_level_publish(model);
		return;
@@ -463,9 +489,11 @@ static void gen_level_set(struct bt_mesh_model *model,
	state->last_dst_addr = ctx->recv_dst;
	state->last_msg_timestamp = now;
	state->target_level = level;
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (state->target_level != state->level) {
		level_tt_values(state, tt, delay);
		level_tt_values(state);
	} else {
		gen_level_get(model, ctx, buf);
		gen_level_publish(model);
@@ -553,9 +581,11 @@ static void gen_delta_set_unack(struct bt_mesh_model *model,
	}

	state->target_level = tmp32;
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (state->target_level != state->level) {
		level_tt_values(state, tt, delay);
		level_tt_values(state);
	} else {
		gen_level_publish(model);
		return;
@@ -643,9 +673,11 @@ static void gen_delta_set(struct bt_mesh_model *model,
	}

	state->target_level = tmp32;
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (state->target_level != state->level) {
		level_tt_values(state, tt, delay);
		level_tt_values(state);
	} else {
		gen_level_get(model, ctx, buf);
		gen_level_publish(model);
@@ -781,9 +813,11 @@ static void gen_move_set_unack(struct bt_mesh_model *model,
	}

	state->target_level = tmp32;
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (state->target_level != state->level) {
		level_tt_values(state, tt, delay);
		level_tt_values(state);
	} else {
		gen_level_move_publish(model);
		return;
@@ -863,9 +897,11 @@ static void gen_move_set(struct bt_mesh_model *model,
	}

	state->target_level = tmp32;
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (state->target_level != state->level) {
		level_tt_values(state, tt, delay);
		level_tt_values(state);
	} else {
		gen_level_move_get(model, ctx, buf);
		gen_level_move_publish(model);
@@ -1167,12 +1203,17 @@ static void light_lightness_get(struct bt_mesh_model *model,
	bt_mesh_model_msg_init(msg, BT_MESH_MODEL_LIGHT_LIGHTNESS_STATUS);
	net_buf_simple_add_le16(msg, state->actual);

	if (state->actual == state->target_actual) {
		goto send;
	}

	if (state->transition->counter) {
		calculate_rt(state->transition);
		net_buf_simple_add_le16(msg, state->target_actual);
		net_buf_simple_add_u8(msg, state->transition->rt);
	}

send:
	if (bt_mesh_model_send(model, ctx, msg, NULL, NULL)) {
		printk("Unable to send LightLightnessAct Status response\n");
	}
@@ -1191,12 +1232,17 @@ void light_lightness_publish(struct bt_mesh_model *model)
	bt_mesh_model_msg_init(msg, BT_MESH_MODEL_LIGHT_LIGHTNESS_STATUS);
	net_buf_simple_add_le16(msg, state->actual);

	if (state->actual == state->target_actual) {
		goto publish;
	}

	if (state->transition->counter) {
		calculate_rt(state->transition);
		net_buf_simple_add_le16(msg, state->target_actual);
		net_buf_simple_add_u8(msg, state->transition->rt);
	}

publish:
	err = bt_mesh_model_publish(model);
	if (err) {
		printk("bt_mesh_model_publish err %d\n", err);
@@ -1255,9 +1301,11 @@ static void light_lightness_set_unack(struct bt_mesh_model *model,
	}

	state->target_actual = actual;
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (state->target_actual != state->actual) {
		light_lightness_actual_tt_values(state, tt, delay);
		light_lightness_actual_tt_values(state);
	} else {
		light_lightness_publish(model);
		return;
@@ -1326,9 +1374,11 @@ static void light_lightness_set(struct bt_mesh_model *model,
	}

	state->target_actual = actual;
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (state->target_actual != state->actual) {
		light_lightness_actual_tt_values(state, tt, delay);
		light_lightness_actual_tt_values(state);
	} else {
		light_lightness_get(model, ctx, buf);
		light_lightness_publish(model);
@@ -1357,12 +1407,17 @@ static void light_lightness_linear_get(struct bt_mesh_model *model,
			       BT_MESH_MODEL_LIGHT_LIGHTNESS_LINEAR_STATUS);
	net_buf_simple_add_le16(msg, state->linear);

	if (state->linear == state->target_linear) {
		goto send;
	}

	if (state->transition->counter) {
		calculate_rt(state->transition);
		net_buf_simple_add_le16(msg, state->target_linear);
		net_buf_simple_add_u8(msg, state->transition->rt);
	}

send:
	if (bt_mesh_model_send(model, ctx, msg, NULL, NULL)) {
		printk("Unable to send LightLightnessLin Status response\n");
	}
@@ -1382,12 +1437,17 @@ void light_lightness_linear_publish(struct bt_mesh_model *model)
			       BT_MESH_MODEL_LIGHT_LIGHTNESS_LINEAR_STATUS);
	net_buf_simple_add_le16(msg, state->linear);

	if (state->linear == state->target_linear) {
		goto publish;
	}

	if (state->transition->counter) {
		calculate_rt(state->transition);
		net_buf_simple_add_le16(msg, state->target_linear);
		net_buf_simple_add_u8(msg, state->transition->rt);
	}

publish:
	err = bt_mesh_model_publish(model);
	if (err) {
		printk("bt_mesh_model_publish err %d\n", err);
@@ -1439,9 +1499,11 @@ static void light_lightness_linear_set_unack(struct bt_mesh_model *model,
	state->last_dst_addr = ctx->recv_dst;
	state->last_msg_timestamp = now;
	state->target_linear = linear;
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (state->target_linear != state->linear) {
		light_lightness_linear_tt_values(state, tt, delay);
		light_lightness_linear_tt_values(state);
	} else {
		light_lightness_linear_publish(model);
		return;
@@ -1503,9 +1565,11 @@ static void light_lightness_linear_set(struct bt_mesh_model *model,
	state->last_dst_addr = ctx->recv_dst;
	state->last_msg_timestamp = now;
	state->target_linear = linear;
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (state->target_linear != state->linear) {
		light_lightness_linear_tt_values(state, tt, delay);
		light_lightness_linear_tt_values(state);
	} else {
		light_lightness_linear_get(model, ctx, buf);
		light_lightness_linear_publish(model);
@@ -1768,6 +1832,11 @@ static void light_ctl_get(struct bt_mesh_model *model,
	net_buf_simple_add_le16(msg, state->lightness);
	net_buf_simple_add_le16(msg, state->temp);

	if (state->lightness == state->target_lightness &&
	    state->temp == state->target_temp) {
		goto send;
	}

	if (state->transition->counter) {
		calculate_rt(state->transition);
		net_buf_simple_add_le16(msg, state->target_lightness);
@@ -1775,6 +1844,7 @@ static void light_ctl_get(struct bt_mesh_model *model,
		net_buf_simple_add_u8(msg, state->transition->rt);
	}

send:
	if (bt_mesh_model_send(model, ctx, msg, NULL, NULL)) {
		printk("Unable to send LightCTL Status response\n");
	}
@@ -1798,6 +1868,11 @@ void light_ctl_publish(struct bt_mesh_model *model)
	net_buf_simple_add_le16(msg, state->lightness);
	net_buf_simple_add_le16(msg, state->temp);

	if (state->lightness == state->target_lightness &&
	    state->temp == state->target_temp) {
		goto publish;
	}

	if (state->transition->counter) {
		calculate_rt(state->transition);
		net_buf_simple_add_le16(msg, state->target_lightness);
@@ -1805,6 +1880,7 @@ void light_ctl_publish(struct bt_mesh_model *model)
		net_buf_simple_add_u8(msg, state->transition->rt);
	}

publish:
	err = bt_mesh_model_publish(model);
	if (err) {
		printk("bt_mesh_model_publish err %d\n", err);
@@ -1872,11 +1948,13 @@ static void light_ctl_set_unack(struct bt_mesh_model *model,

	state->target_temp = temp;
	state->target_delta_uv = delta_uv;
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (state->target_lightness != state->lightness ||
	    state->target_temp != state->temp ||
	    state->target_delta_uv != state->delta_uv) {
		light_ctl_tt_values(state, tt, delay);
		light_ctl_tt_values(state);
	} else {
		light_ctl_publish(model);
		return;
@@ -1956,11 +2034,13 @@ static void light_ctl_set(struct bt_mesh_model *model,

	state->target_temp = temp;
	state->target_delta_uv = delta_uv;
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (state->target_lightness != state->lightness ||
	    state->target_temp != state->temp ||
	    state->target_delta_uv != state->delta_uv) {
		light_ctl_tt_values(state, tt, delay);
		light_ctl_tt_values(state);
	} else {
		light_ctl_get(model, ctx, buf);
		light_ctl_publish(model);
@@ -2242,6 +2322,11 @@ static void light_ctl_temp_get(struct bt_mesh_model *model,
	net_buf_simple_add_le16(msg, state->temp);
	net_buf_simple_add_le16(msg, state->delta_uv);

	if (state->temp == state->target_temp &&
	    state->delta_uv == state->target_delta_uv) {
		goto send;
	}

	if (state->transition->counter) {
		calculate_rt(state->transition);
		net_buf_simple_add_le16(msg, state->target_temp);
@@ -2249,6 +2334,7 @@ static void light_ctl_temp_get(struct bt_mesh_model *model,
		net_buf_simple_add_u8(msg, state->transition->rt);
	}

send:
	if (bt_mesh_model_send(model, ctx, msg, NULL, NULL)) {
		printk("Unable to send LightCTL Temp. Status response\n");
	}
@@ -2268,6 +2354,11 @@ void light_ctl_temp_publish(struct bt_mesh_model *model)
	net_buf_simple_add_le16(msg, state->temp);
	net_buf_simple_add_le16(msg, state->delta_uv);

	if (state->temp == state->target_temp &&
	    state->delta_uv == state->target_delta_uv) {
		goto publish;
	}

	if (state->transition->counter) {
		calculate_rt(state->transition);
		net_buf_simple_add_le16(msg, state->target_temp);
@@ -2275,6 +2366,7 @@ void light_ctl_temp_publish(struct bt_mesh_model *model)
		net_buf_simple_add_u8(msg, state->transition->rt);
	}

publish:
	err = bt_mesh_model_publish(model);
	if (err) {
		printk("bt_mesh_model_publish err %d\n", err);
@@ -2340,10 +2432,12 @@ static void light_ctl_temp_set_unack(struct bt_mesh_model *model,

	state->target_temp = temp;
	state->target_delta_uv = delta_uv;
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (state->target_temp != state->temp ||
	    state->target_delta_uv != state->delta_uv) {
		light_ctl_temp_tt_values(state, tt, delay);
		light_ctl_temp_tt_values(state);
	} else {
		light_ctl_temp_publish(model);
		return;
@@ -2420,10 +2514,12 @@ static void light_ctl_temp_set(struct bt_mesh_model *model,

	state->target_temp = temp;
	state->target_delta_uv = delta_uv;
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (state->target_temp != state->temp ||
	    state->target_delta_uv != state->delta_uv) {
		light_ctl_temp_tt_values(state, tt, delay);
		light_ctl_temp_tt_values(state);
	} else {
		light_ctl_temp_get(model, ctx, buf);
		light_ctl_temp_publish(model);
+28 −0
Original line number Diff line number Diff line
@@ -224,6 +224,26 @@ jump:
	readjust_lightness();
}

void init_lightness_target_values(void)
{
	target_lightness = lightness;

	if (target_lightness) {
		gen_onoff_srv_root_user_data.target_onoff = STATE_ON;
	} else {
		gen_onoff_srv_root_user_data.target_onoff = STATE_OFF;
	}

	gen_level_srv_root_user_data.target_level = target_lightness - 32768;

	light_lightness_srv_user_data.target_actual = target_lightness;

	light_lightness_srv_user_data.target_linear =
		actual_to_linear(target_lightness);

	light_ctl_srv_user_data.target_lightness = target_lightness;
}

void calculate_lightness_target_values(u8_t type)
{
	u16_t tmp;
@@ -277,6 +297,14 @@ void calculate_lightness_target_values(u8_t type)
	light_ctl_srv_user_data.target_lightness = target_lightness;
}

void init_temp_target_values(void)
{
	target_temperature = temperature;
	gen_level_srv_s0_user_data.target_level = target_temperature;
	light_ctl_srv_user_data.target_temp =
			level_to_light_ctl_temp(target_temperature);
}

void calculate_temp_target_values(u8_t type)
{
	bool set_light_ctl_delta_uv_target_value;
+4 −0
Original line number Diff line number Diff line
@@ -30,7 +30,11 @@ extern s16_t temperature, target_temperature;
void readjust_lightness(void);
void readjust_temperature(void);
void state_binding(u8_t lightness, u8_t temperature);

void init_lightness_target_values(void);
void calculate_lightness_target_values(u8_t type);

void init_temp_target_values(void);
void calculate_temp_target_values(u8_t type);

#endif
+7 −52
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@ u8_t transition_type, default_tt;
u32_t *ptr_counter;
struct k_timer *ptr_timer = &dummy_timer;

struct transition lightness_transition, temp_transition;
struct transition transition;

/* Function to calculate Remaining Time (Start) */

@@ -61,29 +61,6 @@ void calculate_rt(struct transition *transition)

/* Function to calculate Remaining Time (End) */

static void bound_states_transition_type_reassignment(u8_t type)
{
	switch (type) {
	case ONOFF:
	case LEVEL:
	case ACTUAL:
	case LINEAR:
		light_ctl_srv_user_data.transition = &lightness_transition;
		break;
	case CTL:
		light_ctl_srv_user_data.transition = &lightness_transition;
		gen_level_srv_s0_user_data.transition = &lightness_transition;
		break;
	case LEVEL_TEMP:
	case CTL_TEMP:
		gen_level_srv_s0_user_data.transition = &temp_transition;
		light_ctl_srv_user_data.transition = &temp_transition;
		break;
	default:
		break;
	}
}

static bool tt_values_calculator(struct transition *transition)
{
	u8_t steps_multiplier, resolution;
@@ -119,12 +96,9 @@ static bool tt_values_calculator(struct transition *transition)
	return true;
}

void onoff_tt_values(struct generic_onoff_state *state, u8_t tt, u8_t delay)
void onoff_tt_values(struct generic_onoff_state *state)
{
	bound_states_transition_type_reassignment(ONOFF);
	calculate_lightness_target_values(ONOFF);
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (!tt_values_calculator(state->transition)) {
		return;
@@ -137,17 +111,13 @@ void onoff_tt_values(struct generic_onoff_state *state, u8_t tt, u8_t delay)
			   state->transition->counter);
}

void level_tt_values(struct generic_level_state *state, u8_t tt, u8_t delay)
void level_tt_values(struct generic_level_state *state)
{
	if (state == &gen_level_srv_root_user_data) {
		bound_states_transition_type_reassignment(LEVEL);
		calculate_lightness_target_values(LEVEL);
	} else if (state == &gen_level_srv_s0_user_data) {
		bound_states_transition_type_reassignment(LEVEL_TEMP);
		calculate_temp_target_values(LEVEL_TEMP);
	}
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (!tt_values_calculator(state->transition)) {
		return;
@@ -160,13 +130,9 @@ void level_tt_values(struct generic_level_state *state, u8_t tt, u8_t delay)
			   state->transition->counter);
}

void light_lightness_actual_tt_values(struct light_lightness_state *state,
				      u8_t tt, u8_t delay)
void light_lightness_actual_tt_values(struct light_lightness_state *state)
{
	bound_states_transition_type_reassignment(ACTUAL);
	calculate_lightness_target_values(ACTUAL);
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (!tt_values_calculator(state->transition)) {
		return;
@@ -180,13 +146,9 @@ void light_lightness_actual_tt_values(struct light_lightness_state *state,
		 state->transition->counter);
}

void light_lightness_linear_tt_values(struct light_lightness_state *state,
				      u8_t tt, u8_t delay)
void light_lightness_linear_tt_values(struct light_lightness_state *state)
{
	bound_states_transition_type_reassignment(LINEAR);
	calculate_lightness_target_values(LINEAR);
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (!tt_values_calculator(state->transition)) {
		return;
@@ -200,12 +162,9 @@ void light_lightness_linear_tt_values(struct light_lightness_state *state,
		 state->transition->counter);
}

void light_ctl_tt_values(struct light_ctl_state *state, u8_t tt, u8_t delay)
void light_ctl_tt_values(struct light_ctl_state *state)
{
	bound_states_transition_type_reassignment(CTL);
	calculate_lightness_target_values(CTL);
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (!tt_values_calculator(state->transition)) {
		return;
@@ -227,13 +186,9 @@ void light_ctl_tt_values(struct light_ctl_state *state, u8_t tt, u8_t delay)
		 state->transition->counter);
}

void light_ctl_temp_tt_values(struct light_ctl_state *state,
			      u8_t tt, u8_t delay)
void light_ctl_temp_tt_values(struct light_ctl_state *state)
{
	bound_states_transition_type_reassignment(CTL_TEMP);
	calculate_temp_target_values(CTL_TEMP);
	state->transition->tt = tt;
	state->transition->delay = delay;

	if (!tt_values_calculator(state->transition)) {
		return;
Loading