SPRD-MMI学习笔记

来源:互联网 发布:在js中写json数据格式 编辑:程序博客网 时间:2024/06/05 16:42
 开关型feature options
列表型feature options
make目录存放和模块对应的编译脚本,属于模块编译脚本
Makefile.rules、Makefile.modules、Makefile以及项目的相关make脚本,属于项目编译脚本
makefile中变量和转义宏的区别:变量注释的#少于3个,转义宏注释的#至少有3个

application
window
control
虚拟窗口主要是指那种已经打开了但是无法得到Focus的应用窗口。
外部消息:由Application来处理
          事先在mmk_regapp.def中定义
          消息队列由嵌入式操作系统维护
内部消息:由Window,Control处理
   消息队列由Kernel模块维护
   定义在mmk_msg.h中


pb   电话本
sms  短信
mms  彩信
idle 待机窗口
tp   触笔
record 录音
cc(call control) 呼叫控制
vibrator 振动器
charge   充电
im(input method) 输入法
trisim 3卡
MSG_KEYDOWN_PLUS 全键盘
MSG_APP_WEB 一键上网键(被上下左右键包围的那个)
fmm 文件管理
accessary 附件
speaker 扬声器
headset 耳机
NV的全称:None Volatile永远不变、常住内存(具体文件flash_sim.dat)
虚拟窗口:主要是指那种已经打开了但是无法得到Focus的应用窗口。
im输入法
image:生成新的bin文件,放在build\..\img文件夹下,new命令包括image,而update命令则不包括。
如果在.mk文件中加宏,重新编译的时候,相关模块一定要先clean,再update。

idle窗口->主菜单窗口->多媒体窗口->mp3窗口->mp3播放列表->'浏览' 的代码走向:
          DisplayIdleWinSoftkey
mainapp.c文件中         Mainmenu_win.c文件中     
MAIN_OpenIdleWin->IdleWin_HandleMsg->HandleIdleMsg->MMIMENU_CreatMainMenu->MAINMENU_WIN_TAB->!!!HandleMainMenuWinMsg->MAINMENU_ICON_PLAYER_WIN_TAB
         mmimp3_wintab.c文件中
->HandleMainSecondMenuWinMsg->MMIAPIMP3_OpenMp3Player->MMIAPIMP3_OpenMp3PlayerScreen->MMIMP3_MAIN_PLAY_WIN_TAB->HandleMp3PlayWinMsg
->OpenPlayerOptMenu->HandleMp3PlayerOptWinMsg->MMIMP3_PLAY_LIST_LIST_WIN_TAB->HandleMp3PlayListListWinMsg->OpenListListOptMenu
->HandleMp3PlayListListOptWinMsg->ShowMp3ListInfo

在OpenPlayerOptMenu中:MMIPOPMENU_CreateDynamic注册mp3窗口菜单的消息处理函数HandleMp3PlayerOptWinMsg
         InsertMp3NodeByLabel给mp3窗口加菜单'播放列表'、'刷新列表'等
在OpenListListOptMenu中:MMIPOPMENU_CreateDynamic注册mp3播放列表菜单的消息处理函数HandleMp3PlayListListOptWinMsg
           InsertMp3NodeByLabel给mp3播放列表窗口加菜单'浏览'等
HandleMp3PlayListListOptWinMsg中的ShowMp3ListInfo为点‘浏览’所调用的函数
       mmipb_wintab.c        查找后显示号码列表的窗口          MSG_APP_WEB: OpenEntry();进入显示详情窗口
电话本:从!!!开始->MMIAPIPB_OpenListAllGroupWin->MMIPB_OpenNumberList->MMIPB_SEARCH_LIST_WIN_TAB->HandleTabListParentWinMsg中的消息->HandleTabListWinMsg->DealWithDoneAndOption->
pb菜单项
MMIPB_MEMBER_OPT_WIN_ID->HandleMemberOptMenuWinMsg->PB_OPTMENU_NODE_SEARCH消息,进入查找pb窗口:MMK_CreateWin((uint32 *)MMIPB_SEARCH_NAME_WIN_TAB, PNULL);
加载pb列表HandleTabListWinMsg函数中:MMI_PB_RELOAD_SEARCH_LIST_MSG消息下

                |MMIFMM_MAIN_WIN_TAB(产生选项卡的父窗口)->HandleFmmMainWinMsg
