LogyanGFXでテキストを横スクロールする

# はじめに
この記事では、LogyanGFXを使ってテキストの横スクロールの方法について記載します。
News等の長いテキストのスクロール等に使えます。

- LovyanGFX for Windowsでのデバッグ環境の構築
- ソースの修正
- Windows環境でのビルド・デバッグ
- 実機での動作確認

# LovyanGFX for Windowsの環境構築
LovyanGFX for Windowsを使ってみた(https://qiita.com/pokibon/items/4f6f9b1f733ad60c708a )を参考にPC上に環境を構築します。

# ソースの修正
テキストの横スクロールの参考になるサンプルソフトウェアは、LogyanGFXのサンプルに含まれている「LovyanGFX\examples\Standard\LongTextScroll\LongTextScroll.ino」を参考に、LoyanGFX for Winodwsのコードを追加します。
- Arduino固有のソースをWindowsAPIに修正
    delay() → sleep()
    StringクラスをC++のstringクラスに変更
- LovyanGFX固有のコード修正
    デバッグ時の可視化性向上のため、インスタンス作成時に表示倍率に4倍を指定しています。
- 文字のスクロール
    このソースでは漢字を含む文字列を32ドットの明朝体で表示しています。ターゲットとなるLEDパネルのスクロールエリアは64x32ドットですが、これより1文字分多い96x32ドット分のスプライトを作成しています。スプライトを1ドット左にスクロールした後に描画エリアにpushSprite()で描画を繰り返すことにより横スクロールを実現しています。
```
#include <windows.h>    // Sleep()を使うために追加
#include <string>       // string変数を使うために追加
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
#include <LGFX_AUTODETECT.hpp>

#define SCREEN_SIZE_X 64   // 64x32のHUB75 LEDパネルを想定
#define SCREEN_SIZE_Y 32

LGFX gfx ( SCREEN_SIZE_X, SCREEN_SIZE_Y, 4);    // 縦横4倍の拡大表示
static lgfx::LGFX_Sprite cBuf;
#define FONT          &fonts::lgfxJapanMincho_32
#define FONT_SIZE       32
#define FONT_MULTI     1.0


void setup()
{
    gfx.init();
    cBuf.createSprite(SCREEN_SIZE_X + FONT_SIZE, FONT_SIZE);
    cBuf.setTextSize(FONT_MULTI, FONT_MULTI);
    cBuf.setFont(FONT);
    cBuf.setTextWrap(false);
    cBuf.setTextColor(TFT_YELLOW, TFT_BLUE);
    cBuf.clear(TFT_BLUE);
}

const std::string str = "◇AKBONE2022 Break Out News - ◇秘密結社オープンフォースの河野総統は、LEDパネルキットAKB2022をAVTOKYO2022で発表した。◇AKB2022のグラフィックライブラリにはLovyanGFXを使用、漢字表示や高速な描画を実現。◇搭載しているセンサモジュールは、BME280、MPU6500、およびReal Time Clock。◇Linux ボードとして、Sipeed Lichee Nanoを搭載。◇2023年1月 BitTradeOneより発売予定！";
size_t textlen = 0;
size_t textpos = 0;

void loop()
{
    //=====================================================================
    // 文字列をスクロール表示
    //=====================================================================
    textlen = str.length();
    while (1) {
        int32_t cursor_x = cBuf.getCursorX() - 1;   // 現在のカーソル位置を取得し、1ドット左に移動
        if (cursor_x <= 0) // カーソル位置が左端に到達している場合は一周したと判断
        {
            textpos = 0;            // 文字列の読取り位置をリセット
            cursor_x = gfx.width(); // 新たな文字が画面右端に描画されるようにカーソル位置を変更
        }
        cBuf.setCursor(cursor_x, 0); // カーソル位置を更新
        cBuf.scroll(-1, 0);          // キャンバスの内容を1ドット左にスクロール
        while (textpos < textlen && cursor_x <= gfx.width()) // 画面右端に文字が書けるか判定
        {
            //Serial.print(str[textpos]);
            cBuf.print(str[textpos++]);   // 1バイトずつ出力 (マルチバイト文字でもこの処理で動作します)
            cursor_x = cBuf.getCursorX();  // 出力後のカーソル位置を取得
        }
        cBuf.pushSprite(&gfx, 0, 0);
        Sleep(10);
    }
}
```

# Windows環境でのデバッグ
Visual Studio上でデバッグ可能です。表示を拡大することにより、ドット単位で表示位置を確認することができます。
https://twitter.com/pokibon/status/1603533710460067843?s=20&t=8OfZQdGjVuRVe9Aw3BinEA

# 実機での動作確認
デバッグが完了したソースをAKBONE2022＋HUB75のLED PANELで実行してみました。
再現性もばっちりですね。動画でとるとLEDパネルのきれいな色が再現できないのが残念です。
https://twitter.com/pokibon/status/1603534370710507520?s=20&t=8OfZQdGjVuRVe9Aw3BinEA

# まとめ
- LovyanGFX for Windowsを使うことにより、組込みデバイス書き込み前にPC上で動作確認、デバッグができるようになった。
- LovyanGFXのスプライトを使うことにより、テキストの横スクロールをちらつきなしに実現できた。