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 + -
显示快捷键?