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