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

📄 oskernel.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
📖 第 1 页 / 共 4 页
字号:
    g_nKnlExitStatus = KNLEXITSTATUS_ASK;
    g_nKnlExitCode = nExitCode;
}

/****************************************************************************/
/* FUNCTION:   VOID  DrawCurrentAp(VOID)                                   */
/* DESCRIPTION:重新显示当前(顶层)AP                                      */
/* INPUTS:     NONE                                                        */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     NONE                                                        */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-03-30          创建                                    */
/****************************************************************************/
VOID  DrawCurrentAp(VOID)
{
    _GuiModelDraw();
}

/****************************************************************************/
/* FUNCTION:   VOID  DrawFullScreenAp(VOID)                                */
/* DESCRIPTION:重新显示全屏AP                                              */
/* INPUTS:     NONE                                                        */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     NONE                                                        */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-03-30          创建                                    */
/****************************************************************************/
VOID  DrawFullScreenAp(VOID)
{
    _GuiModelDraw_All();
}

/****************************************************************************/
/* FUNCTION:   INT  HanldeEventTable( APGUI_STRUCT *pGui, UINT uEvent,     */
/*                               UINT uParam, APEV_HANDLE_TABLE *pTable )   */
/* DESCRIPTION:根据事件类型寻找对应的事件处理函数                          */
/* INPUTS:     pTable - 事件处理表地址                                    */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     对应事件的处理返回值                                        */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-04-04          创建                                    */
/****************************************************************************/
INT  HanldeEventTable( APGUI_STRUCT *pGui, UINT uEvent, UINT uParam,
                       APEV_HANDLE_TABLE *pTable )
{
    while ( pTable->uEvent != NULL )
    {
        if ( pTable->uEvent == uEvent )
            return pTable->fpHandleFunc( (APGUI_STRUCT_MODEL*)pGui, uEvent, uParam );
        pTable++;
    }
    return 0;
}


/****************************************************************************/
/* FUNCTION:   INT  HanldeEventTableEx( APGUI_STRUCT *pGui, UINT uEvent,   */
/*                               UINT uParam, APEV_HANDLE_TABLE_EX *pTable )*/
/* DESCRIPTION:根据事件类型和事件参数寻找对应的事件处理函数                */
/* INPUTS:     pTable - 事件处理表地址                                    */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     对应事件的处理返回值                                        */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-04-04          创建                                    */
/****************************************************************************/
INT  HanldeEventTableEx( APGUI_STRUCT *pGui, UINT uEvent, UINT uParam,
                         APEV_HANDLE_TABLE_EX *pTable )
{
	UINT	uParam2;
	if ( (uEvent == EVENT_KEY) || (uEvent == EVENT_KEYREPEAT) ||(uEvent == EVENT_KEYUP) )
	{
		uParam2 = READKB_VALUE(uParam);
	}
	else
	{
		uParam2=uParam;
	}

    while ( pTable->uEvent != NULL )
    {
        if ( (pTable->uEvent == uEvent) 
			&& (  (pTable->uParam == uParam2) 
			    ||(pTable->uParam == uParam) )  )
		{
            return pTable->fpHandleFunc( (APGUI_STRUCT_MODEL*)pGui, uEvent, uParam );
		}
        pTable++;
    }
    return 0;
}


/****************************************************************************/
/* FUNCTION:   static void _SetGuiEntryFlag(UINT8 ubNew)                   */
/* DESCRIPTION:APenter flag												*/
/* INPUTS:     NONE                                                        */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     NONE					                                    */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   DennyHan    2006-02-21          First Issue							*/
/****************************************************************************/
static void _SetGuiEntryFlag(UINT8 ubNew, INT nNo)
{
	if ((INT)nNo < 0)
	{
		nNo=0;
	}

	g_aGuiEntry[nNo]=ubNew;
}

static UINT8 _GetGuiEntryFlag(INT nNo)
{
	if ((INT)nNo < 0)
	{
		nNo=0;
	}

	return g_aGuiEntry[nNo];
}

