/*
|
* Licensed to the Apache Software Foundation (ASF) under one
|
* or more contributor license agreements. See the NOTICE file
|
* distributed with this work for additional information
|
* regarding copyright ownership. The ASF licenses this file
|
* to you under the Apache License, Version 2.0 (the
|
* "License"); you may not use this file except in compliance
|
* with the License. You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing,
|
* software distributed under the License is distributed on an
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
* KIND, either express or implied. See the License for the
|
* specific language governing permissions and limitations
|
* under the License.
|
*/
|
|
/* Bluetooth: Mesh Generic OnOff, Generic Level, Lighting & Vendor Models
|
*
|
* Copyright (c) 2018 Vikrant More
|
*
|
* SPDX-License-Identifier: Apache-2.0
|
*/
|
|
#include "base64/base64.h"
|
#include "console/console.h"
|
#include "mesh/mesh.h"
|
|
#include "ble_mesh.h"
|
#include "device_composition.h"
|
#include "storage.h"
|
|
static uint8_t storage_id;
|
uint8_t reset_counter;
|
|
static void save_reset_counter(void)
|
{
|
char buf[5];
|
|
settings_str_from_bytes(&reset_counter, sizeof(reset_counter), buf,
|
sizeof(buf));
|
|
settings_save_one("ps/rc", buf);
|
}
|
|
static void save_gen_def_trans_time_state(void)
|
{
|
char buf[5];
|
|
settings_str_from_bytes(&gen_def_trans_time_srv_user_data.tt,
|
sizeof(gen_def_trans_time_srv_user_data.tt),
|
buf, sizeof(buf));
|
|
settings_save_one("ps/gdtt", buf);
|
}
|
|
static void save_gen_onpowerup_state(void)
|
{
|
char buf[5];
|
|
settings_str_from_bytes(&gen_power_onoff_srv_user_data.onpowerup,
|
sizeof(gen_power_onoff_srv_user_data.onpowerup),
|
buf, sizeof(buf));
|
|
settings_save_one("ps/gpo", buf);
|
|
if (gen_power_onoff_srv_user_data.onpowerup == 0x02) {
|
save_on_flash(LIGHTNESS_TEMP_LAST_STATE);
|
}
|
}
|
|
static void save_lightness_temp_def_state(void)
|
{
|
char buf[12];
|
|
light_ctl_srv_user_data.lightness_temp_def =
|
(uint32_t) ((light_ctl_srv_user_data.lightness_def << 16) |
|
light_ctl_srv_user_data.temp_def);
|
|
settings_str_from_bytes(&light_ctl_srv_user_data.lightness_temp_def,
|
sizeof(light_ctl_srv_user_data.lightness_temp_def),
|
buf, sizeof(buf));
|
|
settings_save_one("ps/ltd", buf);
|
}
|
|
static void save_lightness_temp_last_state(void)
|
{
|
char buf[12];
|
|
light_ctl_srv_user_data.lightness_temp_last =
|
(uint32_t) ((light_ctl_srv_user_data.lightness << 16) |
|
light_ctl_srv_user_data.temp);
|
|
settings_str_from_bytes(&light_ctl_srv_user_data.lightness_temp_last,
|
sizeof(light_ctl_srv_user_data.lightness_temp_last),
|
buf, sizeof(buf));
|
|
settings_save_one("ps/ltl", buf);
|
|
printk("Light CTL Last values have beed saved !!\n");
|
}
|
|
static void save_lightness_range(void)
|
{
|
char buf[12];
|
|
light_lightness_srv_user_data.lightness_range =
|
(uint32_t) ((light_lightness_srv_user_data.light_range_max << 16) |
|
light_lightness_srv_user_data.light_range_min);
|
|
settings_str_from_bytes(&light_lightness_srv_user_data.lightness_range,
|
sizeof(light_lightness_srv_user_data.lightness_range),
|
buf, sizeof(buf));
|
|
settings_save_one("ps/lr", buf);
|
}
|
|
static void save_temperature_range(void)
|
{
|
char buf[12];
|
|
light_ctl_srv_user_data.temperature_range =
|
(uint32_t) ((light_ctl_srv_user_data.temp_range_max << 16) |
|
light_ctl_srv_user_data.temp_range_min);
|
|
settings_str_from_bytes(&light_ctl_srv_user_data.temperature_range,
|
sizeof(light_ctl_srv_user_data.temperature_range),
|
buf, sizeof(buf));
|
|
settings_save_one("ps/tr", buf);
|
}
|
|
static void storage_work_handler(struct os_event *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;
|
}
|
}
|
|
struct os_callout storage_work;
|
|
void save_on_flash(uint8_t id)
|
{
|
storage_id = id;
|
os_callout_reset(&storage_work, 0);
|
}
|
|
static int ps_set(int argc, char **argv, char *val)
|
{
|
int len;
|
|
if (argc == 1) {
|
if (!strcmp(argv[0], "rc")) {
|
len = sizeof(reset_counter);
|
|
return settings_bytes_from_str(val, &reset_counter,
|
&len);
|
}
|
|
if (!strcmp(argv[0], "gdtt")) {
|
len = sizeof(gen_def_trans_time_srv_user_data.tt);
|
|
return settings_bytes_from_str(val,
|
&gen_def_trans_time_srv_user_data.tt, &len);
|
}
|
|
if (!strcmp(argv[0], "gpo")) {
|
len = sizeof(gen_power_onoff_srv_user_data.onpowerup);
|
|
return settings_bytes_from_str(val,
|
&gen_power_onoff_srv_user_data.onpowerup, &len);
|
}
|
|
if (!strcmp(argv[0], "ltd")) {
|
len = sizeof(light_ctl_srv_user_data.lightness_temp_def);
|
|
return settings_bytes_from_str(val,
|
&light_ctl_srv_user_data.lightness_temp_def,
|
&len);
|
}
|
|
if (!strcmp(argv[0], "ltl")) {
|
len = sizeof(light_ctl_srv_user_data.
|
lightness_temp_last);
|
|
return settings_bytes_from_str(val,
|
&light_ctl_srv_user_data.lightness_temp_last,
|
&len);
|
}
|
|
if (!strcmp(argv[0], "lr")) {
|
len = sizeof(light_lightness_srv_user_data.
|
lightness_range);
|
|
return settings_bytes_from_str(val,
|
&light_lightness_srv_user_data.lightness_range,
|
&len);
|
}
|
|
if (!strcmp(argv[0], "tr")) {
|
len = sizeof(light_ctl_srv_user_data.
|
temperature_range);
|
|
return settings_bytes_from_str(val,
|
&light_ctl_srv_user_data. temperature_range,
|
&len);
|
}
|
}
|
|
return -ENOENT;
|
}
|
|
static struct conf_handler ps_settings = {
|
.ch_name = "ps",
|
.ch_set = ps_set,
|
};
|
|
int ps_settings_init(void)
|
{
|
int err;
|
|
os_callout_init(&storage_work, os_eventq_dflt_get(),
|
storage_work_handler, NULL);
|
|
err = conf_register(&ps_settings);
|
if (err) {
|
printk("ps_settings_register failed (err %d)", err);
|
return err;
|
}
|
|
return 0;
|
}
|