📄 uialarm.c
字号:
{
if( temp->time.day > newNode->time.day )//(日)
{
newNode->next=pPretemp->next;
pPretemp->next=newNode;
break; //找到要加的位置,跳出回圈
}
else if( temp->time.day == newNode->time.day )//(日)
{
if( temp->time.hour > newNode->time.hour )//(时)
{
newNode->next=pPretemp->next;
pPretemp->next=newNode;
break; //找到要加的位置,跳出回圈
}
else if( temp->time.hour == newNode->time.hour )//(时)
{
if( temp->time.minute > newNode->time.minute )//(分)
{
newNode->next=pPretemp->next;
pPretemp->next=newNode;
break; //找到要加的位置,跳出回圈
}
else if( temp->time.minute == newNode->time.minute )//(分)
{
if( temp->time.second > newNode->time.second )//(秒)
{
newNode->next=pPretemp->next;
pPretemp->next=newNode;
break; //找到要加的位置,跳出回圈
}
else //若时间都一样,则判断priority大小以决定要加在前面或後面
{
/*
if( temp->nPriority < newNode->nPriority ) //若要加入的资料优先权较大,就不用移至下一笔
{
break; //找到要加的位置,跳出回圈
}
*/
//若时间都一样,则以当前Alarm取代
newNode->next = temp->next;
pPretemp->next = newNode;
sc_free(temp);
break;
}
}
}
}
}
}
//移至下一笔资料
pPretemp=temp;
temp=temp->next;
}// end of while
if(temp==NULL) //表示到尾部尚未找到要加的位置,把Newnode加在尾部
{
newNode->next=pPretemp->next;
pPretemp->next=newNode;
}
}
//*****************************************************
// 新增 一个时间资料到linklist中
// newNode :指向Alarm型态的资料结构
// 传回值: FAIL:失败
// SUCCESS:成功
// 2:表示目前要加入这笔资料的ID已经存在了,将旧有资料取代掉
//*****************************************************
int _AddAlarmLinklist(AlarmNode *pAlarm)
{
AlarmNode *newNode;
AlarmNode *temp,*pPretemp,*pOldNode;
pPretemp=gpAlarmTab;
temp = gpAlarmTab->next;
if( isAlarmTimeExist(gpAlarmTab, pAlarm->pAlarmID) ) //若资料已存在(ID相同),就不新增资料
{
while(temp!=NULL)
{
//若program id相同的话表示资料已经存在
if (strcmp(temp->pAlarmID,pAlarm->pAlarmID)==0)
{
//复制pAlarm的资料到linklist内
time_assign(&(temp->time),pAlarm->time);
temp->nPriority=pAlarm->nPriority;
temp->nPeriod=pAlarm->nPeriod;
temp->ProgID=pAlarm->ProgID;
temp->msg_alarmcallbackfun=pAlarm->msg_alarmcallbackfun;
strcpy(temp->pAlarmMsg, pAlarm->pAlarmMsg);
pOldNode=temp;
pPretemp->next=temp->next;
//重新找寻插入位址
InsertAlarmLinklist(pOldNode);
//处理过期闹铃时间,如果linklist内没有资料,则跳出if()
if(AlarmOutofTime()!=0)
{
//直接设定闹铃
hw_rtcSetAlarm();
}
//return 2;
return STATUS_OK;
}
pPretemp=temp; //保留前一个node
temp=temp->next; //下移一个node
}
}
else if ((gpAlarmTab->next) == NULL) // The list is empty.
{
newNode = (AlarmNode*)sc_malloc(sizeof(AlarmNode));
if (newNode == NULL)
return STATUS_ERR;
else
memset(newNode, 0 , (unsigned long)sizeof(AlarmNode));
gpAlarmTab->next = newNode;
newNode->next = NULL;
}
else //not empty
{
newNode = (AlarmNode*)sc_malloc(sizeof(AlarmNode));
if (newNode == NULL)
return FAIL;
else
memset(newNode, 0 , (unsigned long)sizeof(AlarmNode));
while(temp!=NULL)
{
if( temp->time.year > pAlarm->time.year ) //表示新增的值较小(年)
{
newNode->next=pPretemp->next;
pPretemp->next=newNode;
break; //找到要加的位置,跳出回圈
}
else if( temp->time.year == pAlarm->time.year )//表示新增的值一样大(年)
{
if( temp->time.month > pAlarm->time.month )//(月)
{
newNode->next=pPretemp->next;
pPretemp->next=newNode;
break; //找到要加的位置,跳出回圈
}
else if( temp->time.month == pAlarm->time.month )//(月)
{
if( temp->time.day > pAlarm->time.day )//(日)
{
newNode->next=pPretemp->next;
pPretemp->next=newNode;
break; //找到要加的位置,跳出回圈
}
else if( temp->time.day == pAlarm->time.day )//(日)
{
if( temp->time.hour > pAlarm->time.hour )//(时)
{
newNode->next=pPretemp->next;
pPretemp->next=newNode;
break; //找到要加的位置,跳出回圈
}
else if( temp->time.hour == pAlarm->time.hour )//(时)
{
if( temp->time.minute > pAlarm->time.minute )//(分)
{
newNode->next=pPretemp->next;
pPretemp->next=newNode;
break; //找到要加的位置,跳出回圈
}
else if( temp->time.minute == pAlarm->time.minute )//(分)
{
if( temp->time.second > pAlarm->time.second )//(秒)
{
newNode->next=pPretemp->next;
pPretemp->next=newNode;
break; //找到要加的位置,跳出回圈
}
else //若时间都一样,则判断priority大小以决定要加在前面或後面
{
/*
if( temp->nPriority < pAlarm->nPriority ) //若要加入的资料优先权较大,就不用移至下一笔
{
break; //找到要加的位置,跳出回圈
}
*/
//若时间都一样,则以当前Alarm取代
sc_free(newNode);
newNode = temp;
break;
}
}
}
}
}
}
//移至下一笔资料
pPretemp=temp;
temp=temp->next;
}// end of while
if(temp==NULL) //表示到尾部尚未找到要加的位置,把Newnode加在尾部
{
newNode->next=pPretemp->next; // ???
pPretemp->next=newNode;
}
/* else // by zhangxueping
{
pPretemp->next=newNode;
newNode->next=temp->next;
}
*/
}
//复制pAlarm的资料到linklist内
time_assign(&(newNode->time),pAlarm->time);
newNode->nPriority=pAlarm->nPriority;
newNode->nPeriod=pAlarm->nPeriod;
newNode->ProgID=pAlarm->ProgID;
newNode->msg_alarmcallbackfun=pAlarm->msg_alarmcallbackfun;
strcpy(newNode->pAlarmID, pAlarm->pAlarmID);
strcpy(newNode->pAlarmMsg, pAlarm->pAlarmMsg);
/*
#ifndef __WIN32__
//改变Allocate出来记忆体的Owner为Kernel(-11),避免AP离开後会一并被Free掉
setMemoryOwner(newNode, (long)-11);
#endif
*/
// if not set alarm in rtc, then set alarm
/* if(gSetAlarm==0) // by zhang xue ping
{
//处理过期闹铃时间,如果linklist内没有资料,则跳出if()
if(AlarmOutofTime()!=0)
{
//直接设定闹铃
hw_rtcSetAlarm();
}
}
*/
if(AlarmOutofTime()!=0)
{
//直接设定闹铃
hw_rtcSetAlarm();
}
//return SUCCESS;
return STATUS_OK;
}
//int _AddAlarmLinklist(AlarmNode *pAlarm)
DLL_EXP(int) guiAddAlarm(sysTime *pTime, char *pAlarmID, char *pMessage, unsigned short nPeriod)
{
struct _AlarmNode *pAlarmNode;
int len, count, ret;
sysTime setTime, now;
if(pAlarmID[0]==0)
return STATUS_ERR;
if(pMessage[0]==0)
return STATUS_ERR;
sc_getTime(&now);
now.second += 1; // second intr late than alarm intr sometimes
setTime.second = pTime->second;
setTime.minute = pTime->minute;
setTime.hour = pTime->hour;
setTime.day = pTime->day;
setTime.month = pTime->month;
setTime.week = pTime->week;
setTime.year = pTime->year;
if(time_comp(now, setTime)!=2)
return STATUS_ERR;
pAlarmNode = (struct _AlarmNode *)sc_malloc(sizeof(struct _AlarmNode));
time_assign(&(pAlarmNode->time), *pTime);
pAlarmNode->nPriority = 0;
pAlarmNode->ProgID = 0;
pAlarmNode->nPeriod = nPeriod;
len = strlen(pAlarmID);
if(len>PID_SIZE)
len = PID_SIZE;
strncpy(pAlarmNode->pAlarmID, pAlarmID, len); // PID_SIZE
pAlarmNode->pAlarmID[len] = 0;
len = strlen(pMessage);
if(len>MSG_SIZE)
len = MSG_SIZE;
strcpy(pAlarmNode->pAlarmMsg, pMessage); // MSG_SIZE
pAlarmNode->msg_alarmcallbackfun = guiDispAlarmMessage;
pAlarmNode->next = NULL;
ret = _AddAlarmLinklist(pAlarmNode);
sc_free(pAlarmNode);
return ret;
}
//**************************************************************
// 移除 linklist内所有资料,保留head
//**************************************************************
static void freeAlarmLinklist(AlarmNode* head)
{
AlarmNode *current;
AlarmNode *pNext;
if(head==NULL || head->next==NULL) //若是空的就不必release了
return;
current = head->next;
pNext = current->next;
while (pNext != NULL)
{
sc_free(current);
current = pNext;
pNext = pNext->next;
}
sc_free(current);
head->next=NULL;
}
DLL_EXP(void) guiDispAlarmMessage(HNDL handle, char *msg)
{
HNDL hTopWindow, hWin;
HNDL hButton;
guiMessageBox(RES_STR_ALARMREMIND[gLanguage], msg, GUIMB_OK); // "响闹提醒"
//hWin=guiWindow_Create(NULL, "响闹提示",NULL, NULL, GUIWIN_IMAGE_SAVE);//GUIWIN_SAVE_IMAGE);
//hButton = guiButton_Create(AP_BOTTOM_BUTTON1_LEFT,AP_BOTTOM_BUTTON1_TOP,AP_BOTTOM_BUTTON1_RIGHT,AP_BOTTOM_BUTTON1_BOTTOM,(char *)sch_buttontext[1],BUTTON_WIN3D|BUTTON_ALIGN_CENTER);
}
//**************************************************************
// 移除id相同的那笔资料
// head:linklist head
// id :这笔资料的识别码(可由时间的年月日时分秒组成)
//**************************************************************
// if id is exist, then return STATUS_OK, else return STATUS_ERR
DLL_EXP(int) guiRemoveAlarm(char *id)
{
AlarmNode *pRemove,*pTmp,*pPreTmp,*nodePtr;
nodePtr=gpAlarmTab;
pPreTmp=nodePtr;
pTmp=nodePtr->next;
while(pTmp!=NULL)
{
//若program id相同的话表示要删除
if (strcmp(pTmp->pAlarmID,id)==0)
{
pRemove=pTmp;
pPreTmp->next=pTmp->next;
break;
}
pPreTmp=pTmp; //保留前一个node
pTmp=pTmp->next; //下移一个node
}
gSetAlarm = 0; // must reset alarm in rtc
//处理过期闹铃时间,如果linklist内没有资料,则跳出if()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -