多點觸控(MT)協議

Copyright: |copy| 2009-2010 Henrik Rydberg [email protected]

此文章爲個人翻譯英文文檔的產物,僅當做個人筆記使用,不喜勿噴!!
對於翻譯內容有強迫症的讀者請勿閱讀此文檔!!
閱讀過程中如有不恰當之處歡迎交流指正~~
如需轉載,請註明出處!

介紹

爲了能夠使用多點觸控和多用戶設備的全部功能,需要一種從各類觸控設備報告詳細數據的方法,例如:設備表面直接接觸設備。本文描述的多點觸控(MT)協議用於內核驅動報告任意數量觸點的詳細信息。

本協議依據硬件的功能分爲兩種類型。對於處理匿名觸點(類型A)的設備,本協議描述如何發送所有觸點的原始數據給接收者。對於能夠跟蹤區分觸點(類型B)的設備,本協議描述瞭如何通過事件slot發送各個觸點的更新。

注意:MT協議類型A已經被淘汰了,所有內核驅動都被轉換到使用類型B。

協議使用

觸點的詳細信息作爲ABS_MT事件的單獨數據包順序發送。只有ABS_MT事件被認爲是觸點包的一部分。因爲這些事件會被當前的單點觸控(ST)應用忽略,MT協議可以在存在於現有驅動中的ST協議上實現。

類型A設備的驅動通過在每個數據包的結尾調用input_mt_sync()實現分離觸點數據包。這將會產生一個SYN_MT_REPORT事件,從而通知接收者接收當前觸點信息,同時準備接收另一個觸點信息。

類型B設備的驅動通過在每個數據包的開頭以slot爲參數調用input_mt_slot()來分離觸點數據包。這會產生一個ABS_MT_SLOT事件,從而通知接收者準備所給的slot的更新。

所有驅動都調用通用input_sync()函數來標記多點觸控轉換結束。這會通知接收者執行自上次EV_SYNC/SYN_REPORT後累計的大量事件,同時準備接收新的事件和數據包。

