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 <stdio.h>
10
11 #include <ble_types/types.h>
12 #include <stddef.h>
13 #include <sys/types.h>
14 #include <bt_errno.h>
15 #include <misc/__assert.h>
16 #include <ble_os.h>
17
18 #include "settings/settings.h"
19 #include "settings_priv.h"
20
21 // #include <logging/log.h>
22 // LOG_MODULE_DECLARE(settings, CONFIG_SETTINGS_LOG_LEVEL);
23
24 sys_slist_t settings_load_srcs;
25 struct settings_store *settings_save_dst;
26 extern struct k_mutex settings_lock;
27
settings_src_register(struct settings_store * cs)28 void settings_src_register(struct settings_store *cs)
29 {
30 sys_slist_append(&settings_load_srcs, &cs->cs_next);
31 }
32
settings_dst_register(struct settings_store * cs)33 void settings_dst_register(struct settings_store *cs)
34 {
35 settings_save_dst = cs;
36 }
37
settings_load(void)38 int settings_load(void)
39 {
40 printf("enter %s\n", __func__);
41 return settings_load_subtree(NULL);
42 }
43
settings_load_subtree(const char * subtree)44 int settings_load_subtree(const char *subtree)
45 {
46 struct settings_store *cs;
47 int rc;
48 const struct settings_load_arg arg = {
49 .subtree = subtree
50 };
51
52 /*
53 * for every config store
54 * load config
55 * apply config
56 * commit all
57 */
58 k_mutex_lock(&settings_lock, K_FOREVER);
59 SYS_SLIST_FOR_EACH_CONTAINER(&settings_load_srcs, cs, cs_next) {
60 cs->cs_itf->csi_load(cs, &arg);
61 }
62 rc = settings_commit_subtree(subtree);
63 k_mutex_unlock(&settings_lock);
64 return rc;
65 }
66
settings_load_subtree_direct(const char * subtree,settings_load_direct_cb cb,void * param)67 int settings_load_subtree_direct(
68 const char *subtree,
69 settings_load_direct_cb cb,
70 void *param)
71 {
72 struct settings_store *cs;
73
74 const struct settings_load_arg arg = {
75 .subtree = subtree,
76 .cb = cb,
77 .param = param
78 };
79 /*
80 * for every config store
81 * load config
82 * apply config
83 * commit all
84 */
85 k_mutex_lock(&settings_lock, K_FOREVER);
86 SYS_SLIST_FOR_EACH_CONTAINER(&settings_load_srcs, cs, cs_next) {
87 cs->cs_itf->csi_load(cs, &arg);
88 }
89 k_mutex_unlock(&settings_lock);
90 return 0;
91 }
92
93 /*
94 * Append a single value to persisted config. Don't store duplicate value.
95 */
settings_save_one(const char * name,const void * value,size_t val_len)96 int settings_save_one(const char *name, const void *value, size_t val_len)
97 {
98 int rc;
99 struct settings_store *cs;
100
101 cs = settings_save_dst;
102 if (!cs) {
103 return -ENOENT;
104 }
105
106 k_mutex_lock(&settings_lock, K_FOREVER);
107
108 rc = cs->cs_itf->csi_save(cs, name, (char *)value, val_len);
109
110 k_mutex_unlock(&settings_lock);
111
112 return rc;
113 }
114
settings_delete(const char * name)115 int settings_delete(const char *name)
116 {
117 return settings_save_one(name, NULL, 0);
118 }
119
settings_save(void)120 int settings_save(void)
121 {
122 struct settings_store *cs;
123 int rc;
124 int rc2;
125
126 cs = settings_save_dst;
127 if (!cs) {
128 return -ENOENT;
129 }
130
131 if (cs->cs_itf->csi_save_start) {
132 cs->cs_itf->csi_save_start(cs);
133 }
134 rc = 0;
135 #if 0
136 Z_STRUCT_SECTION_FOREACH(settings_handler_static, ch) {
137 if (ch->h_export) {
138 rc2 = ch->h_export(settings_save_one);
139 if (!rc) {
140 rc = rc2;
141 }
142 }
143 }
144 #endif
145 #if defined(CONFIG_SETTINGS_DYNAMIC_HANDLERS)
146 struct settings_handler *ch;
147 SYS_SLIST_FOR_EACH_CONTAINER(&settings_handlers, ch, node) {
148 if (ch->h_export) {
149 rc2 = ch->h_export(settings_save_one);
150 if (!rc) {
151 rc = rc2;
152 }
153 }
154 }
155 #endif /* CONFIG_SETTINGS_DYNAMIC_HANDLERS */
156
157 if (cs->cs_itf->csi_save_end) {
158 cs->cs_itf->csi_save_end(cs);
159 }
160 return rc;
161 }
162
settings_store_init(void)163 void settings_store_init(void)
164 {
165 sys_slist_init(&settings_load_srcs);
166 }
167