微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式中基于Qt/Embedded的键盘接口设计

嵌入式中基于Qt/Embedded的键盘接口设计

时间:02-16 来源:互联网 点击:

套接字与客户端进行通信。客户端从服务器接收事件,这些事件通过重新实现QApplication的qwsEvent-Filter()函数可以被直接检索访问。

客户端相互之间(和服务器)通过QCopChannel类通信。QCOP用于在多个通道间传送信息,是一个多对多的通信协议。每个通道用名字作为识别 ID,任何一个想要和它通信的通道都能监听它。QCOP协议既允许在相同的地址空间内的客户端之间进行通信,也允许在不同的进程的客户端之间进行通信。

3.3 字符输入层

如图5所示,当一个服务器应用程序开始运行时使用Qt的插件系统加载键盘驱动,驱动是一个QWSKeyboardHandler类的实例。


键盘驱动从设备接收键盘事件,并把事件封装成一个QWSEvent类的实例,然后把这个类传送给服务器。定制键盘可以通过子类QWSKeybo- ardHandler类创建一个键盘驱动插件来实现。默认的QKbdDriverFactory类将自动检测到这个插件然后把驱动加载到正在运行的服务器应用中。

4 键盘驱动插件的实现

本文通过Qt的插件系统实现了矩阵键盘的接口驱动。插件是一种遵循一定规范的应用程序接口编写出来的程序。在现代计算机语言中,应用环境复杂多变,常常要面临着适应这样那样的未知需求的挑战,为了使程序设计语言具有良好的可扩展性,使之能够适应复杂的应用环境,同时也出于降低设计复杂性的考虑,采用插件机制是一个很不错的方法。通过采用插件系统,把扩展功能从框架中剥离出来,可以降低框架的复杂度,让框架更容易实现。扩展功能与框架之间以一种松耦合的方式集成,允许在保持接口不变的情况下,实现彼此的独立变化。

Qt提供了两种插件:一种是高层的插件,用来扩展Qt自身,如自定义数据库驱动、图像格式、文本编解码器、自定义风格等;一种是底层的插件,用来扩展Qt应用程序。

一个键盘插件的实现,通常至少需要两个类:一个是插件封装器类,它实现了插件的通用API函数;另外一个是一个或多个处理器类,每个处理器类都实现了一种用于特殊类型插件的API。通过封装器类才能访问这些处理器类。下面是具体的实现过程:

首先要实现一个自己的MyKeyDriverPlugin类,这个类继承了QKbdDriverPlugin类,需要重新实现QKbdDriverPlugin::keys()函数和QKbdDriverPlugin::create()函数。

keys()函数返回一个键盘插件的键值,这个键值不能和其他的键值相冲突。create()函数返回一个给定键值的QWSKeyboardHandler派生类的实例。

在.cpp文件的最后,必须添加一个下面这样的宏:Q_EXPORT_PLUGIN2(keyboard,MyKeyDriverPlugin)

第一个参数项是目标库名字去除任意扩展符、前缀或者版本号之后的基本名。第二个参数则是插件的类名。

第二个要实现的类是处理类MyKeyboardHandler,这个类需要继承QWSKeyboardHandler类。当键盘驱动捕获到键盘数据时,系统会通过套接字监听键盘信息,并在MykeyboardHandler::readKbdData()中对捕捉到的扫描数据进行处理并封装,然后向服务器端发送键盘事件。

①打开键盘设备并初始化,一般调用open()函数。

②监控键盘设备,调用QScoketNotifier监控键盘设备kbdFd。



③发生键盘事件时读取键盘事件,读取键盘事件后将键值、按下等信息翻译成Qt内部键盘事件的格式,并通过调用processKeyEvent将事件分发出去。

5 键盘插件在应用程序中的使用

将键盘插件编译后生成一个libkeyboard.so的动态库,这个动态库的名字是由Q_EXPORT_PLUGIN2宏的第一个参数决定的。派生插件默认存储在标准插件目录下的子目录中,如果它们没有存储在正确的目录下Qt不会找到这些插件,所以要在使用的文件系统中创建Qt的标准插件目录。

要想应用程序在启动的时候能够正确加载键盘插件还要设置嵌入式Linux系统中的环境变量:

QWS_KEYBOARD=MyKeyHandler:/dev/kbd

MyKeyHandler对应着key()函数中的键值,kbd是在/dev文件夹下的键盘设备文件。Qt应用程序开始运行后要根据 QWS_KEYBOARD这个环境变量创建一个MyKeyboardHandler类。窗口部件响应服务器分发的键盘事件还要重新实现如下函数。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top