M5Paper: 日本語TTFファイルを SD から SPIFFS へコピー

こちらのページを参考にしました。
[M5Paperに日本語フォントを入れる話](https://note.com/rasen/n/n794d87fd92b7)

SD カード に日本語TTFファイル (font.ttf)があるとします。

フォントの取得 (font.ttf)

```bash
wget https://moji.or.jp/wp-content/ipafont/IPAexfont/ipaexg00401.zip
unzip ipaexg00401.zip
cd ipaexg00401
mv ipaeg.ttf font.ttf
```

## Arduino IDE の設定 ##
>ツールで
>```text
>ボード　"M5Stack-Paper"
>Partition Scheme "Large SPIFFS(7MB)"
>```
>にして下さい。


## プログラム ##

```text:sd_copy.ino
// ---------------------------------------------------------------
//	sd_copy.ino
//
//					Jun/13/2022
// ---------------------------------------------------------------
#include	<M5EPD.h>
#include	<FS.h>

M5EPD_Canvas canvas(&M5.EPD);

// ---------------------------------------------------------------
// SDカードがセットされていれば、SPIFFSを初期化後ipaeg.ttfをコピーする
bool tryCopySDFile() {
	Serial.println("*** tryCopySDFile() ***\r\n");
 const char *path = "/font.ttf";
 if (!SD.begin(4) || !SD.exists(path)) {
	 return SPIFFS.begin(false) && SPIFFS.exists(path);
 }

 canvas.drawString("Copying font ...", 270, 664);
 canvas.pushCanvas(0,0,UPDATE_MODE_DU4);

 Serial.println("Formatting SPIFFS ...");
 if (!SPIFFS.format()) {
		 Serial.println("SPIFFS format Failed");
		 return false;
 }
 if (!SPIFFS.begin()) {
		 Serial.println("SPIFFS Mount Failed");
		 return false;
 }
 Serial.println("Copying font ...");
 File file = SD.open(path);
 SPIFFS.remove(path);
 File dest = SPIFFS.open(path, FILE_WRITE);
 if (!file || !dest) {
	 Serial.println("failed.");
	 return false;
 }
 uint8_t *buf = new uint8_t[4096];
 if (!buf) {
	 Serial.println("failed.");
	 return false;
 }
 size_t len, size, ret;
 size = len = file.size();
 while (len) {
	 size_t s = len;
	 if (s > 4096)
		 s = 4096;
	 file.read(buf, s);
	 if ((ret = dest.write(buf, s)) < s) {
		 Serial.print("write failed: ");
		 Serial.print(ret);
		 Serial.print(" - ");
		 Serial.println(s);
		 return false;
	 }
	 len -= s;
	 Serial.print(size - len);
	 Serial.print(" / ");
	 Serial.println(size);
 }
 delete[] buf;
 file.close();
 dest.close();

 if (!SPIFFS.exists(path)) {
	 Serial.println("no file");
	 return false;
 }
 dest = SPIFFS.open(path);
 len = dest.size();
 dest.close();
 if (len != size) {
	 Serial.print("size not match : ");
	 Serial.println(dest.size());
	 return false;
 }
 Serial.println("*** Done. ***\r\n");
 return true;
}

// ---------------------------------------------------------------
void setup() {
	M5.begin();
	M5.TP.SetRotation(90);
	M5.EPD.SetRotation(90);
	M5.EPD.Clear(true);

	Serial.print("*** setup ***\r\n");

	canvas.createCanvas(540, 960);
	canvas.setTextDatum(TC_DATUM);
	canvas.setTextSize(3);

	Serial.print("*** Initializing ***\r\n");
	canvas.drawString("... Initializing ...", 270, 640);
	canvas.pushCanvas(0,0,UPDATE_MODE_A2);

 if (!tryCopySDFile()) {
	 canvas.drawString("data copy failed !", 270, 254);
	 canvas.pushCanvas(0,0,UPDATE_MODE_DU4);
	 for (;;);
 }

 // SPIFFSからフォントを読み込む
 canvas.drawString("Loading font ...", 270, 230);
 canvas.pushCanvas(0,0,UPDATE_MODE_DU4);
 Serial.println("*** Loading font from SPIFFS. ***\r\n");
 canvas.loadFont("/font.ttf", SPIFFS);
 Serial.println("*** Loading done. ***\r\n");
 canvas.createRender(96, 256);
 canvas.createRender(32, 256);

 canvas.drawString("OK!", 270, 254);
 canvas.pushCanvas(0,0,UPDATE_MODE_DU4);

 M5.EPD.Clear(true);
}

// ---------------------------------------------------------------
void loop() {

 String buf;

 canvas.setTextDatum(TL_DATUM);
 canvas.fillCanvas(0);

 buf = "あいうえお かきくけこ";
 canvas.setTextSize(32);
 canvas.drawString(buf, 12, 16);

 buf = "漢字だよ！";
 canvas.setTextSize(96);
 canvas.drawString(buf, 12, 64);
 canvas.setTextSize(32);
 canvas.drawString("こんにちは 2", 12, 300);
 canvas.pushCanvas(0,0,UPDATE_MODE_A2);

 delay(3000);
canvas.drawString("こんにちは 3", 12, 350);
 canvas.drawString("こんにちは 4", 12, 400);
 canvas.pushCanvas(0,0,UPDATE_MODE_A2);
 delay(3000);
 Serial.print("*** loop ***\r\n");
}
// ---------------------------------------------------------------
```

Arduino IDE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/ca8e5ce8-b327-552b-2a68-df874f637fe5.png)