【M5Stack_Core2】Gesture recognition for Core2, on Arduino.
Gesture recognition for Core2, on micropython. pic.twitter.com/Yopap7v7WS
— M5Stack (@M5Stack) 2020年9月27日
公式のまねっこ
// // touch_gesture // ver.02 2020/09/30 chiyoh // #include <M5Core2.h> #include <utility/Sprite.h> #include <touch.h> #include <stdio.h> #define ESP32 #define CST_DEVICE_ADDR 0x38 #define CST_DEVICE_READ_MAX 4 #define CST_DEVICE_WRITE_MAX 4 #define CST_DEVICE_REG_TD_STATUS 0x02 #define CST_DEVICE_REG_P1 0x03 #define CST_DEVICE_REG_GESTURE_ENABLE 0xd0 #define CST_DEVICE_REG_GESTURE_ID 0xd3 TFT_eSprite stext1 = TFT_eSprite(&M5.Lcd); TFT_eSprite stext2 = TFT_eSprite(&M5.Lcd); // 1byte Write uint8_t touchWrite1(uint8_t reg, int8_t value) { // write mode w:reg w:value s Wire1.beginTransmission(CST_DEVICE_ADDR); Wire1.write(reg); Wire1.write(value); uint8_t result = Wire1.endTransmission(); return result; } // 1byte Read uint8_t touchRead1(uint8_t reg) { // read mode w:reg r:value s uint8_t value; Wire1.beginTransmission(CST_DEVICE_ADDR); Wire1.write(reg); Wire1.endTransmission(false); Wire1.requestFrom((uint16_t)CST_DEVICE_ADDR, (uint8_t)1); value = Wire1.read(); return value; } // burstRead uint8_t touchReadBurst(uint8_t reg, uint8_t size, uint8_t* data) { uint8_t result=0; Wire1.beginTransmission((uint8_t)CST_DEVICE_ADDR); Wire1.write(reg); Wire1.endTransmission(false); result = Wire1.requestFrom((uint16_t)CST_DEVICE_ADDR, size); for(uint8_t i=0; i<size; i++){ data[i] = Wire1.read(); } return result; } uint8_t td_status(){ return touchRead1((uint8_t)CST_DEVICE_REG_TD_STATUS); } void gesture_enable(){ touchWrite1((uint8_t)CST_DEVICE_REG_GESTURE_ENABLE, 0x01); } uint8_t gestureID(){ return touchRead1((uint8_t)CST_DEVICE_REG_GESTURE_ID); } char* gestureName(uint8_t id){ char* gName; switch(id){ case 0x00: gName = "no-gesture"; break; case 0x20: gName = "right-slide"; break; case 0x21: gName = "left-slide"; break; case 0x22: gName = "up-slide"; // 途中で止める?突き抜けると0になる? break; case 0x23: gName = "down-slide"; break; case 0x24: gName = "double-click"; break; case 0x30: gName = "o gesture"; break; case 0x31: gName = "w gesture"; break; case 0x32: gName = "m gesture"; break; case 0x33: gName = "e gesture"; break; case 0x34: gName = "c gesture"; break; case 0x35: gName = "g gesture"; break; case 0x36: gName = "a gesture"; break; case 0x37: gName = "d gesture"; break; case 0x40: gName = "n gesture"; break; case 0x41: gName = "???"; break; case 0x42: gName = "b gesture"; break; case 0x43: gName = "(q) ???"; break; case 0x44: gName = "L gesture"; break; case 0x45: gName = "P gesture"; break; case 0x46: gName = "S gesture"; break; case 0x47: gName = "u gesture"; break; case 0x50: gName = "@ gesture"; break; case 0x51: gName = "(<) ???"; break; case 0x52: gName = "> gesture"; break; case 0x53: gName = "^ gesture"; break; case 0x54: gName = "v gesture"; break; case 0x60: gName = "3 gesture"; break; case 0x61: gName = "6 gesture"; break; case 0x62: gName = "(8) ???"; break; case 0x63: gName = "7 gesture"; break; case 0x64: gName = "(9) ???"; break; case 0x65: gName = "2 gesture"; break; case 0x70: gName = "h gesture"; break; case 0x71: gName = "k gesture"; break; case 0x72: gName = "y gesture"; break; case 0x73: gName = "r gesture"; break; default: gName = "???"; } return gName; } uint8_t touchPoint(uint16_t* x, uint16_t* y){ uint8_t e,dat[4]; dat[0] = touchRead1((uint8_t)(CST_DEVICE_REG_P1 +0)); dat[1] = touchRead1((uint8_t)(CST_DEVICE_REG_P1 +1)); dat[2] = touchRead1((uint8_t)(CST_DEVICE_REG_P1 +2)); dat[3] = touchRead1((uint8_t)(CST_DEVICE_REG_P1 +3)); e = (dat[0] >> 6) & 0x03; *x = ((dat[0]<<8)|dat[1]) & 0x0fff; *y = ((dat[2]<<8)|dat[3]) & 0x0fff; return e; } void setup() { M5.begin(); // 外部I2C off Serial.printf("\n"); Serial.flush(); delay(50); yield(); stext1.setColorDepth(8); stext1.createSprite(320, 32); stext1.fillSprite(TFT_WHITE); stext1.setTextColor(TFT_BLACK); stext2.setColorDepth(8); stext2.createSprite(320, 32); stext2.fillSprite(TFT_WHITE); stext2.setTextColor(TFT_BLACK); M5.Lcd.fillScreen(WHITE); M5.Lcd.setTextColor(BLACK); M5.Lcd.setTextSize(2); M5.Lcd.clear(WHITE); M5.Lcd.setCursor(10, 10); M5.Lcd.printf("touch GESTURE Test!"); gesture_enable(); delay(500); yield(); } uint8_t tds=0; uint8_t tds_old=0; uint8_t id=0; uint8_t id_old=0; void loop() { char buf[80]; char* c; uint16_t x,y; uint8_t e,e_old; tds = td_status(); e = touchPoint(&x, &y); sprintf(buf,"event:%d,%d P1(%d,%d)",tds,e,x,y); stext1.fillSprite(TFT_WHITE); stext1.drawString(buf, 0, 0, 4); // (0,0) font #4 stext1.pushSprite(16, 32); if(tds==1){ if(tds_old==0){ M5.Lcd.fillScreen(WHITE); M5.Lcd.fillCircle(x, y, 8, RED); tds_old=1; }else{ M5.Lcd.fillCircle(x, y, 4, BLUE); } }else if(tds_old==1){ tds_old=0; } id = gestureID(); if(id != id_old){ id_old = id; c = gestureName(id); sprintf(buf,"gesture:%d(%s)",id,c); stext2.fillSprite(TFT_WHITE); stext2.drawString(buf, 0, 0, 4); // (0,0) font #4 stext2.pushSprite(16, 64); } delay(50); yield(); }
【M5Stack_Core2】タッチパネルの組み込みジェスチャー動いた。
何とか動いたけど。いろいろと調べないと。
スライド
クリック
S字ジェスチャー
とりあえずサンプルプログラム
gesture_id が分かりにくい。とりあえず、いろいろ文字を書いてみてどのコードになるのか調査しないと。
注意:gesture_idは、10分くらい動かして調べたCODE No.なので違う文字ジェスチャーの可能性もある。
gesture_id:いくつか更新2020/09/29
// // touch_gesture // ver.01 2020/09/28 chiyoh // #include <M5Core2.h> #include <utility/Sprite.h> #include <touch.h> #include <stdio.h> #define ESP32 #define CST_DEVICE_ADDR 0x38 #define CST_DEVICE_READ_MAX 4 #define CST_DEVICE_WRITE_MAX 4 #define CST_DEVICE_REG_TD_STATUS 0x02 #define CST_DEVICE_REG_P1 0x03 #define CST_DEVICE_REG_GESTURE_ENABLE 0xd0 #define CST_DEVICE_REG_GESTURE_ID 0xd3 TFT_eSprite stext1 = TFT_eSprite(&M5.Lcd); TFT_eSprite stext2 = TFT_eSprite(&M5.Lcd); // 1byte Write uint8_t touchWrite1(uint8_t reg, int8_t value) { // write mode w:reg w:value s Wire1.beginTransmission(CST_DEVICE_ADDR); Wire1.write(reg); Wire1.write(value); uint8_t result = Wire1.endTransmission(); return result; } // 1byte Read uint8_t touchRead1(uint8_t reg) { // read mode w:reg r:value s uint8_t value; Wire1.beginTransmission(CST_DEVICE_ADDR); Wire1.write(reg); Wire1.endTransmission(false); Wire1.requestFrom((uint16_t)CST_DEVICE_ADDR, (uint8_t)1); value = Wire1.read(); return value; } // burstRead uint8_t touchReadBurst(uint8_t reg, uint8_t size, uint8_t* data) { uint8_t result=0; Wire1.beginTransmission((uint8_t)CST_DEVICE_ADDR); Wire1.write(reg); Wire1.endTransmission(false); result = Wire1.requestFrom((uint16_t)CST_DEVICE_ADDR, size); for(uint8_t i=0; i<size; i++){ data[i] = Wire1.read(); } return result; } uint8_t td_status(){ return touchRead1((uint8_t)CST_DEVICE_REG_TD_STATUS); } void gesture_enable(){ touchWrite1((uint8_t)CST_DEVICE_REG_GESTURE_ENABLE, 0x01); } uint8_t gestureID(){ return touchRead1((uint8_t)CST_DEVICE_REG_GESTURE_ID); } char* gestureName(uint8_t id){ char* gName; switch(id){ case 0x00: gName = "no-gesture"; break; case 0x20: gName = "right-slide"; break; case 0x21: gName = "left-slide"; break; case 0x22: gName = "up-slide"; // 途中で止める?突き抜けると0になる? break; case 0x23: gName = "down-slide"; break; case 0x24: gName = "double-click"; break; case 0x30: gName = "o gesture"; break; case 0x31: gName = "w gesture"; break; case 0x32: gName = "m gesture"; break; case 0x33: gName = "e gesture"; break; case 0x34: gName = "C gesture"; break; case 0x35: gName = "g gesture"; // 9→g(9を書く感じで初めてgで終わる) break; case 0x36: gName = "a gesture"; break; case 0x37: gName = "d gesture"; // 筆記体 break; case 0x40: gName = "n gesture"; break; case 0x41: gName = "???"; break; case 0x42: gName = "b gesture"; break; case 0x43: gName = "(q) ???"; // a sとかに認識する書き順不明 break; case 0x44: gName = "L gesture"; break; case 0x45: gName = "P gesture"; break; case 0x46: gName = "S gesture"; break; case 0x47: gName = "u gesture"; break; case 0x50: gName = "@ gesture"; break; case 0x51: gName = "(<) ???"; // Cと認識するから <はないのかも break; case 0x52: gName = "> gesture"; break; case 0x53: gName = "^ gesture"; break; case 0x54: gName = "v gesture"; break; case 0x60: gName = "3 gesture"; break; case 0x61: gName = "6 gesture"; break; case 0x62: gName = "(8) ???"; // 書き順不明 break; case 0x63: gName = "7 gesture"; // Lを回転した形で break; case 0x64: gName = "(9) ???"; // 書き順不明 break; case 0x65: gName = "2 gesture"; break; case 0x70: gName = "h gesture"; break; case 0x71: gName = "k gesture"; // ブロック体(一筆書き) break; case 0x72: gName = "y gesture"; // ブロック体(一筆書き) break; case 0x73: gName = "r gesture"; break; default: gName = "???"; } return gName; } uint8_t touchPoint(uint16_t* x, uint16_t* y){ uint8_t e,dat[4]; dat[0] = touchRead1((uint8_t)(CST_DEVICE_REG_P1 +0)); dat[1] = touchRead1((uint8_t)(CST_DEVICE_REG_P1 +1)); dat[2] = touchRead1((uint8_t)(CST_DEVICE_REG_P1 +2)); dat[3] = touchRead1((uint8_t)(CST_DEVICE_REG_P1 +3)); e = (dat[0] >> 6) & 0x03; *x = ((dat[0]<<8)|dat[1]) & 0x0fff; *y = ((dat[2]<<8)|dat[3]) & 0x0fff; return e; } void setup() { M5.begin(); // 外部I2C off Serial.printf("\n"); Serial.flush(); delay(50); yield(); stext1.setColorDepth(8); stext1.createSprite(320, 32); stext1.fillSprite(TFT_WHITE); stext1.setTextColor(TFT_BLACK); stext2.setColorDepth(8); stext2.createSprite(320, 32); stext2.fillSprite(TFT_WHITE); stext2.setTextColor(TFT_BLACK); M5.Lcd.fillScreen(WHITE); M5.Lcd.setTextColor(BLACK); M5.Lcd.setTextSize(2); M5.Lcd.clear(WHITE); M5.Lcd.setCursor(10, 10); M5.Lcd.printf("touch GESTURE Test!"); gesture_enable(); delay(500); yield(); } void loop() { char buf[80]; char* c; uint16_t x,y; uint8_t tds = td_status(); uint8_t e = touchPoint(&x, &y); uint8_t id = gestureID(); sprintf(buf,"event:%d,%d P1(%d,%d)",tds,e,x,y); stext1.fillSprite(TFT_WHITE); stext1.drawString(buf, 0, 0, 4); // (0,0) font #4 c = gestureName(id); sprintf(buf,"gesture:%d(%s)",id,c); stext2.fillSprite(TFT_WHITE); stext2.drawString(buf, 0, 0, 4); // (0,0) font #4 stext1.pushSprite(16, 32); stext2.pushSprite(16, 64); delay(500); yield(); }
【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で判定よりソフトでジェスチャ処理したほうがよさそう?
【M5Stack_Core2】新しいタッチライブラリ
M5Core2のライブラリが更新されて、タッチパネルのライブラリが大幅に更新されました。
ざっと見た感じ、このBLOGで指摘していた感じのことがドキュメントに書かれています。
やっぱり、そうなのね。という感じです。
タッチライブラリですが、
- Arduinoスタイルのボタン対応
- タッチジェスチャー対応 ※ライブラリで対応
- マルチタッチ一部対応(垂直のみ) ※本体を90°回転してもパネルは物理的に変わらないので反応しない。
- タッチゾーン登録(あらかじめボタンエリア登録)
- wasPressed() ボタンを離した
- isPressed() ボタンを押した
- ジェスチャー、ゾーン1、2を登録して1から2に移動中にジェスチャーをして判定
- イベント関数
- TE_TOUCH タッチした(接触した)
- TE_MOVE 移動した(スワイプ)
- TE_RELEASE ジェスチャー後ある程度時間がたった?
- TE_GESTURE ジェスチャーした
- TE_TAP シングルタップ 短く叩いた
- TE_DBLTAP ダブルタップ 二回叩いた
- TE_DRAGGED ボタンからボタンへ移動(ドラッグ)
- TE_PRESSED 離した(指が離れた)
初リリースされて、まだ、数週間ですが、既にレガシーAPI呼ばわりされている。M5Core2 Factory Test等で 使用されていた、isPressed()関数とgetPressedPoint()関数、HotZonesは、一応まだ残しておくけど、今後 使わないでねって。おもっきりあちこちの雑誌とかでこう使うとか紹介されてそう。
サンプルスケッチとかがあるので使ったら使い方がわかるよと書かれているのでこれから使ってみようと思います。
【M5Stack_Core2】Core2_Factory_testとは?
Core2_Factory_testは、製品に出荷時に組み込まれているプログラムなのだが、どっちかというとプロモーションっぽいところがある。 工場出荷時の最終チェックプログラムと考えると、スペックをこれですべてチェック出来ているのか不安になる。 しばらくは、使い方やタッチスクリーンのプログラムの流れとかを学習するように解析をしたり、中途半端に切り捨てられた機能を 元通りにしていく感じか。なんかこれ、学習用プログラム(未完成)っぽい要素があってそういう意味でも出荷チェックプログラムじゃないよね。
【M5Stack_Core2】Core2_Factory_test解析
jpeg file
mono file
@rem jpeg バッテリーチャージ python code2bin.py batPower.c @rem jpeg 時間再描画 python code2bin.py clockImage.c @rem jpeg 起動画面 python code2bin.py Core2Cover.c @rem jpeg メイン画面 python code2bin.py Core2Main.c @rem jpeg アプリ(IMU)メニュー画面 python code2bin.py imageMenu.c @rem jpeg SDカード再描画 python code2bin.py sdCardImage.c @rem jpeg SYSTEMアプリ画面 python code2bin.py SettingAppImage.c @rem jpeg タイマーアプリ python code2bin.py TimerAppImage.c @rem jpeg タッチスクリーン座標再描画 python code2bin.py touchImage.c @rem jpeg WIFIアプリ画面 python code2bin.py WifiSacn.c @rem audio タッチ音 python code2bin.py bibisig.c @rem audio 起動音 python code2bin.py preview_R.c @rem 7 DisBatbuff.drawColorBitmap(31,19,27,11, batRect[sytState.batCount], 0xff9c00, 0x000000); python code2drawColorBitmap.py batRect.c -width 27 27 27 27 27 27 27 @rem 11 DisClockbuff.drawColorBitmap(posx[0],26,24,42, DigNumber[ sytState.Rtctime.Hours / 10 ], 0xff9c00, 0x1a1100); python code2drawColorBitmap.py digNumber.c -width 24 24 24 24 24 24 24 24 24 24 24 @rem 11 DisClockbuff.drawColorBitmap(posx[4],33,18,35, DigNumber_35px[ sytState.Rtctime.Seconds / 10 ], 0xff9c00, 0x1a1100); python code2drawColorBitmap.py digNumber_35px.c -width 18 18 18 18 18 18 18 18 18 18 18 @rem 6 DisClockbuff.drawColorBitmap(0,0,164,17, rectptrBuff[sytState.clockCount], 0xff9c00, 0x000000); python code2drawColorBitmap.py image.c -width 164 164 164 164 164 164 @rem 4 Disbuff.drawColorBitmapAlpha(posx,posy,53,33, (uint8_t*)ptr2, color, 0x000000); python code2drawColorBitmap.py initImage.c -width 53 53 53 53 @rem 16 DisBatbuff.drawColorBitmap(3,20,7,10, Number_7x10px[batVoltage1], 0xff9c00, 0x000000); @rem DisTouchbuff.drawColorBitmap(19,15,3,10, (uint8_t*)Number_7x10px[13], 0xff9c00, 0x000000); @rem DisBatbuff.drawColorBitmap(3,37,60,10, Number_7x10px[14], color, 0x000000); python code2drawColorBitmap.py Number8x7.c -width 7 7 7 7 7 7 7 7 7 7 7 7 7 3 60 7 @rem 4 @rem DisPowerbuff.drawColorBitmap(0,65,77,37, (uint8_t*)image_External, color2, 0x000000); @rem DisPowerbuff.drawColorBitmap(0,0,77,37, (uint8_t*)image_Internal, color1, 0x000000); @rem DisPowerbuff.drawColorBitmap(0,39,77,24, (uint8_t*)image_power, 0xff9c00, 0x000000); @rem DisPowerbuff.drawColorBitmap(54,posy,20,31, (uint8_t*)image_PowerC, 0xae2828, 0x000000); python code2drawColorBitmap.py power.c -width 77 77 77 20 @rem 7 @rem (未使用) python code2drawColorBitmap.py rect_320_20.c -width 320 320 320 320 320 320 320 @rem 6 @rem Disbuff.drawColorBitmap(122,98,76,44, TouchFishBuff[count_n], 0xff9c00, 0x000000); python code2drawColorBitmap.py touchFish.c -width 76 76 76 76 76 76