MTP 多點觸控協議資訊獲取

2021-08-19 19:26:46 字數 3187 閱讀 9099

附:**例項

多點觸控協議有兩種,a協議和b協議。

首先來看a協議,協議上說了報點格式是這樣的,以兩點為例:

abs_mt_position_x x[0]

abs_mt_position_y y[0]

syn_mt_report

abs_mt_position_x x[1]

abs_mt_position_y y[1]

syn_mt_report

syn_report

如果第乙個觸點離開(抬起),這裡的意思是說還有乙個觸點,需要繼續上報這個觸點。

abs_mt_position_x x[1]

abs_mt_position_y y[1]

syn_mt_report

syn_report

如果兩個觸點都離開了,那麼只需要報告乙個同步事件就可以了。

syn_mt_report
syn_report

對於b協議就稍微顯得有點複雜。b協議需要硬體支援,和a協議主要區別在**呢?b協議可以使用乙個id來標識觸點,可以減少上報到使用者空間的資料量,這個id(abs_mt_tracking_id)可以有硬體提供或者從原始資料計算而得。那》麼下面我們就來看b協議怎麼上報資料的。

abs_mt_slot 0

abs_mt_tracking_id 45

abs_mt_position_x x[0]

abs_mt_position_y y[0]

abs_mt_slot 1

abs_mt_tracking_id 46

abs_mt_position_x x[1]

abs_mt_position_y y[1]

syn_report

如果觸點45只是在x方向做了移動,那麼應該怎麼報告這個事件呢?

abs_mt_slot 0

abs_mt_position_x x[0]

syn_report

可以看到減少了很多資料的上報,這就是同a協議最大的區別。

如果同slot 0相關的觸點離開(抬起),只需要做下面的操作。

abs_mt_tracking_id -1

syn_report

這裡為什麼沒有傳送abs_mt_slot 0事件呢,因為之前slot已經被置成了0,再次傳送abs_mt_slot 0是會被忽略掉的。

如果第二個觸點被抬起,傳送下面的事件序列。

abs_mt_slot 1

abs_mt_tracking_id -1

syn_report

其他event 位於uapi/linux/input-event-codes.h

abs_mt_position_x和abs_mt_position_y是多點觸控協議的最小事件集,是最基本的事件,也是必須的事件。除此之外呢,還包括下面的一些時間集(需要設定支援):

abs_mt_touch_major

abs_mt_touch_minor

abs_mt_touch*用來表示接觸點區域大小(即手指與玻璃接觸區域大小),通常接觸區域是乙個橢圓形狀,那麼major就表示橢圓的長軸,而minor就表示橢圓的短軸。如果接觸區域是圓形的話,那麼可以忽略minor,而major就表示圓形的直徑大小。

abs_mt_width_major

abs_mt_width_minor

上面的touch表示接觸區域的大小,而width則表示為接觸工具的大小(例如手指,觸控筆等)。

abs_mt_pressure

而pressure表示壓力值,這個壓力值可以通過上面的4個引數計算而得,例如:abs_mt_touch_major/abs_mt_width_major,可以看到接觸面積越大,壓力值也就越大。當然這個壓力值也可以直接由裝置提供。

abs_mt_distance

觸點與接觸面的距離,0表示觸點在接觸面的表面(已經實實在在的接觸到了),而正數表示在接觸面的上方。

abs_mt_orientation

觸點的方向。

abs_mt_tool_x

abs_mt_tool_y

abs_mt_tool_type

**例項:

#include

#include

#include

#include

#include

#include

struct touch_info ;

int main( void )  

while (1)  

else if ( fd_isset( fd, &rds ) )  

if (ev_key==event.type)                   }}

if (ev_abs==event.type)

switch(event.code)

break;

case abs_mt_tracking_id :

touch[num].id = event.value;

if(touch[num].id != -1)

}else

break;

case abs_mt_width_major :

touch[num].h = event.value;

printf("touch[%d].h =  %d\n",num, touch[num].h);

flag_a = 0;

break;

case abs_mt_width_minor :

touch[num].w = event.value;

printf("touch[%d].w =  %d\n",num, touch[num].w);

flag_b = 0;

break;

#if 0

case abs_mt_touch_major :

axis_x = event.value/2;

break;

case abs_mt_touch_minor :

axis_y = event.value/2;

printf("touch[%d].area = %0.2f\n",num, 3.14*axis_x*axis_y);

#endif}}

}  }

close( fd );  

return(0);  

}  

linux 多點觸控協議

多點觸控協議 討論 datangsoc hotmail.com 簡介 為了使用功能強大的多點觸控裝置,一種方案是上報使用者層所需的詳細的手指觸控資料。這個文件所描述的多點觸控協議可以讓核心驅動程式向使用者層上報任意多指的資料資訊。使用說明 任何乙個手指的觸控資料都是打包成 abs event 包按順...

linux 多點觸控協議

多點觸控協議 討論 datangsoc hotmail.com 簡介 為了使用功能強大的多點觸控裝置,一種方案是上報使用者層所需的詳細的手指觸控資料。這個文件所描述的多點觸控協議可以讓核心驅動程式向使用者層上報任意多指的資料資訊。使用說明 任何乙個手指的觸控資料都是打包成 abs event 包按順...

http協議 呼叫API介面來獲取天氣資訊

api介面獲取 api可以查詢裝置基本資訊,同時包含時間資訊,可用於更新時間 id 584512522 auth info d001 datastreams title 一路開關 desc tags error succ api可以查詢裝置資料節點的資料 返回資料格式如下所示 error succ ...