我的第一个MII应用程序

来源:互联网 发布:opencv用什么编程 编辑:程序博客网 时间:2024/06/05 18:35

郑重声明:此不是技术文章,充其量就算是日记,请不要喷菜鸟!       

      2010年1月11日我从软通跳槽到龙旗控股,具体跳槽原因就不说了。入职的第一天就是简单的走下入职的流程,然后就安排了一个工位。周围没有认识的人所以就一个人看看文档消磨时间。第二天下班前老大问我看文档感觉怎么样,我回答说MTK中有很多库函数不晓得其功能,函数的参数也不晓得他的意义。于是老大就给我布置了一个实践练习的小项目。

       项目的要求是:

                 在模拟器上实现一个计算器功能.

                        1.Tools下面添加一个菜单,菜单名为Caculator.

 

                        2.进入该菜单的窗体后,里面使用的是57inline类型的窗体。

                             关键函数去参阅其他使用ShowCategory57Screen的实现方法。

                             其中包含2Caption,分别显示为“Num1和“Num2

                                  2Singleline inputbox,可分别输入两个数字

                                  1Select 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);
}


字符串转化为数字:

 

原创粉丝点击