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

📄 oskernel.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
📖 第 1 页 / 共 4 页
字号:
/****************************************************************************/
/*                                                                          */
/*              Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD                   */
/*                                                                          */
/* FILE NAME:   OsKernel.c                                                  */
/* MODULE NAME: 内核模拟                                                    */
/* DESCRIPTION: 本文件主要定义内核主系统相关的函数                          */
/*                                                                          */
/* FUNCTIONS:                                                               */
/*              KernelInitialize    内核模块初始化                          */
/*              RunAp               运行AP                                  */
/*              ExitAp              退出AP                                  */
/*              RequestExitAp       请求退出AP                              */
/*              DrawCurrentAp       重新显示当前(顶层)AP                  */
/*              DrawFullScreenAp    重新显示全屏AP                          */
/*              HanldeEventTable    根据事件类型寻找对应的事件处理函数      */
/*              HanldeEventTableEx  根据事件类型和参数寻找对应的事件处理函数*/
/*              KnlSetEventPrevHandle   设置优先事件处理函数                */
/*              KnlSetEventBehindHandle 设置事后事件处理函数                */
/*                                                                          */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-03-18          创建                                    */
/*    Dennyhan  2006.1.24           Add SD card                             */
/*                                  changed position for booting display    */
/*                                  changed ESC key to auto exit            */
/*                                  changed macro compling                  */
/****************************************************************************/

// 包含相关的头文件
#include "Kernel.h"
//#include "ExtLcdDisp.h"

#define GUI_INIT_DRAW_FG_EN     1           // if open, Disable Draw during Initialization


// 全局变量定义
#define GUI_BUFFER_COUNT    51
// For GUI
static APGUI_STRUCT_MODEL   g_aGuiBuffer[GUI_BUFFER_COUNT+1];   // GUI结构存放的缓冲区
static APGUI_STRUCT        *g_pDesktopGuiModel;                 // 前一GUI模板的起始句柄
static APGUI_STRUCT_MODEL  *g_pPrevGuiModel;                    // 前一GUI模板的起始句柄
static APGUI_STRUCT_MODEL  *g_pCurrGuiModel;                    // 当前GUI模板的起始句柄
static UINT                 g_uTotalGuiCount;                   // 到当前为止的所有GUI控件个数
static UINT8				g_aGuiEntry[GUI_BUFFER_COUNT+1];

#define  KNLEXITSTATUS_NULL     0
#define  KNLEXITSTATUS_ASK      1       // 询问退出
#define  KNLEXITSTATUS_TRUE     2       // 真正退出

static INT      g_nKnlExitStatus;       // 退出AP状态
static INT      g_nKnlExitCode;         // 退出代码



// 事件队列相关全局变量
#define MAX_EVENT_COUNT     24   // 队列中的事件个数
static UINT32   g_aEventQueueBuff[MAX_EVENT_COUNT * EVENT_SIZE];
NU_QUEUE        g_quEventQueue; // 事件队列

static FPHANDLEEVENT    g_fpKernelEventPrev;    // 优先事件处理函数
static FPHANDLEEVENT    g_fpKernelEventBehind;  // 事后事件处理函数

static  void AlarmEventCallBack(void);

//=============================================================
// Draw Operation for Initialize
// Only  _GuiModelDraw_All: Fixed it.
//          That is DrawFullScreenAp()
//------------------------------------
#ifdef GUI_INIT_DRAW_FG_EN

    #define GUI_DRAW_STATUS_EN     0
    #define GUI_DRAW_STATUS_DIS    1
    
    static UINT _GuiFlagGet(UINT uPos);
    static VOID _GuiFlagSet(UINT uStPos, UINT uEndPos, UINT uValue);
#endif


