SIS架构图:

  

  SW Structure

  

  APP Event Flow :消息分发流程

  

UMF进程:

int umf_main(int argc, char* argv[])
{
umf_Init();
/* AFW initialize public module */
AL_FW_Init(FW_MAIN_INIT, MAINAPP_FW_Callback, MAINAPP_FW_GetContext);
SW_init(); MainApp_InitCfg_t stMainAppInit =
{
.pfInitFlow = MAINAPP_InitFlow, //软件初始化,及回调通过“MAINAPP_Initialize()”注册到“g_pfInitFlow”。并在“MAINAPP_MainRoutine”完成执行
.pGUIObjectTable = MAIN_APP_GUI_Obj_List,   //已创建UI窗口链表,主要用于窗口的创建、销毁和消息的流动
.pfOnTimerUpdate = MAINAPP_OnTimerUpdate,  
.pfOnEvent = MAINAPP_OnEvent          //UI事件处理,在MAINAPP_MainRoutine->_MAINAPP_ExternalEventHandler中调用
};
MAINAPP_Initialize(&stMainAppInit);        //创建主线程"MAINAPP_MainRoutine",主要负责消息调度、服务注册、消息投递和消息处理 while ()
{
sleep();
} }

主线程“main_app.c”->MAINAPP_MainRoutine:

  主要负责消息调度和消息驱动,最后都会转到服务例程处理"_SYSAPP_MainRoutine":

void MAINAPP_MainRoutine(void *pParam)
{
unsigned int dMessage;
unsigned int dMessageType;
App_MessageBody_t MsgReceived; if (g_pfInitFlow != NULL)
{
g_pfInitFlow((void *)(&gdTotalAppSize)); //执行"MAINAPP_InitFlow"
} while (!bMPBreakCondition)
{
bMainAppRunning = ;
GL_Status_t MsgReport; //取消息
MsgReport = GL_QueueReceive(MainAppQueueHandle, (void *)(&MsgReceived), APP_MESSAGE_BODY_SIZE, GL_INFINITE_WAIT);
//消息转换"APP_CustomerFuncStart",主要是IR KEYPAD等UI_EVENT等消息在处理前做必要的转换
MAINAPP_MessageDisposeStart(&MsgReceived.dMessage, &MsgReceived.dParam); dMessageType = ((MsgReceived.dMessage) & APPLICATION_MESSAGE_TYPE_MASK);
dMessage = ((MsgReceived.dMessage) & APPLICATION_MESSAGE_MASK);
     //OS消息处理
switch (dMessageType)
{
case APPLICATION_INTERNAL_MESSAGE_TYPE:
_MAINAPP_InternalEventHandler(dMessage, MsgReceived.dParam);
break; case APPLICATION_EXTERNAL_MESSAGE_TYPE:
case APPLICATION_EXTERNAL_MESSAGE_TYPE|APPLICATION_EXTERNAL_UI_MESSAGE_TYPE:
_MAINAPP_ExternalEventHandler(dMessage, MsgReceived.dParam);
break; default:
break;
}
MAINAPP_MessageDisposeEnd(&MsgReceived.dMessage, &MsgReceived.dParam);
} GL_TaskYield(); //线程让步 return ;
}

SW及消息队列初始化:

int MAINAPP_InitFlow(void *param)
{
_MAINAPP_SW_Init(); /* initialize message filter. */
_MAINAPP_InitSysApp((UINT32 *)param); /* initialize PQ relative function */
PQ_Init(); /*create App Infra update timer.*/
SYSAPP_TIMER_CreateTimer();
return SP_SUCCESS;
}

IR回调:

static int _MAINAPP_InitSysApp(UINT32* dTotalApp)
{
SYSAPP_IF_Initialize(TOTAL_SYS_APP_SIZE, apstSysAppInst); //将服务apstSysAppInst注册到gpAppInstTable。
*dTotalApp = TOTAL_SYS_APP_SIZE; APP_RegionMgr_Init();
APP_GuiMgr_Set_Menu() ;
APP_GuiMgr_SwitchShareMenu(TOTAL_SYS_APP_SIZE);

    UINT8 i;
    for (i = 0; i < TOTAL_SYS_APP_SIZE; i++)
    {  
      SYSAPP_IF_InitializeSysApp(i, MainAppQueueHandle);       //1 by 1 创建服务线程"_SYSAPP_MainRoutine",DTV服务有SYS_APP_DVB/SYS_APP_ATV/SYS_APP_FILE_PLAYER
    }

/* initialize IR */
ir_SetMappingTable(stIR_map, dIR_map_size);
ir_LoadEventCode();
KP_LoadCustomerConfig();
ir_init(_MAINAPP_Ir_Callback); //接收线程“ir_Receive”接收到IR后,通过此回调将消息投递到“消息队列”
joystick_init(_MAINAPP_Joystick_Callback);
MAINAPP_RegisterFunc(APP_CustomerFuncStart, APP_CustomerFuncEnd); //IR处理,回调注册到"g_pfMessageDisposeStart",通过主例程MAINAPP_MainRoutine->GL_QueueReceive取消息后调用MAINAPP_MessageDisposeStart
return ;
}

创建IR/KEYPAD接收线程及“IR_CallBack”回调指针的注册:

int ir_init(IR_CallBack_t pIR_CallBackFunc)
{
IR_IOC_IOData irbuf;
pthread_t irthread; irdev = open("/dev/sisir", O_RDWR); if(KP_init() == E_FAIL)
{
return E_FAIL;
}
size_t stacksize = *; pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, stacksize);
if(pthread_create(&irthread, &attr, ir_Receive, NULL) != ) //IR接收线程ir_Receive,接收IR并调用"IR_CallBack"投递消息到消息队列
{
UMFDBG(,"IR pthread_create fail \n");
}
pthread_attr_destroy(&attr);
IR_CallBack = pIR_CallBackFunc; //注册回调指针,即在ir_Receive线程中,调用“IR_CallBack”即调用“_MAINAPP_Ir_Callback”将IR投递到消息队列 return S_OK;
}

