


下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
qwsmouse_qws.cpp在linuette/host/qt/embedded/qt2.3.1/src/kernel目錄下面
Qt的鼠標(biāo)和觸摸屏驅(qū)動
Qt的鼠標(biāo)和觸摸屏驅(qū)動主要集中在qwsmouse_qws.cpp當(dāng)中.在qt中,觸摸屏作為一種特別的鼠標(biāo),具有和鼠標(biāo)同等的處理方法.
在qt初始化的時候,會輸入一些環(huán)境變量,包括
QWS_KEYBORAD:設(shè)定鍵盤的類型
QWS_MOUSE_PROT設(shè)定鼠標(biāo)的類型和設(shè)備.格式是:
:
protocol包括以下的幾種:MouseMan,IntelliMouse,Microsoft等,
device就是鼠標(biāo)(或者觸摸屏)的設(shè)備文件,一般是/dev/mouse,還可能是/dev/ps2(ps類型的鼠標(biāo)),ttyS*(串口鼠標(biāo)),而對于觸摸屏,則會是/dev/Tpanel(在2.4.*的qte版本中).
因
為鼠標(biāo)的驅(qū)動是qt的server的功能,而server關(guān)于鼠標(biāo)的代碼就集中在qwsmouse_qws.cpp中.由于qtembedded是由c+
+語言寫成,所以鼠標(biāo)的驅(qū)動,實際上就是一些不同的鼠標(biāo)類的實現(xiàn),他們的基類就是QMouseHandle或者QAutoMouseHandle.
整個的流程是這樣的:
根
據(jù)環(huán)境變量QWS_MOUSE_PROTO的定義,選擇一個特定的鼠標(biāo)驅(qū)動程序來完成鼠標(biāo)的驅(qū)動(選擇一個特定的鼠標(biāo)類來完成).在特定的鼠標(biāo)驅(qū)動程序
中,首先打開設(shè)備文件,如果設(shè)備文件為空,就打開默認的設(shè)備文件,相應(yīng)的默認設(shè)備文件在代碼中都有詳細的介紹.然后通過讀取設(shè)備文件的數(shù)據(jù),分析得到的數(shù)
據(jù),變換成相應(yīng)的鼠標(biāo)消息,通過SendMouseEvent的方式,將其發(fā)送到應(yīng)用程序.
觸摸屏的不同之處在于,它需要進行調(diào)整.因為從設(shè)備得到的數(shù)據(jù)是物理屏的數(shù)據(jù),比如s3c2410的觸摸屏的ad轉(zhuǎn)換是10位精度,也就是說物理數(shù)據(jù)從0~1023,在實際的情況中一般是100~1000之間的數(shù)據(jù),而我們的液晶屏是640*480(或者是其他的,這和觸摸屏的數(shù)據(jù)沒有任何的關(guān)系),所以必須將物理數(shù)據(jù)轉(zhuǎn)換為屏幕上點的數(shù)據(jù).他們之間的轉(zhuǎn)換公式,就必須通過定標(biāo)的方式來確定.
所謂的定標(biāo),就是在屏幕上依次出現(xiàn)topleft,bottomleft,bottomright,topright和center一共5個點,用戶必須依次在這5個點上點擊(在觸摸屏上點擊,觸摸屏就放在液晶屏的上方),這樣我們得到了物理的點,也得到了對應(yīng)的實際的點,因此就可以計算出相應(yīng)的參數(shù),計算公式是:
s=1<<16;
a=s*(screen_tl.x()-screen_br.x())/(dev_tl.x()-dev_br.x());
b=0;
c=s*screen_tl.x()-a*dev_tl.x();
d=0;
e=s*(screen_tl.y()-screen_br.y())/(dev_tl.y()-dev_br.y());
f=s*screen_tl.y()-e*dev_tl.y();
假設(shè)p是物理的數(shù)據(jù),那么轉(zhuǎn)換到屏幕上點的公式就是:
x=(a*p.x()+b*p.y()+c)/s);
y=(d*p.x()+e*p.y()+f)/s);
需要注意的是:如果物理的點特別的不合常理,比如左邊和右邊的y的差值相差太大,說明屏的線性度太差,不會通過測試.
S3c2410的觸摸屏驅(qū)動是iPAQ兼容的驅(qū)動,編譯的時候需要定義2個宏:
QWS_MOUSE_IPAQ,QWS_MOUSE_IPAQ_RAW.同時設(shè)定的是
QWS_MOUSE_PROTO=Tpanel:/dev/h3600_tsraw
上面列舉的參數(shù),會首先從文件/etc/pointercal中讀取,這個文件格式就是:
abcdefs
如果屏的質(zhì)量穩(wěn)定,我們可以將測得的數(shù)據(jù)放在這個文件當(dāng)中,并取消掉定標(biāo)的過程,這樣就可以每次使用默認的設(shè)置,而不需要重新計算了.
貼個源碼,大家參考一下,在qwsmouse_qws.cpp中添加:
typedefstruct
{
/*liftup:0/touchdown:0x7f*/
shortpressure;
shortxpos;
shortypos;
shorttimestamp;
}ts_sample;//檢索觸筆狀態(tài)
typedefstruct
{
intxscale;
intxtrans;
intyscale;
intytrans;
intreverse;
}ts_cal_values;//觸筆坐標(biāo)校正
classQWSXscaleMouseHandlerPrivate:publicQWSMouseHandler
{
Q_OBJECT
public:
QWSXscaleMouseHandlerPrivate(MouseProtocolprotocol,QStringmouseDev);
~QWSXscaleMouseHandlerPrivate();
private:
intmouseFD;
intprevstate;
privateslots:
voidreadMouseData();
};
QWSXscaleMouseHandlerPrivate::QWSXscaleMouseHandlerPrivate(MouseProtocolprotocol,QStringmouseDev)
{
if(mouseDev.isEmpty())
mouseDev="/dev/ts";
if((mouseFD=open(mouseDev,O_RDONLY))<0){//重要的是打開特定文件設(shè)備
qWarning("Cannotopen%s(%s)",mouseDev.latin1(),strerror(errno));
return;
}else{
sleep(1);
}
prevstate=0;
QSocketNotifier*mouseNotifier;
mouseNotifier=newQSocketNotifier(mouseFD,QSocketNotifier::Read,
this);
connect(mouseNotifier,SIGNAL(activated(int)),this,SLOT(readMouseData()));
}
QWSXscaleMouseHandlerPrivate::~QWSXscaleMouseHandlerPrivate()
{
if(mouseFD>=0)
close(mouseFD);
}
voidQWSXscaleMouseHandlerPrivate::readMouseData()
{
if(!qt_screen)
return;
//YopyTPdatadata;
//unsignedintyopDat[4];
ts_sampledata;//實際設(shè)備的數(shù)據(jù)結(jié)構(gòu)
intret;
//ret=read(mouseFD,&yopDat,sizeof(yopDat));
ret=read(mouseFD,&data,sizeof(ts_sample));//讀取實際設(shè)備數(shù)據(jù)
if(ret){
//data.status=(YOPY_PRES(yopDat))?1:0;
data.pressure=data.pressure&0xFF;//取得觸筆狀態(tài)
//data.xpos=yopDat.xpos;
//data.ypos=yopDat.ypos;
QPointq;
q.setX(data.xpos);
q.setY(data.ypos);
//if(data.status&&!prevstate){
if(data.pressure==0x01&&!prevstate){//判斷觸筆狀態(tài)
emitmouseChanged(q,Qt::LeftButton);//轉(zhuǎn)換為鼠標(biāo)左鍵壓下事件
}
//elseif(!data.status&&prevstate){
elseif(!data.pressure&&prevstate){
emitmouseChanged(q,0);
}
prevstate=data.pressure;
}
else{
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年車輛抵押貸款信保業(yè)務(wù)借款協(xié)議
- 三年級下冊數(shù)學(xué)教案-第五單元長方形的面積∣北師大版
- 2025年工作室網(wǎng)站合同
- 行業(yè)培訓(xùn)外包合同(2篇)
- (高清版)DB45∕T 227-2022 地理標(biāo)志產(chǎn)品 廣西肉桂
- 2011年全國各地高考生物試題分章匯編
- 任務(wù)二 高效地下載信息 教學(xué)設(shè)計 -2023-2024學(xué)年桂科版初中信息技術(shù)七年級上冊
- 第十一課 智能家居教學(xué)設(shè)計 -2023-2024學(xué)年青島版(2019)初中信息技術(shù)第四冊
- 第八單元(A卷基礎(chǔ)篇)三年級語文下冊單元分層訓(xùn)練AB卷(部編版)
- 第六單元-平移、旋轉(zhuǎn)和軸對稱(單元測試)-蘇教版數(shù)學(xué)三年級上冊(含解析)
- 2024義務(wù)教育道德與法治課程標(biāo)準(zhǔn)(2022版)
- 2024年新人教版化學(xué)九年級上冊全冊課件(新版教材)
- 智能體脂秤市場洞察報告
- 教科版 二年級科學(xué)上冊第一單元第6課《不同的季節(jié)》同步練習(xí)(附答案解析)
- 山東省東營市2024年中考英語真題【附真題答案】
- 2024義務(wù)教育英語新課標(biāo)課程標(biāo)準(zhǔn)2022年版考試真題附答案
- 粵港澳宜居城市建設(shè)協(xié)同發(fā)展策略
- 動物防疫服務(wù)投標(biāo)方案(技術(shù)方案)
- 2024年新課標(biāo)全國Ⅰ卷語文高考真題試卷(含答案)
- 2022-2023學(xué)年廣州市六年級下學(xué)期數(shù)學(xué)期末考試試卷及答案解析
- 設(shè)備維護服務(wù)方案(2篇)
評論
0/150
提交評論