Mstar方案软件运行基本原理
1、 MApp_Main.c里有个while(1)循环;
2、 通过 while(1)循环MApp_MultiTasks 里面的 MApp_ProcessUserInput 可以 得到 当前的 u8KeyCode
3、 while(1)循环 里面的MApp_TopStateMachine的作用:
3.1、在刚开机时,首先 enTopState = STATE_TOP_DIGITALINPUTS 等待用户输入;
3.2、再次调用:MApp_TopStateMachine时,switch ( enTopState ) 之后调用 switch (MApp_TV) ;
3.3、当用户在IR中输入Menu按键;
3.4、通过MApp_TV调用MApp_TV_ProcessUserInput 之后
switch ( u8KeyCode )
case KEY_MENU:
enTVState = STATE_TV_INIT;
enTVRetVal = EXIT_GOTO_MENU;
u8KeyCode = KEY_NULL;
break; switch(MApp_TV())
case EXIT_GOTO_MENU:
enTopState = STATE_TOP_MENU;
break;
3.5、再次调用:MApp_TopStateMachine时,witch ( enTopState ) 之后调用 switch(MApp_Menu_Main()) ;
3.6、通过MApp_Menu_Main调用MApp_ZUI_ACT_StartupOSD(E_OSD_MAIN_MENU);再调用MApp_ZUI_ACT_AppShowMainMenu();就可以Show出我们想要Show出的主界面了。
enMainMenuState = STATE_MENU_WAIT;
_eZUIState = E_ZUI_STATE_RUNNING;
3.7、再次调用MApp_Menu_Main时,switch(enMainMenuState)时,就要执行:
MApp_ZUI_ProcessKey(u8KeyCode);
u8KeyCode = KEY_NULL;
MApp_ZUI_ACT_ExecuteWndAction(EN_EXE_UPDATE_SIGNAL_INFORMAT);
了;
3.8、MApp_ZUI_ProcessKey调用MApp_ZUI_API_PostMessage(HWND_MAINFRAME, MSG_KEYDOWN, vk_code),Post Message。
3.9、再次调用MApp_TopStateMachine 时执行到 MApp_ZUI_MainTask 时
switch (_eZUIState) eZUIState等于了E_ZUI_STATE_RUNNING,就会调用MApp_ZUI_API_GetMessage(&msg)收到刚才MApp_ZUI_ProcessKey发过来的Message,再通过MApp_ZUI_API_DispatchMessage (&msg);因为我们刚才发的是key的Message所以,执行的以下代码:
if (pMsg->message == MSG_KEYDOWN)
{
//printf(“[dispmsg1]\n”);
if (_eZUIState == E_ZUI_STATE_RUNNING /*||
_eZUIState == E_ZUI_STATE_MSGBOX_DOMODAL*/)
{
if (!MApp_ZUI_ACT_HandleGlobalKey((VIRTUAL_KEY_CODE)pMsg->wParam))
{
focus = GETWNDFOCUS();
//printf(“/focus=%bu\n”, (U8)focus);
//printf(“[dispmsg2]\n”);
if (HWND_INVALID != focus)
{
pMsg->hwnd = focus; //2007/12/24: keydown message for focus
iRet = MApp_ZUI_ACT_ExecuteWndProc(GETWNDPROCID(focus), pMsg);
}
}
}
#if ZUI_DBG_RECURSIVE
_bInDispatchMessage = 0;
#endif //ZUI_DBG_RECURSIVE
return iRet;
} 3.10、由focus = GETWNDFOCUS();得到当前Win的Focus
3.11、MApp_ZUI_ACT_ExecuteWndProc(GETWNDPROCID(focus), pMsg)两个参数的说明:
GETWNDPROCID(focus),得到当前Win的类型(有EN_ZUI_DEFAULTWINPROC、EN_ZUI_FLIPPAGE_WINPROC、EN_ZUI_EFFECT_WINPROC等类型)
pMsg:收到的消息,在本例中收到是按键。
3.12、执行到S32 MApp_ZUI_ACT_ExecuteWndProc(U8 u8WinProcID, PMSG msg),根据传过来的参数,执行:EFFECT_WINPROC(msg->hwnd, msg);直接调用:return DEFAULTWINPROC(hWnd, pMsg);
3.13、转到执行:MApp_ZUI_API_DefaultWindowProc 本例会执行以下语句:
if (GETWNDKEYEVENT(focus))
{
KEYEVENT *keyevent; keyevent = GETWNDKEYEVENT(focus);
while (keyevent->u16VirKey != VK_NULL)
{
if (keyevent->u16VirKey == pMsg->wParam)
{
handled = MApp_ZUI_ACT_ExecuteWndAction(keyevent->u16ExeActID);
//we can allow multiple actions… depend on the last one action..
}
keyevent++;
}
对这段代码的理解,由GETWNDKEYEVENT(focus)得到当前focus定义的keyevent,如果有定义当前所按键的事件if (keyevent->u16VirKey == pMsg->wParam)则MApp_ZUI_ACT_ExecuteWndAction(keyevent->u16ExeActID);将定义要执行的事件ID传过去。
For example:
static KEYEVENT _ZUI_TBLSEG _MENU_PICTURE_MODE_KEY[] =
{
{ VK_SELECT, EN_EXE_GOTO_PICTURE_MODE_PAGE},
{ VK_UP, EN_EXE_NOTIFY_PARENT_KEY_UP },
{ VK_DOWN, EN_EXE_NOTIFY_PARENT_KEY_DOWN },
{ VK_UP, EN_EXE_EFFECT_SLIDEITEM },
{ VK_DOWN, EN_EXE_EFFECT_SLIDEITEM },
{ VK_LEFT , EN_EXE_EFFECT_FLIPPAGE_LEFT },
{ VK_RIGHT , EN_EXE_EFFECT_FLIPPAGE_RIGHT },
{ VK_NULL, 0 },
}; 3.14、执行到:MApp_ZUI_ACT_ExecuteWndAction
本例只执行:switch(_eActiveOSD)段。当前是E_OSD_MAIN_MENU所以执行MApp_ZUI_ACT_ExecuteMainMenuAction(act);
3.15、以按左右键为例:
switch(act)
case EN_EXE_EFFECT_FLIPPAGE_LEFT:
case EN_EXE_EFFECT_FLIPPAGE_RIGHT:
{
static HWND hwndTop[] =
{
HWND_MENU_CHANNEL_PAGE,
HWND_MENU_PICTURE_PAGE,
HWND_MENU_SOUND_PAGE,
HWND_MENU_TIME_PAGE,
HWND_MENU_OPTION_PAGE,
#if SHOW_LIUBO_ADD_TEST_PAGE
HWND_MENU_TEST_PAGE,
#endif
#if ENABLE_ATV_VCHIP//ENABLE_DTV
HWND_MENU_LOCK_PAGE,
#endif
#if (INPUT_USB_SOURCE == 0)
HWND_MENU_APP_PAGE,
#endif
}; HWND hwndFocus = MApp_ZUI_API_GetFocus();
HWND hwndEffect = hwndFocus;
HWND hwndNext = HWND_INVALID;
EN_FLIPPAGE dir = EN_FLIPPAGE_NONE;
/******若当前不是第0个Index page则 要找到当前功能的首个page 即属性为EN_ZUI_FLIPPAGE_WINPROC的page**************/
while((hwndEffect=MApp_ZUI_API_GetParent(hwndEffect))!= HWND_MAINFRAME )
{
if ( MApp_ZUI_API_GetWindowProcId(hwndEffect) == EN_ZUI_FLIPPAGE_WINPROC )
{
break;
}
}
/******若当前不是第0个Index page则 要找到当前功能的首个page 即属性为EN_ZUI_FLIPPAGE_WINPROC的page**************/ if ( hwndEffect == HWND_MAINFRAME )
return TRUE; U32 u32Data = MApp_ZUI_API_GetWindowData(hwndEffect);
if ( u32Data == 0 )
return TRUE; U32 i;
for (i=0; i<countof(hwndtop); i++)="" {="" if="" (="" hwndtop[i]="=" hwndeffect="" )="" break;="" }="" i="">= COUNTOF(hwndTop) )
return TRUE;
if (act == EN_EXE_EFFECT_FLIPPAGE_LEFT)
{
if ( i < 1 ) i = COUNTOF(hwndTop) - 1; #if ENABLE_DTV else if((hwndTop[i]==HWND_MENU_APP_PAGE)&&(!IsDTVInUse())) i-=2; #endif else i--; hwndNext = hwndTop[i]; dir = EN_FLIPPAGE_LEFT; } else if (act == EN_EXE_EFFECT_FLIPPAGE_RIGHT) { if ( i+1 >= COUNTOF(hwndTop) )
i = 0;
#if ENABLE_DTV
else if((hwndTop[i]==HWND_MENU_OPTION_PAGE)&&(!IsDTVInUse()))
i+=2;
#endif
else
i++;
hwndNext = hwndTop[i];
dir = EN_FLIPPAGE_RIGHT;
}
HWND child, last_succ; //2008/4/12: get last successor once
HWND listwn = hwndNext+2;
last_succ = MApp_ZUI_API_GetLastSuccessor(listwn);
for (child = listwn+1; child <= last_succ; child++) { if (MApp_ZUI_API_GetParent(child) != listwn) continue; if (MApp_ZUI_ACT_QueryDynamicListItemStatus(child) != EN_DL_STATE_NORMAL) 这个if语句的作用是:设置下个页面不要显示的win。 continue; else break; } GUI_DATA_FLIPPAGE *windata = (GUI_DATA_FLIPPAGE *) u32Data; windata->pVarData->hwndCurrent = hwndEffect;
windata->pVarData->hwndNext = hwndNext;
/*
if(windata->pVarData->hwndNext == HWND_MENU_LOCK_PAGE)
{ // if focus on HWND_MENU_LOCK_PAGE, set focus on HWND_MENU_LOCK_TITLE
// Press Enter to invoke input password dialog and to input password to use HWND_MENU_LOCK_PAGE’s functions.
child = windata->pVarData->hwndNext +1;
}
*/
#if ENABLE_DTV
if(windata->pVarData->hwndNext == HWND_MENU_LOCK_PAGE)
stGenSetting.g_BlockSysSetting.u8EnterLockPage = 0;
#endif
if(child == last_succ)
windata->pVarData->hwndNextFocus = windata->pVarData->hwndNext+3;
else
windata->pVarData->hwndNextFocus = child;
windata->pVarData->dir = dir; //MApp_ZUI_API_PostMessage(windata->pVarData->hwndCurrent, MSG_EFFECT, 0);
MApp_ZUI_API_SendMessage(windata->pVarData->hwndCurrent, MSG_EFFECT, 0);
MApp_ZUI_API_InvalidateWindow(HWND_MENU_MAIN_BOTTON_INFO_BAR);
return TRUE;
Mstar方案软件运行基本原理的更多相关文章
- Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据
Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据 PRM 全称为ParnassusData Recovery Manager ,由 诗檀软 ...
- Win10如何禁止软件运行?win10禁止软件启动的设置方法!禁止人生日历热点快讯的方法
相信不少使用Win10系统的用户遇到过下载了一款软件进行安装后后续会有接连不断的程序安装到电脑中.他可能似乎一个大家常用的程序,在我们安装好运行的时候会通过后台偷偷下载其他应用安装到我们电脑中,导致系 ...
- 关于delphi软件运行出现Invalid floating point operation的错误的解决办法
关于delphi软件运行出现Invalid floating point operation的错误的解决办法 关于delphi软件运行出现Invalid floating point operat ...
- Windows 如何为绿色软件运行时添加参数 如最小化,无窗口运行
1 有些软件运行的时候需要或者可以添加参数来实现一些特殊要求,比如开机自启动,运行时不显示主界面,不显示托盘图标等,比如下面的这个流量精灵软件,"urlcore.exe /h /r /t 4 ...
- 通信方案软件设计(环形动态申请内存,支持USART+IIC+SPI+CAN协议
1 <STM32进阶之串口环形缓冲区实现>中讲得比较清楚(链接) 2 amobbs中讲的方法有点复杂,以下是链接和参考源码: 通信方案软件设计(环形动态申请内存,支持USART+IIC+S ...
- linux 自编软件运行时权限不足问题
在非根目录下" ./*.out " 文件时出现显示运行的权限不足的问题,经过调查,有人给出方案: 方案1: 在Linux下执行一个文件时候提示“权限不够”的解决办法如下 转到那个文 ...
- PZISP自动下载软件运行时出现“应用程序无法启动,因为应用程序的并行配置不正确”
在win7下以管理员身份运行“PZISP自动下载软件”时出现“应用程序无法启动,因为应用程序的并行配置不正确”时,是因为系统里面没有一些visual c++库 想一想,反正以后也要用上VS2010的, ...
- mac安装软件运行提示「xxx.app已损坏,打不开.你应该将它移到废纸篓」的解决办法
「xxx.app已损坏,打不开.你应该将它移到废纸篓」,其实并非你安装的软件已损坏,而是Mac系统的安全设置问题,往往这些软件可能是经过了汉化或者破解,所以被Mac认为「已损坏」,那么解决方法就是临时 ...
- Linux下查看Go语言软件运行情况
在Linux下,使用"jps"可以查看用Java语言写的软件的运行情况,如果要查看GO语言写的软件的运行情况,可以使用"gops",但这不是系统自带的,需要进行 ...
随机推荐
- leetcode解题报告(29):Student Attendance Record I
描述 You are given a string representing an attendance record for a student. The record only contains ...
- 洛谷P1901发射站
题目 一道单调栈裸题,主要是用单调栈维护单调性,和单调队列都可以在\(O(n)\)的时间内得出单调最大值或最小值,要比堆要快. 这个题可以用h来当做单调栈的使用对象,即用单调栈来维护高度,高度是越在栈 ...
- 《挑战30天C++入门极限》类的分解,抽象类与纯虚函数的需要性
类的分解,抽象类与纯虚函数的需要性 为了不模糊概念在这里我们就简单的阐述一下类的分解,前面的教程我们着重讲述了类的继承,继承的特点就是,派生类继承基类的特性,进行//站点:www.cndev- ...
- npm start的时候改变端口及组合脚本
windows npm修改端口启动 set PORT=3000&&roadhog server npm start Linux npm 修改端口启动 set PORT=3000 roa ...
- 记一次有惊无险的 JVM 优化经历
转载:https://my.oschina.net/u/3627055/blog/2995973 背景 生产环境有二台阿里云服务器,均为同一时期购买的,CPU.内存.硬盘等配置相同.具体配置如下: 节 ...
- select,poll,epoll最简单的解释
从事服务端开发,少不了要接触网络编程.epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx.Redis.Skynet 和大部分游戏服务器都使用到这一多路复用技术. epoll ...
- sql查询性能调试,用SET STATISTICS IO和SET STATISTICS TIME---解释比较详细
一个查询需要的CPU.IO资源越多,查询运行的速度就越慢,因此,描述查询性能调节任务的另一种方式是,应该以一种使用更少的CPU.IO资源的方式重写查询命令,如果能够以这样一种方式完成查 ...
- Web Worker 使用教程【转】
原文:http://www.ruanyifeng.com/blog/2018/07/web-worker.html 一.概述 JavaScript 语言采用的是单线程模型,也就是说,所有任务只能在一个 ...
- Nginx-实践篇(重要)
原文链接:https://blog.csdn.net/Fe_cow/article/details/84672361
- Binder 原理剖析***
一. 前言 希望更加深入理解 Binder 实现机制的,可以阅读文末的参考资料以及相关源码. 二. Binder 概述 简单介绍下什么是 Binder.Binder 是一种进程间通信机制,基于开源的 ...