⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uialarm.c

📁 嵌入工linux开发的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
			{
				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 + -