趙建峰,陳朔鷹,羅一涵
(北京理工大學(xué)計(jì)算機(jī)學(xué)院,北京100081)
有窮自動機(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ū)動程序的數(shù)據(jù)傳輸規(guī)范,有著廣泛的使用范圍。識別和處理多點(diǎn)觸摸屏驅(qū)動程序的數(shù)據(jù)是多點(diǎn)觸摸屏應(yīng)用最基本的功能。本文采用有窮自動機(jī)的思想,設(shè)計(jì)了一個(gè)可以識別符合Linux multi-touch協(xié)議規(guī)范數(shù)據(jù)的多點(diǎn)觸摸屏中間件。中間件提供外部接口供應(yīng)用程序使用,可以減少程序開發(fā)人員的重復(fù)工作,提高開發(fā)效率。
多點(diǎn)觸摸;中間件;有窮自動機(jī);嵌入式系統(tǒng)
嵌入式系統(tǒng)軟硬件的多樣性,造成硬件設(shè)備驅(qū)動程序和用戶應(yīng)用程序之間接口的連接問題;應(yīng)用軟件必須進(jìn)行相應(yīng)的移植工作才可以在不同的硬件系統(tǒng)中運(yùn)行,同時(shí)不同軟件在同一個(gè)硬件平臺編寫時(shí),也可能出現(xiàn)重復(fù)開發(fā)的現(xiàn)象。針對上述兩種現(xiàn)象,可以使用中間件技術(shù)來解決。中間件對下層系統(tǒng)的復(fù)雜性進(jìn)行屏蔽并對上層提供統(tǒng)一的接口,直接供開發(fā)人員使用,從而大大減少了技術(shù)上的負(fù)擔(dān)。
本文將設(shè)計(jì)一個(gè)可識別多點(diǎn)觸摸屏觸摸點(diǎn)的中間件,接口將提供觸摸點(diǎn)信息。中間件用于多點(diǎn)觸摸屏驅(qū)動程序和應(yīng)用程序之間,中間件從驅(qū)動程序中獲取原始數(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ū)動程序向使用者上報(bào)任意多個(gè)觸摸點(diǎn)的信息。multi-touch協(xié)議分為兩種類型,以便不同類型的硬件設(shè)備使用。A類型協(xié)議用于不具備觸摸點(diǎn)區(qū)分和跟蹤能力的硬件設(shè)備,B類型協(xié)議用于具備觸摸點(diǎn)區(qū)分和跟蹤能力的硬件設(shè)備。B類型協(xié)議對每個(gè)觸摸點(diǎn)進(jìn)行編號,每個(gè)編號與一個(gè)槽相對應(yīng),并使用槽來區(qū)分不同的觸摸點(diǎn)。當(dāng)一個(gè)觸摸點(diǎn)離開時(shí),對應(yīng)的槽被釋放,被釋放的槽可以被新的觸摸點(diǎn)重復(fù)使用。
使用A類型協(xié)議的硬件設(shè)備因?yàn)椴荒軈^(qū)分和跟蹤觸摸點(diǎn),其驅(qū)動程序必須定時(shí)上報(bào)當(dāng)前所有的觸摸點(diǎn)信息,而使用B類型協(xié)議的硬件設(shè)備的驅(qū)動程序只在觸摸點(diǎn)狀態(tài)發(fā)生改變(增加、移除、移動)時(shí),才會上報(bào)信息,而且只上報(bào)狀態(tài)發(fā)生改變的觸摸點(diǎn)信息。驅(qū)動程序使用一串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軸方向移動后產(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ū)動程序上報(bào)消息串的類型比較單一,用戶容易識別和獲取當(dāng)前觸摸點(diǎn)的位置信息;缺點(diǎn)是用戶在使用時(shí),必須自行計(jì)算觸摸點(diǎn)的狀態(tài)信息(如觸摸點(diǎn)增加、觸摸點(diǎn)移動等情況),需要定時(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ū)動程序上報(bào)的消息串類型較多,相比A類型協(xié)議較難識別。
2.1 有窮自動機(jī)
有窮自動機(jī)(也稱有限自動機(jī))是一種識別模型,它能準(zhǔn)確地識別正規(guī)集。有窮自動機(jī)分為兩類:確定有窮自動機(jī)和非確定有窮自動機(jī),本文在設(shè)計(jì)中間件時(shí)使用了確定有窮自動機(jī)模型。一個(gè)確定的有窮自動機(jī)(DFA)M是一個(gè)五元組:M=(K,Σ,f,S,Z),其中K為狀態(tài)集,Σ為輸入符號表,f為轉(zhuǎn)換函數(shù),S為初態(tài),Z為終態(tài)集,終態(tài)也稱可接受狀態(tài)或結(jié)束狀態(tài)。
2.2 有窮自動機(jī)設(shè)計(jì)
根據(jù)Linux multi-touch協(xié)議的內(nèi)容可以得知,驅(qū)動程序是通過發(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、序號消息ABS_MT_TRACKING_ID。其中同步消息只在A類型協(xié)議中使用,槽消息和序號消息只在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)序號消息組成,一個(gè)消息串由多個(gè)基本結(jié)構(gòu)和結(jié)束消息組成。每個(gè)坐標(biāo)消息可以包含完整的x坐標(biāo)消息和y坐標(biāo)消息,也可以只包含其中一個(gè)消息,但在對新觸摸點(diǎn)進(jìn)行編號時(shí),必須包含完整的坐標(biāo)消息。
用戶通過消息串獲取觸摸點(diǎn)的信息,而消息串的格式和長度是不確定的,這使得用戶在識別和處理消息串時(shí)產(chǎn)生了一定的難度。本文設(shè)計(jì)的中間件的主要功能就是對消息串進(jìn)行識別和處理,用戶在使用中間件后,可以直接獲取規(guī)范的觸摸點(diǎn)信息。在設(shè)計(jì)時(shí)采用了有窮自動機(jī)算法的設(shè)計(jì)思想,將所要處理的消息串作為有窮自動機(jī)的輸入串,中間件即為可以識別這些輸入串的自動機(jī)。自動機(jī)把驅(qū)動產(chǎn)生的消息串作為輸入串,當(dāng)自動機(jī)達(dá)到可接受狀態(tài)時(shí),即表明自動機(jī)已經(jīng)識別并處理完成此消息串[3]。使用有窮自動機(jī)的算法設(shè)計(jì)思想可以使中間件的識別處理過程更加清晰明了。
2.2.1 識別A類型協(xié)議消息串的自動機(jī)設(shè)計(jì)
A類型協(xié)議的消息串由ABS_MT_POSITION_X、ABS_MT_POSITION_Y、SYN_MT_REPORT、SYSYN_REPORT四種類型的消息組成。自動機(jī)的狀態(tài)集由初始狀態(tài)S和接收4種消息后的4種狀態(tài)K1、K2、K3、K4組成。K1是自動機(jī)接收ABS_MT_POSITION_X消息后轉(zhuǎn)換的狀態(tài);K2是自動機(jī)接收ABS_MT_POSITION_Y消息后轉(zhuǎn)換的狀態(tài);K3是自動機(jī)接收SYN_MT_REPORT消息后轉(zhuǎn)換的狀態(tài);K4是自動機(jī)接收到SYN_REPORT而轉(zhuǎn)換的狀態(tài),K4為可接受狀態(tài)。轉(zhuǎn)換函數(shù)f定義為:
由此可以得到自動機(jī)的狀態(tài)轉(zhuǎn)換圖,見圖1。
圖1 識別A類型協(xié)議消息串的自動機(jī)
2.2.2 識別B類型協(xié)議消息串的自動機(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ù)兩種類型。自動機(jī)的狀態(tài)集由初始狀態(tài)S和接收6種消息后的7種狀態(tài)K1、K2、K3、K4、K5、K6、K7組成。K1是自動機(jī)接收ABS_MT_SLOT消息后轉(zhuǎn)換的狀態(tài);K2是自動機(jī)接收ABS_MT_TRACKING_ID(非負(fù))消息后轉(zhuǎn)換的狀態(tài);K3是自動機(jī)接收ABS_MT_TRACKING_ID(-1)消息后轉(zhuǎn)換的狀態(tài);K4、K5是自動機(jī)接收ABS_MT_POSITION_X消息后轉(zhuǎn)換的狀態(tài);K6是自動機(jī)接收ABS_ MT_POSITION_Y消息后轉(zhuǎn)換的狀態(tài);K7是自動機(jī)接收SYN_REPORT消息后轉(zhuǎn)換的狀態(tài),K7為可接受狀態(tài)。因?yàn)樽詣訖C(jī)接收到ABS_MT_POSITION_X消息后,會根據(jù)當(dāng)前狀態(tài)的差異而進(jìn)入不同的狀態(tài),所以ABS_MT_ POSITION_X消息對應(yīng)兩種狀態(tài)。轉(zhuǎn)換函數(shù)f定義為:
由此可以得到此自動機(jī)的狀態(tài)轉(zhuǎn)換圖,見圖2。
圖2 識別B類型協(xié)議消息串的自動機(jī)
3.1 代碼設(shè)計(jì)
中間件從驅(qū)動程序中獲取消息串[4],消息串由多個(gè)input_event結(jié)構(gòu)體組成。input_event結(jié)構(gòu)體有4個(gè)成員,分別是時(shí)間戳、類型、代碼和數(shù)值,類型和代碼用來標(biāo)識消息,數(shù)值用來存放消息的內(nèi)容。例如ABS_MT_POSITION_X 10消息的類型是EV_ABS,代碼是ABS_MT_ POSITION_X,數(shù)值是10,表明觸摸點(diǎn)的X坐標(biāo)為10。
中間件對消息串的操作按照上文設(shè)計(jì)的自動機(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í),轉(zhuǎn)入初態(tài),不能識別的消息是指該消息在該狀態(tài)沒有對應(yīng)的轉(zhuǎn)入狀態(tài)。
本文設(shè)計(jì)的中間件在使用時(shí)可以作為系統(tǒng)服務(wù)運(yùn)行于操作系統(tǒng)中,也可以作為函數(shù)庫供用戶程序單獨(dú)使用。
3.2 實(shí)驗(yàn)測試
編寫了一個(gè)中間件測試程序,該程序的功能是通過對觸摸屏的操作實(shí)現(xiàn)圖片的移動、縮放和旋轉(zhuǎn)[5],驅(qū)動程序由不同的廠商提供。經(jīng)過實(shí)驗(yàn),中間件可以識別和處理驅(qū)動程序上報(bào)的消息串,測試程序可以使用中間件提供的觸摸點(diǎn)數(shù)據(jù)實(shí)現(xiàn)對圖片的操作[6]。
本文主要設(shè)計(jì)了可以識別Linux multi-touch協(xié)議消息串的有窮自動機(jī)模型,并依照此模型編寫了多點(diǎn)觸摸屏中間件,最后給出了中間件的關(guān)鍵代碼并對中間件進(jìn)行測試。使用本文設(shè)計(jì)的中間件,可以使開發(fā)者免去了對觸摸屏驅(qū)動程序原始數(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ū)動開發(fā)詳解:基于最新的Linux4.0內(nèi)核[M].北京:機(jī)械工業(yè)出版社,2015.
[3]林平凱.基于Linux系統(tǒng)的多點(diǎn)觸摸驅(qū)動設(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ū)動設(shè)計(jì)[J].微計(jì)算機(jī)信息,2012,28(3):54-56.
[6]泰國棟.有限狀態(tài)機(jī)的嵌入式Linux按鍵驅(qū)動設(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)