fig161103a2ILI9341には,画面をスクロールさせる機能がある。VerticalScrollDifinition(33h)コマンドで、上下の非スクロールエリアの幅を設定(リセット時は0)。VerticalScrollStartAddress(37h)コマンドでスタート位置を設定すれば、Vertical Scroll Areaの表示を自由にスクロール(回転?)表示できる。




このことは以前から知っていたので、いずれHublisoft_ILI9341ライブラリでサポートし、HSES-LCD24で使おうと考えていた。今、HSES-LCDのデモ用にRss表示プログラムを作成している。RSSの表示に、このスクロール機能を使って、大きな文字で下図のような表示をするべく作業していた。

fig161103a1

ところが、いろいろ試していくうち、そんな変な表示をするより、普通にテキストの改行時にスクロールさせた方が、見栄えも良いし、汎用性もあることに気が付いた。

fig161103a3
というわけで、Humblesoft_ILI9341ライブラリにVerticalScrollArea機能を実装、公開した。

使い方を説明する。Humblesoft_ILI9341クラスにpublicなメンバーとしてtfa,vsa,bfaを追加した。これらは、それぞれ Top Fixed Area, Vertical Scroll Area, Bottom Fixed Area  に対応するAdafruit_GFXクラスのサブクラスで、Humblesoft_ILI9341クラス同様に描画できる。fontxの設定を行えば、漢字の描画も可能。

それぞれの領域の高さはsetVerticalScrollAreaメソッドで行う。設定しなければ全領域がvsaとなる。print/println/printfメソッドで文字描画後、カーソル位置が下限を超えた場合、vsa領域のみスクロールされる。

サンプルプログラムは、Humblesoft_ILI9341/vsaSample.inoにある。

[cpp]
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include "Fontx.h"
#include "FontxGfx.h"
#include "Humblesoft_ILI9341.h"

IMPORT_BIN("fontx/ILGH16XB.FNT", font_h);
IMPORT_BIN("fontx/ILGZ16XB.FNT", font_z);
extern uint8_t font_h[], font_z[];

Humblesoft_ILI9341 tft = Humblesoft_ILI9341();

void setup()
{
Serial.begin(115200);
delay(100);
Serial.println("\n\nReset:");

tft.begin();
tft.setVerticalScrollArea(20,20);

tft.tfa.fillScreen(ILI9341_RED);
tft.vsa.fillScreen(ILI9341_BLACK);
tft.bfa.fillScreen(ILI9341_BLUE);
tft.tfa.setTextSize(2);
tft.tfa.print("TFA");
tft.vsa.setTextColor(ILI9341_WHITE);
tft.vsa.setFontx(font_h, font_z);
tft.vsa.print("VSA - Vertical Scroll Area\n");
tft.bfa.print("BFA");
}

void loop()
{
static int i=1;
tft.vsa.printf("%d行目\n",i++);
delay(1000);
}
[/cpp]

使用上の注意がいくつかある。このスクロール機能は、setRotation(0)の時しか、まともに動かない。tftに対する描画はスクロールのことを考慮していないので、 vsaでスクロールが発生した後は、変になるはず。getTextBoundsの処理がちょっと間違っている気がする。

あと、従来 Humblesoft_ILI9341に入っていたfontx関連機能をFontxとFontxGfxライブラリに分離したので、これらのライブラリもインクルードしてやる必要がある。 これは、作業を進めるうち、いろんなクラスにFontx描画機能を組み込まなければいけなくなり、そのたびに同じ処理が重複するのがいやになり、Adafruit_GFXを継承したクラスに対するFontx描画機能のHelperクラスとしてFontxGfxクラスを作成、Adafruit_GFX非依存部分をFontxクラスとして作成した。