AlarmConfig 数据结构

This commit is contained in:
WangQiang 2016-08-16 08:38:06 +00:00
parent 5081dedb7c
commit c4203186d7
2 changed files with 157 additions and 2 deletions

View File

@ -1,6 +1,115 @@
#include "Alarm.h"
#define Int_Max 2147483647
class AlarmConfig :public ConfigBase
{
public:
byte Length;
AlarmDataType Data[20];
byte TagEnd;
AlarmConfig();
virtual void Init();
};
AlarmConfig::AlarmConfig()
{
_Name = "AlarmCf";
_Start = &Length;
_End = &TagEnd;
Init();
}
void AlarmConfig::Init()
{
Buffer(Data, sizeof(Data)).Clear();
}
/************************************************/
Alarm::Alarm()
{
AlarmTaskId = 0;
AfterAlarmId = 0xff;
}
bool Alarm::SetCfg(byte id, AlarmDataType& data)
{
AlarmConfig cfg;
cfg.Load();
Buffer bf(&data, sizeof(AlarmDataType));
Buffer bf2(&cfg.Data[id].Enable, sizeof(AlarmDataType));
bf2 = bf;
cfg.Save();
// 修改过后要检查一下Task的时间
// xxxx
return true;
}
bool Alarm::GetCfg(byte id, AlarmDataType& data)
{
AlarmConfig cfg;
cfg.Load();
Buffer bf(&data, sizeof(AlarmDataType));
Buffer bf2(&cfg.Data[id].Enable, sizeof(AlarmDataType));
bf = bf2;
return true;
}
int Alarm::CalcNextTime(AlarmDataType& data)
{
auto dt = DateTime::Now();
if (data.Type.ToByte() & 1 << dt.DayOfWeek())
{
}
return Int_Max;
}
byte Alarm::FindAfter()
{
AlarmConfig cfg;
cfg.Load();
int nextTimeMs;
byte id = 0xff;
for (int i = 0; i < 20; i++)
{
if (!cfg.Data[i].Enable)continue;
int time = CalcNextTime(cfg.Data[i]);
if (time < nextTimeMs)
{
nextTimeMs = time;
id = i;
}
}
if (id != 0xff)NextAlarmMs = nextTimeMs;
return id;
}
void Alarm::AlarmTask()
{
// 执行动作
// 找到下一个定时器动作的时间
AfterAlarmId = FindAfter();
if (AfterAlarmId != 0xff)
{
Sys.SetTask(AlarmTaskId, true, NextAlarmMs);
return;
}
Sys.SetTask(AlarmTaskId, false);
}
void Alarm::Start()
{
if (!AlarmTaskId)AlarmTaskId = Sys.AddTask(&Alarm::AlarmTask, this, -1, -1, "AlarmTask");
Sys.SetTask(AlarmTaskId,true);
}

View File

@ -4,14 +4,60 @@
#include "Sys.h"
#include "Timer.h"
#include "Port.h"
#include "..\Config.h"
class ByteStruct2 // 位域基类
{
public:
void Init(byte data = 0) { *(byte*)this = data; }
byte ToByte() { return *(byte*)this; }
};
typedef struct:ByteStruct2
{
byte Sunday : 1;
byte Monday : 1;
byte Tuesday : 1;
byte Wednesday : 1;
byte Thursday : 1;
byte Friday : 1;
byte Saturday : 1;
byte Again : 1;
}AlarmType;
// 必须设定为1字节对齐否则offsetof会得到错误的位置
#pragma pack(push) // 保存对齐状态
// 强制结构体紧凑分配空间
#pragma pack(1)
typedef struct
{
byte Enable;
AlarmType Type;
byte Hour;
byte Minutes;
byte Seconds;
byte Data[11];
}AlarmDataType;
#pragma pack(pop) // 恢复对齐状态
class Alarm
{
public:
Alarm();
// bool AddLine(byte id,byte* data);
bool SetCfg(byte id, AlarmDataType& data);
bool GetCfg(byte id, AlarmDataType& data);
void Start();
private:
byte AfterAlarmId; // 0xff 无效
uint AlarmTaskId;
int NextAlarmMs; // 下次闹钟时间
void AlarmTask();
byte FindAfter();
int CalcNextTime(AlarmDataType& data);
};
#endif