0 ctrl+shift+F10 ctrl+end
1 在CustResDefPLUTO.h 中设置工程模式等
2 MTK申请和释放media内存的函数
eg: 分配20字节内存, temp_filename指向其首地址
char* temp_filename;
if (media_get_ext_buffer(MOD_MMI, (void **)&temp_filename, 20) != MED_RES_OK)
{
return ;
}
media_free_ext_buffer(MOD_MMI, (void**)wstr_filename);
med_alloc_ext_mem(size);
med_free_ext_mem(pointer);
media_free_ext_buffer出问题是由于越界访问用media_get_ext_buffer申请的内存
3 MTK申请ctrlbuff内存的函数
eg:
kal_Uint16* p = (kal_Uint16*)get_ctrl_buff(buff_size);
free_ctrl_buff(p);
4 从MMI往L4发消息请求数据
eg:
MYQUEUE Message;
Message.oslSrcId = MOD_MMI;
Message.oslDestId = MOD_L4C_2;
Message.oslMsgId = (msg_type) PRT_MSG_ID_MMI_SMS_GET_PROFILE_PARAMS_REQ;
Message.oslDataPtr = (oslParaType*)msgReq; //传递的参数
Message.oslPeerBuffPtr = NULL;
OslMsgSendExtQueue(&Message);
SetSlaveProtocolEventHandler(Ys_GDevice_MasterCenterNumRsp, PRT_MSG_ID_MMI_SMS_GET_PROFILE_PARAMS_RSP);//设置消息响应的回调
5 获取系统盘和获取挂载设备 获取设备状态 检查剩余空间
eg1:
fun int() get_sys_drv
return FS_GetDrive(FS_DRIVE_V_NORMAL, 2, FS_DRIVE_V_NORMAL | FS_DRIVE_I_SYSTEM);
eg2:
fun int() get_removeable_drv
return FS_GetDrive(FS_DRIVE_V_REMOVABLE, 1, FS_NO_ALT_DRIVE);
eg3:
if(!FS_GetDevStatus(drv, FS_MOUNT_STATE_ENUM) == FS_NO_ERROR)
eg4:
FS_DiskInfo disk_info; U16 path[4] = L"C:\\";
FS_GetDiskInfo((PU16) path, &disk_info, FS_DI_BASIC_INFO | FS_DI_FREE_SPACE);
disk_free_space = (U64)disk_info.FreeClusters * disk_info.SectorsPerCluster * disk_info.BytesPerSector;(byte单位)
6 判断文件是否存在
eg: kal_bool fun(wchar* unifilename)
int attrs = FS_GetAttributes((const WCHAR*)filename);
return (attrs >= 0) && ((attrs & FS_ATTR_DIR) == 0);
6.1 读写文件
char temp_filename[50];
short wstr_filename[50];
sprintf(temp_filename, "%c:\\sample.cgg", get_sys_drv());
ascii_to_unicode(temp_filename, wstr_filename);
if((file_handle = FS_Open((const WCHAR*)wstr_filename,FS_CREATE_ALWAYS | FS_READ_WRITE)) < 0)
{
FS_Close(file_handle);
return ERROR;
}
else
{
FS_Write(file_handle, &statistics_flag, sizeof(statistics_flag), (UINT *)&size);
FS_Read(file_handle, &statistics_flag, sizeof(statistics_flag), (UINT *)&size);
FS_Close(file_handle);
}
6.2 dump文件
static char _logbuff[1024];
void _dumpFileLog()
{
FS_HANDLE logHandle;
U8 size;
logHandle = FS_Open(_logFileName, FS_CREATE|FS_READ_WRITE);
if(logHandle < 0)return;
FS_Seek(logHandle, 0, FS_FILE_END);
FS_Write(logHandle, _logBuff, sizeof(_logBuff), (UINT *)&size);
FS_Write(logHandle, "\r\n", sizeof("\r\n"), (UINT *)&size);
FS_Close(logHandle);
}
6.3 设置文件属性
void fun()
{
FS_HANDLE file_handle = FS_Open((const WCHAR*)_finishFile, FS_CREATE);
int setAttriError = 0;
if(file_handle < 0)return;
FS_Close(file_handle);
if((setAttriError = FS_SetAttributes((const WCHAR*)_finishFile, FS_ATTR_HIDDEN|FS_ATTR_SYSTEM))< 0){sys_error();}
}
6.4 检查盘符
MMI_BOOL available;
available = (FS_GetDevStatus(drv, FS_MOUNT_STATE_ENUM) == FS_NO_ERROR);
6.5 从路径中提取文件名
U16 *mmi_da_util_get_filename(U16 * filepath)
{
S32 length, i;
length = mmi_ucs2strlen((S8 *) filepath);
/*从后往前推到一个斜杠或者是反斜杠就是文件名(有扩展)*/
for (i = length - 1; i >= 0; i--)
{
if (filepath[i] == L'\\' || filepath[i] == L'/'){return &filepath[i + 1];}
}
return filepath;
}
6.6 提取路径
u16* ptr = mmi_da_util_get_filename((U16*)buf_filepath);
*ptr = 0;
7 MTK中获取sim卡状态和当前模式的API
mmi_idle_get_dual_sim_status(U8 *sim_status, U8* mode_status)
sim_status包括:
MMI_SIM_ID_SIM1,
MMI_SIM_ID_SIM2,
MMI_SIM_ID_DUAL_SIM,
MMI_SIM_ID_NO_SIM,
mode_state包括:
MMI_SIM_ID_SIM1,
MMI_SIM_ID_SIM2,
MMI_SIM_ID_DUAL_SIM,
MMI_SIM_ID_FLIGHT_MODE,
8 获取运营商
eg:
char* operid = NULL;
#ifdef __SALES_STATISTICS_DUAL_SIM__
if(mode_status == MMI_SIM_ID_SIM1){ operid = gHomePLMNNum;return;}
else if(mode_status == MMI_SIM_ID_SIM2 ){ operid = gHomePLMNNum_2;return;}
else
{
if(sim_status == MMI_SIM_ID_DUAL_SIM)
{
switch(mode_status)
{
case MMI_SIM_ID_SIM1:{operid = gHomePLMNNum;return;}
case MMI_SIM_ID_SIM2:{operid = gHomePLMNNum_2;return;}
}
}
else if (sim_status == MMI_SIM_ID_SIM2){operid = gHomePLMNNum_2;return;}
else{operid = gHomePLMNNum; return;}
}
#else
if (sim_status != MMI_SIM_ID_SIM1) return;
else{operid = gHomePLMNNum; return;}
#endif
9 读写nvram
第一步:添加LID 文件 Nvram_common_defs.h 位置 NVRAM_EF_LAST_LID_COMMAPP
eg: NVRAM_EF_YOSC_TEST_LID
第二步:添加nvram项的单项字节数和总项数的宏定义 文件 Nvram_common_defs.h 或 Nvram_common_config.c
eg: #define NVRAM_EF_YOSC_TEST_LID_TOTAL 2
#define NVRAM_EF_YOSC_TEST_LID_SIZE (sizeof(NVRAM_YOSC_TEST_STRUCT) * NVRAM_EF_YOSC_TEST_LID_TOTAL)
第三步:设置nvram 数据项的默认值 文件 Nvram_common_config.c 结构体定义在 Nvram_editor_data_item.h
eg:
typedef struct {
int data;
char c1[20];
char c2[20];
}NVRAM_YOSC_TEST_STRUCT;
static NVRAM_YOSC_TEST_STRUCT const NVRAM_YOSC_TEST_DEFAULT[] =
{
{1, "j1", ""},
{2, "j2", ""}
};
第四步:添加nvram项的版本, 文件 Nvram_editor_data_item.h
#define NVRAM_EF_YOSC_TEST_LID_VERNO "000"
第五步:添加nvram项 文件 Nvram_common_config.c 位置 NVRAM_EF_RESERVED_LID
eg:
,{
NVRAM_EF_YOSC_TEST_LID,
NVRAM_EF_YOSC_TEST_LID_SIZE,
NVRAM_EF_YOSC_TEST_LID_TOTAL,
NVRAM_NORMAL(NVRAM_YOSC_TEST_DEFAULT),
NVRAM_ATTR_AVERAGE, //指定属性比如备份
NVRAM_CATEGORY_USER, //指定文件的目录
"yosc_test", //文件名的前部分 文件名的组成是:"yosc_test" + "-" + "版本号"
VER(NVRAM_EF_YOSC_TEST_LID), //版本
"yosc test data", //描述
NVRAM_APP_RESERVED //默认是这个
}
第六步:读写nvram项
eg1:
S16 pError;
NVRAM_YOSC_TEST_STRUCT data_item[2];
ReadRecord(
NVRAM_EF_YOSC_TEST_LID,
1,//从哪条记录开始读 起始1
(void*)data_item,
2 * sizeof(vrsd_tag_struct), //读取的字节数
&pError);
eg2:
NVRAM_YOSC_TEST_STRUCT data_item[2] = {{1, "k1", ""},{2, "k2", ""}};
WriteRecord(NVRAM_EF_YOSC_TEST_LID,1, (void*)data_item, 2 * sizeof(vrsd_tag_struct), &pError);
pError = 1 时 success
第七步:codegen
10 修改medbuf大小 Med_mem.h 修改asm大小App_mem_config.h
10.1 与unicode有关的函数UCS2.c
10.2 与UI有关的函数声明Gui.h
10.3 与字体有关的FontType.c
10.4 gdi_layer_push_and_set_active(handle_layer) 和 gdi_layer_pop_and_restore_active(void)成对使用
eg:
gdi_layer_push_and_set_active(avatar_cntx_p->image_buffer_handle);
gdi_layer_set_source_key(TRUE, GDI_COLOR_TRANSPARENT);
gdi_layer_clear(GDI_COLOR_GREEN);
gdi_layer_pop_and_restore_active();
10.5 盘符eg:MMI_CARD_DRV 用宏保存在FileMgrGprot.h
11 添加从idle输入*#XX#进入的界面 在ssc_table1[]
12.1 COM_DEF
COM_DEF +=字符串 eg:COM_DEF += VRE_30
COM_DEF +=变量 eg:VRE_USER_AGENT_COMPANY = Tcent
COM_DEF += VRE_USER_AGENT_COMPANY=$(strip $(VRE_USER_AGENT_COMPANY))
12.2 mak输出
$(warning ERROR: Please set VRE_USER_AGENT_COMPANY as "NONE" when VRE_CIPHER_UA = TRUE)
12.3 mak调用过程
eg:
DEP_ERR_ONA_OR_OFFB = $(warning ERROR: PLEASE turn on $1 or turn off $2)
$(call DEP_ERR_ONA_OR_OFFB,WBXML_SUPPORT,VRE_SUPPORT)
13.1 编译目录出错 导致Resgenerating Process Error build目录在开始编译时刻建立在编译目录(可删除)
13.2 Resgenerating Process merge ref_list.txt error. 35版本出错在MMIDataType.h 53版本在mmi_res_range_def.h
>>主题系列
14 哪个目录下的themecomponents.h会生效
custresource\themecomponents.h remake
custresource\pluto_mmi\themecomponents.h resgen
lcdresource\$MAINLCD_SIZE\touch or non_touch new
14.1 custthemeres.h里面定义结构MMI_theme
themeres.c里面定义theme_defaultTheme是默认主题
themecomponents.h里面定义默认主题元素
14.2 resgen图片生成的数据在custimgdatahw.h(这里面的数据直接调用)
themecomponents.h里面的UI_FILEED_AREA数据从custimgdatahw.h(custimgdatahw.h包含路径)手动拷贝
特别注意从custimgdatahw.h拷贝数据到themecomponents.h之后,要把custimgdatahw.h里面原始数据删除以免额外占用rom空间(一个已经不用的const数组)
。
路径参见custresdef.h或custdatares.h
14.3 资源范围RESOURCE_BASE_RANGE定义在 MMIDatatype.h
14.4 themeres.c:
MAX_MMI_THEMES 主题列表里显示的主题个数
mtk_MMI_themes[] 主题列表项
MMI_theme_names[] 主题名称
14.5 用Modis Theme Editor 导出来的mte文件同struct MMI_theme结构里面的项一一对应。
类型有UI_filled_area 和 color 两种,UI_filled_area 一般是image 或 NULL
14.6 修改themecomponents.h后模拟器没有修改,重编ThemeRes.c
15.1 n字节对齐(a+(n-1))&(~(n-1))
15.2 #if #elif #else #endif
15.3 soureinsight ctrl+M添加书签
>>Features系列
16 Gsm2.mak:
@if /I "$(NEED_COPY_MMIFEATURE)" EQU "PLUTO_MMI" \
(if exist $(FIXPATH)\$(MMIDIR)\Customer\CustResource\PLUTO_MMI\MMI_features_switchPLUTO.h \
(copy /y $(FIXPATH)\$(MMIDIR)\Customer\CustResource\PLUTO_MMI\MMI_features_switchPLUTO.h $(FIXPATH)\$(MMIDIR)
\MMI\Inc\MMI_features_switch.h) \
) & \
(if exist $(FIXPATH)\$(MMIDIR)\Customer\CustResource\$(strip $(CUSTOMER))_MMI\MMI_features_switch$(strip $(CUSTOMER)).h \
(copy /y $(FIXPATH)\$(MMIDIR)\Customer\CustResource\$(strip $(CUSTOMER))_MMI\MMI_features_switch$(strip $(CUSTOMER)).h
$(FIXPATH)\$(MMIDIR)\MMI\Inc\MMI_features_switch.h) \
)
说明:MMI_features_switch$(strip $(CUSTOMER)).h 是MTK Release的文件,作为原始features的参考和备份。MMI_features_switchPLUTO.h也是
MTK release的文件,用来客制化。Gsm2.mak的语法揭示了MMI_features_switch.h的内容优先从MMI_features_switchPLUTO.h拷贝,成功即退出。
MMI_features.h: include "MMI_features_switch.h"
MMI_features.h根据MMI_features_switch.h的Features是OFF\AUTO\ON 制定相关Features的宏
MMI_include.h: include "MMI_features.h"
MMI_include.h在几乎所有.c文件中被包含。所以MMI_features.h里面的宏对包含MMI_include.h的源文件是可见的。
>>ref_list.txt
17 删除从前面删,第三项是字符长度最大是20,resgen只修改pluto_mmi下面的,可以用Excel打开看是否显示正常来确认是否添加对了.
>>another notes
18.0 在showcategory里面将某个资源指针置“非空的非法指针”有可能可以快速定位到绘制的地方。
18.1 放在plutommi\Customer\CustResource\PLUTO_MMI\Res_MMI目录下的res_xx.c文件会在resgen的时候被搜索编译到
18.2 其它模块包含本模块的头文件用COMMINCDIRS
18.3 第一次进入screen和从子screen返回的时候不会调用highlighthander
18.4 在EntryNewScreen后面调用DeleteScreenIfPresent可以返回到上上一屏。DeleteScreenIfPresent()
18.5 __MTK_TARGET__ _WIN32