M5Unified の HelloWorld! のプラグラムをざっくり理解する

## 本記事について

[M5Unifiedライブラリの始め方](https://docs.m5stack.com/ja/quick_start/m5unified/helloworld#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE%E5%85%A5%E5%8A%9B)のプラグラムが実行できたので、次はこのプラグラムを理解する。

## 前提

[M5AtomS3でHello World! with mac](https://qiita.com/Teach/items/9d0f21736808f44e2abc)

## 該当のコード

長くはないため全部貼る

```main.cpp
#include <M5Unified.h> // M5Unifiedライブラリをプログラムで使用可能にします。

// グローバル変数（プログラム全体で使用する変数の定義をします。）
uint32_t count;


// setup関数は起動時に一度だけ実行されます。
// 主に初期化処理を記述します。
void setup() {

  auto cfg = M5.config();       // M5Stack初期設定用の構造体を代入
  // configを設定する場合はここで設定
  // 例
  // cfg.external_spk = true;

  M5.begin(cfg);                           // M5デバイスの初期化

  M5.Display.setTextSize(3);               // テキストサイズを変更
  M5.Display.print("Hello World!!");       // 画面にHello World!!と1行表示
  Serial.println("Hello World!!");         // シリアルモニターにHello World!!と1行表示
  count = 0;                               // countを初期化

}

// loop関数は起動している間ずっと繰り返し実行されます。
// センサーから値を取得したり、画面を書き換える動作等をおこないます。
void loop() {

  M5.Display.setCursor(0, 20);              // 文字の描画座標（カーソル位置）を設定
  M5.Display.printf("COUNT: %d\n", count);  // countを画面に表示
  Serial.printf("COUNT: %d\n", count);      // countをシリアルに表示
  count++;                                  // countを1増やす
  delay(1000);                              // 1秒待つ

}

```

これを読んで以下の疑問が浮かんだ。

- config, begin って何？
- M5.Displayって何？
- setTextSizeの3って何？
- Hello World!を画面に収めるにはどうすればいい？

これらを一つずつ調べていく。

## config, begin って何？

これに関しては[M5Unifiedへの移植のポイント](https://docs.m5stack.com/ja/quick_start/m5unified/migration)に書いてあった。

configのドキュメントは[ここ](https://docs.m5stack.com/ja/api/m5unified/m5unified_appendix#m5config)

定義ジャンプでサクッと見れるためコード直で見るのもいいと思う

https://github.com/m5stack/M5Unified/blob/0.1.7/src/M5Unified.hpp#L85

begin が具体的に何をやってるかは調べてないけど、config は begin のためのパラメータであることは理解した。

## M5.Displayって何？

begin と同じく　[M5Unifiedへの移植のポイント](https://docs.m5stack.com/ja/quick_start/m5unified/migration#%E7%94%BB%E9%9D%A2%E6%8F%8F%E7%94%BB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)の「画面描画について」の項目に書いてある。

> 画面付きのデバイスではM5.DisplayでM5GFXのAPIを使用することができます。定義は必要ありません。

M5.Display は M5GFX そのもの

```M5Unified.hpp
M5GFX &Display = _primaryDisplay;
```

https://github.com/m5stack/M5Unified/blob/0.1.7/src/M5Unified.hpp#L162

左側にリンクがある

![スクリーンショット_2023-06-23_22_38_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/4a23f03d-0664-7c47-854c-7fb21143a1dd.png)

## setTextSizeの3って何？

https://docs.m5stack.com/en/api/m5gfx/m5gfx_functions#settextsize

ドキュメントには単位は書いてなかった。(2023/06時点)
まぁ大体わかればいいだろうということで実験してみた。

size 1,2,3でそれぞれ ATOM S3 の画面に出してみた。

```main.cpp
#include <M5Unified.h>

void setup()
{
  auto cfg = M5.config();
  M5.begin(cfg);
  USBSerial.begin(115200);

  M5.Display.setTextSize(1);
  M5.Display.print("aaaaaaaaaa");
  M5.Display.setCursor(0, 20);

  M5.Display.setTextSize(2);
  M5.Display.print("aaaaaaaaaa");
  M5.Display.setCursor(0, 40);

  M5.Display.setTextSize(3);
  M5.Display.print("aaaaaaaaaa");
}

void loop()
{
}

```

結果が以下。

![IMG_5443.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/867529d4-d481-6bf5-81d8-d35a00bf7635.jpeg)

デフォルトのフォント等の設定の場合、ATOM S3 では

TextSize 1 : a が10個で半分くらい
TextSize 2 : a が10個でほぼ右端。これ以上入らなそう
TextSize 3 : a が7個分入る

## Hello World!を画面に収めるにはどうすればいい？

```main.cpp
#include <M5Unified.h>

void setup()
{
  auto cfg = M5.config();
  M5.begin(cfg);
  USBSerial.begin(115200);

  M5.Display.setTextSize(1);
  M5.Display.print("Hello World!");
  M5.Display.setCursor(0, 20);

  M5.Display.setTextSize(1.5);
  M5.Display.print("Hello World!");
  M5.Display.setCursor(0, 40);

  M5.Display.setTextSize(2);
  M5.Display.print("Hello World!");
}

void loop()
{
}

```

![IMG_5444.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/64e146dc-8ce0-a5cf-fff8-b4a744f3d241.jpeg)

TextSize 2 だと入らない。 1.5 なら入ることがわかった。