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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值