淺析 Qt Embedded 鍵盤驅動分析 (下)
Qt Embedded 鍵盤驅動分析是我們所要介紹的內容。我們接著上文繼續介紹, 淺析 Qt Embedded 鍵盤驅動分析 (上) 上文我們介紹了下面這兩個代碼文件中載入鍵盤驅動插件的流程。
讀取環境變量,載入相應的鍵盤驅動插件: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要看鍵盤的驅動。
這些問題都是文章中沒有講到的問題,但相信通過大家的聰明才智一定可以解答。
小結:淺析 Qt Embedded 鍵盤驅動分析 (下)的內容介紹完了,希望本文能幫你解決問題。