blob: 3ad79012a5f4dc789ca44f48e8fd62d4346e418e [file] [log] [blame]
/* Bluetooth: Mesh Generic OnOff, Generic Level, Lighting & Vendor Models
*
* Copyright (c) 2018 Vikrant More
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "ble_mesh.h"
#include "device_composition.h"
#include "storage.h"
static u8_t storage_id;
u8_t reset_counter;
static void save_reset_counter(void)
{
settings_save_one("ps/rc", &reset_counter, sizeof(reset_counter));
}
static void save_gen_def_trans_time_state(void)
{
settings_save_one("ps/gdtt", &gen_def_trans_time_srv_user_data.tt,
sizeof(gen_def_trans_time_srv_user_data.tt));
}
static void save_gen_onpowerup_state(void)
{
settings_save_one("ps/gpo", &gen_power_onoff_srv_user_data.onpowerup,
sizeof(gen_power_onoff_srv_user_data.onpowerup));
if (gen_power_onoff_srv_user_data.onpowerup == 0x02) {
save_on_flash(LIGHTNESS_TEMP_LAST_STATE);
}
}
static void save_lightness_temp_def_state(void)
{
light_ctl_srv_user_data.lightness_temp_def =
(u32_t) ((light_ctl_srv_user_data.lightness_def << 16) |
light_ctl_srv_user_data.temp_def);
settings_save_one("ps/ltd", &light_ctl_srv_user_data.lightness_temp_def,
sizeof(light_ctl_srv_user_data.lightness_temp_def));
}
static void save_lightness_temp_last_state(void)
{
light_ctl_srv_user_data.lightness_temp_last =
(u32_t) ((light_ctl_srv_user_data.lightness << 16) |
light_ctl_srv_user_data.temp);
settings_save_one("ps/ltl",
&light_ctl_srv_user_data.lightness_temp_last,
sizeof(light_ctl_srv_user_data.lightness_temp_last));
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) {
case RESET_COUNTER:
save_reset_counter();
break;
case GEN_DEF_TRANS_TIME_STATE:
save_gen_def_trans_time_state();
break;
case GEN_ONPOWERUP_STATE:
save_gen_onpowerup_state();
break;
case LIGHTNESS_TEMP_DEF_STATE:
save_lightness_temp_def_state();
break;
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;
}
}
K_WORK_DEFINE(storage_work, storage_work_handler);
void save_on_flash(u8_t id)
{
storage_id = id;
k_work_submit(&storage_work);
}
static int ps_set(int argc, char **argv, void *val_ctx)
{
int len = 0;
if (argc == 1) {
if (!strcmp(argv[0], "rc")) {
len = settings_val_read_cb(val_ctx, &reset_counter,
sizeof(reset_counter));
}
if (!strcmp(argv[0], "gdtt")) {
len = settings_val_read_cb(
val_ctx,
&gen_def_trans_time_srv_user_data.tt,
sizeof(gen_def_trans_time_srv_user_data.tt));
}
if (!strcmp(argv[0], "gpo")) {
len = settings_val_read_cb(
val_ctx,
&gen_power_onoff_srv_user_data.onpowerup,
sizeof(gen_power_onoff_srv_user_data.onpowerup));
}
if (!strcmp(argv[0], "ltd")) {
len = settings_val_read_cb(
val_ctx,
&light_ctl_srv_user_data.lightness_temp_def,
sizeof(light_ctl_srv_user_data.lightness_temp_def));
}
if (!strcmp(argv[0], "ltl")) {
len = settings_val_read_cb(
val_ctx,
&light_ctl_srv_user_data.lightness_temp_last,
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;
}
return -ENOENT;
}
static struct settings_handler ps_settings = {
.name = "ps",
.h_set = ps_set,
};
int ps_settings_init(void)
{
int err;
err = settings_subsys_init();
if (err) {
printk("settings_subsys_init failed (err %d)", err);
return err;
}
err = settings_register(&ps_settings);
if (err) {
printk("ps_settings_register failed (err %d)", err);
return err;
}
return 0;
}