/****************************************************************************/
/* FUNCTION:   BOOL  KernelInitialize(VOID)                                */
/* DESCRIPTION:内核模块初始化                                              */
/* INPUTS:     NONE                                                        */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     初始化成功返回TRUE,否则返回FALSE                           */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-03-18          创建                                    */
/****************************************************************************/
BOOL  KernelInitialize(VOID)
{
    NU_DRIVER          *pDrv;
    INT     nInit;

    // 先初始化内核变量
    g_aGuiBuffer[0].uReserveMark = 0;
    g_pPrevGuiModel = NULL;
    g_pCurrGuiModel = NULL;
    g_uTotalGuiCount = 0;

    g_nKnlExitStatus = KNLEXITSTATUS_NULL;
    g_nKnlExitCode = 0;

    g_fpKernelEventPrev = (FPHANDLEEVENT)NULL;
    g_fpKernelEventBehind = (FPHANDLEEVENT)NULL;

    // Init Help Part
    OsGuiHelpInitialize();
    
#ifdef GUI_INIT_DRAW_FG_EN    
    // Clear Draw Disable Flag
    _GuiFlagSet(0,GUI_BUFFER_COUNT+1,GUI_DRAW_STATUS_DIS);
#endif

    // 再初始化内核模块
	MemMngInitialize();			// For flash mode initial	/// dennyhan added

#ifndef WIN32
    // FALSH管理模块初始化
    nInit = FlashModInitial();
    if ( nInit < 0 )
    {
        UINT8   *pFlsErrStr;
        pFlsErrStr = NULL;
        switch (nInit)
        {
        case NFLS_ERR_LOWVOLTAGE:   // 低电压
            pFlsErrStr = (UINT8*)"Power Low!";
            break;
        case NFLS_ERR_NOSPACE:      // 坏块太多
            pFlsErrStr = (UINT8*)"No Enough Fls Block!";
            break;
        case NFLS_ERR_FORMAT:
            // 格式化FLASH
            nInit = FlashIoCtrl( NFLASH_DRIVENO, FLASH_COMMAND_FORMAT, NULL );
            if (nInit == NFLS_ERR_LOWVOLTAGE)   // 低电压
                pFlsErrStr = (UINT8*)"Power Low!";
            else if (nInit != NFLS_ERR_NO)      // 格式化失败
                pFlsErrStr = (UINT8*)"Error in fls Format!";
            //else    // if (nInit == NFLS_ERR_NO)    // 格式化成功
            //    break;
            break;
        default:    // 其它错误
            pFlsErrStr = (UINT8*)"Flash Init Error!";
            break;
        }
        if ( pFlsErrStr != NULL )
        {
            HwClearScreen(0xFFFF);
            HwShowString( (LCD_SCREEN_WIDTH-13*8)/2,
                          (LCD_SCREEN_HEIGHT-2*16)/2, pFlsErrStr, 0x0000 );
            HwDisplayVirtualBuffer();
        }
    }
#endif

#if 0  //def _WIN32
    //MMC initialize
    {
        INT MmcFormat(void);
        INT MmcModInitial(void);

        nInit = MmcModInitial();
        if ( nInit < 0 )
        {
            UINT8   *pFlsErrStr;
            pFlsErrStr = NULL;
            switch (nInit)
            {
            case NFLS_ERR_LOWVOLTAGE:   // 低电压 FLASH_ERR_LOWVOLTAGE
                pFlsErrStr = (UINT8*)"Power Low!";
                break;
            case NFLS_ERR_NOSPACE:      // 坏块太多		FLASH_ERR_NOPREPARE
                pFlsErrStr = (UINT8*)"No Enough Fls Block!";
                break;
            case NFLS_ERR_FORMAT:		//	FLASH_ERR_NOFORMAT
                // 格式化FLASH
                nInit = MmcFormat();
                if (nInit == NFLS_ERR_LOWVOLTAGE)   // 低电压		FLASH_ERR_LOWVOLTAGE
                    pFlsErrStr = (UINT8*)"Power Low!";
                else if (nInit != NFLS_ERR_NO)      // 格式化失败	FLASH_ERR_
                    pFlsErrStr = (UINT8*)"Error in fls Format!";
                //else    // if (nInit == NFLS_ERR_NO)    // 格式化成功
                //    break;
                break;
            default:    // 其它错误
                pFlsErrStr = (UINT8*)"Flash Init Error!";
                break;
            }
            if ( pFlsErrStr != NULL )
            {
                HwClearScreen(0xFFFF);
                HwShowString( (LCD_SCREEN_WIDTH-11*8)/2,
                    (LCD_SCREEN_HEIGHT-2*16)/2, pFlsErrStr, 0x0000 );
                HwDisplayVirtualBuffer();
            }
        }
    }
#endif

    FileModInitial();       // 文件系统模拟初始化
    ResMngInitialize();     // 资源管理模块初始化
    TimerInitialize();      // 定时器管理模块初始化
	TimMngInitial();		// Time 时钟初始化
    FontMngInitialize();    // 字库管理模块初始化
    GraphicInitialize();    // 图形显示模块初始化
    ImeInitialize();        // 输入法模块初始化
    EditInitialize();       // 编辑器模块初始化
    ListInitialize();       // 列表模块初始化
	VoiceModInitial();	    // Voice 模块初始化

    // 创建GUI消息队列
    NU_Create_Queue( &g_quEventQueue, "SysEvent", g_aEventQueueBuff,
		             MAX_EVENT_COUNT * EVENT_SIZE, NU_FIXED_SIZE,
                     EVENT_SIZE, NU_FIFO );

    // 告诉键盘驱动事件队列的指针
    pDrv = GetIODriverFromName((UINT8*)DRV_NAME_KEYBOARD);
    if ( pDrv )
    {
        NU_DRIVER_REQUEST   request;
        request.nu_function = NU_STATUS;
        request.nu_timeout = NU_NO_SUSPEND;
        request.nu_supplemental_ptr = &g_quEventQueue;
	    NU_Request_Driver(pDrv, &request);
    }

	//告诉闹铃驱动闹铃回调函数.
	pDrv = GetIODriverFromName((UINT8*)DRV_NAME_ALARM);
	if(pDrv)
	{
		NU_DRIVER_REQUEST request;
		request.nu_function = NU_STATUS;
		request.nu_timeout = NU_NO_SUSPEND;
		request.nu_supplemental = ALARM_IOCTL_SETCALLBACK;
		request.nu_supplemental_ptr = AlarmEventCallBack;
		NU_Request_Driver(pDrv,&request);
	}

    return TRUE;
}


