【M5Stack_Core2】タッチパネルの組み込みジェスチャー動いた。

何とか動いたけど。いろいろと調べないと。

スライド f:id:chiyoh:20200929014800p:plain

クリック f:id:chiyoh:20200929014832p:plain

S字ジェスチャー f:id:chiyoh:20200929014855p:plain

とりあえずサンプルプログラム
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();
  
}