⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfw_kbd.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 4 页
字号:


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_KBD            |
| STATE   : code                        ROUTINE : kbdCreate          |
+--------------------------------------------------------------------+

  PURPOSE : create keyboard control

*/

MfwHnd kbdCreate (MfwHnd w, MfwEvt e, MfwCb f)
{
    MfwHdr *hdr = (MfwHdr *) mfwAlloc(sizeof(MfwHdr));
    MfwKbd *kbd = (MfwKbd *) mfwAlloc(sizeof(MfwKbd));

    if(!hdr || !kbd)
        return 0;

    kbd->map = e;
    kbd->key = 0;
    kbd->handler = f;

    hdr->data = kbd;
    hdr->type = MfwTypKbd;

    return mfwInsert(w,hdr);
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_KBD            |
| STATE   : code                        ROUTINE : kbdDelete          |
+--------------------------------------------------------------------+

  PURPOSE : delete keyboard control

*/

MfwRes kbdDelete (MfwHnd h)
{
    MfwRes res;

    if(!h)
        return MfwResIllHnd;

    res = (mfwRemove(h)) ? MfwResOk : MfwResIllHnd;

    mfwFree(((MfwHdr *) h)->data,sizeof(MfwKbd));
    mfwFree(h,sizeof(MfwHdr));

    return res;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_KBD            |
| STATE   : code                        ROUTINE : sigExec            |
+--------------------------------------------------------------------+

  PURPOSE : execute keyboard signal
            if the registered set of keys match the currently
            pressed key, the event handler is called, if the
            registered flags match the current flags according
            to the following table:
            M: Make/Break (key release events wanted)
            L: Long press event (timeout set via kbdTime())
            A: Auto repeat event (timing defined via kbdTime())

                                            M 0 0 0 0 1 1 1 1
            current event flags ---------   L 0 0 0 0 0 0 1 1
                                            A 0 0 0 0 0 1 0 1
                                      M L A .................
                                      0 0 0 . 0 0 0 0 1 0 0 0
                                      0 0 1 . 0 0 0 0 1 1 0 1
            registered                0 1 0 . 0 0 0 0 0 0 1 1
            event       -----------   0 1 1 . 0 0 0 0 0 1 1 1
            flags                     1 0 0 . 1 1 1 1 1 0 0 0
                                      1 0 1 . 1 1 1 1 1 1 0 1
                                      1 1 0 . 1 1 1 1 0 0 1 1
                                      1 1 1 . 1 1 1 1 0 1 1 1

*/

static int sigExec (MfwHdr *curElem, U32 map, U8 key)
{
    MfwKbd *kc;

    while(curElem)
    {
        if(curElem->type == MfwTypKbd)
        {
            kc = curElem->data;
            if(kc->map & map & ~KEY_FLAGS)
            {                           /* keys match               */
                kc->code = key;         /* set current key code     */
                if(map & KEY_MAKE)
                {
                    kc->key |= map;     /* set key in control block */
                }
                else
                {
                    kc->key &= ~map;    /* del key in control block */
                    kc->key &= ~KEY_MAKE; /* del make/break flag    */
                }
                if((KEY_MAKE & ~map & kc->map) ||
                   (KEY_MAKE & map &&
                    ((KEY_LONG & map & kc->map)        ||
                     (!(KEY_LONG & kc->map)
                      && (KEY_AUTO & kc->map & map)) ||
                     (!(KEY_LONG & map)
                      && !(KEY_AUTO & map)
                      && !(KEY_LONG & kc->map))      ||
                     (!(KEY_LONG & map)
                      && (KEY_AUTO & map)
                      && (KEY_AUTO & kc->map)))))
                {
                    if(kc->handler)    /* handler valid            */
                    {
                        // PATCH LE 06.06.00
                        // store current mfw elem
                        current_mfw_elem = curElem;
                        // END PATCH LE 06.06.00
                        if((*(kc->handler))(map,kc))
                            return 1;   /* event consumed           */
                    }
                }
            }
        }
        curElem = curElem->next;
    }

    return 1;// old is "return 0"change zy 10/10 don't sent this things to above level
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_KBD            |
| STATE   : code                        ROUTINE : sigDistribute      |
+--------------------------------------------------------------------+

  PURPOSE : distribute keyboard event

*/

static void sigDistribute (U32 map, U8 key)
{
    int res = 0;

    if(doAlways)
        if(doAlways(map,(void*) -1))
            return;                     /* event consumed           */

    if(mfwSignallingMethod == 0)
    {
        if(mfwFocus)
            res = sigExec(mfwFocus,map,key);
        if(!res && mfwRoot)
            res = sigExec(mfwRoot,map,key);
    }
    else
    {
        MfwHdr *h = mfwFocus;
        if(!h)
            h = mfwRoot;
        while(h)
        {
            if(res = sigExec(h,map,key))
                break;
            if(h == mfwRoot)
                break;
            h = mfwParent(mfwParent(h));
            if(h)
                h = ((MfwWin *)(h->data))->elems;
        }
        if(!res && mfwRoot && h != mfwRoot)
            res = sigExec(mfwRoot,map,key);
    }

    if(doAlways)
        doAlways(map,(void*) res);

    return;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_KBD            |
| STATE   : code                        ROUTINE : kbdSignal          |
+--------------------------------------------------------------------+

  PURPOSE : keyboard event (called by driver/PEI)

*/

void kbdSignal (char make, char key)
{
    U32 map;
    UBYTE temp;
    if(key < 0 || key > KCD_MAX)
        return;
    /*NM, p006a
    temp = dspl_Enable(0);
    NM, p006a end*/
    /*
          if((key != 22)&&(key !=27 )){
              //zym added 10/18
            if(!g_kpdnum){
                g_kpdtim = 1;
                StartSecTime();
            }
            g_kpdnum++;
            MmiTrace("kpd_key_handler");
            MmiTraceInt(g_kpdnum);
            if(g_kpdnum>PRENUMPERSEC*2){
                  return ;
            }
            }
    
    */
    map = 1L << key;
    MmiTrace("zym:kbdSignal");
    MmiTraceInt(key);
    MmiTraceInt(drvpara.hallstatusflag);

    if(key == KCD_F4)
    {
        if(drvpara.hallstatusflag ==1)
        {
            ColorLCD_Init(0);
            r2d_refresh();
            // r2d_check_and_send_event_New(r2d_g_lcd_gc);
            LCD_ON();
            LedLightnessAdjust(16);//zy 08/14
            timStart(gtVibator);
            Backlight_ON();

            /*
  
             //set the GPIO0,1,3 ,hxl add 20020929---------------------------------
              *((volatile UINT16 *)(0xfffef008))&=0xfffe; 
              *((volatile UINT16 *)(0xfffe4804))&=0xfffe;  
  
  
              *((volatile UINT16 *)(0xfffef008))&=0xfffd; 
              *((volatile UINT16 *)(0xfffe4804))&=0xfffd;  
  
              *((volatile UINT16 *)(0xfffef008))&=0xfbff; 
              *((volatile UINT16 *)(0xfffe4804))&=0xfff7;  
  
              //open KBD
              *((volatile UINT16 *)(0xfffe4818))&=0xfffd;
              //open LED
              SPIWrite_ABB_Register(1,24,0x0003);
              //end of hxl add 20020929---------------
              */


        }
        else
        {

            Sleep_Or_Quality(1);
            LCD_OFF();
            Backlight_OFF();
            /*
            //set the GPIO0,1,3 to input mode,for power saving 20020929---------------
             *((volatile UINT16 *)(0xfffef008))&=0xfffd; // GPIO1,功放
             *((volatile UINT16 *)(0xfffe4804))|=0x0002;  
 
             *((volatile UINT16 *)(0xfffef008))&=0xfffe; //GPIO0,串口
             *((volatile UINT16 *)(0xfffe4804))|=0x0001; 
 
             *((volatile UINT16 *)(0xfffef008))&=0xfbff; //GPIO3,串口
             *((volatile UINT16 *)(0xfffe4804))|=0x0008; 
 
             //close KBD
             *((volatile UINT16 *)(0xfffe4818))|=0x0002;
             //close LED
             SPIWrite_ABB_Register(1,24,0x000);
             //end of hxl add for power saving 20020929-------------------------------
             */

        }
        AI_UnmaskIT(2);

        //  	return ;
    }

    if((drvpara.hallstatusflag==0)&&((key != KCD_F4)&&(key != KCD_ABC)))  ///zym modified charging virtual key must send 
        return;//zy 11/25 lock all key when hall is closed


    #if defined (WIN32)
    if(make)
    #else
    //kk    if (!make) //kk only needed for asample board
    if(make)
    #endif
    {
        /* NM, p006b
        old : refresh the LCD for keypress and keyrelease
        new: update only on keypress

        there was a unknown effect (doesnt show the '0')
        so this is the reason to add the 'sigDistribute' in every
        statement.

        NM, p006b end */

        ///	temp = dspl_Enable(0);
        map |= KEY_MAKE;
        curMap = map;
        curKey = key;
        if((key != KCD_ABC)&&(key != KCD_F4))
        {
            if((!MorethanMaxPressKeyNum(3))&&(r2d_g_event_was_sent == 0))
            {
                MMIActionKeyPress();///zym added
                timStart(&timLongH);
                timAuto.time = valAuto;
                /*NM, p007a*/
                if(valAuto)
                    timStart(&timAutoH);
            }
        }
        /*NM, p007a end*/

        /*NM, p006c*/
        sigDistribute(map,key);
        ///  		dspl_Enable(temp); 
        /*NM, p006c end*/
    }
    else
    {
        map &= ~KEY_MAKE;
        curMap = map; //ES!!
        curKey = key; //ES!!
        if((!MorethanMaxPressKeyNum(3))&&(r2d_g_event_was_sent == 0))
        {
            timStop(&timLongH);
            /*NM, p007b*/
            if(valAuto)
                timStop(&timAutoH);
            /*NM, p007b end*/
        }
        /*NM, p006d */
        sigDistribute(map,key);
        /*NM, p006d end */
    }

    /*NM, p006e 
    sigDistribute(map,key); 
    dspl_Enable(temp); 
    NM, p006e end*/


    return;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_KBD            |
| STATE   : code                        ROUTINE : toLong             |
+--------------------------------------------------------------------+

  PURPOSE : long press timeout handler

*/

static int toLong (U32 t, void *h)
{
    curMap |= KEY_LONG;
    sigDistribute(curMap,curKey);

    return 0;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_KBD            |
| STATE   : code                        ROUTINE : toAuto             |
+--------------------------------------------------------------------+

  PURPOSE : auto repeat timeout handler

*/

static int toAuto (U32 t, void *h)
{
    curMap |= KEY_AUTO;
    sigDistribute(curMap,curKey);
    timAuto.time = valRepeat;
    /* NM p007c*/
    if(valRepeat)
        timStart(&timAutoH);
    /* NM p007c end*/
    return 0;
}


/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417)        MODULE  : MFW_KBD            |
| STATE   : code                        ROUTINE : kbdCommand         |
+--------------------------------------------------------------------+

  PURPOSE : handle mfw windows command

*/

static int kbdCommand (U32 cmd, void *h)
{
    switch(cmd)
    {
    case MfwCmdDelete:              /* delete me                */
        if(!h)
            return 0;
        kbdDelete(h);
        return 1;
    default:
        break;
    }

    return 0;
}

int  MorethanMaxPressKeyNum(int num)
{
    MmiTrace("MorethanMaxPressKeyNum");
    MmiTraceInt(g_keypadnum);   
    if(g_keypadnum > num)
        return 1;
    return 0;
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -