云南公投董事长级别:QtEmbedded键盘驱动分析(下篇)

来源:百度文库 编辑:偶看新闻 时间:2024/05/09 03:35:37

QtEmbedded键盘驱动分析(下篇)

上文我们介绍了下面这两个代码文件中载入键盘驱动插件的流程。

读取环境变量, 载入相应的键盘驱动插件:src/gui/embedded/qwindowsystem_qws.cpp
创建键盘处理函数类的实例:src/gui/embedded/qkbddriverfactory_qws.cpp

但光说流程没有办法解释大多数人内心的疑问, 键盘驱动插件究竟是怎么工作的呢? 怎么才能让它来响应板子上的按键消息呢?这些疑问需要分析一个完整的键盘处理插件才能回答, 下面我们就来看看最基本的pc101这个键盘插件是怎么实现的吧。首先,说到插件, 先要实现一个插件的框架, 这个框架的代码要遵循Qt中的插件规范,还要符合键盘驱动插件的特点。 听起来很难? 呵呵,其实非常简单, 只有两个函数需要自己实现。

涉及的代码:

键盘plugin框架:src/plugins/kbddrivers/usb/main.cpp
键盘driver handler的实现:src/gui/embedded/qkbdusb_qws.cpp

实现插件框架

//////////main.cpp////////////////////////////////class QUsbKbdDriver : public QKbdDriverPlugin{
public:QUsbKbdDriver();QStringList keys() const;    QWSKeyboardHandler* create(const QString &driver, const QString &device);};

需要实现的函数已经用蓝色字体标示出来了。 通过阅读main.cpp的代码我们发现,这两个函数实在是太简单了, 简直不值一提, 都是最“标准”的实现方式,完全不用动脑子。 keys就是返回当前driver插件的键值, 只要不和其他插件键值冲突就行。 create返回你实现的QWSKeyboardHandler派生类的实例。

实现键盘处理实例

//////////qkbdusb_qws.h/////////////class QWSUsbKeyboardHandler : public QWSPC101KeyboardHandler{public:QWSUsbKeyboardHandler(const QString&);virtual ~QWSUsbKeyboardHandler();private:QWSUsbKbPrivate *d;};

从代码上来看, 这个Handler的类除了必须从QWSKeyboardHandler基类来派生之外,没有什么特别的要求。 但它对应的cpp文件其实实现了不少的功能, 篇幅关系不能把整个代码贴出来,特此总结一个一般的keyboard driver plugin流程,如下:

1、打开键盘设备并初始化 — 一般情况下是调用open
2、监控键盘事件 — 一般用QSocketNotifier去监控键盘fd
3、发生键盘事件时读取键盘事件信息, 如按下、抬起等 — 一般是调用read
4、获得键盘事件信息后, 将键值、按下等信息翻译成Qt内部键盘事件的格式,并通过调用processKeyEvent将事件分发出去。
5、析构函数别忘了关闭设备

90%以上的Keyboard Driver Handler会遵循这样的流程去处理键盘, 如果我们要写自己的插件,肯定这样写也没错。 具体的代码可能还需要看看例子, 请大家阅读qkbdusb_qws.cpp然后回答下面几个问题,以验证自己对这部分是否弄清楚了:

打开设备是不是一定要调用open函数? 这是由什么决定的?
A: 不一定, 但多数字符设备驱动会提供open方法打开设备。 当然是由设备驱动的实现来决定的。

怎样用QSocketNotifier去监控fd?
A: 文档里找答案, 代码里找例子。 关于SocketNotifier我有一点补充: 有人问它的SN在键盘按下时不会发出activated信号, 可能是什么原因? 这个问题我所知道的有两种可能性, 一是设备名字搞错了, 打开的不是键盘设备; 二是设备驱动实现的有些问题导致SN不能正常工作, 记得以前在哪里看到过SN依赖底层提供的poll函数工作, 如果设备驱动没有实现该函数或者实现的不对就会造成SN工作不正常了, 出现问题的话尝试从这个角度去debug看看。

读取键盘事件一定用read函数吗? 还有没有其他可能?
A: 不一定, 见过用ioctl的, 好像还比较常见。 取决于键盘驱动的实现。

该如何定义读取键盘事件使用的数据结构呢?
A: of course要看键盘的驱动。

这些问题都是文章中没有讲到的问题,但相信通过大家的聪明才智一定可以解答。如果有不明白的可以blog或bbs留言~