服务例程“_SYSAPP_MainRoutine”:

static void _SYSAPP_MainRoutine(void *pParam)
{
SysAppInstDef *pstCurrentSysApp = (SysAppInstDef *) pParam;
SystemAppInfra_t *pstTempInfra = (SystemAppInfra_t *) pstCurrentSysApp->stSystemAppInfrastructure; pstCurrentSysApp->fpOnCreate(&(pstTempInfra->pPrivateData)); UINT32 dMessage;
UINT32 dMessageType;
App_MessageBody_t Message;
while (!pstTempInfra->dBreakCondition)
{
//取消息
GL_QueueReceive(pstTempInfra->stMsgQueueHandle, (void *)(&Message), APP_MESSAGE_BODY_SIZE, GL_INFINITE_WAIT);
//消息转换"APP_CustomerFuncStart",主要是IR KEYPAD等UI_EVENT等消息在消息处理前做必要的转换
MAINAPP_MessageDisposeStart(&Message.dMessage, &Message.dParam); dMessageType = ((Message.dMessage) & APPLICATION_MESSAGE_TYPE_MASK);
dMessage = ((Message.dMessage) & APPLICATION_MESSAGE_MASK);
sysappfl2("[SysApp] System app Received MSG, types is:%d.\n", Message.dMessage);
//OS消息处理
switch (dMessageType)
{
case APPLICATION_INTERNAL_MESSAGE_TYPE:
_SYSAPP_InternalEventHandler(pstCurrentSysApp, pstTempInfra, dMessage, Message.dParam);
break; case APPLICATION_EXTERNAL_MESSAGE_KEY_RELEASE_TYPE:
case APPLICATION_EXTERNAL_MESSAGE_KEY_RELEASE_TYPE|APPLICATION_EXTERNAL_UI_MESSAGE_TYPE:
_SYSAPP_ExternalEventHandler(pstCurrentSysApp, pstTempInfra, dMessage, Message.dParam);
break; case APPLICATION_EXTERNAL_MESSAGE_TYPE:
case APPLICATION_EXTERNAL_MESSAGE_TYPE|APPLICATION_EXTERNAL_UI_MESSAGE_TYPE:
_SYSAPP_ExternalEventHandler(pstCurrentSysApp, pstTempInfra, dMessage, Message.dParam);
break; default:
break;
} MAINAPP_MessageDisposeEnd(&Message.dMessage, &Message.dParam);
}
GL_TaskYield();
return;
}

服务例程事件处理:

static void _SYSAPP_ExternalEventHandler(SysAppInstDef *pstSysApp,
SystemAppInfra_t *pstInfra, UINT32 dMessage, UINT32 dParam)
{
switch(dMessage)
{
case APPLICATION_EXTERNAL_TIMER_MESSAGE:
pstSysApp->fpOnTimerUpdate(pstInfra->pPrivateData);
_SYSAPP_GOBJ_GUIObjectTimerUpdate(pstSysApp->dSystemApplicationIndex);
break; default:
//当前菜单先处理,如果没有聚焦UI,则转到相应的服务处理,如:atv_app.c->_ATVApp_OnEvent处理
if(_SYSAPP_GOBJ_GUIObjectMessageHandler(pstSysApp->dSystemApplicationIndex, dMessage, dParam)  //主要负责GUI_OBJECT_POST_EVENT及GUI_OBJECT_EVENT_BYPASS的事件处理
== SYSTEM_APP_NO_FOCUSED_GUIOBJ)
{
pstSysApp->fpOnEvent(pstInfra->pPrivateData, dMessage, dParam);
}
break;
} return;
}

最新文章

  1. Flash Builder 4.7 注册机完美激活方法
  2. SparkSQL(源码阅读三)
  3. Bootstrap (导航、标签、面包屑导航)
  4. POJ 1704 Georgia and Bob (Nim游戏变形)
  5. React 组件开发初探
  6. leetcode_question_115 Distinct Subsequences
  7. SectionIndexer 利用系统的控件,制作比较美观的侧栏索引控件
  8. Myeclipse10连接SqlServer2012
  9. Tableau Desktop 10.4.2 的安装和激活
  10. Makefile有三个非常有用的变量。分别是$@,$^,$
  11. ARMCC和GCC编译ARM代码的软浮点和硬浮点问题 【转】
  12. [codechef]SnackDown 2017 Online Elimination Round Prefix XOR
  13. Java之旅_高级教程_多线程编程
  14. CentOS6.5安装nginx1.5.8时出现“cp: &quot;conf/koi-win&quot; 与&quot;/usr/local/nginx/conf/koi-win&quot; 为同一文件”的解决方法
  15. Oracle安装部署之dbca静默建库和删除库
  16. SQL语言:DDL/DML/DQL/DCL
  17. Spinner功能和用法
  18. 工作常用shell集合
  19. pairRDD中算子reduceByKeyLocally
  20. Socket 编程(二)

热门文章

  1. 8.url路由
  2. windows 安装 python3
  3. Python Pandas库的学习(三)
  4. (蓝桥杯)2018JAVA B组 日志分析
  5. Spring核心技术(六)——Spring中Bean的生命周期
  6. prometheus监控linux系统
  7. nyoj 2 括号配对问题(stack)
  8. Linux备份-删除指定日期内文件
  9. hihoCoder#1109 最小生成树三&#183;堆优化的Prim算法
  10. 从零开始写STL—容器—vector