supla-device
Loading...
Searching...
No Matches
storage.h
1// SPDX-FileCopyrightText: AC SOFTWARE SP. Z O.O.
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#ifndef SRC_SUPLA_SUPLET_STORAGE_H_
5#define SRC_SUPLA_SUPLET_STORAGE_H_
6
7#include <stdint.h>
8#include <stddef.h>
9#include <supla/suplet/channel_map.h>
10#include <supla/suplet/config.h>
11
12namespace Supla {
13
14class Config;
15
16namespace Suplet {
17
20 InstanceRecord(const InstanceRecord &other);
21 InstanceRecord &operator=(const InstanceRecord &other);
23
24 bool setConfig(const uint8_t *data, uint16_t size);
25 void clearConfig();
26
27 uint8_t instanceId = 0;
28 uint32_t definitionId = 0;
29 uint16_t definitionVersion = 0;
30 uint8_t subDeviceId = 0;
31 uint16_t configSize = 0;
32 ChannelMap channelMap = {};
33 uint8_t *config = nullptr;
34};
35
37 public:
39 InstanceTable(const InstanceTable &) = delete;
40 InstanceTable &operator=(const InstanceTable &) = delete;
42
43 uint8_t getCount() const;
44 void clear();
45
46 bool add(const InstanceRecord &record);
47 bool removeByInstanceId(uint8_t instanceId);
48 InstanceRecord *findByInstanceId(uint8_t instanceId);
49 const InstanceRecord *findByInstanceId(uint8_t instanceId) const;
50 InstanceRecord *findBySubDeviceId(uint8_t subDeviceId);
51 const InstanceRecord *findBySubDeviceId(uint8_t subDeviceId) const;
52 InstanceRecord *getRecord(uint8_t index);
53 const InstanceRecord *getRecord(uint8_t index) const;
54
55 private:
56 bool resize(uint8_t newCount);
57
58 InstanceRecord *records = nullptr;
59 uint8_t count = 0;
60};
61
62class Storage {
63 public:
64 explicit Storage(Supla::Config *config);
65
66 bool load(InstanceTable *table);
67 bool loadIndex(InstanceTable *table);
68 bool loadInstance(uint8_t instanceId, InstanceRecord *record);
69 bool save(const InstanceTable &table);
70 bool erase();
71
72 private:
73#pragma pack(push, 1)
74 struct StoredInstanceHeader {
75 uint8_t version = 0;
76 uint8_t reserved = 0;
77 uint32_t definitionId = 0;
78 uint16_t definitionVersion = 0;
79 uint8_t channelCount = 0;
80 uint16_t configSize = 0;
81 };
82
83 struct StoredChannelMapping {
84 uint8_t channelId = 0;
85 uint8_t channelNumber = 0;
86 };
87#pragma pack(pop)
88
89 bool loadVariant(uint8_t instanceId, uint8_t variant, InstanceRecord *record)
90 const;
91 bool loadVariant(uint8_t instanceId,
92 uint8_t variant,
93 InstanceRecord *record,
94 bool loadConfig) const;
95 bool loadActiveVariant(uint8_t instanceId,
96 uint8_t *activeVariant,
97 InstanceRecord *record,
98 bool loadConfig,
99 bool cleanup);
100 bool saveVariant(const InstanceRecord &record, uint8_t variant);
101 bool eraseVariant(uint8_t instanceId, uint8_t variant);
102 bool eraseInstance(uint8_t instanceId);
103 bool cleanupLoadedInstance(uint8_t instanceId,
104 uint8_t activeVariant,
105 uint8_t loadedVariant);
106 bool slotExists(uint8_t instanceId) const;
107 void makeActKey(uint8_t instanceId, char *output) const;
108 void makeHeaderKey(uint8_t instanceId, uint8_t variant, char *output) const;
109 void makeChannelMapKey(uint8_t instanceId,
110 uint8_t variant,
111 char *output) const;
112 void makeConfigKey(uint8_t instanceId, uint8_t variant, char *output) const;
113 bool readBlobExact(const char *key, char *output, size_t expectedSize) const;
114
115 Supla::Config *config = nullptr;
116};
117
118} // namespace Suplet
119} // namespace Supla
120
121#endif // SRC_SUPLA_SUPLET_STORAGE_H_
Definition config.h:44
Definition channel_map.h:25
Definition storage.h:36
Definition storage.h:62
Definition storage.h:18