www.pudn.com > multitaskRTC.rar > Main.c, change:2006-03-27,size:6551b


#include"..\ucos-ii\includes.h"               /* uC/OS interface */ 
#include "..\ucos-ii\add\osaddition.h" 
#include "..\inc\drv.h" 
#include "..\inc\drv\OSFile.h" 
#include <string.h> 
 
///******************任务定义***************/// 
OS_STK Main_Stack[STACKSIZE*8]={0, };   //Main_Test_Task堆栈 
void Main_Task(void *Id);             //Main_Test_Task 
#define Main_Task_Prio     12 
 
/**************已经定义的OS任务************* 
tcp监控任务		11 
以太网物理层监控任务	8 
触摸屏任务		9 
键盘任务		10 
lcd刷新任务		59 
系统任务		1 
*****************************************************/ 
 
///*****************事件定义*****************/// 
OS_EVENT *Nand_Rw_Sem;                   //Nand_Flash读写控制权旗语 
//and you can use it as folloeing: 
//    Nand_Rw_Sem=OSSemCreate(1);        //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件// 
//    OSSemPend(Nand_Rw_Sem,0,&err); 
//    OSSemPost(Nand_Rw_Sem); 
 
OS_EVENT *Uart_Rw_Sem;                   //Uart读写控制权旗语 
//and you can use it as folloeing: 
//    Uart_Rw_Sem=OSSemCreate(1);        //创建Uart读写控制权旗语,初值为1满足互斥条件// 
//    OSSemPend(Uart_Rw_Sem,0,&err); 
//    OSSemPost(Uart_Rw_Sem); 
////////////////////////////////////////////////////////// 
 
void initOSGUI()	//初始化操作系统的图形界面 
{ 
	initOSMessage(); 
	initOSList(); 
	initOSDC(); 
	initOSCtrl(); 
	initOSFile(); 
} 
///////////////////////////////////////////////////// 
//                  Main function.                // 
//////////////////////////////////////////////////// 
 
int Main(int argc, char **argv) 
{ 
	ARMTargetInit(); //开发板初始化 
	OSInit(); //操作系统初始化       
	uHALr_ResetMMU();//复位MMU 
	LCD_Init();             //初始化LCD模块 
	LCD_printf("LCD initialization is OK\n");//向液晶屏输出数据 
	LCD_printf("320 x 240  Text Mode\n"); 
	initOSGUI();//初始化图形界面 
	LoadFont();//调Unicode字库 
	LoadConfigSys();//使用config.sys文件配置系统设置 
	LCD_printf("Create task on uCOS-II...\n"); 
	OSTaskCreate(Main_Task,  (void *)0,  (OS_STK *)&Main_Stack[STACKSIZE*8-1],  Main_Task_Prio);// 创建系统任务 
	OSAddTask_Init();//创建系统附加任务 
	LCD_printf("Starting uCOS-II...\n"); 
	LCD_printf("Entering graph mode...\n"); 
	LCD_ChangeMode(DspGraMode);//变LCD显示模式为文本模式 
	InitRtc();//初始化系统时钟 
	Nand_Rw_Sem=OSSemCreate(1);   //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件// 
	OSStart();//操作系统任务调度开始 
	//不会执行到这里 
	return 0; 
} 
 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
PTextCtrl pTextCtrl;//文本框结构 
#define ID_MainTextCtrl 101//文本框ID 
 
U8 SetSysTime() 
{ 
	U16* ptext=pTextCtrl->text;//得到文本框文本指针 
	U32 tmp[3],i; 
	structClock clock; 
 
	for(i=0;i<3;i++){//从文本中分离出时间,bcd码 
		tmp[i]=0; 
		while(*ptext && *ptext !=':'){ 
			tmp[i]<<=4; 
			tmp[i]|=(*ptext)-'0'; 
			ptext++; 
		} 
		ptext++; 
	} 
 
	clock.hour=tmp[0]; 
	clock.minute=tmp[1]; 
	clock.second=tmp[2]; 
	if((clock.hour<=0x24&&clock.hour>=0)&&(clock.minute>=0&&clock.minute<=0x60)&&(clock.second>=0&&clock.second<=0x60))//小时在0~24,分和秒在0~60 
	{ 
		Set_Rtc_Clock(&clock);//设置时间 
		return TRUE; 
	} 
	else 
	{ 
		return FALSE; 
	} 
} 
 
 
void CreateText() 
{ 
	static char TimeKeyTable[]={0,0,0,'\b','7','8','9',0,'4','5','6','1','2','3',0,'0',':'};//键值映射表 
 
	structRECT rect;//定义矩形结构 
	int i=0; 
	U16 str[20]; 
 
	SetRect(&rect, 80,30,160,50);	//设置文本框 
	pTextCtrl=CreateTextCtrl(ID_MainTextCtrl, &rect, FONTSIZE_MIDDLE, CTRL_STYLE_FRAME,TimeKeyTable,NULL);//创建文本框 
 
	SetWndCtrlFocus(NULL,ID_MainTextCtrl);//焦点移到文本框中 
 
	DrawTextCtrl(pTextCtrl);//重绘文本框 
	 
} 
 
