赵建峰,陈朔鹰,罗一涵
(北京理工大学计算机学院,北京100081)
有穷自动机的Linux多点触摸屏中间件设计
赵建峰,陈朔鹰,罗一涵
(北京理工大学计算机学院,北京100081)
多点触摸屏的应用程序开发是当前的研究热点。Linux multi-touch(MT)协议是Linux输入子系统的一个标准协议,定义了多点触摸设备驱动程序的数据传输规范,有着广泛的使用范围。识别和处理多点触摸屏驱动程序的数据是多点触摸屏应用最基本的功能。本文采用有穷自动机的思想,设计了一个可以识别符合Linux multi-touch协议规范数据的多点触摸屏中间件。中间件提供外部接口供应用程序使用,可以减少程序开发人员的重复工作,提高开发效率。
多点触摸;中间件;有穷自动机;嵌入式系统
嵌入式系统软硬件的多样性,造成硬件设备驱动程序和用户应用程序之间接口的连接问题;应用软件必须进行相应的移植工作才可以在不同的硬件系统中运行,同时不同软件在同一个硬件平台编写时,也可能出现重复开发的现象。针对上述两种现象,可以使用中间件技术来解决。中间件对下层系统的复杂性进行屏蔽并对上层提供统一的接口,直接供开发人员使用,从而大大减少了技术上的负担。
本文将设计一个可识别多点触摸屏触摸点的中间件,接口将提供触摸点信息。中间件用于多点触摸屏驱动程序和应用程序之间,中间件从驱动程序中获取原始数据,应用程序使用中间件处理得到触摸点信息。本文设计的中间件遵循Linux multi-touch(MT)协议。
Linux的multi-touch协议是Linux输入子系统的一个标准协议[1]。此协议允许内核的驱动程序向使用者上报任意多个触摸点的信息。multi-touch协议分为两种类型,以便不同类型的硬件设备使用。A类型协议用于不具备触摸点区分和跟踪能力的硬件设备,B类型协议用于具备触摸点区分和跟踪能力的硬件设备。B类型协议对每个触摸点进行编号,每个编号与一个槽相对应,并使用槽来区分不同的触摸点。当一个触摸点离开时,对应的槽被释放,被释放的槽可以被新的触摸点重复使用。
使用A类型协议的硬件设备因为不能区分和跟踪触摸点,其驱动程序必须定时上报当前所有的触摸点信息,而使用B类型协议的硬件设备的驱动程序只在触摸点状态发生改变(增加、移除、移动)时,才会上报信息,而且只上报状态发生改变的触摸点信息。驱动程序使用一串ABS_MT消息上报触摸点的信息,每一个ABS_MT消息是一个结构体,包含类型、数值、时间戳等成员。
协议举例:A类型
有两个触摸点时,上报的最小消息时序:
移除第一个触摸点时,上报的消息时序:
移除第二个触摸点时,上报的消息时序:
协议举例:B类型
有两个触摸点时,上报的最小消息时序:
当ID为0的触摸点向X轴方向移动后产生的消息时序:
移除第一个触摸点(slot 0,ID 0)时,上报的消息时序:
移除第二个触摸点(slot 1,ID 1)时,上报的消息时序:
A类型协议的优点是在驱动程序上报消息串的类型比较单一,用户容易识别和获取当前触摸点的位置信息;缺点是用户在使用时,必须自行计算触摸点的状态信息(如触摸点增加、触摸点移动等情况),需要定时处理并且数据量较大。
B类型协议的优点是用户可以直接获取触摸点的状态信息,并且只在触摸点状态发生变化时才需处理,需要处理的数据只是状态发生变化的触摸点信息;缺点是驱动程序上报的消息串类型较多,相比A类型协议较难识别。
2.1 有穷自动机
有穷自动机(也称有限自动机)是一种识别模型,它能准确地识别正规集。有穷自动机分为两类:确定有穷自动机和非确定有穷自动机,本文在设计中间件时使用了确定有穷自动机模型。一个确定的有穷自动机(DFA)M是一个五元组:M=(K,Σ,f,S,Z),其中K为状态集,Σ为输入符号表,f为转换函数,S为初态,Z为终态集,终态也称可接受状态或结束状态。
2.2 有穷自动机设计
根据Linux multi-touch协议的内容可以得知,驱动程序是通过发送一串ABS_MT消息来上报触摸点的信息[2]。ABS_MT消息分为以下6类:x坐标消息ABS_MT_ POSITION_X、y坐标消息ABS_MT_POSITION_Y、同步消息SYN_MT_REPORT、结束消息SYN_REPORT、槽消息ABS_MT_SLOT、序号消息ABS_MT_TRACKING_ID。其中同步消息只在A类型协议中使用,槽消息和序号消息只在B类型协议中使用。
A类型协议规范的消息串类型比较单一,是由0个或多个触摸点坐标消息与结束消息组成,同步消息位于各个触摸点坐标之间,每个触摸点坐标消息均包含完整的x坐标消息和y坐标消息。
B类型协议规范的消息串类型较多,基本结构由slot消息与坐标消息或触摸点序号消息组成,一个消息串由多个基本结构和结束消息组成。每个坐标消息可以包含完整的x坐标消息和y坐标消息,也可以只包含其中一个消息,但在对新触摸点进行编号时,必须包含完整的坐标消息。
用户通过消息串获取触摸点的信息,而消息串的格式和长度是不确定的,这使得用户在识别和处理消息串时产生了一定的难度。本文设计的中间件的主要功能就是对消息串进行识别和处理,用户在使用中间件后,可以直接获取规范的触摸点信息。在设计时采用了有穷自动机算法的设计思想,将所要处理的消息串作为有穷自动机的输入串,中间件即为可以识别这些输入串的自动机。自动机把驱动产生的消息串作为输入串,当自动机达到可接受状态时,即表明自动机已经识别并处理完成此消息串[3]。使用有穷自动机的算法设计思想可以使中间件的识别处理过程更加清晰明了。
2.2.1 识别A类型协议消息串的自动机设计
A类型协议的消息串由ABS_MT_POSITION_X、ABS_MT_POSITION_Y、SYN_MT_REPORT、SYSYN_REPORT四种类型的消息组成。自动机的状态集由初始状态S和接收4种消息后的4种状态K1、K2、K3、K4组成。K1是自动机接收ABS_MT_POSITION_X消息后转换的状态;K2是自动机接收ABS_MT_POSITION_Y消息后转换的状态;K3是自动机接收SYN_MT_REPORT消息后转换的状态;K4是自动机接收到SYN_REPORT而转换的状态,K4为可接受状态。转换函数f定义为:
由此可以得到自动机的状态转换图,见图1。
图1 识别A类型协议消息串的自动机
2.2.2 识别B类型协议消息串的自动机设计
B类型协议的消息串由ABS_MT_SLOT、ABS_MT_ TRACKING_ID、ABS_MT_POSITION_X、ABS_MT_POSITION_Y、SYN_REPORT五种类型的消息组成,其中ABS_MT_TRACKING_ID消息又分为ID为-1和非负两种类型。自动机的状态集由初始状态S和接收6种消息后的7种状态K1、K2、K3、K4、K5、K6、K7组成。K1是自动机接收ABS_MT_SLOT消息后转换的状态;K2是自动机接收ABS_MT_TRACKING_ID(非负)消息后转换的状态;K3是自动机接收ABS_MT_TRACKING_ID(-1)消息后转换的状态;K4、K5是自动机接收ABS_MT_POSITION_X消息后转换的状态;K6是自动机接收ABS_ MT_POSITION_Y消息后转换的状态;K7是自动机接收SYN_REPORT消息后转换的状态,K7为可接受状态。因为自动机接收到ABS_MT_POSITION_X消息后,会根据当前状态的差异而进入不同的状态,所以ABS_MT_ POSITION_X消息对应两种状态。转换函数f定义为:
由此可以得到此自动机的状态转换图,见图2。
图2 识别B类型协议消息串的自动机
3.1 代码设计
中间件从驱动程序中获取消息串[4],消息串由多个input_event结构体组成。input_event结构体有4个成员,分别是时间戳、类型、代码和数值,类型和代码用来标识消息,数值用来存放消息的内容。例如ABS_MT_POSITION_X 10消息的类型是EV_ABS,代码是ABS_MT_ POSITION_X,数值是10,表明触摸点的X坐标为10。
中间件对消息串的操作按照上文设计的自动机流程进行处理。中间件定义一个状态值用于表明中间件当前的状态。中间件状态值初始为初态,根据输入消息的类型、代码和数值进行状态转换和相应的处理操作,当中间件的状态为可接受状态时,向应用程序上报触摸点信息并转入初态进行下一轮的处理。当中间件在某一状态接收到不能识别的消息时,转入初态,不能识别的消息是指该消息在该状态没有对应的转入状态。
本文设计的中间件在使用时可以作为系统服务运行于操作系统中,也可以作为函数库供用户程序单独使用。
3.2 实验测试
编写了一个中间件测试程序,该程序的功能是通过对触摸屏的操作实现图片的移动、缩放和旋转[5],驱动程序由不同的厂商提供。经过实验,中间件可以识别和处理驱动程序上报的消息串,测试程序可以使用中间件提供的触摸点数据实现对图片的操作[6]。
本文主要设计了可以识别Linux multi-touch协议消息串的有穷自动机模型,并依照此模型编写了多点触摸屏中间件,最后给出了中间件的关键代码并对中间件进行测试。使用本文设计的中间件,可以使开发者免去了对触摸屏驱动程序原始数据的处理而提高开发效率,同时也为Linux multi-touch协议消息串的处理提供了一种思路。
[1]Multi touch(MT)Protocol[EB/OL].[2016-06].https:// www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt.
[2]宋宝华.Linux设备驱动开发详解:基于最新的Linux4.0内核[M].北京:机械工业出版社,2015.
[3]林平凯.基于Linux系统的多点触摸驱动设计[J].信息技术与标准化,2014(6).
[4]崔力升.中间件技术的综述[J].科技视界,2014(3):198-198.
[5]刘斌.基于有限状态机的Linux多点触摸屏驱动设计[J].微计算机信息,2012,28(3):54-56.
[6]泰国栋.有限状态机的嵌入式Linux按键驱动设计[J].单片机与嵌入式系统应用,2010,4(1):79-81.
赵建峰(硕士研究生),主要研究方向为嵌入式系统与应用;陈朔鹰(副教授),主要研究方向为计算机操作系统、嵌入式系统与应用;罗一涵(硕士研究生),主要研究方向为嵌入式系统与应用。
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)