本人最近在从事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 的输入。

 static INPUT inputs [] =
{
/* General IAL engines ... */
#ifdef _MGIAL_QVFB
{"qvfb", InitQVFBInput, TermQVFBInput},
#endif
#ifdef _MGIAL_JZ4740
{"jz4740", InitJZ4740Input, TermJZ4740Input},
#endif
#ifdef _MGIAL_2440
{"", Init2440Input, Term2440Input},
#endif
... /* ... end of general IAL engines */
};

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

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

    if (strcasecmp(keyboard_engine, "input") ==
// XXX: To be compatible with old configure files
|| strcasecmp(keyboard_engine, "event") == )
{
kbddev = &kbddev_event;
}
else if (strcasecmp(keyboard_engine, "tty") == )
{
kbddev = &kbddev_tty;
}
// add by xyliao
else if (strcasecmp(keyboard_engine, "hi3515ir") == )
{
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 < || key > NR_KEYS)
return (-); int shmidState = shmget((key_t), sizeof(state), |IPC_CREAT); unsigned char *pState = (unsigned char *)shmat(shmidState, , ); int shmidIs = shmget((key_t), sizeof(int), |IPC_CREAT); int *pIskbd = (int *)shmat(shmidIs, , ); *pIskbd = ; if (is_pressed)
{
pState[key] = ;
}
else
{
pState[key] = ;
} printf("isKbdEvent = %d, state[%d] = %d\n", *pIskbd, key, pState[key]); shmdt((void *)pState); shmdt((void *)pIskbd); return ;
}

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

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

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

  1. ubuntu12.4上安装minigui3.0.12

    在ubuntu12.4上安装minigui3.0.12 一下载源文件 移植所需的文件可以从minigui官网下载:http://www.minigui.org/en/download/ 主要文件有: ...

  2. Hadoop MapReduce编程 API入门系列之自定义多种输入格式数据类型和排序多种输出格式(十一)

    推荐 MapReduce分析明星微博数据 http://git.oschina.net/ljc520313/codeexample/tree/master/bigdata/hadoop/mapredu ...

  3. 在ubuntu12.4上安装minigui3.0.12

      在ubuntu12.4上安装minigui3.0.12 一下载源文件 移植所需的文件可以从minigui官网下载:http://www.minigui.org/en/download/ 主要文件有 ...

  4. vue自定义可输入的选择框组件

    vue自定义可输入的选择框组件 props: 属性 说明 类型 默认值 selectDataList 下拉框中的内容 Array 空数组([]) value 输入框中的内容 String 空字符串(& ...

  5. 教你一招:在PowerPoint中自定义可输入文本的占位符

    日常生活中,当我们设计多媒体课件时,默认的版式其实已经够用了.但是,很多时候,我们需要更加个性一点,所以,我们需要自定义很多东西.本文介绍在PowerPoint中自定义可输入文本的占位符. 一.占位符 ...

  6. Spark2.0自定义累加器

    Spark2.0 自定义累加器 在2.0中使用自定义累加器需要继承AccumulatorV2这个抽象类,同时必须对以下6个方法进行实现: 1.reset 方法: 将累加器进行重置; abstract  ...

  7. vue.js2.0 自定义组件初体验

    理解 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能.在有些情况 ...

  8. Settings > Editor > Live Templates 中自定义快速输入

    Settings > Editor > Live Templates 中自定义快速输入

  9. 【SpringBoot】SpringBoot拦截器实战和 Servlet3.0自定义Filter、Listener

    =================6.SpringBoot拦截器实战和 Servlet3.0自定义Filter.Listener ============ 1.深入SpringBoot2.x过滤器Fi ...

随机推荐

  1. [WPF] 为Style 里的button添加鼠标点击响应事件

    一个TabControl, 用的是PagedTabControl style, 在style中有个button, button在style里已经写了click事件,但是现在还需要加上一段功能,就是在响 ...

  2. Xcode 8 控制台输出大量不用的log的问题解决&&NSLog失效的解决

    Product-->Scheme-->editeScheme中:Auguments中Environment Variable中 Scheme中添加环境变量 "OS_ACTIVIT ...

  3. 物料事务处理接口表 MTL_TRANSACTIONS_INTERFACE 账户别名使用 及 提示无效的分配账户字段

    实例: PROCEDURE MAIN(P_ORGANIZATION_ID NUMBER, P_PERIOD_NAME VARCHAR2, XV_STATUS OUT VARCHAR, XV_MESG ...

  4. NSXMLParser自定义的一个xml解析工具

    // // DenglXMLParser.h // #import <Foundation/Foundation.h> @interface DenglXMLParser : NSXMLP ...

  5. bayboy下载安装

    badboy是jmeter工具的好搭档. 好处体现在那里呢? JMeter是纯Java编写的软件功能和性.能测试工具,其录制脚本过于笨拙和复杂. 而Badboy是用C++开发的动态应用测试工具,其拥有 ...

  6. Toast用法

    应用场景:弹出提示信息 主界面: 代码如下: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(sa ...

  7. channel bonding

    一.什么是bondingLinux bonding驱动提供了一个把多个网络接口设备捆绑为单个的网络接口设置来使用,用于网络负载均衡及网络冗余二.bonding应用方向1.网络负载均衡对于bonding ...

  8. Jmeter:相应断言介绍

    Jmeter进行性能测试时,作为对上一个请求返回信息的校验,基本上断言是不可少的,今天主要介绍一下Jmeter的相应断言校验. 相应断言:即对服务器相应信息的校验判断,发送http请求后,对服务器返回 ...

  9. 浅谈position: absolute和position:relative

    一.在此先说一下文档流的概念: 1,文档流定义: 百度百科定义:文档流是文档中可显示对象在排列时所占用的位置. 大多网友的理解:元素的位置由元素在 (X)HTML 中的位置决定.将窗体自上而下分成一行 ...

  10. MySQL命令出现字符错误提示原因

    ERROR 2019 (HY000): Can't initialize character set gb2312 搞了好半天,MySQL都重装了两次,号悲剧... 之前设置了系统编码全都是UTF-8 ...