systask.c

来自「一个操作系统源代码 用于嵌入式设备 在Vc++环境下仿真 成功移植到多款处理器上」· C语言 代码 · 共 1,313 行 · 第 1/3 页

C
1,313
字号
/*************************************************************************
 *  Copyright (C) Asic Center. 2001
 *  All Rights Reserved
 *
 *  Filename : systask.c
 *  Function : System Task
 *  Revision :
 *          2001/09/20     Pessia     Create this file;
 *          2001/10/9	Pessia	Modify KeyScanHandler & TouchPanelHandler 
 *							       for iset_flg at 4 places;
 *          2001/10/10	Pessia	Add SysTableInit() to initial gTskDspTbl;
 *          2002/3/13       Pessia     Move those global variables and functions associated 
 *                                                     with devices to files of these devices;
 *                                               Add init_key_pen_buf() to init KEY_BUF , PEN_BUF 
 *                                                     and so on;
 *                                               Delete all things about AT;
 *                                               Fix a bug about looking for new events after dealing
 *                                                      with last events in the end of process_int() and 
 *                                                      process_msg();
 *          2002/3/16      Pessia      Add code to enable shell catch some special key 
 *                                                      message to send SM_SWITCH
 *          2002/3/16      Pessia      Fix some bug of [case SM_SWITCH]
 ************************************************************************/
#include <stdio.h>
#include <string.h>
#include <kernel\ros33\ros33.h>

#include <sys\at.h>
#include <sys\key.h>
#include <sys\pen.h>

#include <sys\systsk.h>
#include <sys\sysmsg.h>
#include <sys\syserr.h>
#include <sys\ppsmmsg.h>
#include <sys\devmng.h>
#include <sys\atv.h>
#include <sys\rtc.h>
#include <sys\gpc.h>
#include <sys\systmr.h>
#include <sys\taskdsp.h>
#include <sys\lmalloc.h>
#include <sys\keydef.h>

#include <hardware\drball\uart.h>

#include <sys\sysdebug.h>
#include <hardware\drball\M68328.h>
#include <sys\pwrctrl.h>


DWORD 	EveryMinuteTimer;
DWORD 	EveryHourTimer;
DWORD 	EveryDayTimer;

extern UH g_uhIntTime;     // interrupt time

void Systask( void );
void power_down(void);

/* Prototype of  Static Functions */
static void systaskinit(void);
static void process_int(UINT flgptn);
static void process_msg(void);
static void PenCalibration(void);

/* Prototype of  Extern Functions */
extern STATUS ASIXInit(void); 		/* init Asixwin in systaskinit() */

extern void TouchPanelHandler(void);
extern void KeyScanHandler(void);
extern void PenEnable(void);

//extern DWORD InitGSM( void );
extern DWORD CreateDataBase( void );
extern unsigned long InitFileSystem( void );

extern void InitialSystem( void );


#define POS_WUCHA 5
WORD	en_disp_ad = 0;

/* gTskDspTbl will be initialed by SysTableInit() 
  * which is called by taskmain().	 */
SYSTCB	gSysTcbTbl[TASKNUM];	/* Global Task Control Block Table */
ID 		gLcdOwnerTskId=0;		/* task id of LCD owner */
SYSTCB	*CurTask=NULL;			/* point to current app task's link entry */
SYSTCB	*TaskHead=NULL;		/* Application Task List */

BYTE	SystemStart = 0;

/* Variables for Pen Calibration */
static float kx = 0;
static float bx = 0;
static float ky = 0;
static float by = 0;

static unsigned short PendownFlag=0;
static unsigned short AD_Value_Is_Read=0;/* Register how many times AD has been read */

static POINTS kp[256];
static BYTE kpcount = 0;

static DWORD lastpenxy;
static short last_x,last_y;
static short next_x,next_y;

//extern BYTE	array_memory[];

/******************************************************************
 *	Function Name: 	Systask	
 *	Param in:		void
 *  Result code:	void
 *	Description:	system task receive and handle event infinite
 ******************************************************************/	
void Systask( void )
{
	static UINT flgptn;

	dbgprintf("Systask Init Started\n");

//	SysWriteDev( UART0_ID, array_memory, Heapsize, -1 );
	systaskinit();
	SystemStart = 1;
	
		
	while(1) 
	{
		/* initial flgptn */
		flgptn = 0;
		dbgprintf("wait\n");

		/* wait for Interrupt or Tasks' Message */
		wai_flg(&flgptn, SYS_EVENT, 0x000000FF, TWF_ORW);
		dbgprintf("got int\n");

		/* check whether interrupt happend */
		if(flgptn > 0x1)
			process_int(flgptn);

		/* check whther Tasks' message came */
		if(flgptn & 0x1)
			process_msg();
	}
}

