zoukankan      html  css  js  c++  java
  • RDA UMF进程 & UMF_IR.C 遥控处理

    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 
    ");
        }
        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.
    ", 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;
    }
  • 相关阅读:
    (一)RabbitMQ安装与基本配置
    一文搞懂网络层
    分布式锁的实现之 redis 篇
    浅谈synchronized和volatitle实现线程安全的策略
    JUC包的线程池详解
    Curling 2.0 POJ
    第三章处理机调度与死锁
    Java异常学习笔记
    Java对象学习笔记-下
    Java对象学习笔记-上
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/7419805.html
Copyright © 2011-2022 走看看