forked from nrfconnect/sdk-nrf
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbridge_storage_manager.h
321 lines (286 loc) · 10.6 KB
/
bridge_storage_manager.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
/*
* Copyright (c) 2023 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/
#pragma once
#include "matter_bridged_device.h"
#include "persistent_storage/persistent_storage.h"
#ifdef CONFIG_BRIDGED_DEVICE_BT
#include <zephyr/bluetooth/addr.h>
#endif
namespace Nrf
{
/*
* The class implements the following key-values storage structure:
*
* /br/
* /brd_cnt/ /<uint8_t>/
* /brd_ids/ /<uint8_t[brd_cnt]>/
* /brd/
* /0/ /<BridgedDevice>/
* /1/ /<BridgedDevice>/
* .
* .
* /n/ /<BridgedDevice>/
* /ver/ <uint8_t>
*/
class BridgeStorageManager {
public:
static inline constexpr auto kMaxUserDataSize = 128u;
#ifdef CONFIG_BRIDGE_MIGRATE_VERSION_1
struct BridgedDeviceV1 {
uint16_t mEndpointId;
uint16_t mDeviceType;
size_t mNodeLabelLength;
char mNodeLabel[MatterBridgedDevice::kNodeLabelSize] = { 0 };
size_t mUserDataSize = 0;
uint8_t *mUserData = nullptr;
};
#endif
struct BridgedDeviceV2 {
uint16_t mEndpointId;
uint16_t mDeviceType;
size_t mUniqueIDLength;
char mUniqueID[MatterBridgedDevice::kUniqueIDSize] = { 0 };
size_t mNodeLabelLength;
char mNodeLabel[MatterBridgedDevice::kNodeLabelSize] = { 0 };
size_t mUserDataSize = 0;
uint8_t *mUserData = nullptr;
};
using BridgedDevice = BridgedDeviceV2;
static constexpr uint8_t kCurrentVersion = 2;
static constexpr auto kMaxIndexLength = 3;
BridgeStorageManager()
: mBridge("br", strlen("br")), mBridgedDevicesCount("brd_cnt", strlen("brd_cnt"), &mBridge),
mBridgedDevicesIndexes("brd_ids", strlen("brd_ids"), &mBridge),
mBridgedDevice("brd", strlen("brd"), &mBridge), mVersion("ver", strlen("ver"), &mBridge)
#ifdef CONFIG_BRIDGE_MIGRATE_PRE_2_7_0
,
mBridgedDeviceEndpointId("eid", strlen("eid"), &mBridgedDevice),
mBridgedDeviceNodeLabel("label", strlen("label"), &mBridgedDevice),
mBridgedDeviceType("type", strlen("type"), &mBridgedDevice)
#ifdef CONFIG_BRIDGED_DEVICE_BT
,
mBt("bt", strlen("bt"), &mBridgedDevice), mBtAddress("addr", strlen("addr"), &mBt)
#endif
#endif
{
}
static BridgeStorageManager &Instance()
{
static BridgeStorageManager sInstance;
return sInstance;
}
/**
* @brief Initialize BridgeStorageManager module.
*
* @return true if module has been initialized successfully
* @return false an error occurred
*/
bool Init();
/**
* @brief Factory reset the storage.
*
* @return true if success.
* @return false otherwise.
*/
bool FactoryReset();
/**
* @brief Store bridged devices count into settings
*
* @param count count value to be stored
* @return true if key has been written successfully
* @return false an error occurred
*/
bool StoreBridgedDevicesCount(uint8_t count);
/**
* @brief Load bridged devices count from settings
*
* @param count reference to the count object to be filled with loaded data
* @return true if key has been loaded successfully
* @return false an error occurred
*/
bool LoadBridgedDevicesCount(uint8_t &count);
/**
* @brief Store bridged devices indexes into settings
*
* @param indexes address of array containing indexes to be stored
* @param count size of indexes array to be stored
* @return true if key has been written successfully
* @return false an error occurred
*/
bool StoreBridgedDevicesIndexes(uint8_t *indexes, uint8_t count);
/**
* @brief Load bridged devices indexes from settings
*
* @param indexes address of indexes array to be filled with loaded data
* @param maxCount maximum size that can be used for indexes array
* @param count reference to the count object to be filled with size of actually loaded data
* @return true if key has been loaded successfully
* @return false an error occurred
*/
bool LoadBridgedDevicesIndexes(uint8_t *indexes, uint8_t maxCount, size_t &count);
/**
* @brief Load bridged device from settings
*
* If the caller wants to load the optional user data, the mUserData must be set to the valid buffer to store
* data and mUserDataSize must be set to this data size. On success, the method overrides mUserDataSize with
* the data size actually obtained from the storage.
*
* @param device instance of bridged device object to be filled with loaded data.
* @param index index describing specific bridged device
* @return true if key has been loaded successfully
* @return false an error occurred
*/
template <typename T = BridgedDevice> bool LoadBridgedDevice(T &device, uint8_t index);
/**
* @brief Store bridged device into settings. Helper method allowing to store endpoint id, node label and device
* type of specific bridged device using a single call.
*
* @param device instance of bridged device object to be stored
* @param index index describing specific bridged device
* @return true if key has been written successfully
* @return false an error occurred
*/
bool StoreBridgedDevice(BridgedDevice &device, uint8_t index);
/**
* @brief Remove bridged device entry from settings
*
* @param bridgedDeviceIndex index describing specific bridged device to be removed
* @return true if key entry has been removed successfully
* @return false an error occurred
*/
bool RemoveBridgedDevice(uint8_t bridgedDeviceIndex);
private:
/**
* @brief Provides backward compatibility between non-compatible data scheme versions.
*
* It checks the used data scheme version based on version key value. If the version key is not present (it
* means that the old scheme is used - pre nRF Connect SDK 2.7.0) or if the version is different than
* kCurrentVersion, the migration has to be done.
*
* @return true if migration was successful
* @return false an error occurred
*/
bool MigrateData();
#ifdef CONFIG_BRIDGE_MIGRATE_PRE_2_7_0
/**
* @brief Migrate bridged device data at given index.
*
* It migrates bridge device structure from pre nRF Connect SDK 2.7.0 scheme to current one. Method loads the
* data using key names from an old scheme, removes the old data and stores again using the new key names.
*
* @param bridgedDeviceIndex index describing specific bridged device to be removed
* @return true if migration was successful
* @return false an error occurred
*/
bool MigrateDataOldScheme(uint8_t bridgedDeviceIndex);
#endif
#ifdef CONFIG_BRIDGE_MIGRATE_VERSION_1
/**
* @brief Migrate bridged device data at given index.
*
* It migrates bridge device structure from version 1 to current one.
*
* @param bridgedDeviceIndex index describing specific bridged device to be removed
* @return true if migration was successful
* @return false an error occurred
*/
bool MigrateDataVersion1(uint8_t bridgedDeviceIndex);
#endif
/* The below methods are deprecated and used only for the migration purposes between the older scheme versions.
*/
#ifdef CONFIG_BRIDGE_MIGRATE_PRE_2_7_0
/**
* @brief Load bridged device endpoint id from settings
*
* @param endpointId reference to the endpoint id object to be filled with loaded data
* @param bridgedDeviceIndex index describing specific bridged device using given endpoint id
* @return true if key has been loaded successfully
* @return false an error occurred
*/
bool LoadBridgedDeviceEndpointId(uint16_t &endpointId, uint8_t bridgedDeviceIndex);
/**
* @brief Remove bridged device's endpoint id entry from settings
*
* @param bridgedDeviceIndex index describing specific bridged device's endpoint id to be removed
* @return true if key entry has been removed successfully
* @return false an error occurred
*/
bool RemoveBridgedDeviceEndpointId(uint8_t bridgedDeviceIndex);
/**
* @brief Load bridged device node label from settings
*
* @param label address of char array to be filled with loaded data
* @param labelMaxLength maximum size that can be used for label array
* @param labelLength reference to the labelLength object to be filled with size of actually loaded data
* @param bridgedDeviceIndex index describing specific bridged device using given node label
* @return true if key has been loaded successfully
* @return false an error occurred
*/
bool LoadBridgedDeviceNodeLabel(char *label, size_t labelMaxLength, size_t &labelLength,
uint8_t bridgedDeviceIndex);
/**
* @brief Remove bridged device's node label entry from settings
*
* @param bridgedDeviceIndex index describing specific bridged device's node label to be removed
* @return true if key entry has been removed successfully
* @return false an error occurred
*/
bool RemoveBridgedDeviceNodeLabel(uint8_t bridgedDeviceIndex);
/**
* @brief Load bridged device Matter device type from settings
*
* @param deviceType reference to the device type object to be filled with loaded data
* @param bridgedDeviceIndex index describing specific bridged device using given device type
* @return true if key has been loaded successfully
* @return false an error occurred
*/
bool LoadBridgedDeviceType(uint16_t &deviceType, uint8_t bridgedDeviceIndex);
/**
* @brief Remove bridged device's Matter device type entry from settings
*
* @param bridgedDeviceIndex index describing specific bridged device's device type to be removed
* @return true if key entry has been removed successfully
* @return false an error occurred
*/
bool RemoveBridgedDeviceType(uint8_t bridgedDeviceIndex);
#ifdef CONFIG_BRIDGED_DEVICE_BT
/**
* @brief Load bridged device Bluetooth LE address from settings
*
* @param addr reference to the address object to be filled with loaded data
* @param bridgedDeviceIndex index describing specific bridged device using given address
* @return true if key has been loaded successfully
* @return false an error occurred
*/
bool LoadBtAddress(bt_addr_le_t &addr, uint8_t bridgedDeviceIndex);
/**
* @brief Remove bridged device's Bluetooth LE address entry from settings
*
* @param bridgedDeviceIndex index describing specific bridged device's bluetooth address to be removed
* @return true if key entry has been removed successfully
* @return false an error occurred
*/
bool RemoveBtAddress(uint8_t bridgedDeviceIndex);
#endif
#endif
Nrf::PersistentStorageNode mBridge;
Nrf::PersistentStorageNode mBridgedDevicesCount;
Nrf::PersistentStorageNode mBridgedDevicesIndexes;
Nrf::PersistentStorageNode mBridgedDevice;
Nrf::PersistentStorageNode mVersion;
#ifdef CONFIG_BRIDGE_MIGRATE_PRE_2_7_0
/* The below fields are deprecated and used only for the migration purposes between the older scheme versions.
*/
Nrf::PersistentStorageNode mBridgedDeviceEndpointId;
Nrf::PersistentStorageNode mBridgedDeviceNodeLabel;
Nrf::PersistentStorageNode mBridgedDeviceType;
#ifdef CONFIG_BRIDGED_DEVICE_BT
Nrf::PersistentStorageNode mBt;
Nrf::PersistentStorageNode mBtAddress;
#endif
#endif
};
} /* namespace Nrf */