📄 uialarm.c
字号:
if(AlarmOutofTime()!=0)
{
//直接设定闹铃
hw_rtcSetAlarm();
}
if(pTmp==NULL)
//return 0;
return STATUS_ERR;
else
{
sc_free(pRemove);
//return 1;
return STATUS_OK;
}
}
//****************************************************
// 取得闹铃时间table中的第一笔资料,传回0失败,1成功
//*****************************************************
int getFirstAlarmTime(AlarmNode * pAlarm)
{
if(gpAlarmTab==NULL || gpAlarmTab->next==NULL)
{
memset(&pAlarm->time,0,(unsigned long)sizeof(sysTime));
return 0;
}
//复制所有资料到pAlarm
time_assign(&(pAlarm->time),gpAlarmTab->next->time);
pAlarm->nPriority=gpAlarmTab->next->nPriority;
pAlarm->nPeriod=gpAlarmTab->next->nPeriod;
pAlarm->ProgID=gpAlarmTab->next->ProgID;
strcpy(pAlarm->pAlarmID,gpAlarmTab->next->pAlarmID);
strcpy(pAlarm->pAlarmMsg,gpAlarmTab->next->pAlarmMsg);
pAlarm->msg_alarmcallbackfun = gpAlarmTab->next->msg_alarmcallbackfun;
return 1;
}
//****************************************************
// 功能 :释放第一笔资料的记忆体
// 传回值: 0-失败 1-成功
//*****************************************************
int freeFirstAlarmTime(void)
{
AlarmNode *pRemove;
// error linklist is empty
if( gpAlarmTab==NULL || gpAlarmTab->next==NULL)
return 0;
pRemove=gpAlarmTab->next;
gpAlarmTab->next =gpAlarmTab->next->next;
sc_free(pRemove);
return 1;
}
//****************************************************
//
// 设定闹铃timeout时间及处理timeout之ISR
//
//****************************************************
void hw_rtcSetAlarm(void)
{
//char tmpStr[50];
int day;
sysTime now,*pTime;
if(gpAlarmTab->next!=NULL)
{
pTime=&gpAlarmTab->next->time;
#ifndef __WIN32__
//rtcSetAlarm(day, (int)pTime->hour, (int)pTime->minute, (int)pTime->second, timeOutsysAlarm);
rtcSetAlarm(pTime, timeOutsysAlarm);
#endif
//bSetAlarm=0;
gSetAlarm = 1;
}
}
//****************************************************
//
// 设定闹铃timeout时间及处理timeout之ISR
//
//****************************************************
//void startSysAlarmer(int days, int hours, int minutes, int seconds)
void startSysAlarmer(sysTime *pTime, int seconds)
{
//char tmpStr[50];
//sprintf(tmpStr,"start>%d:%d:%d:%d",days,hours,minutes,seconds);
//SprintStringLn(tmpStr);
//bSetAlarm=1;
#ifndef __WIN32__
rtcSetAlarm(pTime, timeOutsysAlarm);
#endif
}
//****************************************************
//
// 关闭硬体闹铃
//
//****************************************************
void stopSysAlarmer(void)
{
gSetAlarm = 0;
#ifndef __WIN32__
rtcResetAlarm();
#endif
}
//****************************************************
//
// 设定timeout时要回呼叫的Enqueue function
//
//****************************************************
/*void setAlarmCallback(hw_alarmHandler pFun)
{
pFunEnqueue=pFun;
}
*/
//****************************************************
//
// 处理Linklist内的过期时间
// 传回值: 0:linklist没有资料 1:其它情形
//
//****************************************************
int AlarmOutofTime(void)
{
AlarmNode * pOldNode;
AlarmNode currentAlarm;
sysTime now;
unsigned short tmpWeekCount;
//char tmpStr[50];
// unsigned short year1, month1, day1, hour1, minute1, second1;
// unsigned short year2, month2, day2, hour2, minute2, second2;
sc_getTime(&now);
now.second += 1; // second intr late than alarm intr sometimes
//now.year+=1990; // by zhang xue ping
if(getFirstAlarmTime(¤tAlarm)==0)
return 0;
// 当now>=currentAlarm.time 则处理过期时间
for( ; time_comp(now,currentAlarm.time)!=2 ; ) // !(t1<t2)
{
if(currentAlarm.nPeriod==0) //period为零,为非周期性资料
{
// add2GabageList(); //丢到garbage list
freeFirstAlarmTime(); // by zhang xue ping
}
else
{ //将重算目前这点的闹铃时间,并重新插入到gpAlarmTab中
//改变pAlarm的第一笔资料为下一个节点,并传回被移掉那个节点的指标
pOldNode=change2NextNode();
hw_calendar_caladdday(&pOldNode->time.day, &pOldNode->time.month, &pOldNode->time.year, &tmpWeekCount , pOldNode->nPeriod );
//将加上n天後的闹铃时间加到周期性table内
InsertAlarmLinklist(pOldNode);
}
if(getFirstAlarmTime(¤tAlarm)==0)
return 0;
}
return 1;
}
void processActiveAlarm(AlarmNode *currentAlarm)
{
TGuiMessage msgTemp;
#ifndef __WIN32__
AlarmPlay(); // play alarm voice
#endif
msgTemp.handle=(HNDL)gpTopWindow; // notice thread to process interface
msgTemp.messageType=SYS_MESSAGE_ALARM;
msgTemp.elseInfo=(int)currentAlarm;
//msgTemp.y=y;
if(gpTopWindow) // by zhangxp 2003/06/18
_guiEnqueue(gpTopWindow->messageQueue, &msgTemp);
return;
}
//****************************************************
//
// Send message to Hardware alarm manager
//
//****************************************************
void timeOutsysAlarm(void)
{
int day;
//AlarmNode currentAlarm,nextAlarm;
AlarmNode *pHeadAlarm;
// unsigned short tmpWeekCount;
sysTime now;
//char tmpStr[50];
stopSysAlarmer(); // disable alarm interrupt
//SprintStringLn("timeOutsysAlarm");
gSetAlarm = 0;
getFirstAlarmTime(&gCurrentAlarm);
/*
// if not period alarm, then delete it
if(currentAlarm.nPeriod==0)
{
freeFirstAlarmTime();
}
*/
if(AlarmOutofTime()!=0)
{
//直接设定闹铃
hw_rtcSetAlarm();
}
//AlarmOutofTime();
//hw_rtcSetAlarm();
processActiveAlarm(&gCurrentAlarm);
/*
switch(bSetAlarm)
{
//送讯息给HWAlarmThread以作对应的处理
case 0:
do
{
//SprintStringLn("1");
//先取得第一个节点的资料,再作enqueue的动作
getFirstAlarmTime(¤tAlarm);
//呼叫Hardware Alarm Manager enqueue function
if(pFunEnqueue!=NULL)
{
// ((*pFunEnqueue)(gpAlarmTab->next));
processActiveAlarm(gpAlarmTab->next);
}
//改变pAlarm的第一笔资料为下一个节点
change2NextNode();
// find next item in list
if(getFirstAlarmTime(&nextAlarm)==0)
break;
}while( time_comp(currentAlarm.time,nextAlarm.time)!=2 );
//下一笔资料时间若小於等於目前时间,则继续send message
//设定Alarm
case 1:
//处理过期闹铃时间,如果linklist内没有资料,则跳出if()
if(AlarmOutofTime()!=0)
{
//直接设定闹铃
hw_rtcSetAlarm();
}
break;
}
*/
}
//****************************************************
//
// 将过期的资料加到Gabage Linklist内,并将gpAlarmTab移到下一点
//
//****************************************************
void add2GabageList(void)
{
AlarmNode *pNewHead;
//记下下一节点的位址,最後要设为新的gpAlarmTab的head
pNewHead=gpAlarmTab->next->next;
//将第一笔资料串到Garbage linklist内
if(gpGarbabeAlarm->next==NULL) //若garbage linklist为空
{
gpAlarmTab->next->next=NULL;
}
else
{
gpAlarmTab->next->next=gpGarbabeAlarm->next->next;
}
gpGarbabeAlarm->next=gpAlarmTab->next;
gpAlarmTab->next=pNewHead;
}
//****************************************************
//
// 并将gpAlarmTab移到下一点
//
//****************************************************
AlarmNode * change2NextNode(void)
{
AlarmNode * pOldNode;
pOldNode=gpAlarmTab->next;
//将下一节点改为head
gpAlarmTab->next=gpAlarmTab->next->next;
return pOldNode;
}
//****************************************************
//
// Garbage collection
//
//****************************************************
void gabageCollection(AlarmNode * pNode)
{
unsigned short tmpWeekCount;
//sysTime now;
if( pNode->nPeriod!=0 ) //为周期性时间
{
//将加上n天後的闹铃时间加到周期性table内
hw_calendar_caladdday(&pNode->time.day, &pNode->time.month, &pNode->time.year, &tmpWeekCount , pNode->nPeriod );
InsertAlarmLinklist(pNode);
hw_rtcSetAlarm();
}
else
{
sc_free(pNode);
}
freeAlarmLinklist(gpGarbabeAlarm);
}
#ifdef ALARM_DRV_DEBUG
int trival_Alarmlinklist(void)
{
AlarmNode *pRemove,*pTmp,*pPreTmp,*nodePtr;
// char tmpStr[50];
nodePtr=gpAlarmTab;
pPreTmp=nodePtr;
pTmp=nodePtr->next;
SprintStringLn("Linklist trace");
while(pTmp!=NULL)
{
// sprintf(tmpStr,"<%s>",gpAlarmTab->pAlarmID);
// SprintStringLn(tmpStr);
pPreTmp=pTmp; //保留前一个node
pTmp=pTmp->next; //下移一个node
}
SprintStringLn("Linklist O.K.");
return 1;
}
#endif
#ifdef _OLD_VER_
//***********************************************************
// 取得table中的第一笔资料,并将这个node删除,传回0失败,1成功
//***********************************************************
int extractAlarmTime(AlarmNode *pAlarm)
{
if(getFirstAlarmTime(pAlarm)==0) //没有资料存在
{
return 0;
}
//删除第一个节点
freeFirstAlarmTime();
return 1;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -