【M5Stack_Core2】タッチライブラリ使ってみた

サンプルスケッチにいくつか処理を追加

わかったこと、タッチパネルの機能はほとんど使ってない。ジェスチャに関しては、収得ポイントを使ってライブラリで行っている。F/Wの機能は使っていない。

#include <M5Core2.h>
#include <touch.h>

#define ESP32

// 画面を上下2分割してジェスチャスタート、エンドポイントとする
TouchZone topHalf(0,0,320,120);         // 上側
TouchZone bottomHalf(0,120,320,160);    // 下側

TouchZone leftHalf(0,0,160,240);         // 上側
TouchZone rigthHalf(160,120,160,240);    // 下側

Gesture swipeDown(topHalf, bottomHalf, "Swipe Down");        // ソフトジェスチャ(↓)
Gesture swipeUp(bottomHalf, topHalf, "Swipe Up");            // ソフトジェスチャ(↑)
Gesture swipeLeft(rigthHalf, leftHalf, "Swipe Left");        // ソフトジェスチャ(←)
Gesture swipeRight( leftHalf, rigthHalf,    "Swipe Rigth");  // ソフトジェスチャ(→)

// 画面を4分割してボタンとして割り振る
TouchButton lt = TouchButton(0, 0, 160, 120, "left-top");          // 左上
TouchButton lb = TouchButton(0, 120, 160, 120, "left-bottom");     // 左下
TouchButton rt = TouchButton(160, 0, 160, 120, "right-top");       // 右上
TouchButton rb = TouchButton(160, 120, 160, 120, "right-bottom");  // 右下

void setup() {
  M5.begin();
  M5.Touch.addHandler(eventDisplay);  // イベント発生したら実行
  M5.Touch.addHandler(colorButtons, TE_BTNONLY + TE_TOUCH + TE_RELEASE);

  swipeDown.addHandler(yayWeSwiped_down);  // スタートポイントからエンドポイントに移動したら実行
  swipeUp.addHandler(yayWeSwiped_up);  //  スタートポイントからエンドポイントに移動したら実行
  swipeLeft.addHandler(yayWeSwiped_left);  //  スタートポイントからエンドポイントに移動したら実行
  swipeRight.addHandler(yayWeSwiped_right);  //  スタートポイントからエンドポイントに移動したら実行

  rt.addHandler(dblTapped, TE_DBLTAP); // 右上ゾーンイベントのダブルクリックが発生したら実行

}

void loop() {
  // ループは、アップデートのみ。つまり、タッチのコールバックに登録されたファンクションで処理が行われている。
  M5.update();
}

void eventDisplay(TouchEvent& e) {
  Serial.printf("%-12s finger%d  %-18s (%3d, %3d)", M5.Touch.eventTypeName(e), e.finger, M5.Touch.eventObjName(e),  e.from.x, e.from.y);
  if (e.type != TE_TOUCH && e.type != TE_TAP && e.type != TE_DBLTAP) {
    Serial.printf("--> (%3d, %3d)  %5d ms", e.to.x, e.to.y, e.duration);
  }
  Serial.println();
}

void colorButtons(TouchEvent& e) {
  TouchButton& b = *e.button;
  M5.Lcd.fillRect(b.x, b.y, b.w, b.h, b.isPressed() ? WHITE : BLACK);
}

void yayWeSwiped_down(TouchEvent& e) {
  Serial.println("--- SWIPE DOWN DETECTED ---");
}

void yayWeSwiped_up(TouchEvent& e) {
  Serial.println("--- SWIPE UP DETECTED ---");
}

void yayWeSwiped_right(TouchEvent& e) {
  Serial.println("--- SWIPE RIGHT DETECTED ---");
}

void yayWeSwiped_left(TouchEvent& e) {
  Serial.println("--- SWIPE LEFT DETECTED ---");
}

void dblTapped(TouchEvent& e) {
  Serial.println("--- TOP RIGHT BUTTON WAS DOUBLETAPPED ---");
}

TE_TOUCH タッチした(接触した)

TE_TOUCH     finger0  left-bottom        (110, 196)
TE_RELEASE   finger0  left-bottom        (110, 196)--> (110, 196)     13 ms
TE_TAP       finger0  left-bottom        (110, 196)
TE_TOUCH     finger0  left-bottom        ( 81, 208)
TE_RELEASE   finger0  left-bottom        ( 81, 208)--> ( 81, 208)     52 ms
TE_TAP       finger0  left-bottom        ( 81, 208)
TE_TOUCH     finger0  left-bottom        ( 51, 227)
TE_RELEASE   finger0  left-bottom        ( 51, 227)--> ( 51, 227)     26 ms
TE_TAP       finger0  left-bottom        ( 51, 227)
TE_TOUCH     finger0  left-bottom        ( 34, 220)
TE_RELEASE   finger0  left-bottom        ( 34, 220)--> ( 34, 220)     39 ms
TE_TAP       finger0  left-bottom        ( 34, 220)

パネルに接触時に発生

TE_MOVE 移動した(スワイプ)

TE_TOUCH     finger0  left-top           (  6, 107)
TE_MOVE      finger0  left-top           (  6, 107)--> ( 10, 107)     13 ms
TE_MOVE      finger0  left-top           ( 10, 107)--> ( 15, 107)     26 ms
TE_MOVE      finger0  left-top           ( 15, 107)--> ( 22, 107)     52 ms
TE_MOVE      finger0  left-top           ( 22, 107)--> ( 30, 107)     65 ms
TE_MOVE      finger0  left-top           ( 30, 107)--> ( 39, 107)     91 ms
TE_MOVE      finger0  left-top           ( 39, 107)--> ( 48, 107)    104 ms
TE_MOVE      finger0  left-top           ( 48, 107)--> ( 57, 107)    117 ms
TE_MOVE      finger0  left-top           ( 57, 107)--> ( 66, 107)    143 ms
TE_MOVE      finger0  left-top           ( 66, 107)--> ( 75, 107)    156 ms
TE_MOVE      finger0  left-top           ( 75, 107)--> ( 84, 107)    169 ms
TE_RELEASE   finger0  left-top           (  6, 107)--> ( 84, 107)    195 ms
TE_PRESSED   finger0  left-top           (  6, 107)--> ( 84, 107)    203 ms

タッチしてスワイプして離した。スワイプ中はTE_MOVEが発生

TE_RELEASE ジェスチャー後ある程度時間がたった?

ほかのイベントみればわかるがほとんど指を離したイベントで発生している。 タップとダブルタップでは発生してないので、ある程度の継続時間が必要かも。 PRESSEDでは発生している。

TE_GESTURE ジェスチャーした

TE_TOUCH     finger0  left-top           (153,  61)
TE_MOVE      finger0  left-top           (153,  61)--> (153,  70)     39 ms
TE_MOVE      finger0  left-top           (153,  70)--> (153,  85)     52 ms
TE_MOVE      finger0  left-top           (153,  85)--> (153, 106)     78 ms
TE_MOVE      finger0  left-top           (153, 106)--> (153, 137)     91 ms
TE_MOVE      finger0  left-top           (153, 137)--> (153, 157)    117 ms
TE_RELEASE   finger0  left-top           (153,  61)--> (153, 157)    130 ms
TE_GESTURE   finger0  Swipe Down         (153,  61)--> (153, 157)    130 ms
--- SWIPE DOWN DETECTED ---

上から下にスワイプした

TE_TAP シングルタップ 短く叩いた

TE_TOUCH     finger0  left-bottom        (108, 151)
TE_TAP       finger0  left-bottom        (120, 149)
TE_RELEASE   finger0  left-bottom        (108, 151)--> (108, 151)     26 ms

クリックした

TE_DBLTAP ダブルタップ 二回叩いた

TE_TOUCH     finger0  left-bottom        (135, 128)
TE_RELEASE   finger0  left-bottom        (135, 128)--> (135, 128)     26 ms
TE_DBLTAP    finger0  left-bottom        (135, 128)

ダブルクリップした

TE_DRAGGED ボタンからボタンへ移動(ドラッグ)

TE_TOUCH     finger0  left-top           ( 96,  62)
TE_MOVE      finger0  left-top           ( 96,  62)--> ( 96,  69)     13 ms
TE_MOVE      finger0  left-top           ( 96,  69)--> ( 96,  81)     39 ms
TE_MOVE      finger0  left-top           ( 96,  81)--> ( 96,  97)     52 ms
TE_MOVE      finger0  left-top           ( 96,  97)--> ( 96, 114)     65 ms
TE_MOVE      finger0  left-top           ( 96, 114)--> ( 96, 133)     91 ms
TE_RELEASE   finger0  left-top           ( 96,  62)--> ( 96, 133)    104 ms
TE_DRAGGED   finger0  left-top           ( 96,  62)--> ( 96, 133)    112 ms

スワイプなんだけど、画面四分割でボタン化しているのでその間を挟んでドラックしたイメージ

TE_PRESSED 離した(指が離れた)

TE_TOUCH     finger0  left-bottom        (108, 191)
TE_RELEASE   finger0  left-bottom        (108, 191)--> (108, 191)    585 ms
TE_PRESSED   finger0  left-bottom        (108, 191)--> (108, 191)    593 ms

クリックより遅い感じで離した

マルチタッチ

TE_TAP       finger0  right-bottom       (273, 156)
TE_TOUCH     finger0  left-top           ( 88,  57)
TE_TOUCH     finger1  left-bottom        ( 73, 191)
TE_MOVE      finger1  left-bottom        ( 73, 191)--> ( 73, 190)    178 ms
TE_MOVE      finger1  left-bottom        ( 73, 190)--> ( 73, 189)    269 ms
TE_RELEASE   finger1  left-bottom        ( 73, 191)--> ( 73, 189)    477 ms
TE_PRESSED   finger1  left-bottom        ( 73, 191)--> ( 73, 189)    485 ms
TE_RELEASE   finger0  left-top           ( 88,  57)--> ( 88,  57)    511 ms
TE_PRESSED   finger0  left-top           ( 88,  57)--> ( 88,  57)    519 ms

finger0 が、1本指目、finger1が2本指目。

TE_MOVE      finger1  left-bottom        (261, 222)--> (319, 229)    143 ms
TE_RELEASE   finger1  left-bottom        (135, 206)--> (319, 229)    156 ms
TE_GESTURE   finger1  Swipe Rigth        (135, 206)--> (319, 229)    156 ms
--- SWIPE RIGHT DETECTED ---
TE_RELEASE   finger0  left-top           (124,  57)--> (124,  57)   1417 ms
TE_PRESSED   finger0  left-top           (124,  57)--> (124,  57)   1425 ms

2本指目のイベントはほとんどできるけど、スワイプUP/DOWNは厳しい。1本目の影響がないY軸ラインにいないとできないのかも。

TE_TOUCH     finger0  left-top           (125,  56)
TE_TOUCH     finger1  left-bottom        ( 98, 175)
TE_RELEASE   finger1  left-bottom        ( 98, 175)--> ( 98, 175)     34 ms
TE_RELEASE   finger0  left-top           (125,  56)--> (125,  56)     56 ms
TE_TAP       finger1  left-bottom        ( 98, 175)
TE_TAP       finger0  left-top           (125,  56)

同時マルチタップ 。反応見る限り、下手に組み込みF/Wで判定よりソフトでジェスチャ処理したほうがよさそう?