【M5Stack_Core2】Serial 入力制御

目的を失ってキャレット制御や、BASICやXon/Xoffなどとっ散らかってしまったのでシンプルに入力を

今回わかったこと
M5Core2で使われている、ESP-IDF3.3はRXbufferは256。FIFOでいったん受信したデータは取り出さない限り消えない。
また、bufferをオーバーするとそのデータは消えていく。Serialクラスでは、Xon/Xoffをサポートしていない。ESP32のハードウエアでは サポートしているっぽい。

//
// inkey
//
// 2020/10/11 chiyo.h
//
#include <M5Core2.h>
#include <utility/Sprite.h>
#include <stdio.h>
#define ESP32
TFT_eSprite spr = TFT_eSprite(&M5.Lcd);

int rxBufferClear(){
  int sBuf = Serial.available();
  int dat;
  // read dummy.
  for(int i=0;i<sBuf;i++){
    dat = Serial.read();
  }
  return sBuf;
}

void setup() {
  M5.begin();   // 外部I2C off
  Serial.printf("\n");
  Serial.flush();
  rxBufferClear();  // serial read clear.
  delay(50);
  yield();
  M5.Lcd.fillScreen(WHITE);
  M5.Lcd.setTextColor(BLACK);
  M5.Lcd.setTextSize(2);
  M5.Lcd.clear(WHITE);
  M5.Lcd.setCursor(10, 10);
  M5.Lcd.printf("Serial Test!");
  Serial.println("Serial input test.");
  Serial.print(">");
  // スプライト定義
  spr.setColorDepth(8);       // カラーモード
  spr.createSprite(320, 240); // 大きさ
  spr.fillSprite(TFT_WHITE);

  delay(50);
  yield();
}

char inKey(){
  int rSize = Serial.available();
  if(rSize == 0){
    return 0;
  }
  char c = Serial.read();
  rSize--;
  for(int i=0;i<rSize;i++){
    char d = Serial.read();
  }
  return c;
}

uint32_t color = TFT_BLACK;
void selectColor(uint32_t c){
    switch(c){
    case 'B':
      color = TFT_BLUE;
      break;
    case 'R':
      color = TFT_RED;
      break;
    case 'G':
      color = TFT_GREEN;
      break;
    case 'K':
      color = TFT_BLACK;
      break;
  }
}

void loop() {
  char c = inKey();
  if(c != 0){
    Serial.println(c);
    selectColor(c);   // PC端末の押したキーによって制御を変える
    spr.drawChar(0,0,c,color,TFT_WHITE,4);
    spr.pushSprite(64,64);
    spr.fillSprite(TFT_WHITE);
    Serial.print('>');
  }
  delay(10);
  yield();
}

まとめ:毎回parameter変更してコンパイルしなおすよりキーボード制御でモード切替をして動かすほうがいいかな。