配置区的加载、保存、创建、删除分离,全部完成,编译通过未测试
This commit is contained in:
parent
297c2f16fb
commit
5f1871714b
104
Config.cpp
104
Config.cpp
|
@ -99,7 +99,7 @@ bool ConfigBlock::Write(const Storage& storage, uint addr, const Array& bs)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool rs = true;
|
Hash = GetHash();
|
||||||
|
|
||||||
// 先写入头部,然后写入数据
|
// 先写入头部,然后写入数据
|
||||||
uint len = sizeof(ConfigBlock) - offsetof(ConfigBlock, Hash);
|
uint len = sizeof(ConfigBlock) - offsetof(ConfigBlock, Hash);
|
||||||
|
@ -111,7 +111,7 @@ bool ConfigBlock::Write(const Storage& storage, uint addr, const Array& bs)
|
||||||
if(!storage.Write(addr + len, Array(bs.GetBuffer(), len2))) return false;
|
if(!storage.Write(addr + len, Array(bs.GetBuffer(), len2))) return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rs;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*================================ 配置 ================================*/
|
/*================================ 配置 ================================*/
|
||||||
|
@ -123,26 +123,36 @@ Config::Config(const Storage& st, uint addr, uint size)
|
||||||
Size = size;
|
Size = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 循环查找配置块。如果找不到而又指明了大小,则找一个满足该大小的空闲数据块,或者在最后划分一个
|
// 检查签名
|
||||||
const void* Config::Find(const char* name, int size) const
|
bool CheckSignature(const Storage& st, uint& addr, bool create)
|
||||||
|
{
|
||||||
|
const uint c_Version = 0x534F5453; // STOS
|
||||||
|
|
||||||
|
// 检查签名,如果不存在则写入
|
||||||
|
if(*(uint*)addr != c_Version)
|
||||||
|
{
|
||||||
|
if(!create) return false;
|
||||||
|
|
||||||
|
st.Write(addr, Array(&c_Version, sizeof(c_Version)));
|
||||||
|
}
|
||||||
|
|
||||||
|
addr += sizeof(c_Version);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 循环查找配置块
|
||||||
|
const void* Config::Find(const char* name) const
|
||||||
{
|
{
|
||||||
TS("Config::Find");
|
TS("Config::Find");
|
||||||
|
|
||||||
const uint c_Version = 0x534F5453; // STOS
|
|
||||||
|
|
||||||
if(name == NULL) return NULL;
|
if(name == NULL) return NULL;
|
||||||
//assert_param2(name, "配置段名称不能为空");
|
//assert_param2(name, "配置段名称不能为空");
|
||||||
|
|
||||||
uint addr = Address;
|
uint addr = Address;
|
||||||
// 检查签名,如果不存在则写入
|
if(CheckSignature(Device, addr, false)) return NULL;
|
||||||
if(*(uint*)addr != c_Version)
|
|
||||||
{
|
|
||||||
if(!size) return NULL;
|
|
||||||
|
|
||||||
Device.Write(addr, Array(&c_Version, sizeof(c_Version)));
|
// 第一个配置块
|
||||||
}
|
|
||||||
|
|
||||||
addr += sizeof(c_Version);
|
|
||||||
auto cfg = (const ConfigBlock*)addr;
|
auto cfg = (const ConfigBlock*)addr;
|
||||||
|
|
||||||
uint slen = strlen(name);
|
uint slen = strlen(name);
|
||||||
|
@ -157,7 +167,19 @@ const void* Config::Find(const char* name, int size) const
|
||||||
cfg = cfg->Next();
|
cfg = cfg->Next();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!size) return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建一个指定大小的配置块。找一个满足该大小的空闲数据块,或者在最后划分一个
|
||||||
|
const void* Config::New(int size) const
|
||||||
|
{
|
||||||
|
TS("Config::New");
|
||||||
|
|
||||||
|
uint addr = Address;
|
||||||
|
if(CheckSignature(Device, addr, true)) return NULL;
|
||||||
|
|
||||||
|
// 第一个配置块
|
||||||
|
auto cfg = (const ConfigBlock*)addr;
|
||||||
|
|
||||||
// 找一块合适大小的空闲区域
|
// 找一块合适大小的空闲区域
|
||||||
cfg = (const ConfigBlock*)addr;
|
cfg = (const ConfigBlock*)addr;
|
||||||
|
@ -177,10 +199,22 @@ const void* Config::Find(const char* name, int size) const
|
||||||
return cfg;
|
return cfg;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 废弃
|
// 删除
|
||||||
bool Config::Invalid(const char* name) const
|
bool Config::Remove(const char* name) const
|
||||||
{
|
{
|
||||||
return Set(name, ByteArray(0));
|
//return Set(name, ByteArray(0));
|
||||||
|
TS("Config::Remove");
|
||||||
|
|
||||||
|
if(name == NULL) return NULL;
|
||||||
|
|
||||||
|
auto cfg = (ConfigBlock*)Find(name);
|
||||||
|
if(!cfg) return false;
|
||||||
|
|
||||||
|
// 只清空名称,修改哈希,不能改大小,否则无法定位下一个配置块
|
||||||
|
memset(cfg->Name, 0, ArrayLength(cfg->Name));
|
||||||
|
cfg->Write(Device, (uint)cfg, ByteArray(0));
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据名称更新块
|
// 根据名称更新块
|
||||||
|
@ -192,18 +226,16 @@ const void* Config::Set(const char* name, const Array& bs) const
|
||||||
//assert_param2(name, "配置块名称不能为空");
|
//assert_param2(name, "配置块名称不能为空");
|
||||||
//assert_param2(Device, "未指定配置段的存储设备");
|
//assert_param2(Device, "未指定配置段的存储设备");
|
||||||
|
|
||||||
auto cfg = (const ConfigBlock*)Find(name, bs.Length());
|
auto cfg = (const ConfigBlock*)Find(name);
|
||||||
if(cfg)
|
if(!cfg) cfg = (const ConfigBlock*)New(bs.Length());
|
||||||
{
|
if(!cfg) return NULL;
|
||||||
// 重新搞一个配置头,使用新的数据去重新初始化
|
|
||||||
ConfigBlock header;
|
|
||||||
header.Init(name, bs);
|
|
||||||
header.Write(Device, (uint)cfg, bs);
|
|
||||||
|
|
||||||
return cfg->Data();
|
// 重新搞一个配置头,使用新的数据去重新初始化
|
||||||
}
|
ConfigBlock header;
|
||||||
|
header.Init(name, bs);
|
||||||
|
header.Write(Device, (uint)cfg, bs);
|
||||||
|
|
||||||
return NULL;
|
return cfg->Data();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取配置数据
|
// 获取配置数据
|
||||||
|
@ -214,7 +246,7 @@ bool Config::Get(const char* name, Array& bs) const
|
||||||
if(name == NULL) return false;
|
if(name == NULL) return false;
|
||||||
//assert_param2(name, "配置块名称不能为空");
|
//assert_param2(name, "配置块名称不能为空");
|
||||||
|
|
||||||
auto cfg = (const ConfigBlock*)Find(name, 0);
|
auto cfg = (const ConfigBlock*)Find(name);
|
||||||
if(cfg && cfg->Size > 0 && cfg->Size <= bs.Capacity())
|
if(cfg && cfg->Size > 0 && cfg->Size <= bs.Capacity())
|
||||||
{
|
{
|
||||||
bs.Copy(cfg->Data(), cfg->Size);
|
bs.Copy(cfg->Data(), cfg->Size);
|
||||||
|
@ -233,13 +265,13 @@ const void* Config::Get(const char* name) const
|
||||||
if(name == NULL) return NULL;
|
if(name == NULL) return NULL;
|
||||||
//assert_param2(name, "配置块名称不能为空");
|
//assert_param2(name, "配置块名称不能为空");
|
||||||
|
|
||||||
auto cfg = (const ConfigBlock*)Find(name, 0);
|
auto cfg = (const ConfigBlock*)Find(name);
|
||||||
if(cfg && cfg->Size) return cfg->Data();
|
if(cfg && cfg->Size) return cfg->Data();
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取配置数据,如果不存在则覆盖
|
/*// 获取配置数据,如果不存在则覆盖
|
||||||
bool Config::GetOrSet(const char* name, Array& bs) const
|
bool Config::GetOrSet(const char* name, Array& bs) const
|
||||||
{
|
{
|
||||||
TS("Config::GetOrSet");
|
TS("Config::GetOrSet");
|
||||||
|
@ -254,7 +286,7 @@ bool Config::GetOrSet(const char* name, Array& bs) const
|
||||||
Set(name, bs);
|
Set(name, bs);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
// Flash最后一块作为配置区
|
// Flash最后一块作为配置区
|
||||||
const Config& Config::CreateFlash()
|
const Config& Config::CreateFlash()
|
||||||
|
@ -314,7 +346,8 @@ void ConfigBase::Load()
|
||||||
{
|
{
|
||||||
// 尝试加载配置区设置
|
// 尝试加载配置区设置
|
||||||
auto bs = ToArray();
|
auto bs = ToArray();
|
||||||
New = !Cfg.GetOrSet(_Name, bs);
|
//New = !Cfg.GetOrSet(_Name, bs);
|
||||||
|
New = !Cfg.Get(_Name);
|
||||||
if(New)
|
if(New)
|
||||||
debug_printf("%s::Load 首次运行,创建配置区!\r\n", _Name);
|
debug_printf("%s::Load 首次运行,创建配置区!\r\n", _Name);
|
||||||
else
|
else
|
||||||
|
@ -330,11 +363,12 @@ void ConfigBase::Save() const
|
||||||
|
|
||||||
void ConfigBase::Clear()
|
void ConfigBase::Clear()
|
||||||
{
|
{
|
||||||
Init();
|
//Init();
|
||||||
|
|
||||||
debug_printf("%s::Clear \r\n", _Name);
|
debug_printf("%s::Clear \r\n", _Name);
|
||||||
|
|
||||||
Cfg.Set(_Name, ToArray());
|
//Cfg.Set(_Name, ToArray());
|
||||||
|
Cfg.Remove(_Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigBase::Show() const
|
void ConfigBase::Show() const
|
||||||
|
|
12
Config.h
12
Config.h
|
@ -19,15 +19,17 @@ public:
|
||||||
Config(const Storage& st, uint addr, uint size);
|
Config(const Storage& st, uint addr, uint size);
|
||||||
|
|
||||||
// 查找。size不为0时表示要查找该大小的合适配置块
|
// 查找。size不为0时表示要查找该大小的合适配置块
|
||||||
const void* Find(const char* name, int size = 0) const;
|
const void* Find(const char* name) const;
|
||||||
// 废弃。仅清空名称,并不删除数据区
|
// 创建一个指定大小的配置块
|
||||||
bool Invalid(const char* name) const;
|
const void* New(int size) const;
|
||||||
|
// 删除。仅清空名称,并不删除数据区
|
||||||
|
bool Remove(const char* name) const;
|
||||||
// 设置配置数据
|
// 设置配置数据
|
||||||
const void* Set(const char* name, const Array& bs) const;
|
const void* Set(const char* name, const Array& bs) const;
|
||||||
// 获取配置数据
|
// 获取配置数据
|
||||||
bool Get(const char* name, Array& bs) const;
|
bool Get(const char* name, Array& bs) const;
|
||||||
// 获取配置数据,如果不存在则覆盖
|
// 获取配置数据,如果不存在则覆盖
|
||||||
bool GetOrSet(const char* name, Array& bs) const;
|
//bool GetOrSet(const char* name, Array& bs) const;
|
||||||
// 获取配置数据
|
// 获取配置数据
|
||||||
const void* Get(const char* name) const;
|
const void* Get(const char* name) const;
|
||||||
|
|
||||||
|
@ -46,7 +48,7 @@ class ConfigBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool New;
|
bool New;
|
||||||
|
|
||||||
ConfigBase();
|
ConfigBase();
|
||||||
virtual void Init();
|
virtual void Init();
|
||||||
|
|
||||||
|
|
|
@ -707,7 +707,7 @@ void TinyServer::SaveDevices() const
|
||||||
ms.Write((byte)count);
|
ms.Write((byte)count);
|
||||||
for(int i = 0; i<count; i++)
|
for(int i = 0; i<count; i++)
|
||||||
{
|
{
|
||||||
Device* dv = Devices[i];
|
auto dv = Devices[i];
|
||||||
dv->Write(ms);
|
dv->Write(ms);
|
||||||
}
|
}
|
||||||
debug_printf("TinyServer::SaveDevices 保存 %d 个设备到 0x%08X!\r\n", count, cfg.Address);
|
debug_printf("TinyServer::SaveDevices 保存 %d 个设备到 0x%08X!\r\n", count, cfg.Address);
|
||||||
|
@ -723,7 +723,7 @@ void TinyServer::ClearDevices()
|
||||||
|
|
||||||
debug_printf("TinyServer::ClearDevices 清空设备列表 0x%08X \r\n", cfg.Address);
|
debug_printf("TinyServer::ClearDevices 清空设备列表 0x%08X \r\n", cfg.Address);
|
||||||
|
|
||||||
cfg.Invalid("Devs");
|
//cfg.Remove("Devs");
|
||||||
|
|
||||||
int count = Devices.Length();
|
int count = Devices.Length();
|
||||||
for(int j = 0; j < 3; j++) // 3遍
|
for(int j = 0; j < 3; j++) // 3遍
|
||||||
|
@ -755,12 +755,12 @@ void DeviceShow(void* param)
|
||||||
|
|
||||||
byte len = svr->Devices.Length();
|
byte len = svr->Devices.Length();
|
||||||
byte count = 0;
|
byte count = 0;
|
||||||
|
|
||||||
for(int i = 0; i < len; i++)
|
for(int i = 0; i < len; i++)
|
||||||
{
|
{
|
||||||
auto dv = svr->Devices[i];
|
auto dv = svr->Devices[i];
|
||||||
if(dv == NULL) continue;
|
if(dv == NULL) continue;
|
||||||
|
|
||||||
count++;
|
count++;
|
||||||
dv->Show();
|
dv->Show();
|
||||||
debug_printf("\r\n");
|
debug_printf("\r\n");
|
||||||
|
|
Loading…
Reference in New Issue