更新RTC闹钟函数
怪异的现象是添加闹钟后rt_alarm_dump()正常,系统启动后rt_alarm_dump()异常,时钟加了+8
This commit is contained in:
parent
2412d4fba7
commit
66377a9450
@ -20,6 +20,7 @@
|
||||
#define LOG_TAG "alarm"
|
||||
#define LOG_LVL LOG_LVL_DBG
|
||||
#include <ulog.h>
|
||||
//#define BOOT_PER_HOUR
|
||||
|
||||
void user_alarm_callback(rt_alarm_t alarm, time_t timestamp)
|
||||
{
|
||||
@ -28,7 +29,7 @@ void user_alarm_callback(rt_alarm_t alarm, time_t timestamp)
|
||||
|
||||
void alarm_sample(int argc, char *argv[])
|
||||
{
|
||||
rt_device_t dev = rt_device_find("rtc");
|
||||
// rt_device_t dev = rt_device_find("rtc");
|
||||
struct rt_alarm_setup setup;
|
||||
struct rt_alarm * alarm = RT_NULL;
|
||||
static time_t now;
|
||||
@ -98,20 +99,18 @@ void poTT2_callback(rt_alarm_t alarm, time_t timestamp)
|
||||
timerIsReady();
|
||||
initTT();
|
||||
}
|
||||
//每个开窗设置对应两个rtc闹钟,一个上电一个下电
|
||||
//更新开窗设置前需要先清空闹钟设置。可改为调用rt_alarm_control()修改。
|
||||
static struct rt_alarm *alarm[20];//支持2组开窗共4个闹钟,加一个定时发送闹钟
|
||||
#ifndef al
|
||||
void InitAlarm()
|
||||
|
||||
void addDefaultAlarm()
|
||||
{
|
||||
struct rt_alarm_setup setup;
|
||||
struct rt_alarm * alarm = RT_NULL;
|
||||
static time_t now;
|
||||
struct tm p_tm;
|
||||
/* 获取当前时间戳,并把下一秒时间设置为闹钟时间 */
|
||||
now = time(NULL);
|
||||
gmtime_r(&now, &p_tm);
|
||||
|
||||
setup.flag = RT_ALARM_DAILY;//天重复
|
||||
setup.flag = RT_ALARM_HOUR;//小时重复
|
||||
setup.wktime.tm_year = p_tm.tm_year;
|
||||
setup.wktime.tm_mon = p_tm.tm_mon;
|
||||
setup.wktime.tm_mday = p_tm.tm_mday;
|
||||
@ -120,187 +119,146 @@ void InitAlarm()
|
||||
setup.wktime.tm_min = 0; //p_tm.tm_min;
|
||||
setup.wktime.tm_sec = 0; //p_tm.tm_sec;
|
||||
|
||||
if (RT_NULL != alarm[0])
|
||||
{
|
||||
rt_alarm_delete(alarm[0]); //
|
||||
}
|
||||
alarm[0] = rt_alarm_create(poTT_callback, &setup);
|
||||
|
||||
setup.wktime.tm_hour = 2; //开窗1闭合点
|
||||
if (RT_NULL != alarm[1])
|
||||
{
|
||||
rt_alarm_delete(alarm[1]); //
|
||||
}
|
||||
alarm[1] = rt_alarm_create(pdTT_callback, &setup);
|
||||
|
||||
setup.wktime.tm_hour = 7; //开窗2开启点
|
||||
if (RT_NULL != alarm[2])
|
||||
{
|
||||
rt_alarm_delete(alarm[2]); //
|
||||
}
|
||||
alarm[2] = rt_alarm_create(poTT_callback, &setup);
|
||||
|
||||
setup.wktime.tm_hour = 8; //开窗2闭合点
|
||||
if (RT_NULL != alarm[3])
|
||||
{
|
||||
rt_alarm_delete(alarm[3]); //
|
||||
}
|
||||
alarm[3] = rt_alarm_create(pdTT_callback, &setup);
|
||||
|
||||
setup.flag = RT_ALARM_HOUR;//小时重复
|
||||
setup.wktime.tm_min = 15; //每小时的1刻钟启动发送
|
||||
if (RT_NULL != alarm[4])
|
||||
{
|
||||
rt_alarm_delete(alarm[4]); //
|
||||
}
|
||||
alarm[4] = rt_alarm_create(poTT2_callback, &setup);
|
||||
|
||||
for (size_t var = 0; var < 5; var++) {
|
||||
if (alarm[var] != RT_NULL) {
|
||||
rt_alarm_start(alarm[var]);
|
||||
if (RT_NULL != alarm)
|
||||
{
|
||||
rt_alarm_delete(alarm); //
|
||||
}
|
||||
alarm = rt_alarm_create(poTT2_callback, &setup);
|
||||
|
||||
if (alarm != RT_NULL) {
|
||||
rt_alarm_start(alarm);
|
||||
// LOG_D("alarm %d(%02d:%02d) started.",var+1,alarm[var]->wktime.tm_hour+8,alarm[var]->wktime.tm_min);
|
||||
}
|
||||
else {
|
||||
LOG_E("Failed to start alarm %d.",var+1);
|
||||
}
|
||||
LOG_E("Failed to start alarm.");
|
||||
}
|
||||
|
||||
}
|
||||
#else
|
||||
void updateAlarm(uint8_t *t, size_t len);
|
||||
void InitAlarm()
|
||||
{
|
||||
updateAlarm(scfg.openWindowTime, 8);
|
||||
}
|
||||
#ifdef BOOT_PER_HOUR
|
||||
INIT_APP_EXPORT(addDefaultAlarm);
|
||||
#endif
|
||||
INIT_APP_EXPORT(InitAlarm);
|
||||
|
||||
|
||||
extern struct rt_alarm_container _container;
|
||||
static rt_alarm_t a[50];
|
||||
static size_t cnt = 0;
|
||||
#ifdef BOOT_PER_HOUR
|
||||
static size_t indexBegin=1;
|
||||
#else
|
||||
static size_t indexBegin=0;
|
||||
#endif
|
||||
|
||||
/**
|
||||
*获取所有RTC闹钟,不含预置闹钟
|
||||
*/
|
||||
void getAllAlarm()
|
||||
{
|
||||
rt_list_t *next;
|
||||
rt_alarm_t alarm;
|
||||
cnt = indexBegin;
|
||||
|
||||
for (next = _container.head.next; next != &_container.head; next = next->next)
|
||||
{
|
||||
alarm = rt_list_entry(next, struct rt_alarm, list);
|
||||
a[cnt++] = alarm;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 清空所有RTC闹钟
|
||||
*/
|
||||
void clearAlarm(void)
|
||||
{
|
||||
getAllAlarm();
|
||||
for (size_t i = indexBegin; i < cnt; ++i)
|
||||
{
|
||||
rt_alarm_delete(a[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭rtc闹钟,
|
||||
*/
|
||||
void stopAlarm()
|
||||
{
|
||||
getAllAlarm();
|
||||
for (size_t i = indexBegin; i < cnt; ++i)
|
||||
{
|
||||
rt_alarm_stop(a[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 恢复rtc闹钟,
|
||||
*/
|
||||
void startAlarm()
|
||||
{
|
||||
getAllAlarm();
|
||||
for (size_t i = indexBegin; i < cnt; ++i)
|
||||
{
|
||||
rt_alarm_start(a[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void addAlarm(uint8_t *din, rt_alarm_callback_t callback)
|
||||
{
|
||||
struct rt_alarm_setup setup;
|
||||
struct rt_alarm * alarm = RT_NULL;
|
||||
static time_t now;
|
||||
struct tm p_tm;
|
||||
|
||||
if (alarm != RT_NULL)
|
||||
return;
|
||||
|
||||
/* 获取当前时间戳,并把下一秒时间设置为闹钟时间 */
|
||||
now = time(NULL) + 10;
|
||||
gmtime_r(&now, &p_tm);
|
||||
|
||||
setup.flag = RT_ALARM_DAILY;
|
||||
setup.wktime.tm_year = p_tm.tm_year;
|
||||
setup.wktime.tm_mon = p_tm.tm_mon;
|
||||
setup.wktime.tm_mday = p_tm.tm_mday;
|
||||
setup.wktime.tm_wday = p_tm.tm_wday;
|
||||
setup.wktime.tm_hour = din[0]; //p_tm.tm_hour;
|
||||
setup.wktime.tm_min = din[1]; //p_tm.tm_min;
|
||||
setup.wktime.tm_sec = 0; //p_tm.tm_sec;
|
||||
|
||||
alarm = rt_alarm_create(callback, &setup);
|
||||
|
||||
if (RT_NULL != alarm)
|
||||
{
|
||||
rt_alarm_start(alarm);
|
||||
LOG_D("alarm started.");
|
||||
}
|
||||
rt_alarm_dump();
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新rtc闹钟
|
||||
* @param t 每个rtc时刻组成的数组,依次对应开窗时段的开始和结束
|
||||
*/
|
||||
void updateAlarm(uint8_t *t, size_t len)
|
||||
{
|
||||
// LOG_HEX("alarm",16,t,4);
|
||||
static struct rt_alarm_setup setup;
|
||||
|
||||
static time_t now;
|
||||
struct tm p_tm;
|
||||
/* 获取当前时间戳,并把下一秒时间设置为闹钟时间 */
|
||||
now = time(NULL);
|
||||
gmtime_r(&now, &p_tm);
|
||||
|
||||
setup.flag = RT_ALARM_DAILY;//天重复
|
||||
setup.wktime.tm_year = p_tm.tm_year;
|
||||
setup.wktime.tm_mon = p_tm.tm_mon;
|
||||
setup.wktime.tm_mday = p_tm.tm_mday;
|
||||
setup.wktime.tm_wday = p_tm.tm_wday;
|
||||
setup.wktime.tm_hour = 1; //整点
|
||||
setup.wktime.tm_min = 0; //p_tm.tm_min;
|
||||
setup.wktime.tm_sec = 0; //p_tm.tm_sec;
|
||||
//
|
||||
setup.wktime.tm_hour = t[0]; //开窗1开启点
|
||||
setup.wktime.tm_min = t[1]; //开窗1开启点
|
||||
// if (RT_NULL != alarm[0])
|
||||
// {
|
||||
// rt_alarm_delete(alarm[0]); //
|
||||
// }
|
||||
// alarm[0] = rt_alarm_create(poTT_callback, &setup);
|
||||
rt_alarm_control(alarm[0], RT_ALARM_CTRL_MODIFY, &setup);
|
||||
|
||||
setup.wktime.tm_hour = t[2]; //开窗1闭合点
|
||||
setup.wktime.tm_min = t[3]; //开窗1开启点
|
||||
// if (RT_NULL != alarm[1])
|
||||
// {
|
||||
// rt_alarm_delete(alarm[1]); //
|
||||
// }
|
||||
// alarm[1] = rt_alarm_create(pdTT_callback, &setup);
|
||||
rt_alarm_control(alarm[1], RT_ALARM_CTRL_MODIFY, &setup);
|
||||
|
||||
setup.wktime.tm_hour = t[4]; //开窗2开启点
|
||||
setup.wktime.tm_min = t[5]; //开窗2开启点
|
||||
// if (RT_NULL != alarm[2])
|
||||
// {
|
||||
// rt_alarm_delete(alarm[2]); //
|
||||
// }
|
||||
// alarm[2] = rt_alarm_create(poTT_callback, &setup);
|
||||
rt_alarm_control(alarm[2], RT_ALARM_CTRL_MODIFY, &setup);
|
||||
|
||||
setup.wktime.tm_hour = t[6]; //开窗2闭合点
|
||||
setup.wktime.tm_min = t[7]; //开窗2开启点
|
||||
// if (RT_NULL != alarm[3])
|
||||
// {
|
||||
// rt_alarm_delete(alarm[3]); //
|
||||
// }
|
||||
// alarm[3] = rt_alarm_create(pdTT_callback, &setup);
|
||||
rt_alarm_control(alarm[3], RT_ALARM_CTRL_MODIFY, &setup);
|
||||
|
||||
|
||||
//使用循环添加RTC
|
||||
// for (int var = 0; var < len; var+=4) {
|
||||
// setup.wktime.tm_hour = t[var+0]; //开窗1开启点
|
||||
// setup.wktime.tm_min = t[var+1]; //开窗1开启点
|
||||
// int index = var/2;
|
||||
//
|
||||
// if (alarm[index])
|
||||
// {
|
||||
// rt_alarm_control(alarm[index], RT_ALARM_CTRL_MODIFY, &setup);
|
||||
// }
|
||||
// else {
|
||||
// alarm[index] = rt_alarm_create(poTT_callback, &setup);
|
||||
// }
|
||||
//
|
||||
// setup.wktime.tm_hour = t[var+2]; //开窗1闭合点
|
||||
// setup.wktime.tm_min = t[var+3]; //开窗1开启点
|
||||
// if (alarm[index+1])
|
||||
// {
|
||||
// rt_alarm_control(alarm[index+1], RT_ALARM_CTRL_MODIFY, &setup);
|
||||
// }
|
||||
// else {
|
||||
// alarm[index+1] = rt_alarm_create(pdTT_callback, &setup);
|
||||
// }
|
||||
// }
|
||||
|
||||
for (size_t var = 0; var < len/2; var++) {
|
||||
if (alarm[var] != RT_NULL) {
|
||||
rt_alarm_start(alarm[var]);
|
||||
// LOG_D("alarm %d started.",var+1);
|
||||
LOG_D("alarmer %d(%02d:%02d) started.",var+1,alarm[var]->wktime.tm_hour+8,alarm[var]->wktime.tm_min);
|
||||
}
|
||||
else {
|
||||
LOG_E("Failed to start alarm %d.",var+1);
|
||||
}
|
||||
}
|
||||
// rt_alarm_control(alarm[0],RT_ALARM_CTRL_MODIFY,&setup);
|
||||
|
||||
}
|
||||
/**
|
||||
* 关闭rtc闹钟,
|
||||
*/
|
||||
void stopAlarm()
|
||||
{
|
||||
for (size_t var = 0; var < 4; var++) {
|
||||
if (alarm[var] != RT_NULL) {
|
||||
rt_alarm_stop(alarm[var]);
|
||||
LOG_D("alarm %d stopped.",var+1);
|
||||
}
|
||||
else {
|
||||
LOG_E("Failed to stop alarm %d.",var+1);
|
||||
}
|
||||
clearAlarm();
|
||||
for (int var = 0; var < len; var+=4) {
|
||||
addAlarm(t+var, poTT_callback);
|
||||
addAlarm(t+var+2, pdTT_callback);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 恢复rtc闹钟,
|
||||
*/
|
||||
void startAlarm()
|
||||
|
||||
static int isInAlarm(time_t now, rt_alarm_t start, rt_alarm_t stop)
|
||||
{
|
||||
for (size_t var = 0; var < 4; var++) {
|
||||
if (alarm[var] != RT_NULL) {
|
||||
rt_alarm_start(alarm[var]);
|
||||
LOG_D("alarm %d started.",var+1);
|
||||
}
|
||||
else {
|
||||
LOG_E("Failed to start alarm %d.",var+1);
|
||||
}
|
||||
}
|
||||
struct tm *alBegin = &start->wktime;
|
||||
alBegin->tm_hour += 8;
|
||||
time_t tBegin = mktime(alBegin);
|
||||
struct tm *alEnd = &stop->wktime;
|
||||
alEnd->tm_hour += 8;
|
||||
time_t tEnd = mktime(alEnd);
|
||||
// LOG_D("%ld-%ld", (long)tBegin,(long)tEnd);
|
||||
|
||||
return (int)(now >= tBegin && now <= tEnd);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -313,52 +271,25 @@ int isInWindowZone()
|
||||
gettimeofday(&tv, NULL);
|
||||
time_t now = (long) tv.tv_sec;
|
||||
// LOG_D("now = %ld", now);
|
||||
getAllAlarm();
|
||||
|
||||
struct tm *alBegin = &alarm[0]->wktime;
|
||||
alBegin->tm_hour += 8;
|
||||
time_t tBegin = mktime(alBegin);
|
||||
struct tm *alEnd = &alarm[1]->wktime;
|
||||
alEnd->tm_hour += 8;
|
||||
time_t tEnd = mktime(alEnd);
|
||||
// LOG_D("%ld-%ld", (long)tBegin,(long)tEnd);
|
||||
|
||||
uint8_t isIn1 = (now > tBegin && now < tEnd);
|
||||
|
||||
|
||||
alBegin = &alarm[2]->wktime;
|
||||
alBegin->tm_hour += 8;
|
||||
tBegin = mktime(alBegin);
|
||||
alEnd = &alarm[3]->wktime;
|
||||
alEnd->tm_hour += 8;
|
||||
tEnd = mktime(alEnd);
|
||||
// LOG_D("%ld-%ld", (long)tBegin,(long)tEnd);
|
||||
uint8_t isIn2 = (now > tBegin && now < tEnd);
|
||||
|
||||
if (isIn1 || isIn2)
|
||||
for (size_t i = indexBegin; i < cnt; i+=2)
|
||||
{
|
||||
if(isInAlarm(now, a[i], a[i+1]))
|
||||
{
|
||||
LOG_I("is in window zone.");
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//读取系统毫秒级时间
|
||||
//long getCurrentTime()
|
||||
//
|
||||
//{
|
||||
//
|
||||
//struct timeval tv;
|
||||
//
|
||||
//gettimeofday(&tv,NULL);
|
||||
//
|
||||
//LOG_D("ms=%lld", tv.tv_sec * 1000 + tv.tv_usec / 1000);
|
||||
//
|
||||
//LOG_D("Current time: %ld.%06ld\n", tv.tv_sec, tv.tv_usec);
|
||||
//
|
||||
//}
|
||||
|
||||
|
||||
MSH_CMD_EXPORT(clearAlarm,清空闹钟);
|
||||
MSH_CMD_EXPORT(stopAlarm,stop);
|
||||
MSH_CMD_EXPORT(startAlarm,start);
|
||||
MSH_CMD_EXPORT(isInWindowZone,isInWindow);
|
||||
|
Loading…
Reference in New Issue
Block a user