static  APGUI_STRUCT *_LoadApGuiModel(APGUI_STRUCT *pApGui);
static  INT  _RunApGuiModel(VOID);
static  VOID _GuiModelInitialize(VOID);
static  VOID _GuiModelExitAp(INT nExitCode);
static  VOID _GuiModelDestroyAp(VOID);
static  VOID _GuiModelDraw(VOID);
static  VOID _GuiModelDraw_All(VOID);
static  BOOL _GuiModelHandleKey(UINT uEvent, UINT uParam);
static  INT  _GuiModelHandleEvent(UINT uEvent, UINT uParam);

extern  INT OsKnlKeyBeepHook(UINT uEvent, UINT uParam);      //For KeyBeep
extern  INT OsKnlAlarmHook(UINT uEvent, UINT uParam);
/****************************************************************************/
/* FUNCTION:   INT  RunAp(APGUI_STRUCT *pApGui)                            */
/* DESCRIPTION:运行AP                                                      */
/* INPUTS:     pApGui - AP的GUI模板指针                                   */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     AP运行结束后的返回值,运行失败则返回-1                      */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-03-28          创建                                    */
/****************************************************************************/
INT  RunAp(APGUI_STRUCT *pApGui)
{
    if( _LoadApGuiModel(pApGui) == NULL )
        return EXIT_CODE_ERROR;
    return _RunApGuiModel();
}

/****************************************************************************/
/* FUNCTION:   VOID  ExitAp(INT nExitCode)                                 */
/* DESCRIPTION:退出AP                                                      */
/* INPUTS:     nExitCode - 退出代码                                       */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     NONE                                                        */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-03-30          创建                                    */
/****************************************************************************/
VOID  ExitAp(INT nExitCode)
{
    g_nKnlExitStatus = KNLEXITSTATUS_TRUE;

    //if ( (g_nKnlExitCode < EXIT_CODE_FORCE_START) || (g_nKnlExitCode > EXIT_CODE_FORCE_END) )
        g_nKnlExitCode = nExitCode;
}

/****************************************************************************/
/* FUNCTION:   INT  GetCurExitCode(VOID)                                   */
/* DESCRIPTION:退出AP                                                      */
/* OUTPUTS:     nExitCode - 退出代码                                      */
/* RETURN:     NONE                                                        */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   Dennyhan   2006-06-26          创建                                    */
/****************************************************************************/
INT  GetCurExitCode(VOID)
{
    return g_nKnlExitCode;
}

/****************************************************************************/
/* FUNCTION:   VOID  RequestExitAp(INT nExitCode)                          */
/* DESCRIPTION:请求退出A                                                   */
/* INPUTS:     nExitCode - 退出代码                                       */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     NONE                                                        */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2006-01-08          创建                                    */
/****************************************************************************/
VOID  RequestExitAp(INT nExitCode)
{

⌨️ 快捷键说明

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