ESP32で日本語入力のスクリプト化
- 結局重たい部分は日本語の表示、変換部分だけなので、それ以外はスクリプトにしたい
- luaが一番平和そう
- 最近メンテされていないのが気になる
duktape+LuaのROM容量確認
- 逆に言うとo-bakoに日本語表示、日本語入力機能をつけるということ
- 多分duktapeとluaと日本語は入りきらない気がする
> code
RAM: = 5.8% (used 18992 bytes from 327680 bytes) Flash: ===== 52.9% (used 692805 bytes from 1310720 bytes) <<
Flashを52%使っているのが痛い
o-bako
> code
RAM: = 14.0% (used 45724 bytes from 327680 bytes) Flash: ========== 108.5% (used 1422005 bytes from 1310720 bytes) <<
オーバーしとるやん・・
lua組み込んでみる
前と変わったかな?
> url
<<
- systemは不要になったように見えた
- lua_writestringの設定はどうだろう?
- 何が変わったかは知らない、ESP32側かもしれない
luaのバージョン違いでしばしハマる
- LUA_32BITSが有効にならない?
> code
lib/lua/luaconf.h:119: warning: "LUA_32BITS" redefined
<<
こっちが有効になってしまう?
- 取り敢えずコメントアウトした
- o-bakoはこれでもビルドが通っていたが、なぜだろう?
- lib側にファイルがあるからかも
リンカーでmainの再定義でこけた
- arduino固有の問題かな・・
- luaを利用するファイルをlibからsrcに移動させる
- まだだめ
- lua_writestringかな?
- 直観的ではないが、これが定義されていないとmainをビルドしてしまうという仮説
- だめ
- 念のためキャッシュを消す
- .pio/ 全部消してみる
- mainの再定義はまた発生
- systemを消し忘れていた
- luaは最新を指しているようだ
- おや、systemを消すだけで動いた
- luaが最新じゃないのがだめなのかな?
- ということでluaをmasterに戻して再実行
- LUA_32BITSもrevertした
- このエラーが出た・・
- 何が違うんだろう・・
- あ、最新じゃない、 v5.3.4だった
- 最新は5.4.4なので、あとで変更点を読もう
- v5.3.4にしたらすべてうまくいった・・
lua実行環境を作る
日本語の打てるluaのインタプリタを作ってみる
shellとほとんど同じはず
- loadstring で引数の文字を読めば行けるか?
- これで関数に積まれる様子
- print関数は元から存在する?
- スタック先頭の関数を実行しないとダメ?
- YES pcallすればOK
shellをコピーしてluashellを作る
- 本当はshellをプラガブルにした方がよさそう
wchar_tではなさそう
utf8に変換する?
fep.hに utf16CharToUtf8があるのでこれを使いたい
gprintがヘッダファイルにあると良くないみたい
一時的にshellをluaShellに変更
日本語が化けたけど動いた
内部処理がUTF16なのにUTF8で行ってしまったっぽい
エラーメッセージも出せるかな?
> code
RAM: = 6.3% (used 20764 bytes from 327680 bytes) Flash: ====== 63.0% (used 825505 bytes from 1310720 bytes) <<
まだ余裕がある。
どう進める?
- luashellはキーボードで入力した文字をevalするもの
- ファイルからの入力を扱いたい
- shellでluaコマンドを作ってSPIFFSから読み込むのがよさそう
- やること
- {x} luashellのlua処理をluaexecに移行する
- Luaクラスを作るのがよさそう
- luaとluashellで同じものを参照できるようにする
- {x} テスト用のluaスクリプトをSPIFFSに上げられるようにする
- { } luaアプリを作る
- { } shellでluaコマンドを作る
- 初期ビルドが遅いな・・
- ヘッダ周りをいじったときも全部ビルドし始める?
- {x} ChrScreenが無駄
- luaのlinesにメタ情報を持たせればいけそう
- 物理行数
- {x} fepの表示との兼ね合いが・・
- fepがChrScreenを使うのをやめるのはどうか?
- ほかのアプリに問題が出る?
- というかshell
- 取り敢えず共存させた
- {x} ヒープの確認機能
- GCしても解放される様子がない、というか使用量が増加している・・
- luaが開放してもESP32からは解放されないように見えることはありそう
- 勘違い、日本語入力モードだと変な文字が入力されておかしくなってるっぽい
- GCはうまく動いてる
- {x} 折り返し
- 論理行に物理行数を記録させておいてレイアウト時に調整かな?
- 文字幅を足していけば折り返す行数は計算できる
- {x} スクロール
- {x} ファイル読み込み
- シェルからの指定
- 内部から読み込み
- こっちの方が筋がよさそう
- 実装方針
- ファイル名を指定するとテキストでドバっとかえってくる方式
- {x} ファイル保存
- { } ファイル一覧
- { } シミュレータ
wikiっぽくしてみる
- Ctrl+jでカーソル付近のブラケットを認識してファイルを開く
- Ctrl+bで前のファイルの戻る
- カーソルも復元してほしい
- 後必要な機能
- ファイルの存在確認orないファイルもエラーなく開けるように
> mermaid
graph TD
subgraph ESP32
Lua-Interpreter --> Wiki-engine
end
<<
うまく動かん
- onCharでリセットがかかる
- Case
- LuaのonCharハンドラを空にする
- まだエラー
- CのonCharの末尾まで走っている
- keydownの実行もトレースする → 悪さしていない
- CのonCharの中身を空にする→まだおかしい
- いきなりluaShellを起動させる →まだおかしい
> code
Backtrace:0x400d9d68:0x3ffb26200x400eb57d:0x3ffb2640 0x400eb56d:0x3ffb2660 0x400d9aaf:0x3ffb2690 0x400d963d:0x3ffb26c0 0x400d97ba:0x3ffb26e0 0x400d9a09:0x3ffb2700 0x400eb53e:0x3ffb2720 0x400d5fae:0x3ffb2740 0x4011c6bd:0x3ffb2760 0x400d5104:0x3ffb27a0 0x400d9029:0x3ffb27e0 0x400d5c6a:0x3ffb2800 0x400edeed:0x3ffb2820
<<
0x400d9d68:0x3ffb2620 chrscreen.cpp:139 getMaxLine
0x400eb57d:0x3ffb2640 shell.cpp:5 (discriminator 3) init
0x400eb56d:0x3ffb2660 luashell.cpp:29 lua.onChar(..)
0x400d9aaf:0x3ffb2690 fep.cpp:218 onChar
0x400d963d:0x3ffb26c0 fep.cpp:373
0x400d97ba:0x3ffb26e0
0x400d9a09:0x3ffb2700 0x400eb53e:0x3ffb2720 0x400d5fae:0x3ffb2740 0x4011c6bd:0x3ffb2760 0x400d5104:0x3ffb27a0 0x400d9029:0x3ffb27e0 0x400d5c6a:0x3ffb2800 0x400edeed:0x3ffb2820
- AppがわのonCharの返り値をtrueにしたら動いた?
- もともとは無指定だった
- しかしfep側でこれを見ていないように見えるが・・
- できた!
- boolを返し忘れていた
- しかし根本原因よくわからなかったな
luaでエディタを作るのに必要なAPI
- 文字を出す
- 今の座標に文字を出す仕組みでよさそう
- キー入力を受け取る
- これをo-bakoに入れれば終わりな気がする
- 日本語入力はo-bako側で再現する必要はなさそう
- すでにbtnがそういう仕様になっているので、ここを任意の文字にすれば良さそう
- keypressedみたいな名前でも呼べるようにすればひとまずよし
- 文字種の判定
- asciiかどうかを見る
- string.byte(c,1,2)
- これで行けそう
- ファイルを読み込む
- ファイルを保存する
- ファイルを検索する
- これがうまいことできるとwikiも作れそう
この辺をブラウザでも動くようにしたい
o-bakoを拡張した方が早いかも
文字が全角か半角かを判定する仕組みが必要そう
luaの内部でもできるかな? isAsciiがあればOK
o-bakoから一部を持ってくる感じ
o-bakoのluaのゲームエンジンをそっと持ってくる感じにする
ちょっとコメントアウトすれば動きそう
APIリファレンス
- getfiles(pathPrefix) -> Array of files
- exists(fileName) -> bool
- savefile(fileName, body)
- readfile(fileName) -> string
- putstring(string)
- 画面に文字を出力
- clear()
- 画面をクリア
- fillrect(x,y,w,h)
- fgColorで塗りつぶし
- setcursor(col,line)
- TODO:半角幅固定で計算しているがこれでよい?
- getfreeheap -> number
- gettextwidth -> number
- getmaxline -> number
- TODO: 固定値を返している
- getscreenwidth -> number
- TODO: 固定値を返している
- setcolor(r, g, b, r2, g2, b2)
- fgColor, bgColorを設定
- debug(text)
- シリアル出力
- exit
- luaを終了
欲しいAPI
- 線の描画
- スプライト?
- メモリを食うので要検討
- 1行ずつファイルを読みだす・書き込むAPI
- どっちみちそのようなファイルはエディタで開けないので扱わないかも