U8 onKey(int nkey, int fnkey); 
 
OS_EVENT *Rtc_Updata_Sem;//时钟更新控制权 
OS_STK Rtc_Disp_Stack[STACKSIZE]={0, };   //Rtc_Disp_Task堆栈 
void Rtc_Disp_Task(void *Id);             //Rtc_Disp_Task 
#define Rtc_Disp_Task_Prio      14 
 
void Main_Task(void *Id)             //Main_Test_Task 
{ 
	POSMSG pMsg=0;//消息结构 
 
	ClearScreen();//清屏 
	CreateText(); //创建文本框 
 
	Rtc_Updata_Sem=OSSemCreate(1); 
	OSTaskCreate(Rtc_Disp_Task,  (void *)0,  (OS_STK *)&Rtc_Disp_Stack[STACKSIZE-1],  Rtc_Disp_Task_Prio);	//5//创建时钟任务 
 
	 
	//消息循环 
	for(;;){ 
		POS_Ctrl pCtrl;//控件结构 
		pMsg=WaitMessage(0);//等待消息 
 
		if(pMsg->pOSCtrl){//发给控件的消息 
			if(pMsg->pOSCtrl->CtrlMsgCallBk) 
				(*pMsg->pOSCtrl->CtrlMsgCallBk)(pMsg); 
		} 
		else{ 
			switch(pMsg->Message){ 
			case OSM_KEY://键盘消息 
				pCtrl=GetCtrlfromID(NULL, GetWndCtrlFocus(NULL));//得到焦点控件指针 
				if(pCtrl->CtrlType==CTRLTYPE_WINDOW){ 
					if((((PWnd)pCtrl)->style&WND_STYLE_MODE)==WND_STYLE_MODE){ 
						//焦点是有模式窗口,消息直接传递过去 
						OSOnSysMessage(pMsg); 
						break; 
					} 
				} 
				if(onKey(pMsg->WParam,pMsg->LParam) ) 
					break; 
			default: 
				OSOnSysMessage(pMsg); 
				break; 
			} 
		} 
		DeleteMessage(pMsg);//删除消息 
	} 
} 
 
U8 onKey(int nkey, int fnkey) 
{ 
	PDC pdc;//定义绘图设备上下文结构 
	U16 str[20]; 
	static U8 input=FALSE;//编辑状态标志 
	INT8U err; 
	char errinformation[]="data flow!";//数据溢出信息 
	u8 i=0; 
 
	switch(nkey){ 
	case 14://OK 
		if(!input){//没处于编辑状态 
			OSSemPend(Rtc_Updata_Sem, 0,&err);//等待信号量 
			pTextCtrl->text[0]=0;  //清空文本框 
			SetTextCtrlEdit(pTextCtrl, TRUE);//焦点移到文本框控件 
			DrawTextCtrl(pTextCtrl);//重绘文本框控件 
			input=TRUE;//置编辑标志为是 
		} 
		else{ 
			if(SetSysTime())//输入的数据有效 
			{ 
				SetTextCtrlEdit(pTextCtrl, FALSE);//退出编辑状态 
				DrawTextCtrl(pTextCtrl);//重绘文本框控件 
				input=FALSE;//置编辑标志为否 
				OSSemPost(Rtc_Updata_Sem);//发送信号? 
			} 
			else 
			{ 
				strChar2Unicode(pTextCtrl->text,errinformation);//数据溢出信息转换成unicode 
				DrawTextCtrl(pTextCtrl);//重绘文本框控件 
				pTextCtrl->text[0]=0;  //清空文本框 
			} 
		} 
		return TRUE; 
	case 7://Cancel 
		if(input){ 
			SetTextCtrlEdit(pTextCtrl, FALSE);//退出编辑状态 
 
			input=FALSE;//编辑状态标志为否 
 
			OSSemPost(Rtc_Updata_Sem);//发送信号量 
		}		 
		return TRUE; 
	} 
	return FALSE; 
} 
 
//////////////////////////////////////////////////////////////// 
void Rtc_Disp_Task(void *Id) //时钟显示更新任务 
{ 
	U16 strtime[10]; 
	INT8U err; 
	 
	for(;;){ 
		if(Rtc_IsTimeChange(RTC_SECOND_CHANGE)){//不需要更新显示 
			OSSemPend(Rtc_Updata_Sem, 0,&err);//等待信号量 
			Rtc_Format("%H:%I:%S",strtime);//格式化时间 
			SetTextCtrlText(pTextCtrl, strtime,TRUE);//设置文本框内容 
			OSSemPost(Rtc_Updata_Sem);//发送信号量 
		} 
		OSTimeDly(250); 
	} 
}