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_MessageDisposeStartreturn 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; }