Arduboy用シェルにビットマップ転送コマンドを追加

先週作成したArduboy用コマンドシェルですが、ビットマップ画像を表示させる命令についてはペンディングにしていました。
あれこれ考えた末、

・表示位置とデータは別命令とする
・データは16進数の文字列で送る

ということに決めました。

ビットマップはデータがとても重いので、1行の命令で記述しようとするとあまり大きな画像は表現できません。
1行は100文字程度、と考えると最大でも100バイトしか、一度には送れません。
すると、何回かに分割して送ることになります。
それなら、1度しか必要ない表示位置の指定と、何度も行うデータの転送は分けるのが理にかなっています。

表示位置は矩形(座標、幅、高さ)で指定し、それ以降に送られるデータはその矩形の中へ詰めていくことにします。
データはバイナリなので、テキストに変換する必要がありますが、今回は16進数にしました。
16進数だと1文字で4ビットしか送れないので、効率は悪いですが、覚えやすいのがメリットです。
ソースコードに書く値との互換性もあります。
uuencodeやbase64などを使えば、文字数の3/4程度のバイナリデータを送れますが、そこまで速度に拘る必要性は低いと判断しました。

とはいえ将来的に拡張も考えられるように、16進数のデータ転送命令は「.x」としました。
「x」が16進数を表しているつもりです。

書式は単純な16進数の連続で、たとえば
「.x aa55aa55」

「{ 0xaa, 0x55, 0xaa, 0x55 }」
というデータを表します。

実際の使い方はこんな感じです。

bitmap 52 20 24 24
.x 8080808888888888888c8c8880ffff81
.x 8082849c98c0c080000000f8f80800fe
.x fe222030200f7ff08000000000000000
.x 20e0607f7f30301f1f08080404000001
.x 070e1c7870e0fe60

これは、左上が(52, 20)で幅と高さが24ピクセルのビットマップを描画します。
続く.x命令が実際のビットマップのデータを現しています。

このデータは、たとえば以下で公開されているツールなどで生成したデータを、”0x”や”,”、余計なスペースなどを削除し、行の頭に”.x “を付加すれば簡単に作ることができます。

Web-based bitmap editor – Arduboy / Development – Community

とはいえ、以前にも書いたように変換ツールも作る予定です。
とりあえずカラー画像をディザリングして白黒画像に変換するところまではできました。

abImage.png

コメント