/*****************************************************************
*  Function Name: process_int 
*  Param in:	UINT flgptn
*  Result code:	void							
*  Description: process Interrupt indicated by event
*****************************************************************/
static void process_int(UINT flgptn)
{
	MSG 	newmsg;
	MSG		ppsmmsg;
	ID		destid;		/* destination */
	BYTE	msgtype;	/* message type */
	static BYTE	pen_clb_cnt = 0;
	static BYTE	power_down_cnt = 0;
	BYTE	en_pen_clb = 0, en_power_down = 0;

	/* check if it is GSM_RING interrupt or not */
	// Just test code!!!
	/*
	if( flgptn & INTGSM_RING_FLG )
	{
		// clear this event
		clr_flg(SYS_EVENT, ~INTGSM_RING_FLG);

		// disable GSM_RING interrupt 
		*(volatile unsigned char *)0x40270 &= ~0x04;

		newmsg.message = 0x400;//test
		// setflg TIMER_EVENT
		SysSendMessage(6, &newmsg);// to c task
	}
	*/
	
	/* check if it is KEY Interrupt or not */
	/* here, we think there must be new event in buffer */
	/* so we needn't check KEY_BUF_readcount =?= KEY_BUF_writecount */
	if( flgptn & INTKEY_FLG )
	{	
		msgtype = KEY_BUF[KEY_BUF_readcount].flag;
		// dest task should be the one which has LcdScreen now!
		destid = gLcdOwnerTskId;
		
		// make sure that destination is running
		if( gSysTcbTbl[destid-1].status == RUNNING )
		{
			switch(msgtype)
			{
				case SM_KEY:
					break;
				
				// SM_KEYDOWN and SM_KEYREPEAT is not sent
				case SM_KEYDOWN:
					//PenDisable();
					act_cyc(KEYSCANTIMER,TCY_ON|TCY_INI);
					/*
					/////////////////////////////////////////////////
					//pessia2002/3/16:
					//System Catch Special Key, switch to SHELL
					if( KEY_BUF[KEY_BUF_readcount].keyvalue == 1)
					{
						ppsmmsg.message = SM_SWITCH;
						ppsmmsg.wparam = 0;
						SysSendMessage(SYSTASK_ID, &ppsmmsg);
						break;
					}
					/////////////////////////////////////////////////
					*/
				case SM_KEYREPEAT:
					switch( KEY_BUF[KEY_BUF_readcount].keyvalue )
					{
						case KEY_Down:
							pen_clb_cnt++;
							break;
						case KEY_POWER_DOWN:
							power_down_cnt++;
							break;
					}
					break;					
				case SM_KEYUP:
					switch( KEY_BUF[KEY_BUF_readcount].keyvalue )
					{
						case KEY_Down:
							pen_clb_cnt > 30;
							pen_clb_cnt = 0;
							en_pen_clb = 1;
							break;
						case KEY_POWER_DOWN:
							power_down_cnt > 30;
							power_down_cnt = 0;
							en_power_down = 1;
							break;
						default:
							pen_clb_cnt = 0;
							power_down_cnt = 0;
							break;
					}
					//newmsg.message = msgtype;
					//newmsg.wparam = KEY_BUF[KEY_BUF_readcount].keyvalue;
					
					//dbgoutput("Systask sent KEY message to task(%s)\n",findtskname(destid));
					//SysSendMessage(destid, &newmsg);					
					
					
					dbgoutput("Systask sent KEY message to task(%s)\n",findtskname(destid));
//					ppsmmsg.message = IRPT_KEY;
//					ppsmmsg.lparam = GetFocus();
//					ppsmmsg.wparam = KEY_BUF[KEY_BUF_readcount].keyvalue;
					AsixTransKeyMsg( &ppsmmsg, &KEY_BUF[KEY_BUF_readcount] );
					SysSendMessage(destid, &ppsmmsg);
					
					//PenEnable();
					break;
					
				default:
					break;
			}
		}
		
		KEY_BUF_readcount++;
		if (KEY_BUF_readcount >= MAX_KEY_BUF)
			KEY_BUF_readcount = 0;	
		clr_flg(SYS_EVENT,~INTKEY_FLG);
		if( en_pen_clb )
		{	
			// pen calibration
			ID	tempId;
			VRAM	*vram;

			// pen calibration
			tempId = gLcdOwnerTskId;
			PenCalibration();
			gLcdOwnerTskId = tempId;
			vram = gSysTcbTbl[gLcdOwnerTskId-1].gc->vram;
			Write2LCD( 0, 0, PHY_LCD_W-1, PHY_LCD_H-1, vram );
			en_pen_clb = 0;
		}
		if( en_power_down )
		{
			// power down
			power_down();
			en_power_down = 0;
		}				
	}
		
	/* check if it is PEN Interrupt or not */
	if( flgptn & INTPEN_FLG )
	{  
		msgtype = PEN_BUF[PEN_BUF_readcount].flag;
		destid = gLcdOwnerTskId;
		
		// make sure that destination is running
		if( gSysTcbTbl[destid-1].status == RUNNING )
		{
			switch(msgtype)
			{
				case SM_PENDOWN:
					last_x = 0;
					last_y = 0;
					lastpenxy = 0;
					//KeyDisable();
					act_cyc(TOUCHTIMER,TCY_ON|TCY_INI);
					break;
					
				case SM_PENMOVE:
					next_x = kx * PEN_BUF[PEN_BUF_readcount].x + bx;
					next_y = ky * PEN_BUF[PEN_BUF_readcount].y + by;
					
					if (!PendownFlag)
					{	
						// first touch panel, message should be SM_PENDOWN.
						// otherwise, message is SM_PENMOVE .
						newmsg.message = SM_PENDOWN;
						last_x = next_x;
						last_y = next_y;
						PendownFlag = 1;
					}
					else
					{
						
						// check AD value
						/*
						if ( next_x > last_x + POS_WUCHA 
							|| next_x < last_x - POS_WUCHA
							|| next_y > last_y + POS_WUCHA 
							|| next_y < last_y - POS_WUCHA )
						{
							//AD value is not right
							//break;
							next_x = last_x;
							next_y = last_y;
						}
						*/
						/*
						if ( next_x > last_x + POS_WUCHA )
							next_x = last_x + POS_WUCHA;
						else if ( next_x < last_x - POS_WUCHA )
							next_x = last_x - POS_WUCHA;
						
						if ( next_y > last_y + POS_WUCHA )
							next_y = last_y + POS_WUCHA;
						else if ( next_y < last_y - POS_WUCHA )
							next_y = last_y - POS_WUCHA;
						*/
						newmsg.message = SM_PENMOVE;
						last_x = next_x;
						last_y = next_y;
					}
					
					// Here is different with Asixwin
					// Because Asixwin uses .data to keep pointer to coordinate info(x&y).
					// Here, we use .lparam instead of pointer .data
					((POINTS *)&newmsg.lparam)->x = next_x;
					((POINTS *)&newmsg.lparam)->y = next_y;
					
					// save this coordinate
					lastpenxy = newmsg.lparam;
					
					kp[kpcount++] = *((POINTS *)&lastpenxy);
					
					dbgoutput("Systask get PEN int: %4x\n",msgtype);
					
					// Add ACTIVEAREA Module:
					//	Ros33 message will be translated into PPSM message!
					//
					ppsmmsg.message = IRPT_NONE;
					ppsmmsg.data = (void *)lastpenxy;
					SysTransMsg(&newmsg, gSysTcbTbl[destid-1].atvcb, &ppsmmsg);
					if(ppsmmsg.message != IRPT_NONE)
					{
						dbgoutput("Systask sends PEN message to task(%s)\n",findtskname(destid));
						dbgoutput("              PEN message: %4x\n", ppsmmsg.message);
						SysSendMessage(destid, &ppsmmsg);
					}	
					// Send additional IRPT_PEN(-1,-1) message while PPSM_INPUT_DRAG_UP 
					//& PPSM_INPUT_PEN_UP	in INPUTAREA which uses CONTINIOUS mode.
					if( ppsmmsg.lparam == PPSM_INPUT_DRAG_UP || ppsmmsg.lparam == PPSM_INPUT_PEN_UP )
					{
						dbgoutput("Systask sends PEN message to task(%s)\n",findtskname(destid));
						dbgprintf("              PEN message:IRPT_PEN(31)(-1,-1)\n");
						// 2001-11-22 23:02
						ppsmmsg.message = IRPT_PEN;
						
						((POINTS *)&ppsmmsg.lparam)->x = -1;
						((POINTS *)&ppsmmsg.lparam)->y = -1;
						SysSendMessage(destid, &ppsmmsg);
					}
										
					break;
					
				case SM_PENUP:
					if (PendownFlag)
					{ 
						PendownFlag = 0;
						
						newmsg.message = SM_PENUP;
						
						// here, coordinate in penup is the same as last one in penmove
						if ( lastpenxy != 0 )
							newmsg.lparam = lastpenxy;
						else{
//							PenEnable();
							break;
						}
						
						dbgoutput("Systask get PEN int: %4x\n",msgtype);
						
						// Add ACTIVEAREA Module:
						//	Ros33 message will be translated into PPSM message!
						//
						ppsmmsg.message = IRPT_NONE;
						ppsmmsg.data = (void *)lastpenxy;
						SysTransMsg(&newmsg, gSysTcbTbl[destid-1].atvcb, &ppsmmsg);
						if(ppsmmsg.message != IRPT_NONE)
						{
							dbgoutput("Systask sends PEN message to task(%s)\n",findtskname(destid));
							dbgoutput("              PEN message: %4x\n", ppsmmsg.message);
							SysSendMessage(destid, &ppsmmsg);
						}	
						// Send additional IRPT_PEN(-1,-1) message while PPSM_INPUT_DRAG_UP 
						//& PPSM_INPUT_PEN_UP	in INPUTAREA which uses CONTINIOUS mode.
						if( ppsmmsg.lparam == PPSM_INPUT_DRAG_UP || ppsmmsg.lparam == PPSM_INPUT_PEN_UP )
						{
							dbgoutput("Systask sends PEN message to task(%s)\n",findtskname(destid));
							dbgprintf("              PEN message:IRPT_PEN(31)(-1,-1)\n");
							// 2001-11-22 23:02
							ppsmmsg.message = IRPT_PEN;
						
							((POINTS *)&ppsmmsg.lparam)->x = -1;
							((POINTS *)&ppsmmsg.lparam)->y = -1;
							SysSendMessage(destid, &ppsmmsg);	
						}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?