Newer
Older
M5StickCPlus_FactoryTest2022 / SampleSrc / regexp01.ino
/**
 * 辞書クラスの使用例 (&正規表現の利用)
 */
#include <M5StickCPlus.h>
#include <Dictionary.h>
#include <Regexp.h>

Dictionary *dict = new Dictionary(); // 辞書/ハッシュ。キー文字列→値 を保持するデータ構造

// param2dict関数のなかで使われるコールバック関数
void match_callback(const char *match,         // matching string (not null-terminated)
                    const unsigned int length, // length of matching string
                    const MatchState &ms)      // MatchState in use (to get captures)
{
  char k[10]; // 配列サイズに注意。size must be large enough to hold captures
  char v[10]; // 配列サイズに注意。size must be large enough to hold captures
  ms.GetCapture(k, 0);
  ms.GetCapture(v, 1);
  dict->insert(k, v); // 辞書に追加 (たとえば、 red→120 を追加)
} // end of match_callback

// 下のsetupからは使用していないが、文字列で受け取った複数のパラメータを辞書に設定するサンプル
// たとえば、*cbuf = "red=120&green=255&blue=100" のような文字列をうけとると、辞書に設定する。その後、色を表す整数値として返す
int32_t param2dict(char *cbuf)
{
  MatchState ms(cbuf);                                 // 正規表現マッチャーの作成
  ms.GlobalMatch("([a-z]+)=([0-9]+)", match_callback); // (key)=(value) で複数回マッチングする。match_callback は別関数。
  int r = dict->search("red").toInt();                 // 辞書 dict
  int g = dict->search("green").toInt();
  int b = dict->search("blue").toInt();
  int32_t color = (int(r * 31 / 255) << 11) | (int(g * 63 / 255) << 5) | (int(b * 31 / 255));
  return color;
}

void setup()
{
  M5.begin(115200);          // M5StickCPlusの初期化処理
  M5.Lcd.setRotation(3);     // Aボタンが左側になる向きで画面を使用するよう設定
  M5.Lcd.fillScreen(CYAN);   // 画面を塗りつぶす
  M5.Lcd.setTextColor( BLUE, GREENYELLOW );
  M5.Lcd.setCursor(0, 0, 4); // 左から0,上から0ピクセルの位置にフォントサイズ3の文字を出力するよう設定

  dict->insert("apple", 200); // 辞書に追加
  dict->insert("banana", 100);
  dict->insert("cherry", 300);

  char keys[3][10] = {"banana", "cherry", "apple"};
  for (int k = 0; k < 3; k++)
  {
    Serial.printf("key %s => val %d\n", keys[k], dict->search(keys[k]).toInt());
    M5.Lcd.printf("key %s => val %d\n", keys[k], dict->search(keys[k]).toInt());
  }
}

void loop()
{
  // do nothing
  delay(100);
}