# ESP32で日本語入力
- [ESP32]を使って日本語入力デバイスを作る
- [かな漢字変換]は力弱く[SKK]風

[active][experiment]

# この取り組みの概要
- [ESP32で日本語入力]
  - これがPhase1(このページ)
    - [ESP32で日本語入力-ChrScreenの脱却]
    - [ESP32で日本語入力の同期の案]
    - [ESP32で日本語入力の筐体設計]
    - [ESP32で日本語入力は自分で使うプロダクトになるか?]
    - [ESP32で日本語入力をどうしたい?]
    - [2023-05-27ESP32で日本語入力]
- Phase2
  - [ESP32で日本語入力のスクリプト化] からの
  - [ESP32とLuaで日本語入力] がメインかな
    -  [7インチ画面付きESP32-S3開発ボード]
    - [4.3インチ画面付きESP32-S3開発ボード] 


# リポジトリ
- https://github.com/inajob/esp32-text-editor

# 配線
- 参考
  - https://ht-deko.com/arduino/shield_usbhost_mini.html
    - まともに使えるようにする方法
  - https://okiraku-camera.tokyo/blog/?p=8333
    - ESP32

上がUSB端子
>> table
INT,M5Stack(17), SS,M5Stack(5)
D8,,MOSI,M5Stack-MOSI(23)
D7,,MISO,M5Stack-MISO(19)
D6,,CLK,M5Stack-CLK(18)
D5,,A0,
D4,,A1,
D3,,A2,
D2,,A3,
GND,M5Stack-GND, VCC, M5Stack-3.3V
MAX_RST,, RES1, M5Stack-RES(-0.1uF-GND)
RXI,, GND,
TXO,, RAW --> 5V,
<<

## M5Stack端子
裏返しになっているので注意。
ピンヘッダ上から見る場合は左右が逆
>> table
GND --> GND,,G35,
GND --> GND,,G36,
GND --> GND,, RST --> RST,
MOSI --> MOSI,,G25,
MISO --> MISO,,G26,
SCK --> CLK ,, 3.3V --> VCC,
RXD0(G3),, TXD0(G1),
RXD2(G17),, TXD2(G17) -->INT,
SDA,,SCL,
G2,,G5 --> SS,
G12,,G13,
G15,,G10,
HPWR,,G34,
HPWR,,5V --> RAW,
HPWR,, BAT,

<<

# 漢字変換モード
- DIRECT(直接入力モード)
  - Ctrl + jでROMEに
- ROME(ローマ字入力モード)
  - lでDIRECTに
  - qでKATAに
  - ローマ字入力モード
- KATA(カタカナローマ字入力モード)
  - Ctrl + jでROMEに
  - 一旦カタカナからの漢字変換は実装しない
- KANJI
  - Shift+ローマ字入力で漢字入力モードに入った
- HENKAN
  - 漢字変換中

>> mermaid
graph LR
DIRECT --Ctrl+J--> ROME
KATA --Ctrl+J--> ROME
ROME --l--> DIRECT
ROME --q--> KATA
ROME --Upper--> KANJI
KANJI --Space Or Upper--> HENKAN
HENKAN --decide--> ROME


<<
# 辞書
http://openlab.ring.gr.jp/skk/wiki/wiki.cgi?page=SKK%BC%AD%BD%F1

## 行数まとめ(UTF8)
- S
  - 3412
  - 73KB
- M
  - 8379
  - 191KB
- ML
  - 48801
  - 931KB
- L
  - 175836
  - 5.9MB
# スクロールの実装
## 物理行と論理行(まだうまみがわからず)
マス目状の物理行を作るのはどうか?
半角敷き詰め分を用意しておいて、全角が来たら2マス占有させる
横にはみ出した際のfoldはこれで実現できそう

foldしたときに下の方の行が表示されなくなるが、無駄に描画しても遅くなる以外のペナルティは無い
## 今のままでdrawでfoldを実装する
これでも良さそう
## 縦スクロール
ファイルポインタとして表示している部分の一番最後を持っておく
同じく表示している部分の一番最初も持っておく?(2つのfpを扱える?)
## 横スクロール
サポートせずにfoldを実装するのがよさそう。
# メニューの実装
text editorだが、ファイルの選択やShellみたいなものとかを作りたい。
そのためにはタスクシステムのようなものがあると便利そう?
Shellでも日本語を打ちたいのでeditorの処理を流用する必要がある。

## Interface
- draw
- keydown

- text-editor
  - メンバ変数のlinesを表示する
  - スクロールが未実装
- file-list
  - リストからファイルを選択する。削除などもできるとよさそう
- shell
  - なんとなくシェルを作ってみたい。もちろん日本語入力にも対応
  - text-editorと処理を共存させたいが・・
  - 制限付きのtext-editorみたいにできないか?
  - 論理行と物理行の問題が・・

# テスト実施
>> pre
$ platformio test -e native
<<
# 設計メモ
Taskでインターフェースを切っている
- Task
  - ChrScreen*
  - keydown
  - draw
- KanjiEditor
  - 日本語入力テキストエディタ
- Shell
  - コマンドプロンプト

- ChrScreen
  - キャラクタスクリーン
  - vectorのvectorで画面分のバッファを確保している

日本語入力の仕組みをTaskから切り離したい
- これができるとShellでも日本語が使える
- KanjiEditorと日本語入力が密結合している
- KanjiTaskとかにする?keydownの部分に一枚かませて日本語が決定したらTaskに渡すようにできるか?
- KanjiEditorを少し改造すれば作れそう
# テストが壊れている
- ChrScreen脱却の途中でテストが壊れている
- platformioを最新版にする
  - cannot find -llsan のエラーが出た
  - TDM-GCCを使っているのが原因のように見える
  - PATHからTDM-GCCを外してみる
    - これでmingwになるはず
    - c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/ld.exe: cannot find -llsan
    - 同じエラーだ
    - platformio.iniにリークサニタイザの設定が入っていたせいだった
      - いつ入ったのだ?
  - 依存関係の解析がおかしい問題が直らないな・・
    - lib_ldf_mode = chain+
    - これでなおった!
- warningも消したい
  - warning: ISO C++ forbids converting a string constant to 'wchar_t*' -Wwrite-strings
    -    chrScreen.putString(L"test", 0, 0);
  - リテラルをwchar_t*のところに書くと怒られるっぽい
  - 明示的にキャストして直した
# ロードマップ
- { } 大きな辞書を試してみる
- {x} 連続Shiftで連続確定
  - {-} テスト これはmainに書かれているのでテストできない

[ESP32で日本語入力-ChrScreenの脱却] 
[ESP32で日本語入力の筐体設計] 
- 下半分いい感じ!
[ESP32で日本語入力をどうしたい?] 
[2023-03-05]. スクリプト化 [ESP32で日本語入力のスクリプト化] 
[2021-07-13]~  ファイル分割などにより変換速度を向上させる
[2021-07-13]~  大きな辞書への対応
[2021-07-13].  スクロール
[2021-07-13]. ファイルの読み込み・書き込み