CodeReading: VT2040
VT2040という見つけた。 かっこいい。 中身がどうなっているか知りたかったので、コードを読む事にした。
コード読みメモを以下に書く。
- 複数のレポジトリに別れてる。
- git submoduleで参照してる。
- 参照はシンボリックリンクでなされていて、ソース内では直接使ってはない。
- 良くみると、VT2040-fontが複数の場所にsubmoduleで入ってる。
- かなり小さい
% cat *.c *.h | wc 2026 9944 72913
- しかも、これデータを含んでる。
- フォント(258行)
- スプラッシュスクリーン画像(121行)
- unicode処理テーブル(299行)
- vt2040.c
- メイン処理
- 57行
- 各種初期化
- メインループ
- シリアルから入力されたのを画面に出す
- キー入力をシリアルに出す
- スプラッシュスクリーンは文字列絵なのか。
- serial.c
- 99行
- PIO使ってるみたい。
- lcd.c
- 225行
- メインの処理はcore1_mainの中に書かれてる。
- デュアルコア!
- これもPIO使ってる。
- CSはLOW固定してる。
- RSTはHIGH固定してる。
- ガンマカーブ補正って書いてあるけど、何だろうこれ。
- 他のサンプルにもあった。
- バックライトはPWM
- あかるさは二乗してる。
- rotateはLCD側でできるんだな。
- メインのコア側から通知がきたら2回描画する。
- 何で2回なんだろう?
- データとコマンドで速度を変えてる。
- しかもデータシートよりオーバークロックしてるとコメントがある。
- 思ったよりギリギリなのかな。
- 描画ループ
- 行分 24回
- 列分 80回
- 6回(たぶん1文字の横幅?)
- 0x3000000 2バイトずつ右シフトして0になるまで。
- 最も内側のこれわからんな。
- あ、フォントの縦か。
- 画面縦でも横でもない凄い出力順だな。
- 左上(0,0)から(0,13)、(1,0)から(1,13)、(2,0)から(2,13)….(480,0)から(480,13)、 (0,14)から(0,27)…(480,14)から(480,27)、 … (0,299)から(0,311)…(480,299)から(480,311)
- font.h
- 258行
- たぶんフォントデータ
- int32が6個1行で256セット入ってる。
- font_exporter.html
- 108行
- font.hを作る。
- canvasに書いて、生成
- アンチエイリアスしてる。
- 1ピクセルを2bitに入れてる。
- 縦13ピクセルを26bitに入れて1つのint32として出してる。
- 横6ピクセル分セットにして出力
- 文字分繰り返す
- 左端1列が白いフォントを使ってるから、最初の桁は0が多い。
- なるほど、1行分のウインドウ内だけ書き込みとかできるのかな。
- key.c
- 117行
- GPIOを読んで、unicode文字コード+カスタムコードを出す。
- 1msおきにスキャンして、押されてたらkey_msesテーブルをインクリメントする。
- shiftはここでは、レイヤ切り替え。
- こもモジュールは文字コードを返すので、シフトもレイヤ。
- Ctrl+Shift+Xみたいな文字入力はできなさそう。
- term.c
- 686行
- メインディッシュ
- term_chars 画面上の文字が入ってる配列
- term_attrs それぞれの文字の属性が入ってる配列
- 前景色4bit 背景色3bit 下線1bit
- フラグがいっぱい
- カーソル位置
- カーソルが表示されてるか
- DEC graphics
- shift
- カーソル制御
- 改行文字
- タブ位置
- それらを一時保存する領域(エスケープシーケンスにそういうのがある)
- ステートによって次の文字を受けとる関数をポインタに入れてる。
- テキストvramっぽいものに結果を入れてる。
- ついでに、キーボードから来たコードポイントをutf-8にするのもやってる。
この記事へのご意見、ご感想、コメントは、
twitter
か下のフォーム(実験的)へどうぞ。