0x1B キャンバス

コマンド送信。

ヘッダ コマンドID Type Length Value
01 1B 80 LE(ペイロード長) 内側TLV
1 byte 1 byte 1 byte 2 byte 可変長

LE(n) は整数nを2 byteのリトルエンディアンで表した値。Nは本文または圧縮データのbyte数。 共通のパケット形式を参照。

キャンバスは576×360、左上が原点。テキスト・画像の送信でキャンバス画面に切り替わる。 テキストと画像はそれぞれid 0〜7で管理する。テキストは画像の手前に描画する。

Type(1 byte) Length(2 byte、LE) Value
01 02 00 表示制御
02 9 + 本文の長さ テキスト要素
03 Valueの長さ 画像チャンク
04 0A 00 アニメーション開始
05 2 + 圧縮データの長さ アニメーションのフレームチャンク
06 00 00 空(アニメーション停止)

表示制御(Type 01)

Type Length Value
01 02 00 閉じる 00 00 / 全消去 01 00
1 byte 2 byte 2 byte

全消去はテキスト・画像を消してキャンバス画面を保つ。 全体を置き換えるときは全消去TLV → テキスト要素TLVの順に送る。 指定した要素だけを更新するときはテキスト要素TLVを送る。

テキスト要素(Type 02)

Type Length id x y 幅 高さ 本文
02 LE(9 + N) 0〜7 LE(x) LE(y) LE(幅) LE(高さ) UTF-8
1 byte 2 byte 1 byte 2 byte 2 byte 2 byte 2 byte N byte

x・y・幅・高さは符号なし整数。xは0〜575、yは0〜359。 本文を空(N = 0)にすると、そのidのテキストを消す。 同じidに送ると座標・寸法・本文を置き換える。 複数要素はType 02 のTLVを連結する。 表示制御とテキスト要素のペイロード合計は190 byteまで。 1要素だけなら本文は178 byteまで、全消去TLV付きなら173 byteまで。 本文は矩形内で左揃え・折り返し表示され、矩形を超える部分は切り取られる。

id 0、座標(16, 8)、幅240、高さ40に Hello を表示するパケット:

01 1B 80 11 00 02 0E 00 00 10 00 08 00 F0 00 28 00 48 65 6C 6C 6F

画像(Type 03)

画像を3bit RLEで圧縮し、圧縮データを先頭191 byte、以降200 byteまでに分割する。

単一・先頭パケットのTLV:

Type Length マーカー id x y 幅 高さ 圧縮データ
03 LE(11 + N) 単一 5A 6B / 先頭 5A 5A 0〜7 LE(x) LE(y) LE(幅) LE(高さ) 先頭から最大191 byte
1 byte 2 byte 2 byte 1 byte 2 byte 2 byte 2 byte 2 byte N byte

続きのパケットのTLV:

Type Length マーカー 圧縮データ
03 LE(2 + N) 途中 7C 7C / 末尾 6B 6B 最大200 byte
1 byte 2 byte 2 byte N byte

各TLVに通常パケットのヘッダ 01 1B 80 とペイロード長を付けて送る。 画像1枚のパケットをすべて送ってから次の画像を送る。同じidへの送信で画像を置き換える。 x・y・幅・高さは符号なし2 byte、LE。幅・高さは1以上で、画像全体を576×360の範囲に収める。 画像バッファは、配置済み画像の 幅 × 高さ × 2 の合計と受信中の圧縮データの合計で380,000 byteまで。

id 0、座標(16, 48)に白い2×2の画像を表示するパケット(圧縮データ E3):

01 1B 80 0F 00 03 0C 00 5A 6B 00 10 00 30 00 02 00 02 00 E3

上の Hello のパケットに続けて送ると、テキストと画像が同じキャンバスに表示される。

画像の削除(Type 03)

単一パケットのマーカー 5A 6B、対象id、x・y・幅・高さをすべて0として送る。

id 0を削除するパケット:

01 1B 80 0E 00 03 0B 00 5A 6B 00 00 00 00 00 00 00 00 00

画像の3bit RLE圧縮

画素は左上から行単位に並べる。各画素は0(黒)〜255(白)のグレースケール。 各画素を 画素値 >> 5 で0〜7に変換し、同じ値が続く部分を1〜32画素ずつまとめる。 1つの連続区間を次の1 byteで表す。行境界も連続区間に含める。

上位3 bit 下位5 bit
画素値(0〜7) 連続画素数 − 1(0〜31)

圧縮byte = (画素値 << 5) | (連続画素数 - 1)。 復元後の画素数は 幅 × 高さ。

画像 圧縮データ
白4画素 E3
黒4画素 03
白32画素 FF
白33画素 FF E0

アニメーション開始(Type 04)

Type Length x y 幅 高さ 再生間隔
04 0A 00 LE(x) LE(y) LE(幅) LE(高さ) LE(ms)
1 byte 2 byte 2 byte 2 byte 2 byte 2 byte 2 byte

再生間隔は1〜65535 ms。画像全体を576×360内に収める。 2フレーム分の 幅 × 高さ × 2 × 2 を380,000 byte以内にする。 開始すると静止画像を消してフレーム用のバッファを確保する。テキスト要素は残る。

アニメーションフレーム(Type 05)

Type Length マーカー 圧縮データ
05 LE(2 + N) 単一 5A 6B / 先頭 5A 5A / 途中 7C 7C / 末尾 6B 6B 最大200 byte
1 byte 2 byte 2 byte N byte

開始時に指定した寸法の画像を3bit RLEで圧縮して分割する。 1フレームのパケットをすべて送ってから次のフレームを送る。

アニメーション停止(Type 06)

01 1B 80 03 00 06 00 00

関連