-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathConfig.h
114 lines (88 loc) · 2.7 KB
/
Config.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
#ifndef __Config_H__
#define __Config_H__
#include "Kernel\Sys.h"
#include "Storage\Storage.h"
// 配置管理
// 配置区以指定签名开头,后续链式跟随各配置块
class Config
{
private:
public:
const Storage& Device; // 配置存储的设备
uint Address; // 在存储区中的起始地址
uint Size; // 在存储区中的可用空间大小
Config(const Storage& st, uint addr, uint size);
// 查找。size不为0时表示要查找该大小的合适配置块
const void* Find(const String& name) const;
// 创建一个指定大小的配置块
const void* New(int size) const;
// 删除。仅清空名称,并不删除数据区
bool Remove(const String& name) const;
// 删除所有配置。
bool RemoveAll() const;
// 设置配置数据
const void* Set(const String& name, const Buffer& bs) const;
// 获取配置数据
bool Get(const String& name, Buffer& bs) const;
// 获取配置数据,如果不存在则覆盖
//bool GetOrSet(cstring name, Buffer& bs) const;
// 获取配置数据
const void* Get(const String& name) const;
// 当前
static const Config* Current;
// Flash最后一块作为配置区
static const Config& CreateFlash();
// RAM最后一小段作为热启动配置区
static const Config& CreateRAM();
};
/******************************** ConfigBase ********************************/
// 应用配置基类
class ConfigBase
{
public:
bool New;
ConfigBase();
virtual void Init();
virtual void Load();
virtual void Save() const;
virtual void Clear();
virtual void Show() const;
// 序列化到消息数据流
void Write(Stream& ms) const;
void Read(Stream& ms);
uint Size() const;
Buffer ToArray();
const Buffer ToArray() const;
protected:
const Config& Cfg;
cstring _Name;
void* _Start;
void* _End;
};
// 必须设定为1字节对齐,否则offsetof会得到错误的位置
//#pragma pack(push) // 保存对齐状态
// 强制结构体紧凑分配空间
//#pragma pack(1)
/******************************** HotConfig ********************************/
// 系统配置信息
class HotConfig
{
public:
ushort Times; // 启动次数
void* Next() const;
static HotConfig& Current();
};
/******************************** SysConfig ********************************/
// 系统配置信息
class SysConfig
{
public:
};
//#pragma pack(pop) // 恢复对齐状态
/*
配置子系统,链式保存管理多配置段。
1,每个配置段都有固定长度的头部,包括签名、校验、名称等,数据紧跟其后
2,借助签名和双校验确保是有效配置段
3,根据名称查找更新配置段
*/
#endif