無狀態的類型A協議和有狀態的類型B插槽協議之間的主要區別在於使用可識別的觸點來減少發送到用戶空間的數據量。使用slot協議需要有ABS_MT_TRACKING_ID,這個由硬件提供或從原始數據中計算得到[#f5]_。

對於類型A設備,內核驅動需要產生當前面板上的所有觸點,數據包出現在事件流中的順序是不重要的。事件過濾和手指追蹤都流給用戶空間去做[#f3_]。

對於類型B設備,內核驅動需要將每個識別的觸點與一個slot關聯,利用這個slot來傳遞對應觸點的變化。觸點的創建、替換和銷燬是通過修改相關聯slot的ABS_MT_TRACTKING_ID完成的。一個無符號的追蹤id代表一個觸點,值-1表示一個未使用的slot。一個未出現的過的追蹤id被認爲是新的,而一個不在出現的追蹤id考慮被移除。因爲只傳遞了變化的信息,每個觸點的全部信息需要保存在接收端。當接收到MT事件時,簡單地更新當前slot的對應屬性。

一些設備識別並/或追蹤的觸點多於他們能夠報告給驅動的數量。這種設備的驅動需要將硬件上報的每一個觸點與一個類型B的slot相關聯。一旦與一個slot關聯的觸點的識別發生改變,驅動需要改變它的ABS_MT_TRACKING_ID使這個slot作廢。如果硬件表明當前追蹤的點比上報的點多,驅動需要使用BTN_TOOL_*TAP事件來告訴用戶空間當前硬件追蹤的總觸點數量。驅動在調用input_mt_report_pointer_emulation()時需要明確地發送相應的BTN_TOOL_*TAP事件,同時設置use_count爲false。驅動程序應該只上報硬件和硬件能夠報告一樣多的slot。用戶空間可以檢測出驅動可以報告比slot更多的總觸點,通過指出最大支持的BTN_TOOL_ * TAP事件大於ABS_MT_SLOT軸的absinfo中報告的類型B的slot數量。

ABS_MT_SLOT軸的最小值必須爲0。

協議例子A

以下是類型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

移動其中一個觸點後的順序看起來完全相同。 在與SYN_REPORT的每次同步之間發送所有當前觸點的原始數據。

以下是第一個觸點離開後的順序:

   ABS_MT_POSITION_X x[1]
   ABS_MT_POSITION_Y y[1]
   SYN_MT_REPORT
   SYN_REPORT

以下是第二個觸點離開後的順序:

   SYN_MT_REPORT
   SYN_REPORT

如果驅動除了ABS_MT事件外還上報BTN_TOUCH或ABS_PRESSURE之一,則最後一個SYN_MT_REPORT事件可能被忽略。另外,最後的SYN_REPORT會被輸入內核放棄,從而導致沒有空觸事件到達用戶層。

協議例子B

以下是類型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

以下是在X方向上移動觸點45後的順序:

   ABS_MT_SLOT 0
   ABS_MT_POSITION_X x[0]
   SYN_REPORT

以下是slot 0中觸點離開後的順序:

   ABS_MT_TRACKING_ID -1
   SYN_REPORT

由於slot被修改爲0,因此這個ABS_MT_SLOT被忽略。這條信息移除了slot 0和觸點45的聯繫,因此銷燬觸點45同時釋放slot 0給另外的觸點再次使用。

最後, 以下是第二個觸點離開後的順序:

   ABS_MT_SLOT 1
   ABS_MT_TRACKING_ID -1
   SYN_REPORT

事件使用

一套含有期望屬性的ABS_MT事件已經被定義了。這些事件被分爲不同的種類,以允許部分實現。最小的集合由ABS_MT_POSITION_X和ABS_MT_POSITION_Y組成,允許多觸點被跟蹤。如果設備支持,ABS_MT_TOUCH_MAJOR和ABS_MT_WIDTH_MAJOR可以分別用於提供觸點面積尺寸和接觸工具尺寸。

TOUCH和WIDTH參數具有幾何解釋; 想象通過窗戶看着某人輕輕地將手指靠在玻璃上。你會看到兩個區域,一個由實際觸碰在玻璃上的手指部分組成的內部區域,一個由手指周邊形成的外部區域。接觸區域的中心(a)爲ABS_MT_POSITION_X/Y,接觸手指的中心(b)爲ABS_MT_TOOL_X/Y。接觸的尺寸爲ABS_MT_TOUCH_MAJOR,手指的尺寸爲ABS_MT_WIDTH_MAJOR。現在想象某人更加用力地按壓在玻璃上,觸摸面積將會增加,總體上ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR的比率與觸點壓力相關,該比率會小於1。對於基於壓力的設備,使用ABS_MT_PRESSURE提供觸點區域的壓力。能夠懸停接觸的設備可以使用ABS_MT_DISTANCE來指示接觸點與表面之間的距離。

在這裏插入圖片描述

除了MAJOR參數外,還可以通過添加MINOR參數來描述觸摸區域和手指區域的橢圓形狀,以使MAJOR和MINOR是橢圓的長軸和短軸。觸摸橢圓的方向可以用ORIENTATION參數描述,而手指橢圓的方向則由矢量(a-b)給出。

對於A型設備,可以通過ABS_MT_BLOB_ID進一步指定觸摸形狀。

ABS_MT_TOOL_TYPE可以用於區分接觸工具是手指、筆或者其他工具。最後,ABS_MT_TRACKING_ID事件可以用於跟蹤一段時間內已識別的觸點[#f5]_。

事件含義

ABS_MT_TOUCH_MAJOR

觸點主軸長度。該長度需要以表面單位給出。如果表面的分辨率是X的Y倍,則ABS_MT_TOUCH_MAJOR的最大可能值爲sqrt(X ^ 2 + Y ^ 2),即對角線[#f4]_。

ABS_MT_TOUCH_MINOR

觸點的短軸長度,單位爲表面單位。如果觸點是元,該事件可以被忽略。

ABS_MT_WIDTH_MAJOR

接觸工具的長軸長度,單位爲表面單位。這要被理解爲工具自身的尺寸。觸點和接觸工具的方向假定是一樣的[#f4]_。

ABS_MT_WIDTH_MINOR

接觸工具的長軸短度,單位爲表面單位。如果爲圓形忽略[#f4]_。

以上四個值可用於導出觸點的其他信息。 比率ABS_MT_TOUCH_MAJOR / BS_MT_WIDTH_MAJOR近似於壓力的概念。 手的手指和手掌都有不同的特徵寬度。

ABS_MT_PRESSURE

接觸區域上的壓力(以任意單位表示)。 對於基於壓力的設備或任何具有空間信號強度分佈的設備,可以代替TOUCH和WIDTH使用。

ABS_MT_ORIENTATION

接觸橢圓的方向。該值應描述圍繞觸摸中心順時針旋轉的四分之一圈。有符號的值範圍是任意的,但對於與曲面的Y軸(北)對齊的橢圓,應返回零;當將橢圓向左旋轉時,應返回負值;當將橢圓向右旋轉時,則應返回正值。當在正方向上與X軸對齊時,應返回最大範圍; 當與X軸在負方向上對齊時,應返回-max範圍。

默認情況下,觸摸橢圓是對稱的。 對於具有真正360度方位角的設備,報告的方位角必須超出最大範圍,以表示超過四分之一圈。 對於倒置的手指,應返回最大* 2的範圍。

如果接觸區域是圓形或者在內核驅動中沒有有效信息,方向可以被忽略。如果設備可以區分兩個軸,但不能(唯一地)區分兩個軸,則可以進行部分定向。在這種情況下,ABS_MT_ORIENTATION的取值範圍爲[0, 1][#f4]_。

ABS_MT_POSITION_X

接觸橢圓中心表面X座標。

ABS_MT_POSITION_Y

接觸橢圓中心表面Y座標。

ABS_MT_TOOL_X

接觸工具的中心表面X座標。如果設備不能區分想要的觸點和工具本身,則可以忽略。

ABS_MT_TOOL_Y

接觸工具的中心表面Y座標。如果設備不能區分想要的觸點和工具本身,則可以忽略。

以上四個位置值可用於將觸摸位置與工具位置分開。如果兩個位置都存在,則主工具軸指向接觸點[#f1]_,否則,工具軸與觸摸軸對其。

ABS_MT_TOOL_TYPE

接觸工具類型。很多內核驅動不能分辨不同的工具類型,例如手指或筆。在這種情況下,該事件應該被忽略。協議當前主要支持MT_TOOL_FINGER,MT_TOOL_PEN和 MT_TOOL_PALM[#f2]_.

對於類型B設備,該事件由輸入內核處理;驅動程序應該改用input_mt_report_slot_state()。一個觸點的ABS_MT_TOOL_TYPE在一直觸摸設備時可能發生改變,因爲當工具首次出現時固件不能夠確定正在使用哪個工具。

ABS_MT_BLOB_ID

BLOB_ID將幾個數據包組合在一起,形成一個任意形狀的觸點。點序列形成定義接觸形狀的多邊形。這是用於類型A設備的低級別匿名分組,不應與高級TrackingID 混淆[#f5] _。大部分的類型A設備沒有這個blob功能,所以驅動可以安全地忽略這個事件。

ABS_MT_TRACKING_ID

TRACKING_ID識別一個觸點並貫穿它的生命週期[#f5]_。TRACKING_ID的值範圍應足夠大,以確保在長時間內能唯一標識觸點。 對於類型B的設備,此事件由輸入內核處理;驅動程序應該改用input_mt_report_slot_state()。

事件計算

不同硬件的多樣性不可避免地導致某些設備比其他設備更適合MT協議。 爲了簡化和統一映射,本節提供瞭如何計算某些事件的方法。

對於將觸點報告爲矩形的設備,無法獲得帶符號的方向。 假設X和Y是矩形矩形的邊長,這是一個簡單的公式,可以保留儘可能多的信息:

   ABS_MT_TOUCH_MAJOR := max(X, Y)
   ABS_MT_TOUCH_MINOR := min(X, Y)
   ABS_MT_ORIENTATION := bool(X > Y)

ABS_MT_ORIENTATION的範圍被設置爲[0, 1],用於表示設備可以分辨手指沿着Y軸(0)和手指沿着X軸(1)。

對於Win8設備具有T和C座標,位置映射爲:

   ABS_MT_POSITION_X := T_X
   ABS_MT_POSITION_Y := T_Y
   ABS_MT_TOOL_X := C_X
   ABS_MT_TOOL_Y := C_Y

不幸的是,沒有足夠的信息去確定是觸摸橢圓還是工具橢圓,因此必須採用近似值。 一種與早期用法兼容的簡單方案是:

   ABS_MT_TOUCH_MAJOR := min(X, Y)
   ABS_MT_TOUCH_MINOR := <not used>
   ABS_MT_ORIENTATION := <not used>
   ABS_MT_WIDTH_MAJOR := min(X, Y) + distance(T, C)
   ABS_MT_WIDTH_MINOR := min(X, Y)

原理:我們沒有關於觸摸橢圓的方向的信息,因此可以使用內接圓來近似它。 工具橢圓應與向量(T-C)對齊,因此直徑必須隨距離(T,C)增大。 最後,假設接觸直徑等於工具厚度,我們得出上面的公式。

## 手指跟蹤

手指跟蹤的過程,即爲表面上的每個已啓動接觸分配唯一的trackingID,是歐幾里得兩部分匹配問題。在每個事件同步中,實際觸點集與來自先前同步的觸點集匹配。 完整的實現可以在下面找到[#f3]_。

## 手勢

在創建手勢事件的特定應用中,TOUCH和WIDTH參數可用於例如估計手指壓力或區分食指和拇指。通過添加MINOR參數,您還可以區分手指是掃動手指還是手指,並且通過ORIENTATION,可以檢測手指的扭曲。

注意

爲了與已存在的應用保持兼容,手指數據包中報告的數據不得被識別爲單點觸摸事件。

對於類型A設備,所有手指數據都繞過輸入過濾,因爲相同類型的後續事件引用了不同的手指。

註釋

  • [#f1] 此外,(TOOL_X - POSITION_X)差值可用於模型傾斜。
  • [#f2] 該列表當然可以擴展。
  • [#f3] mtev項目:http://bitmath.org/code/mtdev/
  • [#f4] 參考事件計算部分。
  • [#f5] 參考手指跟蹤部分
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章