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‘\n", 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\n", *pIskbd, key, pState[key]);

    shmdt((void *)pState);

    shmdt((void *)pIskbd);

    return 0;
}

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

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

时间: 2024-10-06 10:59:43

Minigui3.0 自定义遥控输入引擎的相关文章

unity-UIInput自定义限制输入字符

UIInput组件如下图所示 UIInput可以用于创建输入框,它自带6种限制方式,如下图所示 最后一种Alphabet Int Chinese是我自定义的,用于限制输入字母,数字,汉字,比如昵称,就可以使用这种设定 自定义限制输入需要修改UIInput的代码 首先,找到Validation这个属性 1 public enum Validation 2 { 3 None, 4 Integer, 5 Float, 6 Alphanumeric, 7 Username, 8 Name, 9 Alph

WatchOS2.0 自定义表盘元素

WatchOS2.0 自定义表盘元素 北京时间6月9日凌晨1点,苹果在美国旧金山举行了WWDC2015全球开发者大会发布新的WatchOS2.0操作系统,不仅与之前WatchOS1系统结构的改变,还添加许多新的功能.新特性及新UI控件,其中WatchOS2.0新Complications(自定义表盘元素)我认为是WatchOS2.0的亮点,好那么我们下面就来聊一聊这东西. 首先在WatchOS1的时候,只支持简单自定义配置表盘.watchOS2支持自定义表盘的Complication(苹果把表盘

Android4.0 input事件输入流程详解(中间层到应用层)

在Android系统中,类似于键盘按键.触摸屏等事件是由WindowManagerService服务来管理的,然后再以消息的形式来分发给应用程序进行处理.系统启动时,窗口管理服务也会启动,该服务启动过程中,会通过系统输入管理器InputManager来负责监控键盘消息.当某一个Activity激活时,会在该Service下注册一个接收消息的通道,表明可以处理具体的消息,然后当有消息时,InputManager就会分发给当前处于激活状态下的Activity进行处理. InputManager的启动

cocos2d-x3.0 新的物理引擎之详解setCategoryBitmask()、setContactTestBitmask()、setCollisionBitmask()

转载请注明出处:游戏开发实验室http://blog.csdn.net/u010019717/article/details/32942641 我在编写游戏的时候遇到了这个问题,  物理引擎其他的内容还好理解,  就这三个函数就是没找到有人详细的解释一下.  我不知道这个都没弄明白,游戏是怎么做出来的.那我就不吐糟了,      下面的所有内容都是我的个人推断.不知道正不正确.    反正我目前是这么理解的. 我们先来看看这三个函数的定义: /** * A mask that defines w

JSP2.0自定义标签

---| SimpleTag 接口 定义了标签处理类的生命周期方法.doTag() -----| SimpleTagSupport 类 全部实现了SimpleTag接口的方法,因此后面我们只需要继承并重写该类即可. 实现自己的if-.else标签 目标: 1 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 2 3 <c:choose> 4 5 <c:when

NET Runtime version 2.0.50727.42 - 执行引擎错误 或者无法创建应用程序域

server2003操作系统 IIS运行应用程序报错,应用程序事件查看器详细: NET Runtime version 2.0.50727.42 - 执行引擎错误 或者无法创建应用程序域 解决方法:卸载.net2.0,然后重装 借助专门卸载.net2.0的工具net framework 2.0cleanup_tool 卸载完后重启系统,安装.netFramework

PHP 自定义 Smarty 模板引擎类 高洛峰 细说PHP

smarty模板引擎类简单工作原理 利用Smarty 模板引擎类对模板文件中的变量进行编译,编译过程其实就是利用正则表达式翻译成PHP文件.例如 模板文件中{$title} 利用正则表达式找到并替换成  <?php echo $this->vars['title'];?> 自定义 Smarty 模板引擎类 smarty.class.php页面 <?php /*  * 自定义Smarty模板引擎类  */         class Smarty{             priva

在PowerPoint中自定义可输入文本的占位符

日常生活中,当我们设计多媒体课件时,默认的版式其实已经够用了.但是,很多时候,我们需要更加个性一点,所以,我们需要自定义很多东西.本文介绍在PowerPoint中自定义可输入文本的占位符. 一.占位符的概念 占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号. 二.PowerPoint(简称:PPT)简介 ppt,是演示文稿软件.演示文稿中的每一页就叫幻灯片,每张幻灯片都是演示文稿中既相互独立又相互联系的内容.我们这里要做的就是,给每一张幻灯片都加上占位符. 三.在幻灯片母版中加入占位

[Enterprise Library for .NET Framework 2.0]自定义日志路径或日志文件名称

有时候,日志输出的时候会根据时间来分类,譬如"20140821\trace.log",在Enterprise Library中通过工具配置,只能定义日志文件名称,可以通过代码修改FlatFileTraceListenerData实现或Custom Trace Listener方式, 通过代码修改FlatFileTraceListenerData实现代码如下: public static string GetTraceLogPath(string listenersName) { str