VIALにロータリーエンコーダーを追加
VIALのポーティングガイドにはロータリーエンコーダーに関する情報と、オプションレイアウトの情報のどちらも項目が設けられています。オプションの設定項目作成やエンコーダー設定の常時表示はガイド通りの方法で実現出来ます。しかし、その両方を同時に実現させるためにはどうしたらいいのでしょう? つまりレイアウトオプションでエンコーダーをオンにした場合のみ、エンコーダー設定が出てくるというインターフェイスの作成方法についてです。
わかってしまえば簡単。
上図のようにオプションレイアウトで特定のエンコーダーをオンにした際にノブが表示される場所をkeyboard-layout-editorにおいてデカールで指定し、該当するエンコーダー番号、「e」、そしてレイアウト番号を入力します。デカールは左側だけでも機能するようなので一方のみ置いています。
レイアウトオプションについては公式ドキュメントにある通りなので割愛します。正しく記述していればレイアウトで選択したエンコーダーのみが表示されるようになります。
OS種別によるGUIキー設定
接続されたホストのOSを検出し、その種別ごとにセッティングなどを行うための機能が用意されています。一般にMac OSではスペースの脇にCMDキーが配置され、一方、WindowsやLinuxではALTキーが配置されます。これを接続されたホストに応じて行うためには以下のようにします。
bool process_detected_host_os_kb(os_variant_t detected_os) {
if (!process_detected_host_os_user(detected_os)) {
return false;
}
switch (detected_os) {
case OS_MACOS:
case OS_IOS:
keymap_config.swap_lalt_lgui = false;
break;
case OS_WINDOWS:
keymap_config.swap_lalt_lgui = true;
break;
case OS_LINUX:
keymap_config.swap_lalt_lgui = true;
break;
case OS_UNSURE:
break;
}
return true;
}
OS検出を行うためにはkeyboard.jsonに以下のように”os_detection”を設定する必要があります。
"features": {
"bootmagic": true,
"mousekey": true,
"extrakey": true,
"console": true,
"rgblight": true,
"encoder": true,
"encoder_map":true,
"os_detection": true
},
Layoutオプションの問題
VIALのLayoutタブでレイアウトオプションを設定すると、次にVIALに接続した際にはそれらのオプションの設定状態が維持された状態で表示されます。たとえばPlanckで2uスペースの設定をしていれば2uスペースのキーが表示されるのです。しかし、オプション数が増えていくと設定状態が再現されずにリセットされた状態になることがわかりました。
これはVIALではなくVIAのドキュメントに記載があります。
https://caniusevia.com/docs/configuring_qmk
手っ取り早い解決法はVIA_EEPROM_LAYOUT_OPTIONS_SIZEマクロの設定値を2以上にすればよいです。オプションの種類によって確保すべき領域が変わりますので厳密には以下のvia.hのコメントに従って計算しましょう。チェックボックスの場合は2値なので8個ごとに1を消費します。つまりこれが9個以上16個以下になるならVIA_EEPROM_LAYOUT_OPTIONS_SIZEを2にします。
以下はvia.hにあるコメントです。
// Changing the layout options size after release will invalidate EEPROM,
// but this is something that should be set correctly on initial implementation.
// 1 byte is enough for most uses (i.e. 8 binary states, or 6 binary + 1 ternary/quaternary )
#ifndef VIA_EEPROM_LAYOUT_OPTIONS_SIZE
# define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 1
#endif
設定するファイルは、keymaps/vial/config.hです。
#define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 2
VIAL UIDについて
VIALではキーボードごとにUIDを生成・設定することになっています。この「キーボードごと」というのがちょっとわかりにくいのですが、「各キーボードのkeymaps/vialごと」という意味になります。
ロングランなキーボードではチップの入手性や流行り廃りなどにより生産時期によってMCUが変更になったり、あるいはMCUのピンアサインや細かな機能が変わることがよくあります。その際に、同じキーボードディレクトリ内に複数のリビジョンが作られ、さらにそれぞれのリビジョン内にkeymaps/vialが存在すると、レイアウトを含めてほとんど変わりのないリビジョン違いであってもUIDを変える必要があります。
そもそもVIALはレイアウト情報であるvial.jsonをファームウェア内に格納しているので、VIAのようにIDによらない仕組みです。vial.jsonはutil/vial_generate_definition.pyによってlzma圧縮されたバイナリデータとしてファームウェア内に置かれます。vial-guiアプリではsrc/main/python/protocol/keyboard_comm.pyで圧縮を解凍してデシリアライズし、jsonを復元します。
となるとUIDはなんのためでしょう。実際、UIDが重複していてもVIALアプリ(vial.rocks含む)では(いまのところ)正常に認識されてしまうようです。しかし公式では上述のようにキーボードごとに固有のUIDを要求しますので従いましょう。
なにより問題となるのは、vial-qmkのGitHubリポジトリにプッシュした際に走るテストです。このテストではUIDの重複チェックが入り、ダブりがあるとエラーを吐いてしまいます。キーボードを追加した際には以下のスクリプトを走らせてエラーが出ないことを確認するとよいです。
python3 util/ci_vial_verify_uid.py