1 /*
2 * Copyright (c) 2018 Nordic Semiconductor ASA
3 * Copyright (c) 2015 Runtime Inc
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8 #include <string.h>
9 #include <assert.h>
10 #include <ble_os.h>
11
12 #include <aos/kv.h>
13 #include <bt_errno.h>
14 #include "settings/settings.h"
15 #include "settings/settings_kv.h"
16 #include "settings_priv.h"
17
18 #define BT_DBG_ENABLED 0
19 #include "common/log.h"
20
21 static int settings_kv_load(struct settings_store *cs,
22 const struct settings_load_arg *arg);
23 static int settings_kv_save(struct settings_store *cs, const char *name,
24 const char *value, size_t val_len);
25
26 static struct settings_store_itf settings_kv_itf = {
27 .csi_load = settings_kv_load,
28 .csi_save = settings_kv_save,
29 };
30
settings_kv_src(struct settings_kv * cf)31 int settings_kv_src(struct settings_kv *cf)
32 {
33 if (!cf->name) {
34 return -EINVAL;
35 }
36
37 cf->cf_store.cs_itf = &settings_kv_itf;
38 settings_src_register(&cf->cf_store);
39
40 return 0;
41 }
42
settings_kv_dst(struct settings_kv * cf)43 int settings_kv_dst(struct settings_kv *cf)
44 {
45 if (!cf->name) {
46 return -EINVAL;
47 }
48
49 cf->cf_store.cs_itf = &settings_kv_itf;
50 settings_dst_register(&cf->cf_store);
51
52 return 0;
53 }
54
55 struct settings_kv_read_arg_t {
56 char *val;
57 uint16_t val_size;
58 };
59
_settings_kv_read_cb(void * cb_arg,void * data,size_t len)60 static ssize_t _settings_kv_read_cb(void *cb_arg, void *data, size_t len)
61 {
62 struct settings_kv_read_arg_t *read_arg = cb_arg;
63 size_t read_len = 0;
64
65 BT_DBG("cb_arg %p, read_arg->val %p, read_arg->val_size %d, data %p, len %d", cb_arg, read_arg?read_arg->val:0,
66 read_arg?read_arg->val_size:0, data, len);
67
68 if (data && read_arg && read_arg->val && read_arg->val_size && len >= read_arg->val_size)
69 {
70 read_len = len > read_arg->val_size? read_arg->val_size : len;
71 memcpy(data, read_arg->val, read_len);
72 return read_len;
73 }
74 return -1;
75 }
76
_settings_kv_load(char * key,char * val,uint16_t val_size,void * arg)77 static void _settings_kv_load(char *key, char *val, uint16_t val_size, void *arg)
78 {
79 const char *kv_prefix = "bt/";
80 struct settings_kv_read_arg_t read_arg = {0};
81
82 if (0 == strncmp(kv_prefix, key, 3))
83 {
84 BT_DBG("%s,size %d", key, val_size);
85 read_arg.val = val;
86 read_arg.val_size = val_size;
87 settings_call_set_handler(key, val_size, _settings_kv_read_cb, &read_arg, arg);
88 }
89 }
90
91 /*
92 * Called to load configuration items. cb must be called for every configuration
93 * item found.
94 */
settings_kv_load(struct settings_store * cs,const struct settings_load_arg * arg)95 static int settings_kv_load(struct settings_store *cs,
96 const struct settings_load_arg *arg)
97 {
98
99 #ifdef CONFIG_BT_SETTINGS
100 #if 0 //remove for build error
101 extern void __kv_foreach(void (*func)(char *key, char *val, uint16_t val_size, void *arg), void *arg);
102 __kv_foreach(_settings_kv_load, (void *)arg);
103 #endif
104 #endif
105 return 0;
106 }
107
108 /*
109 * Called to save configuration.
110 */
settings_kv_save(struct settings_store * cs,const char * name,const char * value,size_t val_len)111 static int settings_kv_save(struct settings_store *cs, const char *name,
112 const char *value, size_t val_len)
113 {
114 int rc;
115
116 if (!name) {
117 return -EINVAL;
118 }
119
120 //delete key
121 if (value == NULL) {
122 aos_kv_del(name);
123 return 0;
124 }
125
126 rc = aos_kv_set(name, (void *)value, val_len, 1);
127
128 if (rc < 0) {
129 BT_ERR("update key fail %s,%s", name, value);
130 return -EIO;
131 }
132
133 printf("setting update %s, %s\n", name, value);
134
135 return 0;
136 }
137
settings_backend_init(void)138 int settings_backend_init(void)
139 {
140 static struct settings_kv config_init_settings_kv = {
141 .name = "btsetting",
142 };
143
144 settings_kv_src(&config_init_settings_kv);
145 settings_kv_dst(&config_init_settings_kv);
146
147 return 0;
148 }
149