id存入flash 0 id为自动寻找空位置

This commit is contained in:
WangQiang 2016-08-23 07:15:16 +00:00
parent 01ca48fa26
commit af4e220b1c
2 changed files with 60 additions and 37 deletions

View File

@ -24,6 +24,10 @@ AlarmConfig::AlarmConfig()
void AlarmConfig::Init() void AlarmConfig::Init()
{ {
Buffer(Data, sizeof(Data)).Clear(); Buffer(Data, sizeof(Data)).Clear();
for (int i = 0; i < ArrayLength(Data); i++)
{
Data[i].Number = i + 1;
}
} }
/************************************************/ /************************************************/
@ -36,8 +40,8 @@ Alarm::Alarm()
bool Alarm::AlarmSet(const Pair& args, Stream& result) bool Alarm::AlarmSet(const Pair& args, Stream& result)
{ {
debug_printf("AlarmSet\r\n"); debug_printf("AlarmSet\r\n");
AlarmDataType data; AlarmDataType alarm;
data.Enable = false; alarm.Enable = false;
Buffer buf = args.Get("alarm"); Buffer buf = args.Get("alarm");
@ -57,71 +61,89 @@ bool Alarm::AlarmSet(const Pair& args, Stream& result)
result.Write((byte)0); result.Write((byte)0);
return false; return false;
} }
alarm.Number = Id;
data.Enable = ms.ReadByte(); alarm.Enable = ms.ReadByte();
byte type = ms.ReadByte(); byte type = ms.ReadByte();
data.Type.Init(type); alarm.Type.Init(type);
data.Hour = ms.ReadByte(); alarm.Hour = ms.ReadByte();
data.Minutes = ms.ReadByte(); alarm.Minutes = ms.ReadByte();
data.Seconds = ms.ReadByte(); alarm.Seconds = ms.ReadByte();
if (data.Hour > 23 || data.Minutes > 59 || data.Seconds > 59)return false; if (alarm.Hour > 23 || alarm.Minutes > 59 || alarm.Seconds > 59)return false;
// Buffer buf2(data.Data, sizeof(data.Data)); // Buffer buf2(data.Data, sizeof(data.Data));
// auto len = ms.ReadArray(buf2); // auto len = ms.ReadArray(buf2);
Buffer buf2(data.Data, sizeof(data.Data)); Buffer buf2(alarm.Data, sizeof(alarm.Data));
Buffer buf3(buf.GetBuffer() + ms.Position() , buf.Length() - ms.Position()); Buffer buf3(buf.GetBuffer() + ms.Position(), buf.Length() - ms.Position());
buf2 = buf3; buf2 = buf3;
debug_printf("%d/%d/%d执行bs",data.Hour,data.Minutes,data.Seconds); buf.Show(true);
buf3.Show(true);
buf2.Show(true); buf2.Show(true);
debug_printf("%d %d %d 执行 bs", alarm.Hour, alarm.Minutes, alarm.Seconds);
if (SetCfg(Id, data))
{ byte resid = SetCfg(Id, alarm);
result.Write((byte)1); result.Write((byte)resid);
return true; if(resid)return true;
} return false;
else
{
result.Write((byte)0);
return false;
}
} }
bool Alarm::AlarmGet(const Pair& args, Stream& result) bool Alarm::AlarmGet(const Pair& args, Stream& result)
{ {
debug_printf("AlarmGet\r\n"); debug_printf("AlarmGet");
AlarmConfig cfg; AlarmConfig cfg;
cfg.Load(); cfg.Load();
debug_printf("data :\r\n");
result.Write((byte)ArrayLength(cfg.Data)); // 写入长度 result.Write((byte)20); // 写入长度
for (AlarmDataType &x : cfg.Data) for (int i = 0; i < 20; i++)
{ {
Buffer bs(&x.Enable, sizeof(AlarmDataType)); Buffer bs(&cfg.Data[i].Number, sizeof(AlarmDataType));
bs.Show(true);
result.WriteArray(bs); result.WriteArray(bs);
} }
Buffer(result.GetBuffer(), result.Position()).Show(true);
Buffer(result.GetBuffer(), result.Position()).Show(true);
debug_printf("\r\n");
return true; return true;
} }
bool Alarm::SetCfg(byte id, AlarmDataType& data) byte Alarm::SetCfg(byte id, AlarmDataType& data)
{ {
AlarmConfig cfg; AlarmConfig cfg;
cfg.Load(); cfg.Load();
Buffer bf(&data, sizeof(AlarmDataType)); if (!id) // 找到空闲位置
Buffer bf2(&cfg.Data[id].Enable, sizeof(AlarmDataType)); {
for (int i = 0; i < 20; i++)
{
if (!cfg.Data[i].Enable)
{
id = i+1;
break;
}
}
}
if (!id)return 0; // 查找失败
Buffer bf(&data.Number, sizeof(AlarmDataType));
Buffer bf2(&cfg.Data[id-1].Number, sizeof(AlarmDataType));
bf2 = bf; bf2 = bf;
for (int i = 0; i < 20; i++)
{
cfg.Data[i].Number = i + 1; // 避免 id 出错
}
cfg.Save(); cfg.Save();
// 修改过后要检查一下Task的时间 // 取消下次动作并重新计算 // 修改过后要检查一下Task的时间 // 取消下次动作并重新计算
NextAlarmIds.Clear(); NextAlarmIds.Clear();
Start(); Start();
return true; return id;
} }
bool Alarm::GetCfg(byte id, AlarmDataType& data) bool Alarm::GetCfg(byte id, AlarmDataType& data)
@ -129,8 +151,8 @@ bool Alarm::GetCfg(byte id, AlarmDataType& data)
AlarmConfig cfg; AlarmConfig cfg;
cfg.Load(); cfg.Load();
Buffer bf(&data, sizeof(AlarmDataType)); Buffer bf(&data.Number, sizeof(AlarmDataType));
Buffer bf2(&cfg.Data[id].Enable, sizeof(AlarmDataType)); Buffer bf2(&cfg.Data[id].Number, sizeof(AlarmDataType));
bf = bf2; bf = bf2;
return true; return true;
} }
@ -196,11 +218,11 @@ byte Alarm::FindNext(int& nextTime)
if (times[i] == miniTime) if (times[i] == miniTime)
{ {
NextAlarmIds.Add(i); NextAlarmIds.Add(i);
debug_printf("添加下一次闹钟的id %d\r\n",i); debug_printf("添加下一次闹钟的id %d\r\n", i);
} }
} }
nextTime = miniTime; nextTime = miniTime;
debug_printf("下一个闹钟时间是%dMs后\r\n",nextTime); debug_printf("下一个闹钟时间是%dMs后\r\n", nextTime);
} }
else else
{ {
@ -269,7 +291,7 @@ void Alarm::Start()
{ {
debug_printf("Alarm::Start\r\n"); debug_printf("Alarm::Start\r\n");
if (!AlarmTaskId)AlarmTaskId = Sys.AddTask(&Alarm::AlarmTask, this, -1, -1, "AlarmTask"); if (!AlarmTaskId)AlarmTaskId = Sys.AddTask(&Alarm::AlarmTask, this, -1, -1, "AlarmTask");
Sys.SetTask(AlarmTaskId, true); Sys.SetTask(AlarmTaskId, true, 0);
} }
void Alarm::Register(byte type, AlarmActuator* act) void Alarm::Register(byte type, AlarmActuator* act)

View File

@ -33,6 +33,7 @@ typedef struct : ByteStruct2
#pragma pack(1) #pragma pack(1)
typedef struct typedef struct
{ {
byte Number;
byte Enable; byte Enable;
AlarmType Type; AlarmType Type;
byte Hour; byte Hour;
@ -59,7 +60,7 @@ public:
/* 注册给 TokenClient 名称 Policy/AlarmGet */ /* 注册给 TokenClient 名称 Policy/AlarmGet */
bool AlarmGet(const Pair& args, Stream& result); bool AlarmGet(const Pair& args, Stream& result);
bool SetCfg(byte id, AlarmDataType& data); byte SetCfg(byte id, AlarmDataType& data);
bool GetCfg(byte id, AlarmDataType& data); bool GetCfg(byte id, AlarmDataType& data);
void Start(); void Start();