我的第一个MII应用程序
来源:互联网 发布:opencv用什么编程 编辑:程序博客网 时间:2024/06/05 18:35
郑重声明:此不是技术文章,充其量就算是日记,请不要喷菜鸟!
2010年1月11日我从软通跳槽到龙旗控股,具体跳槽原因就不说了。入职的第一天就是简单的走下入职的流程,然后就安排了一个工位。周围没有认识的人所以就一个人看看文档消磨时间。第二天下班前老大问我看文档感觉怎么样,我回答说MTK中有很多库函数不晓得其功能,函数的参数也不晓得他的意义。于是老大就给我布置了一个实践练习的小项目。
项目的要求是:
在模拟器上实现一个计算器功能.
1.在Tools下面添加一个菜单,菜单名为Caculator.
2.进入该菜单的窗体后,里面使用的是57号inline类型的窗体。
关键函数去参阅其他使用ShowCategory57Screen的实现方法。
其中包含2个Caption,分别显示为“Num1”和“Num2”
2个Singleline inputbox,可分别输入两个数字
1个Select inlinebox,可选择“+”“-”“*”“/”.
数字和运算符都输入后,可通过左键得到运行结果。
右键均为返回.
由于以前一直没有接触过MTK,所以那到需求说明书是也没有什么头绪。没有关系,查看手头的文档,发现正好有关于MTK的资源添加的介绍,虽然讲的很不厚道,缺胳膊少腿的,但是还是有一定的参考价值。然后又用SVN从服务器上checkout一个BASE。不会编译,只好去找同事帮忙解决,最终模拟器起来了。接下来就用sourceinsight来看源码。我一步一步的根据手头的资料添加菜单,但是最终运行的时候模拟器上楞是没有出现CALCULATOR菜单。最终种好放弃手头资料用sourceinsight选取的一个最简单的菜单进行跟踪,依葫芦画瓢,最终完成了菜单的设计。接下来就是57号窗体了。用sourceinsight搜了一下ShowCategory57Screen,有一百多处。选取一处一看就傻眼了, 57号窗体只是用来最后显示的,但是前面处理的部分代码却少说有200行,而且很多是全局变量和调用的函数,专研了半天还是没有头绪,最后只好借助模拟器一步一步的了解57号窗体中各个参数的意义。我先是在一个事件中直接调用57号窗体,然后运行模拟器看现象,在一个个的改各个参数,逐渐把57号窗体给吃透了。熟悉了57号窗,现在再来看Singleline inputbox和Select inlinebox就简单多了。最终完成这个小的实践项目,但是还是有不少BUG没解决,不过老大说good!可以给我做项目了,所以没没见去完善它了。算了一下,从开始到结束,耗时6天。
下面是我写的实现计算器的代码:
首先是字串的添加:
ADD_APPLICATION_STRING2(STR_CALCULATOR_NUM1_SETTING,"NUM1"," NUM1");
ADD_APPLICATION_STRING2(STR_CALCULATOR_NUM2_SETTING,"NUM2"," NUM2");
ADD_APPLICATION_STRING2(STR_ID_CALCULATOR_ADD,"+"," sign:+");
ADD_APPLICATION_STRING2(STR_ID_CALCULATOR_SUB,"-"," sign:-");
ADD_APPLICATION_STRING2(STR_ID_CALCULATOR_MUL,"*"," sign:*");
ADD_APPLICATION_STRING2(STR_ID_CALCULATOR_DIV,"/","sign:+ /");
ADD_APPLICATION_STRING2(STR_CALCULATOR_SETTING,"CALCULATOR"," CALCULATOR");
菜单的添加:
首先要在上级菜单中添加一个MEMU_SETTING_CALCULATOR的子菜单:
ADD_APPLICATION_MENUITEM2((MENU_SETTING_LONG_TIME_MODE,MENU_SETTING_SAVE_POWER_MODE,3, MEMU_SETTING_ACTIVE_LONG_TIME_MODE, MEMU_SETTING_HELP_LONG_TIME_MODE, MEMU_SETTING_CALCULATOR, SHOW, SHORTCUTABLE,DISP_LIST,STR_LONG_TIME_MODE_SETTING,0));
然后添加calculator菜单:
ADD_APPLICATION_MENUITEM2((MEMU_SETTING_CALCULATOR,MENU_SETTING_LONG_TIME_MODE,0, SHOW, SHORTCUTABLE,DISP_LIST,STR_CALCULATOR_SETTING,0));
最后添加事件
SetHiliteHandler(MEMU_SETTING_CALCULATOR,HighlightCalculator);
HighlightCalculator就是在菜单项中选中calculator按下OK后所调用的函数。
void HighlightCalculatorLongTimeMode(void)
{
/*1 更改左软件的图标和字串*/
ChangeLeftSoftkey(STR_GLOBAL_OK, 0);
/*2 更改右软件的图标和字串*/
ChangeRightSoftkey(STR_GLOBAL_BACK,0);
/*3 按下左软键调用的函数*/
SetLeftSoftkeyFunction(EntryCalculator,KEY_EVENT_UP);
/*4 按下右软键调用的函数*/
SetRightSoftkeyFunction(GoBackHistory,KEY_EVENT_UP);
SetKeyHandler(GoBackHistory,KEY_LEFT_ARROW,KEY_EVENT_DOWN);
SetKeyHandler(EntryCalculator,KEY_RIGHT_ARROW,KEY_EVENT_DOWN);
}
void EntryCalculator(void)
{
8 *guiBuffer; /* Buffer holding history data */
U8 *inputBuffer;
U16 inputBufferSize; ; /* added for inline edit history */
EntryNewScreen(SCR_ID_CALCULATOR, NULL, EntryCalculator, NULL);
guiBuffer = GetCurrGuiBuffer(SCR_ID_CALCULATOR);
InitializeCategory57Screen();
CalculatorFillInilineStruct(); //输入处理函数
RegisterHighlightHandler(HighlightCalculatorInputItem);
guiBuffer = GetCurrGuiBuffer(SCR_ID_CALCULATOR);
inputBuffer = GetCurrNInputBuffer(SCR_ID_CALCULATOR, &inputBufferSize);
if (inputBuffer != NULL) /* added for inline edit history */
{
SetCategory57Data(wgui_inline_items, 5, inputBuffer); /* sets the data */
}
DisableCategory57ScreenDone();
ShowCategory57Screen(
STR_CALCULATOR_LONG_TIME_MODE_SETTING,
0,
STR_GLOBAL_OK,
IMG_GLOBAL_OK,
STR_GLOBAL_BACK,
IMG_GLOBAL_BACK,
5,
NULL,
wgui_inline_items,
0,
guiBuffer);
/1 Change left soft key icon and label */
hangeLeftSoftkey(STR_GLOBAL_OK, 0);
/2 Change right soft key icon and label */
hangeRightSoftkey(STR_GLOBAL_BACK,0);
/3 Register function for left soft key */
etLeftSoftkeyFunction(EntryCalculatorResult,KEY_EVENT_UP);
/*4 Register function for right soft key */
SetRightSoftkeyFunction(GoBackHistory,KEY_EVENT_UP);
SetKeyHandler(EntryCalculatorResult, KEY_LEFT_ARROW,KEY_EVENT_DOWN);
SetCategory57RightSoftkeyFunctions(EntryCalculatorResult, GoBackHistory);
}
57号窗体参数定义:
S. No Data Type Input/Output Description
1 U16 Input Title for the screen
2 U16 Input Icon shown with the title
3 U16 Input Left softkey label
4 U16 Input Icon for the left softkey
5 U16 Input Right softkey label
6 U16 Input Icon for the right softkey
7 S32 Input Number of Items
8 U16* Input List of icons
9 InlineItem Input *List of text items
10 S32 Input Highlighted item
11 U8* Input History Buffer
输入处理函数:
void CalculatorFillInilineStruct(void)
{
SetInlineItemActivation(&wgui_inline_items[0], INLINE_ITEM_ACTIVATE_WITHOUT_KEY_EVENT, 0);
SetInlineItemCaption(&wgui_inline_items[0], (U8*) GetString (STR_CALCULATOR_NUM1_SETTING));
SetInlineItemActivation(&wgui_inline_items[1], INLINE_ITEM_ACTIVATE_WITHOUT_KEY_EVENT, 0);
SetInlineItemTextEdit(
&wgui_inline_items[1],
(U8*) g_calculator_cntx.RateBuff1,
(5 + 1),
IMM_INPUT_TYPE_DECIMAL_NUMERIC);
EnableInlineItemBoundary(&wgui_inline_items[1]);
RightJustifyInlineItem(&wgui_inline_items[1]);
set_leading_zero(FALSE);
SetInlineItemActivation(&wgui_inline_items[3], INLINE_ITEM_ACTIVATE_WITHOUT_KEY_EVENT, 0);
SetInlineItemCaption(&wgui_inline_items[3], (U8*) GetString (STR_CALCULATOR_NUM2_LONG_TIME_MODE_SETTING));
SetInlineItemActivation(&wgui_inline_items[4], INLINE_ITEM_ACTIVATE_WITHOUT_KEY_EVENT, 0);
SetInlineItemTextEdit(
&wgui_inline_items[4],
(U8*) g_calculator_cntx.RateBuff2,
6
IMM_INPUT_TYPE_DECIMAL_NUMERIC);
EnableInlineItemBoundary(&wgui_inline_items[4]);
RightJustifyInlineItem(&wgui_inline_items[4]);
set_leading_zero(FALSE);
(STR_CALCULATOR_SIGN_LONG_TIME_MODE_SETTING));
SetInlineItemActivation(&wgui_inline_items[2], INLINE_ITEM_ACTIVATE_WITHOUT_KEY_EVENT, 0);
g_calculator_cntx.UnitListLg[0] = GetString(STR_ID_CALCULATOR_ADD);
g_calculator_cntx.UnitListLg[1] = GetString(STR_ID_CALCULATOR_SUB);
g_alculator_cntx.UnitListLg[2] = GetString(STR_ID_CALCULATOR_MUL);
g_calculator_cntx.UnitListLg[3] = GetString(STR_ID_CALCULATOR_DIV);
g_calculator_cntx.CurrInlineSelectUnit=0;
SetInlineItemSelect(
&wgui_inline_items[2],
4,
(U8 **) g_calculator_cntx.UnitListLg,
&g_calculator_cntx.CurrInlineSelectUnit);
}
U32 string_to_num(U8 * Str_num )
{
int sum=0;
//printfstring(Str_num);
while(*Str_num!='/0')
{
sum=(*Str_num-'0')+sum*10;
Str_num++;
}
return sum;
}
void EntryLongTimeModeCalculatorResult(void)
{
#if 0
EntryNewScreen(SCR_ID_LONG_TIME_MODE_CALCULATOR_ERROR, NULL, EntryLongTimeModeCalculatorError, NULL);
entry_full_screen();
clear_screen();
gui_move_text_cursor(50,100);
gui_set_text_color(UI_COLOR_BLACK);
gui_print_text(L"ERROR!");
ChangeRightSoftkey(STR_GLOBAL_BACK, IMG_GLOBAL_BACK);
gui_BLT_double_buffer(0,0,UI_device_width-1,UI_device_height-1);
SetRightSoftkeyFunction(GoBackHistory,KEY_EVENT_UP);
#endif
U8 *sign=(char *)malloc(10);
int result;
U32 Valnuma;
U32 Valnumb;
U32 Valsign;
U8 strresult[10];
U8 stringresult[10];
mmi_ucs2_to_asc(numa,g_calculator_cntx.RateBuff1); //将ucs2码转换为asc码,从窗体读到buff里的是ucs码程序
mmi_ucs2_to_asc(numb,g_calculator_cntx.RateBuff2); //内部处理的是asc码,我刚开始就吃了这个亏的。
mmi_ucs2_to_asc(sign,g_calculator_cntx.UnitListLg[g_calculator_cntx.CurrInlineSelectUnit]);
Valnuma=string_to_num((U8*)(numa));
Valnumb=string_to_num((U8*)(numb));
switch(*sign)
{
case '+' : result=(U32)(Valnuma+Valnumb);break;
case '-' : result=(U32)(Valnuma-Valnumb);break;
case '*' : result=(U32)(Valnuma*Valnumb);break;
case '/' : if(Valnumb!=0)
{
result=(U32)(Valnuma/Valnumb);break;
}
default :EntryLongTimeModeCalculatorError();
return;
}
sprintf(strresult, "%02d", result);
mmi_asc_to_ucs2(stringresult, strresult);
EntryNewScreen(SCR_ID_CALCULATOR_RESULT, NULL, EntryCalculatorResult, NULL);
entry_full_screen();
clear_screen();
gui_move_text_cursor(60,100);
gui_set_text_color(UI_COLOR_BLACK);
gui_print_text((UI_string_type)stringresult);
gui_move_text_cursor(60,0);
gui_set_text_color(UI_COLOR_BLACK);
gui_print_text(L"RESULT!");
ChangeRightSoftkey(STR_GLOBAL_BACK, 0);
gui_BLT_double_buffer(0,0,UI_device_width-1,UI_device_height-1);
SetRightSoftkeyFunction(GoBackHistory,KEY_EVENT_UP);
}
计算器完成情况:
完成了菜单,57号窗体的设计,并基本完成了对无符号整型数的加减乘除运算及输入错误及除数为0情况的处理。
存在问题:
计算完成后退出计算器再次进入后发现上次计算的数值NUM1,NUM2仍然存在。
数据输入的单行框中后腰将光标移到其他ITEM上才能将数据读到BUFF里面。
由于提示上传图片功能已经被关闭,所以暂时就不上传图片了。
下面是CalculatorFillInilineStruct和EntryCalculator会调用到的部分函数及变量申明:
typedef struct
{
S32 CurrInlineSelectUnit;
U8 CurrSelectedItem;
U8 CurrHiliteUnitType;
S8 *UnitListLg[11]; /* inline selector items */
U8 InputBuf1[16 + 2];
S8 RateBuff1[10];
S8 RateBuff2[10];
S8 RateBuff3[10];
} calculator_context_struct;
calculator_context_struct g_calculator_cntx;
输入错误和除数为0的处理:
void EntryCalculatorError(void)
{
S32 x,y,w,h;
char *p="ERROR";
gui_measure_string((UI_string_type)p,&w,&h);
x=(UI_device_width-w)/2;
y=(UI_device_height-h)/2;
EntryNewScreen(SCR_ID_CALCULATOR_ERROR, NULL, EntryCalculatorError, NULL);
entry_full_screen();
clear_screen();
gui_move_text_cursor(x,y);
gui_set_text_color(UI_COLOR_BLACK);
gui_print_text(L"ERROR!");
ChangeRightSoftkey(STR_GLOBAL_BACK, IMG_GLOBAL_BACK);
gui_BLT_double_buffer(0,0,UI_device_width-1,UI_device_height-1);
SetRightSoftkeyFunction(GoBackHistory,KEY_EVENT_UP);
}
字符串转化为数字:
- 我的第一个MII应用程序
- 我的第一个C#应用程序
- 我的第一个GNURadio应用程序…
- 我的第一个Java应用程序
- 我的第一个Servlet应用程序
- 我的第一个GNURadio应用程序心得
- 我的第一个Android应用程序HelloWorld
- 我的第一个Android应用程序HelloWorld
- 我的第一个Android应用程序HelloWorld
- 我的第一个完整的Windows应用程序
- 我的第一个实用的java应用程序
- 我的第一个iOS应用程序: 土豪晒单
- 我的第一个Android应用程序(Hello world)
- 我的第一个iphone应用程序真机调试
- 我的第一个
- 我的第一个
- 我的 C++ 学习历程 之三 第一个MFC应用程序
- 我的 C++ 学习历程 之三 第一个MFC应用程序(2)
- 个人网页
- ORACLE常用命令
- PGA管理
- js操作html的select元素
- RMAN常用命令
- 我的第一个MII应用程序
- 纪念下高盛电面。。
- 捕获排序SQL语句
- 安装P69...Oracle补丁
- SQL_TRACE和10046事件
- SPFILE的备份与恢复
- RMAN备份还原
- 数据库事务处理
- 导入导出