/****************************************************************************/
/* FUNCTION:   static BOOL _GuiEntrySwitchChk(UINT uEvent, UINT uParam)	*/
/* DESCRIPTION:Chk GUI switch Flag											*/
/* INPUTS:     NONE                                                        */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     NONE					                                    */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   DennyHan    2006-02-21          First Issue							*/
/****************************************************************************/
static INT _GuiEntrySwitchChk(UINT uEvent, UINT uParam)
{
INT	nRet=0;
	uParam=uParam;	//Avoid warning

	if ( (uEvent==EVENT_KEY) || (uEvent==EVENT_KEYUP) || (uEvent==EVENT_KEYREPEAT) )
	{
		if ( (_GetGuiEntryFlag(g_uTotalGuiCount-1)) )
		{
			if (uEvent == EVENT_KEYUP)
			{
				_SetGuiEntryFlag(0,g_uTotalGuiCount-1);
				nRet=1;
			}
			else if (uEvent == EVENT_KEYREPEAT)
			{
				nRet=1;
			}
			else if (uEvent == EVENT_KEY)
			{
				_SetGuiEntryFlag(0,g_uTotalGuiCount-1);
			}
		}
	}

	return nRet;
}
/****************************************************************************/
/* FUNCTION:   APGUI_STRUCT *_LoadApGuiModel(APGUI_STRUCT *pApGui)         */
/* DESCRIPTION:将AP的GUI模板装入内存,并进行相应的初始化                   */
/* INPUTS:     pApGui - AP的GUI模板指针                                   */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     正确装入模板,则返回模板装入后的内存指针,否则返回空指针    */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-03-21          创建                                    */
/****************************************************************************/
static  APGUI_STRUCT  *_LoadApGuiModel(APGUI_STRUCT *pApGui)
{
    UINT    uGuiCount;
    APGUI_STRUCT   *pTemp;

    // 先计算AP的GUI个数
    uGuiCount = 0;
    pTemp = pApGui;
    while ( pTemp->uReserveMark != NULL )
    {
        uGuiCount++;
        pTemp++;
    }

    // 判断
    if ( uGuiCount == 0 )
        return NULL;    // 没有任何GUI结构,不能运行此AP
    if ( uGuiCount + g_uTotalGuiCount > GUI_BUFFER_COUNT )
        return NULL;    // GUI缓冲区空间不够,不能运行此AP

    // 先记忆当前模板地址
    g_pPrevGuiModel = g_pCurrGuiModel;

    // 计算新的GUI模板装载地址,并将它设为当前模板起始地址
    g_pCurrGuiModel = g_aGuiBuffer;
    g_pCurrGuiModel += g_uTotalGuiCount;
    // 将AP的GUI结构全部拷贝到内存中
    memmove ( g_pCurrGuiModel, pApGui, sizeof(APGUI_STRUCT)*uGuiCount );
    // 总GUI结构数增加
    g_uTotalGuiCount += uGuiCount;

    //----------------
    // Insert  Draw Flag
#ifdef GUI_INIT_DRAW_FG_EN
    // Init Gui Load Draw Flag
    _GuiFlagSet(g_uTotalGuiCount-uGuiCount,g_uTotalGuiCount-1,GUI_DRAW_STATUS_DIS);  
#endif    


    // 写结尾符
    pTemp = (APGUI_STRUCT*)g_aGuiBuffer;
    pTemp += g_uTotalGuiCount;
    pTemp->uReserveMark = NULL;

	// Added for GUI switching Key event switching
	// Set Old Gui Enter Flag
	_SetGuiEntryFlag(1,g_uTotalGuiCount-uGuiCount-1);
	// Set New Gui Enter Flag
	_SetGuiEntryFlag(1,g_uTotalGuiCount-1);

    // Inc Help Level        
    IncGuiHelpLevel();
   
   
    // 初始化GUI控件句柄
    /*pTemp = g_pCurrGuiModel;
    while ( pTemp->uReserveMark != NULL )
    {
        pTemp->uReserveMark = GUI_RESERVE_MARK;
        pTemp++;
    }*/
    
    return  (APGUI_STRUCT*)g_pCurrGuiModel;
}



/****************************************************************************/
/* FUNCTION:   INT  _RunApGuiModel(VOID)                                   */
/* DESCRIPTION:运行AP的GUI模板,此函数必须紧跟在函数“_LoadApGuiModel”后  */
/* INPUTS:     NONE                                                        */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     AP运行结束后的返回值                                        */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-03-21          创建                                    */
/*   DennyHan   2006-03-27          Remove Alarm Hook for SysCtl            */
/****************************************************************************/
static  INT  _RunApGuiModel(VOID)
{
    APGUI_STRUCT_MODEL  *pPrevGuiModel;     // 记忆前一GUI模板的起始句柄
    UINT    uCount;
    INT     nExitCode;

	// Added for Memory check
#ifdef	_WIN32
	MemCheckStart();
#endif

    // (备份原来的INDICATOR (只处理与方向键和发音相关的INDICATOR))
    // (清除方向键和发音相关的INDICATOR)

    // 先保存前一GUI模板地址
    pPrevGuiModel = g_pPrevGuiModel;

    // 运行前面装载到内存中的APGUI模板,即当前AP模板
    _GuiModelInitialize();      // 先初始化模板中所有控件,即发送初始化事件
    if ( g_nKnlExitStatus ==  KNLEXITSTATUS_NULL )
        _GuiModelDraw();            // 再显示各模板中所有控件,即发送显示事件

#ifdef GUI_INIT_DRAW_FG_EN
    // For Draw CurrentAp
    // After this GUI Draw is Enable
    _GuiFlagSet(g_pCurrGuiModel-(APGUI_STRUCT_MODEL*)g_aGuiBuffer,
                g_uTotalGuiCount-1,GUI_DRAW_STATUS_EN);
#endif

    // 进入获取事件和处理事件的运行循环
    while ( 1 )
    {
        // 判断是否要退出此AP
        if ( g_nKnlExitStatus !=  KNLEXITSTATUS_NULL )
        {   // 如果是退出AP,则要判断是真正退出AP还是要经过询问!
            if ( g_nKnlExitStatus == KNLEXITSTATUS_ASK )
            {   // 要询问AP是否真正想退出
                g_nKnlExitStatus = KNLEXITSTATUS_NULL;
                _GuiModelExitAp(g_nKnlExitCode);
            }
            else if ( g_nKnlExitStatus == KNLEXITSTATUS_TRUE )
            {   // 是真正退出,则销毁此AP及相关的控件,退出
                g_nKnlExitStatus = KNLEXITSTATUS_NULL;
                _GuiModelDestroyAp();
                break;
            }
        }
        // 如果不是退出AP,则从事件队列取事件
        else
        {
      	    UINT        aEvent[2];
            UNSIGNED    dwRetLen;

            if ( NU_Receive_From_Queue(&g_quEventQueue, aEvent, EVENT_SIZE, &dwRetLen, NU_SUSPEND) != NU_SUCCESS )
                continue;
            if ( dwRetLen != 2 )
                continue;

			// Added this for GUI switching, skp the first KEY_UP or EVENT_KEYREPEAT
			if (_GuiEntrySwitchChk(aEvent[0],aEvent[1]))
			{
				continue;
			}
			//============= end of the switching

⌨️ 快捷键说明

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