samples: mesh: feature to save Lightness & Temp. Range on Flash

With this commit, it is now possible to save Lightness &
temperature Range values on SoC flash.

Signed-off-by: Vikrant More <vikrant8051@gmail.com>
This commit is contained in:
Vikrant More 2019-01-13 18:26:47 +05:30 committed by Johan Hedberg
commit a61f7c39aa
5 changed files with 83 additions and 14 deletions

View file

@ -51,6 +51,8 @@ static void light_default_status_init(void)
gen_onoff_srv_root_user_data.onoff = STATE_OFF;
}
/* Retrieve Default Lightness & Temperature Values */
if (light_ctl_srv_user_data.lightness_temp_def) {
light_ctl_srv_user_data.lightness_def = (u16_t)
(light_ctl_srv_user_data.lightness_temp_def >> 16);
@ -64,6 +66,24 @@ static void light_default_status_init(void)
light_ctl_srv_user_data.temp = light_ctl_srv_user_data.temp_def;
/* Retrieve Range of Lightness & Temperature */
if (light_lightness_srv_user_data.lightness_range) {
light_lightness_srv_user_data.light_range_max = (u16_t)
(light_lightness_srv_user_data.lightness_range >> 16);
light_lightness_srv_user_data.light_range_min = (u16_t)
(light_lightness_srv_user_data.lightness_range);
}
if (light_ctl_srv_user_data.temperature_range) {
light_ctl_srv_user_data.temp_range_max = (u16_t)
(light_ctl_srv_user_data.temperature_range >> 16);
light_ctl_srv_user_data.temp_range_min = (u16_t)
(light_ctl_srv_user_data.temperature_range);
}
switch (gen_power_onoff_srv_user_data.onpowerup) {
case STATE_OFF:
gen_onoff_srv_root_user_data.onoff = STATE_OFF;

View file

@ -1657,14 +1657,14 @@ static bool light_lightness_range_setunack(struct bt_mesh_model *model,
if (min <= max) {
state->status_code = RANGE_SUCCESSFULLY_UPDATED;
state->light_range_min = min;
state->light_range_max = max;
if (state->light_range_min != min ||
state->light_range_max != max) {
/* Do some work here to save values of
* state->light_range_min &
* state->light_range_max
* on SoC flash
*/
state->light_range_min = min;
state->light_range_max = max;
save_on_flash(LIGHTNESS_RANGE);
}
} else {
/* The provided value for Range Max cannot be set */
state->status_code = CANNOT_SET_RANGE_MAX;
@ -2127,13 +2127,15 @@ static bool light_ctl_temp_range_setunack(struct bt_mesh_model *model,
if (min <= max) {
state->status_code = RANGE_SUCCESSFULLY_UPDATED;
state->temp_range_min = min;
state->temp_range_max = max;
/* Do some work here to save values of
* state->temp_range_min & state->temp_range_min
* on SoC flash
*/
if (state->temp_range_min != min ||
state->temp_range_max != max) {
state->temp_range_min = min;
state->temp_range_max = max;
save_on_flash(TEMPERATURE_RANGE);
}
} else {
/* The provided value for Range Max cannot be set */
state->status_code = CANNOT_SET_RANGE_MAX;

View file

@ -87,6 +87,7 @@ struct light_lightness_state {
u8_t status_code;
u16_t light_range_min;
u16_t light_range_max;
u32_t lightness_range;
u8_t last_tid;
u16_t last_src_addr;
@ -112,6 +113,7 @@ struct light_ctl_state {
u8_t status_code;
u16_t temp_range_min;
u16_t temp_range_max;
u32_t temperature_range;
u16_t lightness_def;
u16_t temp_def;

View file

@ -56,6 +56,29 @@ static void save_lightness_temp_last_state(void)
printk("Light CTL Last values have beed saved !!\n");
}
static void save_lightness_range(void)
{
light_lightness_srv_user_data.lightness_range =
(u32_t) ((light_lightness_srv_user_data.light_range_max << 16) |
light_lightness_srv_user_data.light_range_min);
settings_save_one("ps/lr",
&light_lightness_srv_user_data.lightness_range,
sizeof(light_lightness_srv_user_data.lightness_range)
);
}
static void save_temperature_range(void)
{
light_ctl_srv_user_data.temperature_range =
(u32_t) ((light_ctl_srv_user_data.temp_range_max << 16) |
light_ctl_srv_user_data.temp_range_min);
settings_save_one("ps/tr",
&light_ctl_srv_user_data.temperature_range,
sizeof(light_ctl_srv_user_data.temperature_range));
}
static void storage_work_handler(struct k_work *work)
{
switch (storage_id) {
@ -74,6 +97,12 @@ static void storage_work_handler(struct k_work *work)
case LIGHTNESS_TEMP_LAST_STATE:
save_lightness_temp_last_state();
break;
case LIGHTNESS_RANGE:
save_lightness_range();
break;
case TEMPERATURE_RANGE:
save_temperature_range();
break;
}
}
@ -123,6 +152,20 @@ static int ps_set(int argc, char **argv, void *val_ctx)
sizeof(light_ctl_srv_user_data.lightness_temp_last));
}
if (!strcmp(argv[0], "lr")) {
len = settings_val_read_cb(
val_ctx,
&light_lightness_srv_user_data.lightness_range,
sizeof(light_lightness_srv_user_data.lightness_range));
}
if (!strcmp(argv[0], "tr")) {
len = settings_val_read_cb(
val_ctx,
&light_ctl_srv_user_data.temperature_range,
sizeof(light_ctl_srv_user_data.temperature_range));
}
return (len < 0) ? len : 0;
}

View file

@ -13,7 +13,9 @@ enum ps_variables_id {
GEN_DEF_TRANS_TIME_STATE,
GEN_ONPOWERUP_STATE,
LIGHTNESS_TEMP_DEF_STATE,
LIGHTNESS_TEMP_LAST_STATE
LIGHTNESS_TEMP_LAST_STATE,
LIGHTNESS_RANGE,
TEMPERATURE_RANGE
};
extern u8_t reset_counter;