📄 oskernel.c
字号:
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 + -