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

📄 uialarm.c

📁 嵌入工linux开发的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
	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(&currentAlarm)==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(&currentAlarm)==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(&currentAlarm);
			
			//呼叫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 + -