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 (1) { sleep(100); } }
主线程“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 = 1; 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(0); 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 0; }
创建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 = 16*1024; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setstacksize(&attr, stacksize); if(pthread_create(&irthread, &attr, ir_Receive, NULL) != 0) //IR接收线程ir_Receive,接收IR并调用"IR_CallBack"投递消息到消息队列 { UMFDBG(0,"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; }