趙建峰,陳朔鷹,羅一涵
(北京理工大學(xué)計(jì)算機(jī)學(xué)院,北京100081)
有窮自動(dòng)機(jī)的Linux多點(diǎn)觸摸屏中間件設(shè)計(jì)
趙建峰,陳朔鷹,羅一涵
(北京理工大學(xué)計(jì)算機(jī)學(xué)院,北京100081)
多點(diǎn)觸摸屏的應(yīng)用程序開發(fā)是當(dāng)前的研究熱點(diǎn)。Linux multi-touch(MT)協(xié)議是Linux輸入子系統(tǒng)的一個(gè)標(biāo)準(zhǔn)協(xié)議,定義了多點(diǎn)觸摸設(shè)備驅(qū)動(dòng)程序的數(shù)據(jù)傳輸規(guī)范,有著廣泛的使用范圍。識(shí)別和處理多點(diǎn)觸摸屏驅(qū)動(dòng)程序的數(shù)據(jù)是多點(diǎn)觸摸屏應(yīng)用最基本的功能。本文采用有窮自動(dòng)機(jī)的思想,設(shè)計(jì)了一個(gè)可以識(shí)別符合Linux multi-touch協(xié)議規(guī)范數(shù)據(jù)的多點(diǎn)觸摸屏中間件。中間件提供外部接口供應(yīng)用程序使用,可以減少程序開發(fā)人員的重復(fù)工作,提高開發(fā)效率。
多點(diǎn)觸摸;中間件;有窮自動(dòng)機(jī);嵌入式系統(tǒng)
嵌入式系統(tǒng)軟硬件的多樣性,造成硬件設(shè)備驅(qū)動(dòng)程序和用戶應(yīng)用程序之間接口的連接問題;應(yīng)用軟件必須進(jìn)行相應(yīng)的移植工作才可以在不同的硬件系統(tǒng)中運(yùn)行,同時(shí)不同軟件在同一個(gè)硬件平臺(tái)編寫時(shí),也可能出現(xiàn)重復(fù)開發(fā)的現(xiàn)象。針對(duì)上述兩種現(xiàn)象,可以使用中間件技術(shù)來解決。中間件對(duì)下層系統(tǒng)的復(fù)雜性進(jìn)行屏蔽并對(duì)上層提供統(tǒng)一的接口,直接供開發(fā)人員使用,從而大大減少了技術(shù)上的負(fù)擔(dān)。
本文將設(shè)計(jì)一個(gè)可識(shí)別多點(diǎn)觸摸屏觸摸點(diǎn)的中間件,接口將提供觸摸點(diǎn)信息。中間件用于多點(diǎn)觸摸屏驅(qū)動(dòng)程序和應(yīng)用程序之間,中間件從驅(qū)動(dòng)程序中獲取原始數(shù)據(jù),應(yīng)用程序使用中間件處理得到觸摸點(diǎn)信息。本文設(shè)計(jì)的中間件遵循Linux multi-touch(MT)協(xié)議。
Linux的multi-touch協(xié)議是Linux輸入子系統(tǒng)的一個(gè)標(biāo)準(zhǔn)協(xié)議[1]。此協(xié)議允許內(nèi)核的驅(qū)動(dòng)程序向使用者上報(bào)任意多個(gè)觸摸點(diǎn)的信息。multi-touch協(xié)議分為兩種類型,以便不同類型的硬件設(shè)備使用。A類型協(xié)議用于不具備觸摸點(diǎn)區(qū)分和跟蹤能力的硬件設(shè)備,B類型協(xié)議用于具備觸摸點(diǎn)區(qū)分和跟蹤能力的硬件設(shè)備。B類型協(xié)議對(duì)每個(gè)觸摸點(diǎn)進(jìn)行編號(hào),每個(gè)編號(hào)與一個(gè)槽相對(duì)應(yīng),并使用槽來區(qū)分不同的觸摸點(diǎn)。當(dāng)一個(gè)觸摸點(diǎn)離開時(shí),對(duì)應(yīng)的槽被釋放,被釋放的槽可以被新的觸摸點(diǎn)重復(fù)使用。
使用A類型協(xié)議的硬件設(shè)備因?yàn)椴荒軈^(qū)分和跟蹤觸摸點(diǎn),其驅(qū)動(dòng)程序必須定時(shí)上報(bào)當(dāng)前所有的觸摸點(diǎn)信息,而使用B類型協(xié)議的硬件設(shè)備的驅(qū)動(dòng)程序只在觸摸點(diǎn)狀態(tài)發(fā)生改變(增加、移除、移動(dòng))時(shí),才會(huì)上報(bào)信息,而且只上報(bào)狀態(tài)發(fā)生改變的觸摸點(diǎn)信息。驅(qū)動(dòng)程序使用一串ABS_MT消息上報(bào)觸摸點(diǎn)的信息,每一個(gè)ABS_MT消息是一個(gè)結(jié)構(gòu)體,包含類型、數(shù)值、時(shí)間戳等成員。
協(xié)議舉例:A類型
有兩個(gè)觸摸點(diǎn)時(shí),上報(bào)的最小消息時(shí)序:
移除第一個(gè)觸摸點(diǎn)時(shí),上報(bào)的消息時(shí)序:
移除第二個(gè)觸摸點(diǎn)時(shí),上報(bào)的消息時(shí)序:
協(xié)議舉例:B類型
有兩個(gè)觸摸點(diǎn)時(shí),上報(bào)的最小消息時(shí)序:
當(dāng)ID為0的觸摸點(diǎn)向X軸方向移動(dòng)后產(chǎn)生的消息時(shí)序:
移除第一個(gè)觸摸點(diǎn)(slot 0,ID 0)時(shí),上報(bào)的消息時(shí)序:
移除第二個(gè)觸摸點(diǎn)(slot 1,ID 1)時(shí),上報(bào)的消息時(shí)序:
A類型協(xié)議的優(yōu)點(diǎn)是在驅(qū)動(dòng)程序上報(bào)消息串的類型比較單一,用戶容易識(shí)別和獲取當(dāng)前觸摸點(diǎn)的位置信息;缺點(diǎn)是用戶在使用時(shí),必須自行計(jì)算觸摸點(diǎn)的狀態(tài)信息(如觸摸點(diǎn)增加、觸摸點(diǎn)移動(dòng)等情況),需要定時(shí)處理并且數(shù)據(jù)量較大。
B類型協(xié)議的優(yōu)點(diǎn)是用戶可以直接獲取觸摸點(diǎn)的狀態(tài)信息,并且只在觸摸點(diǎn)狀態(tài)發(fā)生變化時(shí)才需處理,需要處理的數(shù)據(jù)只是狀態(tài)發(fā)生變化的觸摸點(diǎn)信息;缺點(diǎn)是驅(qū)動(dòng)程序上報(bào)的消息串類型較多,相比A類型協(xié)議較難識(shí)別。
2.1 有窮自動(dòng)機(jī)
有窮自動(dòng)機(jī)(也稱有限自動(dòng)機(jī))是一種識(shí)別模型,它能準(zhǔn)確地識(shí)別正規(guī)集。有窮自動(dòng)機(jī)分為兩類:確定有窮自動(dòng)機(jī)和非確定有窮自動(dòng)機(jī),本文在設(shè)計(jì)中間件時(shí)使用了確定有窮自動(dòng)機(jī)模型。一個(gè)確定的有窮自動(dòng)機(jī)(DFA)M是一個(gè)五元組:M=(K,Σ,f,S,Z),其中K為狀態(tài)集,Σ為輸入符號(hào)表,f為轉(zhuǎn)換函數(shù),S為初態(tài),Z為終態(tài)集,終態(tài)也稱可接受狀態(tài)或結(jié)束狀態(tài)。
2.2 有窮自動(dòng)機(jī)設(shè)計(jì)
根據(jù)Linux multi-touch協(xié)議的內(nèi)容可以得知,驅(qū)動(dòng)程序是通過發(fā)送一串ABS_MT消息來上報(bào)觸摸點(diǎn)的信息[2]。ABS_MT消息分為以下6類:x坐標(biāo)消息ABS_MT_ POSITION_X、y坐標(biāo)消息ABS_MT_POSITION_Y、同步消息SYN_MT_REPORT、結(jié)束消息SYN_REPORT、槽消息ABS_MT_SLOT、序號(hào)消息ABS_MT_TRACKING_ID。其中同步消息只在A類型協(xié)議中使用,槽消息和序號(hào)消息只在B類型協(xié)議中使用。
A類型協(xié)議規(guī)范的消息串類型比較單一,是由0個(gè)或多個(gè)觸摸點(diǎn)坐標(biāo)消息與結(jié)束消息組成,同步消息位于各個(gè)觸摸點(diǎn)坐標(biāo)之間,每個(gè)觸摸點(diǎn)坐標(biāo)消息均包含完整的x坐標(biāo)消息和y坐標(biāo)消息。
B類型協(xié)議規(guī)范的消息串類型較多,基本結(jié)構(gòu)由slot消息與坐標(biāo)消息或觸摸點(diǎn)序號(hào)消息組成,一個(gè)消息串由多個(gè)基本結(jié)構(gòu)和結(jié)束消息組成。每個(gè)坐標(biāo)消息可以包含完整的x坐標(biāo)消息和y坐標(biāo)消息,也可以只包含其中一個(gè)消息,但在對(duì)新觸摸點(diǎn)進(jìn)行編號(hào)時(shí),必須包含完整的坐標(biāo)消息。
用戶通過消息串獲取觸摸點(diǎn)的信息,而消息串的格式和長度是不確定的,這使得用戶在識(shí)別和處理消息串時(shí)產(chǎn)生了一定的難度。本文設(shè)計(jì)的中間件的主要功能就是對(duì)消息串進(jìn)行識(shí)別和處理,用戶在使用中間件后,可以直接獲取規(guī)范的觸摸點(diǎn)信息。在設(shè)計(jì)時(shí)采用了有窮自動(dòng)機(jī)算法的設(shè)計(jì)思想,將所要處理的消息串作為有窮自動(dòng)機(jī)的輸入串,中間件即為可以識(shí)別這些輸入串的自動(dòng)機(jī)。自動(dòng)機(jī)把驅(qū)動(dòng)產(chǎn)生的消息串作為輸入串,當(dāng)自動(dòng)機(jī)達(dá)到可接受狀態(tài)時(shí),即表明自動(dòng)機(jī)已經(jīng)識(shí)別并處理完成此消息串[3]。使用有窮自動(dòng)機(jī)的算法設(shè)計(jì)思想可以使中間件的識(shí)別處理過程更加清晰明了。
2.2.1 識(shí)別A類型協(xié)議消息串的自動(dòng)機(jī)設(shè)計(jì)
A類型協(xié)議的消息串由ABS_MT_POSITION_X、ABS_MT_POSITION_Y、SYN_MT_REPORT、SYSYN_REPORT四種類型的消息組成。自動(dòng)機(jī)的狀態(tài)集由初始狀態(tài)S和接收4種消息后的4種狀態(tài)K1、K2、K3、K4組成。K1是自動(dòng)機(jī)接收ABS_MT_POSITION_X消息后轉(zhuǎn)換的狀態(tài);K2是自動(dòng)機(jī)接收ABS_MT_POSITION_Y消息后轉(zhuǎn)換的狀態(tài);K3是自動(dòng)機(jī)接收SYN_MT_REPORT消息后轉(zhuǎn)換的狀態(tài);K4是自動(dòng)機(jī)接收到SYN_REPORT而轉(zhuǎn)換的狀態(tài),K4為可接受狀態(tài)。轉(zhuǎn)換函數(shù)f定義為:
由此可以得到自動(dòng)機(jī)的狀態(tài)轉(zhuǎn)換圖,見圖1。
圖1 識(shí)別A類型協(xié)議消息串的自動(dòng)機(jī)
2.2.2 識(shí)別B類型協(xié)議消息串的自動(dòng)機(jī)設(shè)計(jì)
B類型協(xié)議的消息串由ABS_MT_SLOT、ABS_MT_ TRACKING_ID、ABS_MT_POSITION_X、ABS_MT_POSITION_Y、SYN_REPORT五種類型的消息組成,其中ABS_MT_TRACKING_ID消息又分為ID為-1和非負(fù)兩種類型。自動(dòng)機(jī)的狀態(tài)集由初始狀態(tài)S和接收6種消息后的7種狀態(tài)K1、K2、K3、K4、K5、K6、K7組成。K1是自動(dòng)機(jī)接收ABS_MT_SLOT消息后轉(zhuǎn)換的狀態(tài);K2是自動(dòng)機(jī)接收ABS_MT_TRACKING_ID(非負(fù))消息后轉(zhuǎn)換的狀態(tài);K3是自動(dòng)機(jī)接收ABS_MT_TRACKING_ID(-1)消息后轉(zhuǎn)換的狀態(tài);K4、K5是自動(dòng)機(jī)接收ABS_MT_POSITION_X消息后轉(zhuǎn)換的狀態(tài);K6是自動(dòng)機(jī)接收ABS_ MT_POSITION_Y消息后轉(zhuǎn)換的狀態(tài);K7是自動(dòng)機(jī)接收SYN_REPORT消息后轉(zhuǎn)換的狀態(tài),K7為可接受狀態(tài)。因?yàn)樽詣?dòng)機(jī)接收到ABS_MT_POSITION_X消息后,會(huì)根據(jù)當(dāng)前狀態(tài)的差異而進(jìn)入不同的狀態(tài),所以ABS_MT_ POSITION_X消息對(duì)應(yīng)兩種狀態(tài)。轉(zhuǎn)換函數(shù)f定義為:
由此可以得到此自動(dòng)機(jī)的狀態(tài)轉(zhuǎn)換圖,見圖2。
圖2 識(shí)別B類型協(xié)議消息串的自動(dòng)機(jī)
3.1 代碼設(shè)計(jì)
中間件從驅(qū)動(dòng)程序中獲取消息串[4],消息串由多個(gè)input_event結(jié)構(gòu)體組成。input_event結(jié)構(gòu)體有4個(gè)成員,分別是時(shí)間戳、類型、代碼和數(shù)值,類型和代碼用來標(biāo)識(shí)消息,數(shù)值用來存放消息的內(nèi)容。例如ABS_MT_POSITION_X 10消息的類型是EV_ABS,代碼是ABS_MT_ POSITION_X,數(shù)值是10,表明觸摸點(diǎn)的X坐標(biāo)為10。
中間件對(duì)消息串的操作按照上文設(shè)計(jì)的自動(dòng)機(jī)流程進(jìn)行處理。中間件定義一個(gè)狀態(tài)值用于表明中間件當(dāng)前的狀態(tài)。中間件狀態(tài)值初始為初態(tài),根據(jù)輸入消息的類型、代碼和數(shù)值進(jìn)行狀態(tài)轉(zhuǎn)換和相應(yīng)的處理操作,當(dāng)中間件的狀態(tài)為可接受狀態(tài)時(shí),向應(yīng)用程序上報(bào)觸摸點(diǎn)信息并轉(zhuǎn)入初態(tài)進(jìn)行下一輪的處理。當(dāng)中間件在某一狀態(tài)接收到不能識(shí)別的消息時(shí),轉(zhuǎn)入初態(tài),不能識(shí)別的消息是指該消息在該狀態(tài)沒有對(duì)應(yīng)的轉(zhuǎn)入狀態(tài)。
本文設(shè)計(jì)的中間件在使用時(shí)可以作為系統(tǒng)服務(wù)運(yùn)行于操作系統(tǒng)中,也可以作為函數(shù)庫供用戶程序單獨(dú)使用。
3.2 實(shí)驗(yàn)測試
編寫了一個(gè)中間件測試程序,該程序的功能是通過對(duì)觸摸屏的操作實(shí)現(xiàn)圖片的移動(dòng)、縮放和旋轉(zhuǎn)[5],驅(qū)動(dòng)程序由不同的廠商提供。經(jīng)過實(shí)驗(yàn),中間件可以識(shí)別和處理驅(qū)動(dòng)程序上報(bào)的消息串,測試程序可以使用中間件提供的觸摸點(diǎn)數(shù)據(jù)實(shí)現(xiàn)對(duì)圖片的操作[6]。
本文主要設(shè)計(jì)了可以識(shí)別Linux multi-touch協(xié)議消息串的有窮自動(dòng)機(jī)模型,并依照此模型編寫了多點(diǎn)觸摸屏中間件,最后給出了中間件的關(guān)鍵代碼并對(duì)中間件進(jìn)行測試。使用本文設(shè)計(jì)的中間件,可以使開發(fā)者免去了對(duì)觸摸屏驅(qū)動(dòng)程序原始數(shù)據(jù)的處理而提高開發(fā)效率,同時(shí)也為Linux multi-touch協(xié)議消息串的處理提供了一種思路。
[1]Multi touch(MT)Protocol[EB/OL].[2016-06].https:// www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt.
[2]宋寶華.Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解:基于最新的Linux4.0內(nèi)核[M].北京:機(jī)械工業(yè)出版社,2015.
[3]林平凱.基于Linux系統(tǒng)的多點(diǎn)觸摸驅(qū)動(dòng)設(shè)計(jì)[J].信息技術(shù)與標(biāo)準(zhǔn)化,2014(6).
[4]崔力升.中間件技術(shù)的綜述[J].科技視界,2014(3):198-198.
[5]劉斌.基于有限狀態(tài)機(jī)的Linux多點(diǎn)觸摸屏驅(qū)動(dòng)設(shè)計(jì)[J].微計(jì)算機(jī)信息,2012,28(3):54-56.
[6]泰國棟.有限狀態(tài)機(jī)的嵌入式Linux按鍵驅(qū)動(dòng)設(shè)計(jì)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2010,4(1):79-81.
趙建峰(碩士研究生),主要研究方向?yàn)榍度胧较到y(tǒng)與應(yīng)用;陳朔鷹(副教授),主要研究方向?yàn)橛?jì)算機(jī)操作系統(tǒng)、嵌入式系統(tǒng)與應(yīng)用;羅一涵(碩士研究生),主要研究方向?yàn)榍度胧较到y(tǒng)與應(yīng)用。
Linux Multi-touch Screen Middleware Design Based on Finite Automaton
Zhao Jianfeng,Chen Shuoying,Luo Yihan
(School of Computer Science&Technology,Beijing Institute of Technology,Beijing 100081,China)
The application development of multi-touch screen is becoming highlighting.The Linux multi-touch protocol is a standard protocol for Linux input subsystem,it defines the data transmission specification of multi-touch device drivers and is widely used.The identify and deal with multi-touch screen driver data are the basic functions of multi-touch screen applications.In this paper,a multi-touch screen middleware which is in line with the Linux multi-touch protocol specification data is designed by using the finite automaton.The middleware offers an external interface for the applications,which can reduce duplication of work program developers to improve the development efficiency.
multi-touch;middleware;finite automaton;embedded system
TP311
:A
薛士然
2016-06-06)