Melis4.0[D1s]:3.消息响应部分跟踪笔记


源码看到消息循环部分,继续做阅读笔记。

1.init.axf 消息处理

1.1启动系统消息死循环

上篇笔记《Melis4.0[D1s]:2.启动流程(GUI桌面加载部分)跟踪笔记》提到了application_init_process()启动消息死循环:

void application_init_process(void *arg)
{
	.....
	init_mainwin        = init_mainwin_create();
    .....
    _process_init();   
    /* message loop*/
    while (GUI_GetMessageEx(&msg, init_mainwin))    // 消息循环
    {
        ret = GUI_DispatchMessage(&msg);        // 分发消息到回调
        if (msg.p_arg)                          // 同步消息回应
        {
            GUI_SetSyncMsgRetVal(&msg, ret);
            GUI_PostSyncSem(&msg);
        }
    }
    .....
}

本函数在进入消息死循环之前,调用了2个和消息处理相关的函数init_mainwin_create()_process_init()
今天跟踪一下消息处理的相关源码。

1.2.init_mainwin_create()设置消息处理回调函数init_mainwin_cb()

回调函数代码很多,这里删除掉大部分代码,保留部分框架:

static __s32 init_mainwin_cb(__gui_msg_t *msg)
{
    switch (msg->id)
    {
        case GUI_MSG_CREATE:break;
        case GUI_MSG_DESTROY:break;        
        case DSK_MSG_POWER_OFF:             /* power off */
        	return EPDK_OK;
        case DSK_MSG_STANDBY_WAKE_UP:break;
        case DSK_MSG_TVDAC_PLUGIN:break;
        case DSK_MSG_TVDAC_PLUGOUT:
        case DSK_MSG_HDMI_PLUGOUT:
        case DSK_MSG_SCREEN_SWITCH:break;
        case DSK_MSG_ASSISTANT_SCENE_CREATE:break;
        case DSK_MSG_SET_SCN_CLOSE:break;
        case DSK_MSG_HOME:break
        case DSK_MSG_FW_UPDATE:break;
        ......
        ......
        default:
            GUI_ManWinDefaultProc(msg);
            break;
    }
    return EPDK_OK;
}

1.3 _process_init()加载app_root.axf,启动界面消息处理

static void _process_init(void)
{
.....
    activity_set_load_para("root", "", load_para, sizeof(load_para));
    activity_load_app("application://app_root");
}

2.app_root.axf 的消息处理

2.1 主函数 app_root_start()调用app_root_wincreate()创建根窗口

app_root_start()在文件 《livedesk\beetles\sun20iw1_app\apps\app_root\app_root.c》 中:

/**********************************************************************************************************************
插件接口实现
**********************************************************************************************************************/
static int32_t app_root_start(Activity *activity)
{
......
    happ_root_manwin    = app_root_wincreate(activity);
......
}

2.1.1app_root_wincreate()创建根窗口,设置根窗口消息处理回调函数app_root_win_proc():

app_root_wincreate()app_root_win_proc()都在 《livedesk\beetles\sun20iw1_app\apps\app_root\app_root_scene.c》 中。

/* 创建根窗口 */
H_WIN app_root_wincreate(Activity *activity)
{
......
    create_info.ManWindowProc   = (__pGUI_WIN_CB)esKRNL_GetCallBack((__pCBK_t)app_root_win_proc);
......
}

2.1.1.1 app_root_win_proc()调用app_root_command_proc()处理命令类消息

app_root_win_proc()将属于command类型的MSG传给app_root_command_proc()处理:

int32_t app_root_win_proc(__gui_msg_t *msg)
{
......    
	switch (msg->id)
    {
        case GUI_MSG_CREATE:
            root_para->h_parent     = msg->h_deswin;
            root_para->font         = SWFFont;
            root_para->root_type    = 0;
            root_ctrl->root_para    = root_para;
            root_ctrl->h_app_home   = app_home_create(root_para);
        case GUI_MSG_COMMAND:
        {
            __log("svabed......GUI_MSG_COMMAND");
            app_root_command_proc(msg);
            return EPDK_OK;
        }
......
}        

app_home_create()函数使用单独一节介绍。
app_root_command_proc()函数主要是处理按键消息,如界面切换;在功能界面下实现各种功能操作。函数比较大,大约900行,这里删掉大部分,剩下几十行,供速览:

static int32_t app_root_command_proc(__gui_msg_t *msg)
{
......
    __log("*****************app_root_command_proc**************");
    switch (LOWORD(msg->dwAddData1))
    {
        case APP_HOME_ID:
            switch (HIWORD(msg->dwAddData1))
            {
                case SWITCH_TO_OTHER_APP:
                {
                 ......
                    switch (msg->dwAddData2)
                    {
                    	case ID_HOME_EXPLORER:
                        ......
                     }
                }
           }
           break;       
        case APP_EXPLORER_ID             :break;
        case APP_MOVIE_ID                :break;
        case APP_MUSIC_ID                :break;
        case APP_PHOTO_ID                :break;
        case APP_FM_ID                   :break;
        case APP_SETTING_ID              :break;
        case APP_EBOOK_ID                :break;
        case APP_RECORD_ID               :break;
        default:break;
	}    
}	    

2.2 app_home_create()创建桌面UI,设置消息处理回调函数_home_manager_win_proc()

本节函数均在 《livedesk\beetles\sun20iw1_app\apps\multi_screen_home\app_multi_screen_home.c》 中。
app_home_create()源码:

H_WIN app_home_create(root_para_t  *para)
{
    create_info.name            = APP_MULTI_SCREEN_HOME;
    create_info.hParent         = para->h_parent;
    create_info.ManWindowProc   = (__pGUI_WIN_CB)esKRNL_GetCallBack((__pCBK_t)_home_manager_win_proc);
    create_info.attr            = (void *)pmulti_screen_home_attr;
    create_info.id              = APP_MULTI_SCREEN_HOME_ID;
    create_info.hHosting        = NULL;
    return (GUI_ManWinCreate(&create_info));
}

2.2.1 _home_manager_win_proc()把按键消息传给_home_on_command()

static int32_t _home_manager_win_proc(__gui_msg_t *msg)
//  livedesk\beetles\sun20iw1_app\apps\multi_screen_home\app_multi_screen_home.c
{
	switch (msg->id)
	{
		case GUI_MSG_CREATE:
			return _home_on_create(msg);
		case ALARM_MSG_CLOSE:
			return _home_on_alarm_closed(msg);
		case GUI_MSG_COMMAND:
			return _home_on_command(msg);		

2.2.1.1_home_on_command()处理界面刷新和进入功能界面

static int32_t _home_on_command(__gui_msg_t *msg)
{
    switch (msg->dwAddData1)
    {
        case DESKTOP_REFRESH_MSG:
     	.....
        return EPDK_OK;
        case EXIT_MULTI_SCREEB_HOME_TO_AP_MSG:
     	.....
        return EPDK_OK;

3.由控制台log信息观察从桌面进入音乐界面的过程

当桌面的音乐图标变为焦点时,按下Enter按钮,就进入音乐界面,此时控制台log信息输出如下:

[DBG]: [_home_on_command:0451]:              ++++EXIT_MULTI_SCREEB_HOME_TO_AP_MSG+++
[DBG]: [_home_on_command:0452]:              &&&&&&&&&&&&&&msg->dwAddData1=10, msg->dwAddData2=2
[DBG]: [_home_on_command:0477]:              sarbafe....EXIT_MULTI_SCREEB_HOME_TO_AP_MSG
[DBG]: [uninit_multi_screen_res:0101]:       i = 0
[DBG]: [uninit_multi_screen_res:0101]:       i = 1
[DBG]: [uninit_multi_screen_res:0101]:       i = 2
[DBG]: [uninit_multi_screen_res:0101]:       i = 3
[DBG]: [app_root_win_proc:4198]:             svabed......GUI_MSG_COMMAND
[DBG]: [app_root_command_proc:0374]:         *****************app_root_command_proc**************
[ERR]: [_home_manager_win_proc:0606]:        app GUI_MSG_DESTROY
[DBG]: [app_root_command_proc:0483]:         root_para->root_type=2
[DBG]: [app_root_command_proc:0486]:         exist = 0
[DBG]: [app_music_create:0064]:              ****************************************************************************************
[DBG]: [app_music_create:0065]:              ********  enter music player application  **************
[DBG]: [app_music_create:0066]:              **********************************************************
posted @ 2023-02-23 16:28  汉塘阿德  阅读(32)  评论(0编辑  收藏  举报  来源