文件管理:从!!!开始->ID_ENTERTAIMENT_FAVORITE消息下MMIAPIFMM_OpenExplorer()函数->OpenFmmMainExplorer->CreateExplorerWin->|MMIFMM_UDISK_CHILD_WIN_TAB->HandleUdiskChildWindow->
HandleCreatePopMenuOpt->HandleNormalMenuWinMsg->HandleMenuOption中menuid为ID_FMM_DETAIL的处理方法FmmFileDetail(sel_ctrl_id, list_data_ptr);//一个捷径:菜单名称(xls)->资源id->菜单项集合中的菜单id->回调函数(就是点此菜单对应的处理函数),如果是动态添加的菜单,则为2维数组中每个数组的第一项。
加载文件列表HandleUdiskChildWindow/HandleSDChildWindow函数中:case MSG_CTL_LIST_NEED_ITEM_DATA:
                 FmmHandleListAppendData(param,MMIFMM_SD_LISTBOX_CTRL_ID,MMIFMM_NEED_LIST_ITEM_DATA_TYPE);
                 break;

工具加载闹钟列表:从!!!开始->ID_MAINMENU_TOOLS消息下MAINMENU_ICON_TOOLS_WIN_TAB->HandleMainSecondMenuWinMsg->ID_TOOLS_ALARM消息下MMIALM_OpenMainWin()->ALARM_MAINWIN_TAB->HandleAlarmMainWinMsg
->MSG_OPEN_WINDOW->AppendTwoLineListItem

开关型宏的用法:#if (defined(TRACE_INFO_SUPPORT) && defined(MEMORY_DEBUG_SUPPORT))

           2954 MSG_KEYDOWN_PLUS:              添加到电话本
快速拨号:MAIN_OpenIdleWin->IdleWin_HandleMsg->OpenFuncDialingWin->MMIPOPMENU_CreateStatic->在HandlePhoneOperateMenuWinMsg中,消息###MSG_CTL_MIDSK->ID_DIAL_ADD_PB下对应的处理函数             mmipb_wintab.c 11512 PB_GROUP_ALL:
MMIAPIPB_OpenAddMenu(打开添加菜单的窗口。)->MMIPB_OpenAddMenu->MMIPB_OpenAddNewGroupSelectWin
 
      mmipb_export.c       mmipb_wintab.c
从###开始->ID_DIAL_ADD_EXISTNUM->MMIAPIPB_OpenEntryListForCallLog->MMK_CreateWin((uint32*)MMIPB_ENTRY_LIST_FOR_CALLLOG_WIN_TAB, PNULL);->HandleEntryListForCallLogWinMsg->
OpenEntryListForCallLog->MMIPUB_OpenAlertWarningWin(TXT_PB_NO_ENTRY);//打开提示窗口--没有记录  
                      
待机窗口显示日程和时间:MAIN_OpenIdleWin->IdleWin_HandleMsg->HandleIdleMsg->OutIdleWinContent->OutputIdleWinCalendar->MMIIDLE_DisplaySchedule
               ->OutputIdleWinTimerWithImage

已拨电话:ID_CL_DIALED_CALLS->MMIAPICL_OpenCallsListWindow->MMICL_HandleEnterCallsMenu->MMICL_OpenCLWindow->MMICL_DIALED_CHILD_WIN_TAB->HandleDialedChildWindow->MMICL_LOG_LIST_MENU_CTRL_ID
->HandleLogListMenuWindow->ID_CL_LOG_LIST_CALL->HandleRingBack->MMIAPICC_MakeCall->ProcessMakeCall

输入法展示候选字:IM_HandleKeypadMsg->IM_HandleTextInputMsg->IM_ProcessContent->IM_UpdateWnd->IM_ShowWnd->IM_PaintWnd

控制台输出字符串:
       wchar w_text[] = {'B','t','t','o','n','1',0};
       char str[] = {0};
       MMIAPICOM_WstrToStr(w_text,str);
       SCI_TRACE_LOW("zhoujf %s",str);
MMIAPICOM_WstrToStr(text_l2.wstr_ptr,str);
                    SCI_TRACE_LOW("line2 is %s",str);
------------------------------------------------------------------------------------------------------------------
开合盖去掉铃声特效:
充电界面HandleChargeStartupWindow->MSG_FULL_PAINT:
      MMIAPISET_StopAllRing(TRUE);
usb选择界面HandleUsbOperSelectWindow->
   case MSG_APP_SILDE:
        MMIAPISET_StopAllRing(TRUE);
        break;
    case MSG_APP_SILDE_UP:
        MMIAPISET_StopAllRing(TRUE);
        break;
