MTK两个常用函数
- 格式:doc
- 大小:14.70 KB
- 文档页数:4
mtk imgsensor_info 参数mtk imgsensor_info 参数是用于获取图像传感器信息的函数,它是在Android系统中用于获取传感器数据的一种常见方法。
该参数提供了有关图像传感器状态和性能的详细信息,包括传感器类型、分辨率、曝光时间、光源等信息。
这些信息对于开发者和应用程序开发人员来说非常重要,因为它们可以用于优化图像质量和提高用户体验。
一、函数原型```cint imgsensor_info(struct imgsensor* sensor, u16*sensor_id);```其中,`sensor` 是一个指向 `imgsensor` 结构的指针,该结构包含了传感器相关的信息;`sensor_id` 是一个指向无符号16位整数的指针,用于存储传感器ID。
二、参数说明1. `sensor`:指向 `imgsensor` 结构的指针,用于存储传感器相关的信息。
该结构包含了传感器类型、分辨率、曝光时间、光源等信息。
2. `sensor_id`:指向无符号16位整数的指针,用于存储传感器ID。
通过该参数可以识别不同的传感器型号和版本。
三、函数返回值函数返回一个整数值,表示函数执行的结果。
如果函数执行成功,则返回值为0;否则返回一个非零值,表示发生了错误。
四、参数详解1. `sensor->version`:传感器版本号,表示传感器的型号和版本信息。
2. `sensor->vendor_id`:传感器厂商ID,表示传感器的制造商信息。
3. `sensor->sensor_type`:传感器类型,表示图像传感器的类型,如CMOS、CCD等。
5. `sensor->format`:传感器图像格式,表示图像的像素格式,如RGB、YUV等。
6. `sensor->exposure_time`:曝光时间,表示传感器曝光的时间长度。
7. `sensor->awb_mode`:白平衡模式,表示图像的白平衡模式。
1. int FS_Open(const WCHAR*FileName, UINT Flag)该函数用来打开一个文件,FielName为文件路径及文件名,Flag为文件的操作属性,其值可为FS_READ_WRITE,FS_READ_ONLY,FS_OPEN_SHARED等。
如果文件打开成功,该函数返回一个大于等于0的值,否则返回一个小于0 的值。
具体操作方法可如下:FS_HANDLE h;if((h = (FS_HANDLE)FS_Open((constWCHAR*)filename,FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)) >= 0){FS_Close(h);}注意,这里的路径要转换成Unicode字符串,可以通过AnsiiToUnicodeString(S8 * pOutBuffer, S8 *pInBuffer)函数来实现。
比如我们在D盘的example 文件夹下有一个test.c 文件需要对其进行修改(D:\example\test.c),则:FS_HANDLE h;S8UnicodeName[100];AnsiiToUnicodeString((S8*) UnicodeName, (S8 *)”D:\\example\\test.c”);if((h = (FS_HANDLE)FS_Open((const WCHAR *)UnicodeName,FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)) >= 0){FS_Close(h);}也可使用FS_Open((const WCHAR *)L”D:\\example\\t est.c”,FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)方式打开。
当对文件修改完成后,要使用函数FS_Close()将其关闭。
2. intFS_Close(FS_HANDLEFileHandle)用来关闭一个已经打开的文件。
MTK 中nvram 的读写操作定义NVRAM 数据有三种方式:(一)、在nvram_editor_data_item.h、nvram_data_item.h、nvram_data_item.c三个文件中添加。
1、在nvram_editor_data_item.h文件中定义自己保存在nvram 中的结构体数据类型。
例如:typedef struct{Int a;Char b;}my_nvram_data_t;2、在nvram_data_item.h 文件中的nvram_lid_core_enum 枚举中定义自己的nvram ID(建议在最后面添加,但必须添加到NVRAM_EF_LAST_LID_CORE 的前面)。
再定义两个宏,一个宏是前面定义的结构体的字节大小,另一个是在nvram中保存的数据个数,如果在nvram 中只需要保存一个数据的话,就定义为1。
例如:typedef enum{…………My_nvram_data_lid, //自己定义的nvram IDNVRAM_EF_LAST_LID_CORE}nvram_lid_core_enum;#define my_nvram_data_size sizeof( my_nvram_data_t )#define my_nvram_data_total 13、在nvram_data_items.c文件中的lobical_data_item_table_core 结构体数组中添加自己的项。
建议添加在最后,仿照前面的添加。
例如:Itable_entry_struct logical_data_item_table_core[] ={…………,{My_nvram_data_lid , //前面定义的枚举IDmy_nvram_data_size , //前面定义的宏,结构体大小my_nvram_data_total , //前面定义的宏,nvram中数据的个数NVRAM_EF_ZERO_DEFAULT,NVRAM_A TTR_A VERAGE,NVRAM_CATEGORY_USER,“ MT1D” ,// 根据前面的数据项递增VER( My_nvram_data_lid ),“ my nvram test\0” ,//数据描述,只做参考,无其他作用NVRAM_RESERVED_VALUE}, { NVRAM_EF_RESERVED_LID}}4、my_nvram_data_t my_nvram_data = {0};S16 error ;//将my_nvram_data中的数据写到nvram中My_nvram_data_lid 标志处,error保存错误标志WriteRecord(My_nvram_data_lid, 1, &my_nvram_data, sizeof(my_nvram_data_t ), & error);//将nvram中My_nvram_data_lid 标志处的数据读到my_nvram_data中,error保存错误标志ReadRecord(My_nvram_data_lid, 1, &my_nvram_data, sizeof(my_nvram_data_t ), & error);二、在common_nvram_editor_data_item.h、nvram_user_defs.h、nvram_user_config.c 中定义1、common_nvram_editor_data_item.h 此处定义nvram 中保存数据的结构体数据类型2、nvram_user_defs.h 此处定义nvram ID 和结构体数据大小、数据总数3、nvram_user_config.c 此处填充nvram 结构数据内容及defult值(在MTK 下建议使用此方法修改nvram)(mtk 中nvram 的读写操作(一,二)/epll_apple/blog/item/94b29c22083a14a84723e846.html)三、在coustom_mmi_default_value.h、common_mmi_cache_config.c中定义1、在custom_mmi_default_value.h 文件中有三个枚举类型BYTEDATA,SHORTDATA和DOUBLEDATA。
1、S32 gdi_image_draw_id(S32 offset_x, S32offset_y, U16 image_id);offset_x和offset_y 是图片左上角的坐标,image_id是指向图片的枚举类型,用法如下:ADD_APPLICATION_IMAGE(MAIN_MENU_MA TRIX_PHONEBOOK_ICON,CUST_IMG_PATH"\\\\MainLCD\\\\MainMenu\\\\MATRIX\\\\MM_PB.gif");2、S32 gdi_image_draw(S32 offset_x, S32 offset_y, U8 *image_ptr);Image_ptr是用file2hex.exe转化后的图片文件名;在MTK平台里,image_ptr = (U8*)GetImage(image_id);3、S32 gdi_image_draw_file(S32 offset_x, S32 offset_y, S8*image_name);Image_name是图片的文件名;4、S32 gdi_image_get_dimension_id(U16 image_id, S32 *width, S32*height);S32 gdi_image_get_dimension_file(S8 *image_name, S32 *width, S32*height);S32 gdi_image_get_dimension(U8 *image_ptr, S32 *width, S32 *height);获得图片的长宽参数5、S32 gdi_image_get_frame_count_id(U16 image_id, S32 *frame_count); S32 gdi_image_get_frame_count_id(U16 image_id, S32 *frame_count);获得动态图片的帧数画点函数;6、void UI_putpixel(s32 x,s32 y,color c);7、关于剪切矩形:void UI_set_clip(s32 x1,s32 y1,s32 x2,s32 y2);void UI_reset_clip(void);void UI_pop_clip(void);void UI_set_text_clip(s32 x1,s32 y1,s32 x2,s32 y2);void UI_reset_text_clip(void);void UI_pop_text_clip(void);画线函数;颜色为c的一条直线:void UI_line(s32 x1,s32 y1,s32 x2,s32 y2,color c);颜色为c,宽度为w的一条直线:void UI_wline(s32 x1,s32 y1,s32 x2,s32 y2,color c,s32 w);画一个空心矩形:void UI_draw_rectangle(s32 x1,s32 y1,s32 x2,s32 y2,color c); 填充一个矩形:void UI_fill_rectangle(s32 x1,s32 y1,s32 x2,s32 y2,color c); 画图区域控制函数:void UI_lock_double_buffer(void);void UI_unlock_double_buffer(void);void UI_BLT_double_buffer(s32 x1, s32 y1, s32 x2 , s32 y2); 文字输出有关的函数:设置字符显示区:void UI_set_text_clip(s32 x1,s32 y1,s32 x2,s32 y2);设置字体颜色:void UI_set_text_color(color c);设置字体边框颜色:void UI_set_text_border_color(color c);设置当前光标位置:void UI_move_text_cursor(s32 x,s32 y);获取字符串的长、宽参数:void UI_measure_string(UI_string_type text,s32 *width,s32 *height);获得单个字符的长、宽参数:void UI_measure_character(UI_character_type c,s32 *width,s32*height);输出字符串:void UI_print_text(UI_string_type text);输出一个字符:void UI_print_character(UI_character_type c);字符串求长:U16 UTF8Strlen(U8 *p);字符串操作函数:字符串查找:strstr字符串拷贝:strcpy字符串定长拷贝:strncpy字符串比较:strcmp字符串定长比较:strncmp字符串续接:strcat字符串定长续接:strncat字符串转化为整型函数:atoi整型转化为字符串函数:itoa关于层建立一个层:GDI_RESULT dm_create_layer_using_outside_memory(S32 x, S32 y, S32 width, S32 height, gdi_handle **handle_ptr, U8 *outside_memory, S32 outside_memory_size, U32 flags);MTK平台上,软件支持四层。
小结一:MTK timer 有很多种,从最低层的KAL(kernel adpat layer)到MMI,都有timer 的身影。
一、KAL的timerKAL timer是非常底层的timer,它的实现是直接封装MTK的RTOS(nuleus)的timer,实现方式是由HISR,从而这种timer具有很高的优先级,也就是说,当这个timer 超时时,就会触发一个HISR(高级中断 High Level ISR (Interrupt Service Routine)),这个中断会回调注册的回调函数。
所以这种timer 使用时,要比较小心,它的优先级很高,在回调函数运行时,其他事件是得不到处理的。
//创建一个timer,参数是timer的名字kal_timerid kal_create_timer(kal_char* timer_name_ptr); void//设置timer 超时时间, timer_id 是 create 返回值,handler_func_ptr是回调函数,handler_param_ptr 是回调函数返回的参数(一般回调函数都是这么设置,这样很灵活),delay,是超时时间,注意这个参数的单位是ticks 不是ms。
reschedule_time 表示是否循环使用timer,0 表示 timer 超时一次就停止,1 表示自动循环启动timer。
kal_set_timer(kal_timerid timer_id, kal_timer_func_ptrhandler_func_ptr, void* handler_param_ptr, kal_uint32 delay, kal_uint32 reschedule_time);二、stack timer这种timer 与 KAL timer 最大的区别是:stack timer 超时后,发送一个超时消息到相应task的消息队列,由task的消息队列来处理这个消息,而不像KAL timer,直接在中断状态回调注册函数。
MTK MMI应用入门:1、初始化例程,注册一系列处理函数,比如协议事件处理函数、按键事件处理函数、消息事件处理函数、选中菜单处理函数等等。
2、选中菜单处理函数(Highlight Handler functions)。
即根据用户的定义,选择某菜单时需要执行的函数。
3、完成入口函数(Entry functions)。
即当前应用被其他应用覆盖,其他应用结束后回到当前应用所需要调用的函数。
4、完成退出函数(Exit functions)。
即当前应用被其他应用覆盖时,为保存当前应用的一些现场数据而需要调用的函数。
5、完成业务逻辑,在不同screen之间的进行切换调用。
MMI 采用screen流的方式进行屏幕之间的转换,进入新的screen之前,执行被覆盖screen 的exit函数,并将相关信息存入历史记录,然后进入新的screen, 从新的screen退出后从history数据库取出上一screen的信息,进入其entry函数。
以下代码片段的API都是系统提供的,可在头文件中找到其原形。
初始化函数代码片断://以下两个API参考eventGprot.hV oid MMSInitialization(void){//设事件处理函数如下闹钟超时处理时间SetProtocolEventHandler(AlmExpiryHandler, MSG_ID_MMI_EQ_ALARM_IND);//设置Highlight Handler函数当点mms菜单后调用相应函数HighlightMMSHandler SetHiliteHandler (MESSAGES_MENU_MMS_MENUID, HighlightMMSHandler);}入口函数代码片断:// 本例为进入短信主菜单的处理函数相关接口函数可在对应的头文件中查找void EntrySMSMainMenuList (void){U8* guiBuffer;U16 nStrItemList[MAX_SUB_MENUS];U16 numItems;U16 itemIcons[MAX_SUB_MENUS];U8* popUpList[MAX_SUB_MENUS];U32 menuItemId=-1;U32 menuItemId1=-1;U32 maskingByte=-1;U8** pPopUpList=NULL;//进入入口函数必须首先调用EntryNewScreen, 该函数执行上一屏幕的退出函数,并记录当前屏幕的入口和退出函数EntryNewScreen(SCR_ID_MSG_SMS_MAIN_MENU, mmi_msg_exit_generic, EntrySMSMainMenuList, NULL);//设置当前screen IDSetMessagesCurrScrnID(SCR_ID_MSG_SMS_MAIN_MENU);//获取当前screen 的gui buffer,用于被当前screen被覆盖后存入历史记录guiBuffer = GetCurrGuiBuffer (SCR_ID_MSG_SMS_MAIN_MENU);//设置当前screen的父menu IDSetParentHandler (MESSAGES_MENU_SMS_MENUID);//注册Highlighthandler处理函数RegisterHighlightHandler (ExecuteCurrHiliteHandler);//获取当前菜单子菜单数目numItems = GetNumOfChild (MESSAGES_MENU_SMS_MENUID);//获取子菜单的stringGetSequenceStringIds(MESSAGES_MENU_SMS_MENUID, nStrItemList);//获取子菜单IconGetSequenceImageIds(MESSAGES_MENU_SMS_MENUID, itemIcons);mmi_msg_set_msg_num_hint (msgbox_info.totalinbox, msgbox_info.totaloutbox, msgbox_info.totaldraftbox);ConstructHintsList(MESSAGES_MENU_SMS_MENUID, popUpList);mmi_msg_set_msg_menu_highlight_handler();if (g_msg_cntx.msg_init){pPopUpList = popUpList;}else{pPopUpList = NULL;}menuItemId=GetChildMenuIDIndexByParentMenuID(MESSAGES_MENU_SMS_MENUI D, MESSAGES_MENU_INBOX_MENUID);if(menuItemId!=-1){if(IsResetCSPGroupService(CSP_TELESERVICES_SERVICE_GROUP,CSP_SM_MT)){ResetBit(maskingByte,menuItemId/*1*/);}}menuItemId=GetChildMenuIDIndexByParentMenuID(MESSAGES_MENU_SMS_MENUI D, MESSAGES_MENU_WMESSAGE_MENU_ID);menuItemId1=GetChildMenuIDIndexByParentMenuID(MESSAGES_MENU_SMS_MENU ID, MESSAGES_MENU_OUTBOX_MENUID);if(menuItemId!=-1 && menuItemId1!=-1){if(IsResetCSPGroupService(CSP_TELESERVICES_SERVICE_GROUP,CSP_SM_MO)) {ResetBit(maskingByte, menuItemId/*0*/);ResetBit(maskingByte,menuItemId1/*2*/);}}menuItemId=GetChildMenuIDIndexByParentMenuID(MESSAGES_MENU_SMS_MENUI D, MESSAGES_MENU_CB_MENUID);if(menuItemId!=-1){if(IsResetCSPGroupService(CSP_TELESERVICES_SERVICE_GROUP,CSP_SM_CB)) ResetBit(maskingByte,menuItemId/*6*/);}menuItemId=GetChildMenuIDIndexByParentMenuID(MESSAGES_MENU_SMS_MENUI D, MESSAGES_MENU_VMAIL_MENUID);if(menuItemId!=-1){if(IsResetCSPGroupService(CSP_V ALUE_ADDED_SERVICES_SERVICE_GROUP,CSP_ VPS))ResetBit(maskingByte,menuItemId/*5*/);}MaskStringItems(popUpList,(U8)numItems,maskingByte);MaskItems(itemIcons,(U8)numItems,maskingByte);numItems=MaskItems(nStrItemList,(U8)numItems,maskingByte);MaskHiliteItems(MAIN_MENU_MESSAGES_MENUID, maskingByte);g_msg_cntx.currBoxIndex=0;// show category 函数,将上面准备好的参数传递进去,show当前screen ,show category 系统已经提供了足够多风格的函数选择,可根据需要调用对应的showcategory函数.ShowCategory52Screen (STR_SMS_MENUENTRY, IMG_SMS_ENTRY_SCRN_CAPTION,STR_GLOBAL_OK, IMG_SMS_COMMON_NOIMAGE,STR_GLOBAL_BACK, IMG_SMS_COMMON_NOIMAGE,numItems,nStrItemList, itemIcons,(U8 **) pPopUpList ,0, 0,guiBuffer );//注册右软件处理函数返回键SetRightSoftkeyFunction (GoBackHistory, KEY_EVENT_UP);//同上SetKeyHandler (GoBackHistory, KEY_LEFT_ARROW, KEY_EVENT_DOWN);}退出函数代码片断:退出函数在进入函数的EntryNewScreen中第二个参数被注册,进入当前screen时执行上仪screen的exit函数。
显示文本串的函数原型:void(*gui_print_text)(UI_string_type_text);刷新屏幕/重绘屏幕:gui_BLT_double_buffer(S32 x1,S32 y1,S32 x2,S32 y2); 将屏幕清成空白:clear_screen();设置文本输出的起始位置:gui_move_text_cursor();修改文本颜色:gui_set_text_color();退出上一个程序:EntryNewScreen();全屏幕:entry_full_screen();弹出历史中最后一次显示的屏幕:SetKeyHandler();左键响应函数:SetLeftkeyFunction();高亮函数:SetHiliteHandler();文本绘制函数:gui_print_text();在屏幕上输出一个字符:gui_print_character();输出一个带边框的文本:gui_print_bodered_text();测量一个字符串在屏幕上占多少像素长度和高度:gui_measure_string();整形数据转换成字符串:gui_itoa();设置边框的颜色:gui_set_border_color();图形画点:gui_putpixel();/gdi_draw_point();画线:gui_line();绘制水平直线:gui_draw_horizontal_line();绘制垂直直线:gui_draw_vertical_line();绘制一个矩形:gui_draw_rectangle();绘制一个填充了c颜色的实心矩形:gui_fill_rectangle();在屏幕上绘制一个带边框的填充矩形:gdi_draw_frame_rect();画不同宽度的线:gui_wline();十字纹:gui_cross_hatch_fill_rectangle();百叶窗:gui_hatch_fill_rectangle();十字纹(两种颜色交替):gui_alternate_cross_hatch_fill_rectangle(); 百叶窗(两种颜色交替):gui_alternate_hatch_fill_rectangle();圆角矩形:gdi_draw_round_rect();按钮风格的矩形:gdi_draw_button_rect();带阴影的矩形:gdi_draw_shadow_rect();递进色填充矩形:gdi_draw_gradient_rect();绘制图标:gui_show_image();绘制图像:gdi_image_draw_file();动画:gdi_anim_draw_id();暂停动画播放:gdi_anim_stop();图像排版:gdi_image_get_dimension_id();进入图像裁剪区:gui_push_clip();恢复图像裁剪区:gui_pop_clip();裁剪图像:gui_set_clip();重置图像裁剪区到默认范围:gui_reset_clip();创建层:gdi_layer_create();常规静态图像显示函数如下:gdi_image_draw_id() 资源ID,不缩放gdi_image_draw() 资源Buffer,不缩放gdi_image_draw_file() 文件,不缩放gdi_image_draw_ext() Buffer,不缩放gdi_image_draw_resized_if() 资源ID,可缩放gdi_image_draw_resized() 资源Buffer,可缩放gdi_image_draw_resized_file() 文件,可缩放gdi_image_draw_resized_ext() Buffer,可缩放常用的动画函数如下:gdi_anim_draw_id();资源ID,不缩放gdi_anim_draw_id_once();资源ID,不缩放,只画一次gdi_anim_draw();资源Buffer,不缩放gdi_anim_draw_frames();资源buffer,不缩放,指定开始帧gdi_anim_draw_resized();资源buffer,可缩放gdi_anim_draw_once();资源buffer,不缩放,只画一次gdi_anim_draw_file();文件,不缩放gdi_anim_draw_file_resized();文件,可缩放gdi_anim_draw_file_frames();文件,不缩放,指定开始帧gdi_anim_draw_mem();buffer,不缩放gdi_anim_draw_mem_frames();buffer,不缩放,指定开始帧gdi_anim_draw_mem_resized();buffer,可缩放gdi_anim_draw_mem_once();buffer,不缩放,只画一次创建层:gdi_layer_set_active();获取基础层句柄:gdi_layer_get_base_handle();激活层:gdi_layer_set_active();合并层:gui_BLT_double_buffer();指明哪几个层需要合并:gdi_layer_set_blt_layer();/gdi_layer_blt();将整个层刷成单一颜色:gdi_layer_clear();将某一颜色设为层的通透色:gdi_layer_set_source_key();半透明特效:gdi_layer_set_opacity();释放层:gdi_layer_free();锁屏:gdi_layer_lock_frame_buffer();gdi_layer_unlock_frame_buffer();初始化菜单框架的基本属性:gui_create_fixed_list_menu();设置菜单的高亮项:gui_fixed_list_menu_goto_item();停止菜单项的滚动:gui_fixed_icontext_menuitem_stop_scroll();。
1、域名解析
对于网络编程而言,硬编码IP到客户端,定是下下策,为此,我们需要域名解析功能。
MTK 对此有类似的解决之道,即soc_gethostbyname,下面将它的用法简单叙述如下
soc_gethostbyname( kal_bool is_blocking,//是否为阻塞式调用,手机平台一般不会支持阻塞式调用的
module_type mod_id, //调用该函数的模块id,也即将来接收消息的模块
kal_int32 request_id,//用于区分是那个请求之用,我们自定义的id值,标示不同的应用
const kal_char *domain_name,//域名
kal_uint8 *addr,//ipv4的ip地址,将来也许会有ipv6的
kal_uint8 *addr_len,//数据长度
kal_uint8 access_id,//这个访问控制id,我没有使用给它赋值为0好了
kal_uint32 nwk_account_id //手机gprs帐户id,做过手机的人自然会明白
)//
补充,调用这个函数不需要建立socket,而且是我们建立tcp/ip连接之前,必须完成一个必备步骤
实例代码如下:
typedef void (* mf_funcOnGetHostByName)(mf_u32 hAddr,mf_u32 nAddr);
static mf_funcOnGetHostByName mf_dnsFunc = NULL;
#define MF_DNS_APPID 1
static void MF_dns_event(void * inMsg)
{
app_soc_get_host_by_name_ind_struct *dns_ind;
if( inMsg )
{
dns_ind = (app_soc_get_host_by_name_ind_struct*) inMsg;
if (dns_ind->result == KAL_TRUE)
{
mf_u32 ipAddr = 0;
switch (dns_ind->request_id)
{
case MF_DNS_APPID:
ClearProtocolEventHandler(MSG_ID_APP_SOC_GET_HOST_BY_NAME_IND);
kal_prompt_trace(MOD_ENG,"MF_getHostByName ip: %d, %d, %d, %d", dns_ind->addr[0], dns_ind->addr[1], dns_ind->addr[2], dns_ind->addr[3]);
MF_memcpy(&ipAddr, dns_ind->addr,dns_ind->addr_len);
if( mf_dnsFunc )
mf_dnsFunc(MF_ntohl((mf_u32)ipAddr),ipAddr);
mf_dnsFunc = NULL;
break;
}
}
}
else if( mf_dnsFunc )
{
mf_dnsFunc(0,0);
}
}
mf_bool MF_getHostByName(mf_s8 * server_domain,mf_u32 * hAddr,mf_u32 * nAddr, mf_funcOnGetHostByName func)
{
kal_int8 ret = MF_FALSE;
static kal_uint8 addr_len=0;
kal_uint32 nwk_account_id = mf_skt_account;
static kal_int16 sDNSHandle = MF_DNS_APPID;
static kal_uint32 ipAddr;
mf_dnsFunc = func;
ret = soc_gethostbyname(KAL_FALSE,
MOD_MMI,
(kal_int32)sDNSHandle,
(const kal_char *)server_domain,
(kal_uint8*)&ipAddr,
(kal_uint8*)&addr_len,
(kal_uint8)0,
nwk_account_id);
if (ret == SOC_SUCCESS)
{
kal_uint8 *ptr;
ptr = (kal_uint8*)&ipAddr;
kal_prompt_trace(MOD_ENG,"MF_getHostByName ip: %d, %d, %d, %d", ptr[0], ptr[1], ptr[2], ptr[3]);
if(hAddr)
*hAddr = MF_ntohl((mf_u32)ipAddr);
if(nAddr)
*nAddr = (mf_u32)ipAddr;
return MF_TRUE;
}
else if(ret == SOC_WOULDBLOCK)
{
SetProtocolEventHandler(MF_dns_event, MSG_ID_APP_SOC_GET_HOST_BY_NAME_IND);
}
kal_prompt_trace(MOD_ENG," MF_getHostByName , ret %d", ret);
return ret;
}
2、定制窗口的使用
一般我们创建mtk应用的时候,多多少少会用到Screen,而我们可以使用MTK自带的categories screen,这些封装好的函数,会完成两件重要的事情
第一是绘制我们自己创建的Screen,第二是检测该类型窗口的事件,当然MTK允许你设置一些事件的处理函数(也即钩子函数,Handler)。
我们可以
在程序创建时调用EntryNewScreen,然后再调用ShowListCategoryScreen,绘制列表框窗口,并注册自己的highlight handler,当然也可,更进一步
即我们可以在这个screen上再绘制别的类型的窗口,比如ShowCategory74Screen,唯一需要注意的是,你需要把自己注册的钩子函数注销(干净的做法);
并且调用ExitListCategoryScreen(),来停止绘制列表框界面,再调用ShowCategory74Screen 开始绘制文本框。
嘿嘿,这个方法很爽的。
不过,有一点
需要注意,就是绘图很慢,显示下一个窗口需要延时显示,即调用ExitListCategoryScreen之后,延时一段时间后再调用ShowCategory74Screen,这样才
不会有“重影”。
补充:需要注意的是新窗口的建立撤销方法,我以实例说明,
static void MF_Scr_Exit(void)
{
MF_Exit_LastCategoriesScreen();
//if(new_scr_id == GetActiveScreenId())
// GoBackHistory();
//else
DeleteScreenIfPresent(new_scr_id);
if ( exit_func )
exit_func();
}
static void MF_Scr_Enter(void)
{
EntryNewScreen(new_scr_id, MF_Scr_Exit, MF_Scr_Enter, NULL);
if( enter_func )
enter_func();
}
EntryNewScreen的第3个参数就是screen的入口函数,必须设置成MF_Scr_Enter本身,否则,什么效果都不会出来,这也是够变态的,至于其原因,我不愿详述。