zoukankan      html  css  js  c++  java
  • Minigui3.0 自定义遥控输入引擎

    本人最近在从事minigui的开发工作,使用的gui版本为最新的3.0.12,平台环境为海思的HI3515。

    在历经千辛万苦,终于将gui成功的移植到了开发板上,这里不多赘述,没有移植成功的朋友可以点击下面这个链接,按照步骤慢慢来,是可以成功的。

    http://blog.csdn.net/longyue0917/article/details/7882672

    由于我们的设备需要通过遥控器来控制gui界面,所以需要在已有的gui库中,加入对红外遥控的支持。遥控驱动是HI3515开发组建中已经带好的,可以直接拿来使用。

    我们的思路就是,由上层应用程序检测遥控数据的输入(打开设备文件,读取数据),当有按键事件发生时,调用gui中的接口,在gui的接口中更改按键的状态,并通过gui维护的消息队列,上传按键事件到上层应用程序的窗口回调函数中,从而完成按键的操作。

    首先我们找到 src/ial/ 下的ial.c文件,IAL( Input Abstract Layer)即gui的抽象输入层,这里配置了许多组关于不同平台环境的输入接口,这些接口都是gui自带的,有些可以直接拿来使用,但大部分都需要根据实际情况进行适当的修改。我们现在就要对其中一组接口进行修改,达到实现遥控输入的功能。

    我们这里将遥控输入关联成键盘对gui 的输入。

     1 static INPUT inputs [] = 
     2 {
     3 /* General IAL engines ... */
     4 #ifdef _MGIAL_QVFB
     5     {"qvfb", InitQVFBInput, TermQVFBInput},
     6 #endif
     7 #ifdef _MGIAL_JZ4740
     8     {"jz4740", InitJZ4740Input, TermJZ4740Input},
     9 #endif
    10 #ifdef _MGIAL_2440
    11     {"2440", Init2440Input, Term2440Input},
    12 #endif
    13      ...
    14 
    15 /* ... end of general IAL engines */
    16 };

    我们在ial.c中可以看到这个结构体,这里就保存了许多输入引擎对应的输入接口。这些输入引擎可以在/etc/MiniGUI.cfg中进行配置。

    我们找到其中的 “_MGIAL_CONSOLE” 接口,进入其中的函数 “InitNativeInput” 。这个函数就是初始化该输入引擎的函数,这个函数是写在src/ial/native/native.c中的。

        if (strcasecmp(keyboard_engine, "input") == 0
                // XXX: To be compatible with old configure files
                || strcasecmp(keyboard_engine, "event") == 0)
        {
            kbddev = &kbddev_event;
        }
        else if (strcasecmp(keyboard_engine, "tty") == 0)
        {
            kbddev = &kbddev_tty;
        }
    //    add by xyliao
        else if    (strcasecmp(keyboard_engine, "hi3515ir") == 0)
        {
            kbddev = &kbddev_hiir;
        }
        else
        {
            fprintf(stderr, "IAL: [warning] unknown keyboard_engine '%s'
    ", keyboard_engine);
        }

    如上代码,我们在其中加入一组自定义的结构体,结构体中包括了对输入设备的打开,读取,关闭等通用的操作。我们可以仿造kbddev_event和kbddev_tty,在src/ial/native/下添加一个.c文件和.h文件,存放结构体中对应的函数的实现。其实我们并不需要gui在输入引擎中打开设备文件,或者读取数据,这些操作都是在上层应用程序中完成的,所以在接口实现时,我们无需进行打开或读取的实质性的操作。

    native.c中的wait_event,为该输入引擎中检测输入事件的接口。gui底层维护了一个线程,该线程不断的检测是否有鼠标和键盘的事件发生,如果有,则调用输入引擎的抽象接口,来完成:更新键值,获得键值,上报到应用程序等一系列操作。

    下面这个函数,就是应用程序在有按键按下时,调用的gui库接口。这个接口是我们自己添加的,需要在minigui.h中添加声明,否则应用程序无法编译成功。

    int myKeyboardInterface(int key, int is_pressed)
    {
        if(key < 0 || key > NR_KEYS)
            return (-1);
    
        int shmidState = shmget((key_t)1234, sizeof(state), 0666|IPC_CREAT); 
    
        unsigned char *pState = (unsigned char *)shmat(shmidState, 0, 0);
    
        int shmidIs = shmget((key_t)12345, sizeof(int), 0666|IPC_CREAT); 
    
        int *pIskbd = (int *)shmat(shmidIs, 0, 0);
        
    
        *pIskbd = 1;
    
        if (is_pressed)
        {
            pState[key] = 1;
        }
        else 
        {
            pState[key] = 0;
        }
    
        printf("isKbdEvent = %d, state[%d] = %d
    ", *pIskbd, key, pState[key]);
    
        shmdt((void *)pState);
        
        shmdt((void *)pIskbd);
    
        return 0;
    }

    这里用到了共享内存。由于gui库是动态库,mginit进程和应用程序进程对库中的全局变量进行的是拷贝操作,即各自维护一组变量的值,如果不用共享变量,应用程序调用接口,将无法改变mginit中同一变量的值,也无法达到控制的效果。其中pIsKbd为是否有按键按下的标志位,我们正是通过这个标志位,达到通知gui库有按键发生的效果。pState为指向当前按键值表的指针,一般输入引擎最大支持有128个按键的输入设备,按键值表则有128个存储空间,来存放每个按键当前的值,按下即为1,没有按下或松开即为0。

    暂时写到这里,以后再好好整理一下。

  • 相关阅读:
    使用性能监视器找出SQLServer硬件瓶颈
    重启sql server 服务
    优化SQL Server数据库查询方法
    tempdb对SQL Server数据库性能有何影响
    利用动态管理视图提高SQL Server索引效率
    SQL Server 2008 R2数据库镜像部署
    优化数据库的注意事项
    查看 SQL Server 2000 中数据表所占用的磁盘空间
    SQL Server 2005 排查I/O瓶颈
    SQL语句优化的原则
  • 原文地址:https://www.cnblogs.com/xyliao/p/4279106.html
Copyright © 2011-2022 走看看