完美方案PUBLIC void MMIDEFAULT_HandleSlideKey(
                                      MMI_MESSAGE_ID_E  msg_id //[IN] TRUE: flip up; FALSE: flip down
                                      )
{
    SCI_TRACE_LOW("MMIDEFAULT_HandleSlideKey: msg_id = %d", msg_id);
  
    switch (msg_id)
    {
    case MSG_KEYUP_SLIDE:   //打开滑盖
        if (RESTART_BY_CHARGE != POWER_GetRestartCondition())
        {
            MMIAPISET_PlayRing(0, FALSE,0, 1, MMISET_RING_TYPE_SLIDE_ON, PNULL);
        }
        break;

    case MSG_KEYDOWN_SLIDE:     //关闭滑盖
        if (RESTART_BY_CHARGE != POWER_GetRestartCondition())
        {
            MMIAPISET_PlayRing(0, FALSE,0, 1, MMISET_RING_TYPE_SLIDE_OFF, PNULL);
        }
        break;

    default:
        SCI_TRACE_LOW("MMIDEFAULT_HandleSlideKey invalid msg = %d", msg_id);
        break;       
    }
}
GUITAB_SwitchCurSel(MMIPB_SEARCH_LIST_TAB_CTRL_ID, 1);
------------------------------------------------------------------------------------------------------------------
动态菜单加载 mp3模块、pb
------------------------------------------------------------------------------------------------------------------
>好了 什么情况下要这样做?
你刚才那样该可能也可以的 改了资源文件编译模拟器钱一定要编译下资源
 mmi_res_128x160_win.bin 这个文件只有arm生成  像改了common_mdu_def.h这个文件一定要new 具体我也不清楚。 别的模块的资源文件倒是不需要
 
刚才添加那个NULL的函数 这个函数只是定义了那个图片ID 但是不添加资源
MMK_CreateWin  mmk_window.c 静态创建
MMK_CreateWindow mmk_applet.c 动态创建
更正一下:函数MMK_RunWinProc(),msg_id = 0xf021
-------------------------------------------------------------------------------------------------------------------
关于图片资源:
静态图片首选bmp RLE压缩(实现透明、无损压缩,需要图片不太复杂,上下渐变压缩率高,左右渐变压缩率低)
动态图片首选gif压缩(确保当前窗口无视频播放)
大的背景图用jpeg(节省空间)
实现半透明或消除锯齿用png或argp(确保当前窗口无视频播放)
LCD最大支持16Bit

设置透明色的方法必须成对使用
IMG_EnableTransparentColor(TRUE);
显示图片
IMG_EnableTransparentColor(FALSE);
-------------------------------------------------------------------------------------------------------------------
WIN32这个宏用于模拟器。
-------------------------------------------------------------------------------------------------------------------
GUIAPICTRL_SetBothRect 设置控件的横竖屏坐标位置
-------------------------------------------------------------------------------------------------------------------
字符串掐尾并加...
/*20110920 zhoujf based on piex turncate str and  add .. symbol  begin*/
    wchar  *temporary_str=PNULL;
    uint16 temp_str_len = 0;
    uint16 temp_str_max_len = 0;
    uint16 str_piex_len = 0;
       // 计算一次,不需要断行函数,直接截取字符串
    wchar   ellipsis_str[] = { '.', '.', '.', 0};
    uint16  ellipsis_len   = MMIAPICOM_Wstrlen( ellipsis_str );
    uint16  ellipsis_width = GUI_CalculateStringPiexlNum(ellipsis_str, ellipsis_len, tab_ptr->tab_style.font, 0);
    uint16  temp_char_num  = 0;
    uint16  temp_pixel_num = 0;

    char str1[] = {0};
/*20110920 zhoujf based on piex turncate str and  add .. symbol  end*/
 /*20110920 zhoujf based on piex turncate str and  add .. symbol  begin*/
        str_piex_len = GUI_CalculateStringPiexlNum(str_ptr, str_len, tab_ptr->tab_style.font, 0);
        temp_str_max_len = CalculateItemWidth(tab_ptr,tab_ptr->item_ptr) - 1;
        if(temp_str_max_len < str_piex_len)
       {
           
               temporary_str = SCI_ALLOC_APP( (temp_str_max_len + ellipsis_len + 1) * sizeof(wchar));
               GUI_GetStringInfoInLine(
      str_ptr,  // 字符串指针
      str_len,  // 字符串长度
      tab_ptr->tab_style.font,    // 字体大小
      0, // 字间距
      (temp_str_max_len), // 总的宽度
      &temp_char_num,   // 字数
      &temp_pixel_num,  // 像素个数
      FALSE
      );
  MMIAPICOM_Wstrncpy( temporary_str, str_ptr, temp_char_num );
  MMIAPICOM_Wstrncpy( temporary_str + temp_char_num, ellipsis_str, ellipsis_len );
  temp_str_len = temp_char_num + ellipsis_len;
  str_info.wstr_len = temp_str_len;
   str_info.wstr_ptr = temporary_str;
   MMIAPICOM_WstrToStr(temporary_str,str1);
   SCI_TRACE_LOW("zhoujf %s",str1);
  if (PNULL != temporary_str)
              {
                    SCI_FREE(temporary_str);
              }
       }
/*20110920 zhoujf based on piex turncate str and  add .. symbol  end*/
------------------------------------------------------------------------------------------------------------------
.c文件要参与项目编译必须相应的mk文件添加编译路径
------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------
只下载NV 勾选FDL1,FDL2,NV,FLASH
只下载资源 勾选FDL1,FDL2,KERNEL_IMG,USER_IMG,MMIRES
------------------------------------------------------------------------------------------------------------------
NV读写方法中传入的参数类型必须和预先定义的nv项的类型一样。
------------------------------------------------------------------------------------------------------------------
ARR_SIZE宏计算数组成员个数。
------------------------------------------------------------------------------------------------------------------
多模块编译make p=sc6800h_sp6804h m="bootloader fdl2" clean update   ib=1
单模块编译make p=sc6800h_sp6804h m=app update image stop=1 ib=1/job=4
------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------
资源编译时要关掉模拟器开发环境和字符资源.xls文件。
------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------
添加模块时有关文件编译的脚本
app.make:
ifeq ($(strip $(GAME_SNAKE_SUPPORT)),TRUE)
MSRCPATH  += MS_MMI/source/mmi_app/app/game/game_snake/c
MINCPATH  += MS_MMI/source/mmi_app/app/game/game_snake/h
SOURCES += mmigame_snake_func.c mmigame_snake_nv.c mmigame_snake_menutable.c mmigame_snake_wintab.c mmigame_snake_id.c
endif
resource.mk:
ifeq ($(strip $(GAME_SNAKE_SUPPORT)),TRUE)
SRCPATH += MS_MMI/source/mmi_app/app/game/game_snake/h
SOURCES += game_snake_mdu_def.h
endif
------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
MMK_PostMsg向窗口发消息
------------------------------------------------------------------------------------------------------------------------
字符串过长用'..'显示GUISTR_DrawTextToLCDInRect或LCD_DisplayStringInLineByAlignTruncate
------------------------------------------------------------------------------------------------------------------
添加新代码请添加到末尾,并注意模块化。
------------------------------------------------------------------------------------------------------------------
展讯断言SCI_ASSERT
------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------
wchar 16位unicode字符串
char 8位unicodeascii字符串
------------------------------------------------------------------------------------------------------------------
HandleDefaultWinMsg加载非常规窗口回调函数
宽字符串(wchar)常量前要加L
创建窗口timer用MMK_CreateWinTimer 生命周期随所在窗口
LOCAL const uint8* const sos_nums[] = {
       "13770793981",
       "13816478629",
       "15234567890"
       };
