| /* |
| * 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; |
| } |