嵌入式Linux中基于Qt/Embeded觸摸屏驅(qū)動的設(shè)計
由前面鼠標(biāo)設(shè)備驅(qū)動類的派生結(jié)構(gòu)可知,添加驅(qū) 動接口先要通過調(diào)用QmouseDriverFactory或QmouseDriverPlugin 類根據(jù)相應(yīng)的設(shè)備名生成相對應(yīng)的 QWSCustomMouseHandler 對象,這些具體的設(shè)備驅(qū)動 接口類都是由 QWSMouseHandler 類派生出來的,都 繼承了 QWSMouseHandler 類。然后再由系統(tǒng)調(diào)用QWSCustomMouseHandler:: readMouseData (),獲取到的觸摸屏定位和狀態(tài)信息都直接送到鼠標(biāo)設(shè)備驅(qū)動類的抽象層 QWSMouseHandler 類,Qt/Embedded 通過 QWSMouseHandler 類來實現(xiàn)對鼠標(biāo)設(shè)備的操作。
可以通過兩種方式添加設(shè)備驅(qū)動接口類,一種是 通過調(diào)用 QmouseDriverFactory 生成相應(yīng)的 QWSCustomMouseHandler,一種是由 QmouseDriverPlugin 添 加生成相應(yīng)的 QWSCustomMouseHandler。我們采用第 一種方案,在原有的接口 qwsmouselinuxtp_qws.cpp 上 進(jìn)行修改,以適合新的觸摸屏設(shè)備驅(qū)動接口。
首先,我們在 qwsmouselinuxtp_qws.cpp 修改,先 把 TS_EVENT 的結(jié)構(gòu)改為相應(yīng)設(shè)備的數(shù)據(jù)結(jié)構(gòu),再把 QWSLinuxTPMouseHandlerPrivate 函數(shù)中打開的設(shè)備 文件節(jié)點由/dev/ts 改為自己的設(shè)備文件/dev/ttyS1。然 后修改 readMouseData()函數(shù),按自己的數(shù)據(jù)結(jié)構(gòu) 讀取設(shè)備文件,傳遞給 QPoint 類對鼠標(biāo)進(jìn)行定位或轉(zhuǎn) 換為鼠標(biāo)按鍵狀態(tài)。這個函數(shù)的操作可以參照windows 下的鼠標(biāo)驅(qū)動源代碼。
其實這樣修改以后,已經(jīng)能正常使用觸摸屏設(shè)備 了,但是為了在該系統(tǒng)平臺上同時使用鼠標(biāo)和觸摸屏 操作還必須完成兩個步驟:一個是要正確的設(shè)置QWS_ MOUSE_PROTO 環(huán)境變量,閱讀 qwindowsystem_ qws.cpp 中 QWSServer:: openMouse () 函數(shù)可知,該環(huán) 境變量可同時設(shè)置多個設(shè)備Driver> [: Device>],多個設(shè)備之間以空格隔開,由此可設(shè)置 QWS_MOUSE_PROTO=Auto LinuxTP, Qt/Embedded 通過該環(huán)境變量生成相應(yīng)的鼠標(biāo)和觸摸屏驅(qū)動接口,對設(shè)備進(jìn)行操作。然后再對Qt/Embedded的鼠標(biāo)驅(qū)動接口類的源代碼進(jìn)行修改。由于觸摸屏是采用了系統(tǒng)的串口,而Qt/Embedded 自動搜索鼠標(biāo)接口時發(fā)現(xiàn)串口正在工作中,就會把它當(dāng)作一個鼠標(biāo)設(shè)備進(jìn)行操作,這就發(fā)生了設(shè)備沖突。因此,我們要在 qmousepc_qws.cpp 文件中將串口鼠標(biāo)的子驅(qū)動去掉,找到函數(shù) QWSPcMouseHandlerPrivate:: openDevices () 中的代碼如下,把它注釋掉就行了。
else if (driver==Microsoft) {
QString dev=device.isEmpty()? QString(/dev/ttyS0) : device;
fd = open ( dev.latin1 (), O_RDWR | O_NDELAY );
if ( fd >= 0 )
sub[nsub++] = newQWSPcMouseSubHandler_ms(fd);
} else if (driver==MouseSystems){
QStringdev=device.isEmpty()?QString(/dev/ttyS0). : device;
fd = open ( dev.latin1 (), O_RDWR | O_NDELAY );
if ( fd >= 0 ) sub[nsub++] = new QWSPcMouseSubHandler_mous esystems (fd);
}
關(guān)于觸摸屏的校準(zhǔn),閱讀 qwsmouselinuxtp_qws.h 文件(代碼如下),可知在QWSMouseLinuxTPHandler 中已經(jīng)實現(xiàn)了坐標(biāo)的校準(zhǔn),一般直接讀取坐標(biāo)的位置 和狀態(tài)即可。
class QWSLinuxTPMouseHandler:
public QWSCalibratedMouseHandler
{
};
最后只需要在配置 Qt/Embedded 的安裝configure 加入選項-qt-mouse-linuxtp>,重新編譯,該 Qt/Embedded平臺上的應(yīng)用程序即能夠按照定制的要求提供對觸摸屏的支持。
4、 結(jié)束語
本方案與 Qt 下普通鼠標(biāo)驅(qū)動使用一致的框架,設(shè)計簡潔,條理清楚。已經(jīng)成功的運用于電能質(zhì)量監(jiān)測儀平臺,并且運行穩(wěn)定,定位準(zhǔn)確,反應(yīng)靈敏。友好的 GUI 界面和便捷的人機(jī)接口,使電能質(zhì)量檢測儀更具亮點。同時,開放源代碼的優(yōu)勢在此方案中得到充分的體現(xiàn),通過大量地閱讀源代碼,可以充分的理解軟件工作機(jī)制并按用戶的要求進(jìn)行定制,做出真正適合用戶的產(chǎn)品。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)linux相關(guān)文章:linux教程
評論