------------------------------------------------------------------------------------------------------------------
调整flash大小一般都是调资源(res)的开始地址或代码(ps)的结束地址
------------------------------------------------------------------------------------------------------------------
添加新项目:1.修改项目.make文件2.加资源文件3.加common文件夹中的nv文件
------------------------------------------------------------------------------------------------------------------
74、GPRS 参数类型问题:
1、 WAP:上网时需要通过运营商转到NET服务器,可以访问运营商主页
2、 BROWSER:上网时不需要运营商,可直接访问NET服务器,不可以访问运营商主页
3、 MMS:发送彩信用
------------------------------------------------------------------------------------------------------------------
保险的下载方式:先按下对应的KEY,然后插入USB线,然后点击下载,然后安装电池,然后松开对应的KEY
------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------
/******************************************/
/***********Flash LayeOut******************/
/******************************************/
/*|--------------------|-*--------MAX_FLASH_SIZE
  |                 | *
  | Running NV         | *RUNNIN_NV_SIZE=RUNNIN_NV_SECTOR_NUM*FLASH_SECTOR_SIZE
  |                    | *
  |--------------------|-*--------RUNNIN_NV_BASE_ADDR=MAX_FLASH_SIZE-RUNNIN_NV_SIZE---------*
  |                 |                                                                    *
  |Product Info        |            * 
  |--------------------|-*--------PRODUCT_NV_BASE_ADDR=FIXED_NV_BASE_ADDR+FIXED_NV_SIZE     *FLASH_SECTOR_SIZE
  |                 | *            *
  |Fixed NV            | *FIXED_NV_SIZE                  *
  |                    | *            *
  |--------------------|-*--------FIXED_NV_BASE_ADDR=RUNNIN_NV_BASE_ADDR-FLASH_SECTOR_SIZE--*-*---------------------------------------------------------------------------------------------------------*
  |                 | *              *                     *
  |Umem Disk           | *UDISK_SIZE=UMEM_SECTOR_NUM*FLASH_SECTOR_SIZE                *                     *
  |                    | *              *                     *
  |--------------------|-*--------UDISK_BASE_ADDR=FIXED_NV_BASE_ADDR-UDISK_SIZE---------------*无手机U盘:MMI_RES_SIZE=MMI_RES_SECTOR_NUM*FLASH_SECTOR_SIZE-----------------*----------------------------*
  |                 | *              *                    *    *
  |Resource            | *MMI_RES_SIZE=MMI_RES_SECTOR_NUM*FLASH_SECTOR_SIZE                   *                                                *    *PS(无手机U盘,STONE_IMAGE_SUPPORT=TRUE)
  |                    | *                                                                    *                                                                            *    *
  |--------------------|-*--------MMI_RES_BASE_ADDR=UDISK_BASE_ADDR-MMI_RES_SIZE--------------*无手机U盘:MMI_RES_BASE_ADDR=FIXED_NV_BASE_ADDR-MMI_RES_SIZE(资源空间将变大)-*PS(STONE_IMAGE_SUPPORT=TRUE)*
  |                 |                        *    *
  |                    |                     *    *
  |PS                  |                           *       *
  |--------------------|----------start address----------------------------------------------------------------------------------------------------------------------------*----------------------------*/
/******************************************/
PUBLIC  const NOR_FLASH_CONFIG_T  s_platform_patitiion_config =
{  
    1,                /*single-bank*/                                              
    RUNNIN_NV_SECTOR_NUM,       /*runningNV/EFS sector number*/      
    0,                /* abandon */                   
    FLASH_SECTOR_SIZE,    /*sector size*/                       
    0x00000000,                /*start address*/             
    RUNNIN_NV_BASE_ADDR,        /*runningNV/EFS start address*/    
    MAX_FLASH_SIZE,         /*flash size*/                       
    FIXED_NV_BASE_ADDR,         /*fixed nv start address*/                                   
    PRODUCT_NV_BASE_ADDR,       /*product info start address*/                                         
    MMI_RES_BASE_ADDR,          /*lint !e570 *//*resource start address*/                      
    UDISK_BASE_ADDR,            /*lint !e570 *//*U Disk start address */                          
    UDISK_SIZE,                 /*lint !e570 *//*U Disk Size*/                          
    -1                          /*blbin*/                                   
};//lint !e570

里面算出来的是KB,而非Kb
------------------------------------------------------------------------------------------------------------------
1.WVGA (480×800),FWVGA (480×854)
2.HVGA (320×480)
3.QVGA (240×320)
4.QCIF (176X220)
5.QQVGA (128X160)
------------------------------------------------------------------------------------------------------------------
窗口的title可以在窗口里面改也可以在菜单控件(如果有)的定义里面改
------------------------------------------------------------------------------------------------------------------
计算ram超 搜索.map文件中的SYS_MMU_MEM_AREA,上面一行第一个数加第一个数不要过本行第一个数就没有超
------------------------------------------------------------------------------------------------------------------
不能生成pac是因为内存不够,在任务管理器关一些占用资源大的进程,如果资源生成提示删除XXX_default.bin失败,在任务管理器里删除res_view.exe
------------------------------------------------------------------------------------------------------------------
更换卡1卡2的卡槽位置: common->nv_type->NV_SIM_CONFIG改sim_slot_cfg值0x1023(0x1000203)
------------------------------------------------------------------------------------------------------------------
一种新写法:
#ifdef MMIPB_PREINSTALL_PHONENUM
#include "mmiset_func.h"
#define PREINSTALL_NUM_COUNT   4
LOCAL void MMIAPIPB_PREINSTALL_PHONE_NUM(void)
{
 return;
}
#endif
------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------

原创粉丝点击