Compare commits
19
Commits
54f292b08e
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
af6ce99364 | ||
|
|
1a443c562d | ||
|
|
73e913e776 | ||
|
|
1c99f60719 | ||
|
|
7c927f5e12 | ||
|
|
a37fdd4abd | ||
|
|
333c651491 | ||
|
|
0dc7933077 | ||
|
|
dccc5f095f | ||
|
|
1414a7d725 | ||
|
|
49b023ceaa | ||
|
|
e8fe11bfa1 | ||
|
|
18e060d390 | ||
|
|
cceb9a3e53 | ||
|
|
cd502e260f | ||
|
|
44035a7915 | ||
|
|
76406e2f02 | ||
|
|
46905b1e79 | ||
|
|
63da6e77d8 |
@@ -1,7 +1,7 @@
|
||||
# Beyond KLE
|
||||
|
||||
キーボード設計のデータモデルとワークフローを再設計するプロジェクト。
|
||||
PHY(物理配置) / ELC(電気配線) / IDX(キー識別) / MAP(キーマップ) / IME(入力変換) の5層に分離する。
|
||||
PHY(物理配置) / ELC(電気配線) / IDX(キー識別) / MAP(キーマップ) / HST(ホスト) の5層に分離する。
|
||||
|
||||
- 応答・ドキュメントは日本語。
|
||||
- 現状はコード未着手、設計ドキュメントのみ。
|
||||
@@ -15,10 +15,12 @@ PHY(物理配置) / ELC(電気配線) / IDX(キー識別) / MAP(キーマップ)
|
||||
| `ELCレイヤー.md` | ELC層の仕様 |
|
||||
| `IDXレイヤー.md` | IDX層の仕様 |
|
||||
| `MAPレイヤー.md` | MAP層とエディタの責務・実機との読み書き方針 |
|
||||
| `HSTレイヤー.md` | HST層(ホストによるキーコードの解釈)の仕様 |
|
||||
| `phase1-json-schema.md` | 各層のJSON Schema |
|
||||
| `keyboard-making-workflow.md` | 既存の自作キーボード制作フローとの対応 |
|
||||
| `implementation-plan.md` | 実装方針の決定事項・検証用サンプル |
|
||||
| [`backlog/README.md`](backlog/README.md) | 後回しにできる問い・検証・改善候補 |
|
||||
| `samples/` | 検証用サンプル(KLE JSON、VIA定義)。出典とテストケースは `implementation-plan.md` |
|
||||
|
||||
既存ドキュメントには下記ルールを段階的に適用する。PHY・ELC・IDXの保留課題はbacklogへ分離済み。
|
||||
全体の再編は別タスクとして行い、指示なく他の内容を移動・分割・書き直ししない。
|
||||
|
||||
+97
@@ -0,0 +1,97 @@
|
||||
# HSTレイヤー
|
||||
|
||||
## 概要
|
||||
|
||||
HST(ホスト)レイヤーは、接続先のホストがキーボードから受け取ったキーコードをどう解釈するかを記述する。
|
||||
MAPが出力するのはHIDのキーコードであり、画面上の文字や動作は、ホストのOSとキーボード配列の設定で決まる。
|
||||
HSTはこの対応を持ち、MAPエディタとFirmware Generatorが参照する。入力がHSTを通過するわけではない。
|
||||
|
||||
名前は、HIDでキーボード(device)の接続相手をhostと呼ぶことに合わせる。
|
||||
IMEのかな漢字変換はOSの仕事であり、HSTの対象外とする。
|
||||
|
||||
## プロファイル
|
||||
|
||||
HSTのデータは、ホスト環境ごとのプロファイルの集まりとする。
|
||||
プロファイルはキーボードに依存しないため、プロジェクトの外にある共有カタログとして版を管理する。
|
||||
プロジェクトは、参照するプロファイルのIDと、利用者ごとの差分(XKBのオプションなど)だけを持つ。
|
||||
|
||||
### 識別
|
||||
|
||||
プロファイルは、OSとホスト配列の組で識別する。必要な場合だけ、入力方式やその設定を加える。
|
||||
|
||||
- ホスト配列は、OSがキーコードを解釈するための配列の設定である。キーキャップの刻印やOSの表示言語とは独立に決まる
|
||||
(日本語のWindowsで英語配列を設定する、など)。
|
||||
- Linux(XKB)では、配列(layout)・変種(variant)・オプション(options)の組になる。
|
||||
- `win-jp` のような短い名前は、人が選ぶためのプリセット名として付ける。
|
||||
- 各OSの識別子(WindowsのKLID、XKBの名前、macOSの入力ソースID)と対応付けられるようにする。
|
||||
|
||||
```json
|
||||
{ "os": "windows", "layout": "jp106" }
|
||||
{ "os": "macos", "layout": "us" }
|
||||
{ "os": "linux", "layout": "jp", "options": ["ctrl:nocaps"] }
|
||||
```
|
||||
|
||||
「日本語入力を使う環境」のような設定は、プロファイルの識別に含める。
|
||||
IMEが今ONか、のような実行時の状態は識別に含めない(次節の引数として扱う)。
|
||||
|
||||
### 記述する内容
|
||||
|
||||
プロファイルは、順方向の対応だけを記述する。
|
||||
|
||||
```txt
|
||||
(キーコード, 修飾キー, ホスト状態) → 文字 / 動作 / 未定義 / 不明
|
||||
```
|
||||
|
||||
- ホスト状態: CapsLock、かなロック、IMEのON/OFFなど、同じキーコードの結果を変える状態。
|
||||
HSTは状態の種類を引数として記述するだけで、実行時の状態を観測しない。
|
||||
- OS固有のキーの意味: `LANG1`/`LANG2`(Macのかな/英数)、変換/無変換、Cmd/Ctrlの役割など。
|
||||
- 成立の前提: 動作に必要なOS側の設定(Unicode入力の方式など)。HSTは設定を変更する機能を持たない。
|
||||
- 対応可否: 対応済み・未対応・不明の3値とする。カタログに載っていない動作を「使えない」と扱わない。
|
||||
|
||||
## 使う側の責務
|
||||
|
||||
HSTは逆引き(文字から、それを入力するキー操作を求めること)を持たない。
|
||||
逆引きは、使う側が順方向の表から求める[推測:P-1]。
|
||||
|
||||
- 順方向の表から導けるので、両方を持つと二重管理になる。
|
||||
- 逆引きの候補には、ファームウェアの機能に依存するものがある。
|
||||
例えば、US刻印のキーキャップをJIS配列のホストで使う場合、Shiftの有無で文字の組が合わないキーには、
|
||||
Shift時に別のキーコードを送る機能(QMKのKey Override)が必要になる。
|
||||
これはホストの知識ではないため、HSTに持たせない。
|
||||
|
||||
使う側の担当は次のとおり。
|
||||
|
||||
- MAPエディタ: キーコードの表示、逆引きによる入力補助、対象ホストで意味を持たないキーコードの警告
|
||||
- Firmware Generator: `send_string` が前提にする配列、Unicode入力の方式など、ホストに依存する生成設定
|
||||
|
||||
## MAPとの境界
|
||||
|
||||
- MAPは具体的なキーコードを保存する。逆引きは編集時の入力補助であり、選んだ候補のキーコードをMAPへ書く一方向の変換とする。
|
||||
実機に残るのはキーコードだけなので、この形なら実機との往復を単純に保てる。
|
||||
- HSTは割り当てを所有・変更しない。PHYのキーIDも参照しない。
|
||||
|
||||
## 対象外
|
||||
|
||||
- 実行時の状態の観測・同期(今どのOSに接続しているか、IMEがONか)
|
||||
- OS設定の変更、IMEの変換処理
|
||||
- ホスト側での再割り当て(AutoHotkey、Karabiner、IMEのローマ字テーブルなど)
|
||||
- アプリごとのショートカット(「コピー」のような操作の汎用的な辞書)
|
||||
|
||||
## 検討済み・非採用
|
||||
|
||||
- 名前をSYSとする (journal/2026-09-24-hst-layer-scope.md)
|
||||
- 逆引きの候補をプロファイルが持つ (journal/2026-09-24-hst-layer-scope.md)
|
||||
|
||||
## 未確認事項
|
||||
|
||||
### P-1 使う側が逆引きの候補と実現可否を判断できる
|
||||
|
||||
- 位置づけ: 本文「使う側の責務」が前提にしている。HSTにファームウェアの知識を持たせない線引きは、これが成り立つことに依存する。
|
||||
- 格上げ条件: US刻印のキーキャップをJIS配列のホストで使う構成で、Shiftの有無で文字の組が合わないキーについて、
|
||||
HSTの順方向の表と、Generatorのビルド設定(有効な機能)だけから、MAPエディタがKey Overrideを含む候補を作れることを試作で確認する。
|
||||
|
||||
### P-2 対象ホストを複数持つか
|
||||
|
||||
- 位置づけ: 未解決の問い。Win/Mac両用のキーボードでは、表示と検証を複数のホストに対して行う必要がある。
|
||||
OSの切り替えをMAPのレイヤーで表す既存の慣習と、どう対応付けるかも関わる。
|
||||
- 完了条件: プロジェクトが参照するプロファイルの数と、MAPのレイヤーとの対応付けの有無をユーザーが決める。
|
||||
+90
-15
@@ -17,7 +17,23 @@ MAPのキー参照にはPHYのキーIDを使い、実機との通信に使うア
|
||||
|
||||
現行の保存形式は、[JSON SchemaのMAP節](phase1-json-schema.md#4-mapレイヤー-json-schema)にある
|
||||
レイヤー別のキーコード割り当てを出発点とする。
|
||||
動作定義と保存形式の拡張範囲は、[P-1](#p-1-割り当てる動作と保存形式の範囲)で扱う。
|
||||
キーコードはQMKの表記を基本とする。当面の対象ファームウェアがQMKであるため。
|
||||
レイヤーとStaticの動作定義への参照は、QMKの番号ではなく名前で書く([DynamicとStatic](#dynamicとstatic))。
|
||||
|
||||
ファームウェアの設定値は、キーボード全体に効くものをFirmware Generatorの設定とし、
|
||||
キーごとに上書きする値(tapping termのper key設定等)をMAPが持つ。
|
||||
QMKの機能ごとにどちらに属するかを個別に判断しないで済むようにするため。
|
||||
|
||||
動作定義とキーごとの設定の保存形式は、[P-1](#p-1-動作定義とキーごとの設定の保存形式)で扱う。
|
||||
|
||||
新規作成したMAPは、すべてのキーが未割り当ての状態から始める。
|
||||
PHYのラベルからの自動適用は行わない([PHY「ラベル」](PHYレイヤー.md#ラベル))。
|
||||
|
||||
## キーマップレイヤーの識別
|
||||
|
||||
キーマップレイヤーは、並び順と独立した名前で識別する。名前はMAP内で一意とする。
|
||||
レイヤーを切り替える動作も名前でレイヤーを参照し、番号へは出力時に並び順から変換する。
|
||||
レイヤーの並べ替えや挿入で参照先がずれないようにするため。IDXがキー番号を正本にしないのと同じ理由による。
|
||||
|
||||
## MAPエディタの責務
|
||||
|
||||
@@ -37,8 +53,30 @@ Staticの出力は[全体方針のFirmware Generator](keyboard-design-layers.md#
|
||||
|
||||
MAPエディタはDynamicの読み書きを提供する。Dynamicで変更できる範囲は、
|
||||
対象ファームウェアと既存プロトコルが公開する範囲に従う。
|
||||
Staticで扱う動作定義の範囲と、Dynamicで変更できない設定の扱いは、
|
||||
[P-1](#p-1-割り当てる動作と保存形式の範囲)で扱う。
|
||||
|
||||
当面の対象ファームウェアはQMKとし、対応範囲を次のように分ける。
|
||||
|
||||
- Dynamic: QMK本家のVIAプロトコルが公開する項目に限る。
|
||||
- Static: QMK本家masterの公式機能のうちVIAで変更できないものは、Firmware Generatorで生成する対象とする。
|
||||
- 次のものには当面対応しない。
|
||||
- Vial等のフォーク
|
||||
- XAP、developブランチ等、master以外にある機能
|
||||
- Community Modules(VIAモジュールを除く)
|
||||
- キーボード・キーマップ固有のコード(VIAのキーボード独自メニューを含む)には、原則として対応しない。
|
||||
|
||||
QMKはVIAをCommunity Modulesの形式へ移し、従来の実装を将来のリリースで削除すると告知している(QMK 0.34.4のChangeLog「VIA Feature Migration」)。
|
||||
VIAがモジュールへ移っても、QMKとVIAの両方に追従する。そのため、移行がmasterに入る前に、VIAモジュールを有効にした出力と読み書きに対応する。
|
||||
|
||||
Staticで定義する動作(タップダンス等)をキーへ割り当てるときは、定義を名前で参照し、出力時に番号へ変換する。
|
||||
割り当て自体はVIAで読み書きできても、参照先の定義はStaticにしかないため、
|
||||
[レイヤーの参照](#キーマップレイヤーの識別)と同じく並び順に依存させない。
|
||||
|
||||
QMK本家のVIAには、VIAの管理外にある実機の保存設定(Magic設定、保存されたデフォルトレイヤー、Unicodeの入力モード等)を読み出す手段がない。
|
||||
これらを実機で変更しても、MAPエディタはプロジェクトへ取り込めない。
|
||||
|
||||
プロジェクトのMAP、Staticで組み込んだ初期キーマップ、実機に保存された現在の割り当ては区別する。
|
||||
実機で調整してMAPへ取り込んだ割り当ては、Firmware Generatorへの入力としてStaticの初期キーマップへ反映できるようにする。
|
||||
実機の保存内容を初期化しても、調整後の割り当てに戻せるようにするため。
|
||||
|
||||
## 対応プロトコル
|
||||
|
||||
@@ -50,37 +88,74 @@ Staticで扱う動作定義の範囲と、Dynamicで変更できない設定の
|
||||
- VIAへの対応は、Remapというアプリ全体の機能を再現することを意味しない。
|
||||
- 初期の実装対象はVIAに限る。
|
||||
|
||||
対応するVIAプロトコルのバージョン、キーコード体系、編集項目の範囲は、
|
||||
[P-2](#p-2-viaの初期対応範囲)で扱う。
|
||||
対応環境は、QMKのコミットと、使うモジュールの一覧(各モジュールの出所とコミット)で固定し、
|
||||
更新するタイミングはユーザーが個別に判断する。QMKに同梱されたモジュールは、QMKのコミットで決まる。
|
||||
VIAもモジュールの1つとして扱い、QMKリポジトリの外へ移った場合にも同じ形で指定できるようにするため。
|
||||
MAPエディタのUIには、対応しているVIAプロトコルとキーコード体系のバージョンを明示する。
|
||||
接続した実機とはこの2つのバージョンで照合し、一致しない実機には対応しない。
|
||||
実機から取得できるバージョン情報がこの2つに限られるため。
|
||||
|
||||
最初に対応する環境は、QMK 0.34.4(commit `08c662f`)とする。このときキーコード体系は0.0.9、VIAプロトコルは0x000D。
|
||||
VIAは同梱の従来実装(`quantum/via.c`)で、追加のモジュールは使わない。
|
||||
|
||||
## VIAで読み書きする項目
|
||||
|
||||
VIAプロトコル0x000Dのコマンドのうち、MAPエディタが扱うものを次のように分ける[推測:P-2]。
|
||||
|
||||
- 対応する:
|
||||
- VIAプロトコルとキーコード体系のバージョンの読み出し(実機との照合に使う)
|
||||
- レイヤー数の読み出し
|
||||
- レイヤー別のキーコード割り当ての読み書き
|
||||
- マクロの読み書き(個数・容量の読み出しとリセットを含む)
|
||||
- 別の課題で扱う:
|
||||
- エンコーダの割り当て([MAP-P-4](backlog/README.md#map-p-4-onoff以外の入力への割り当て))
|
||||
- layout option([P-3](#p-3-プロジェクトと実機の対応状態管理))
|
||||
- 当面対応しない: キーマップ・EEPROMのリセット、ブートローダへの移行、デバイスの識別表示、
|
||||
マトリクス状態の読み出し(キーテスター)、custom channel(照明・オーディオ・キーボード独自メニュー)
|
||||
|
||||
実機のファームウェアでどの機能が有効かは、VIAでは読み出せない。
|
||||
新規キーボードではFirmware Generatorのビルド設定を正とする。既存キーボードでは、利用者が同じ形式で申告した内容を信用する。
|
||||
レイヤー数、マクロの個数と容量は実機から読み出し、書き込む前にMAPの内容が収まるかを確認する。
|
||||
|
||||
## 持たないもの
|
||||
|
||||
物理配置、配線、キーの出力番号は、それぞれPHY・ELC・IDXで扱う。
|
||||
OS配列やIMEの入力変換はIME側の責務とし、外部ツールで編集できる照明等の設定も、
|
||||
ホストによるキーコードの解釈は[HSTレイヤー](HSTレイヤー.md)、IMEの入力変換はOSの責務とし、外部ツールで編集できる照明等の設定も、
|
||||
VIAで通信できるという理由だけでMAPの所有データには含めない。
|
||||
MAPエディタは、キーコードを当面US配列の文字で表示する。
|
||||
|
||||
アナログ入力の解釈の所属は、[全体方針のP-1](keyboard-design-layers.md#p-1-アナログ値の解釈をどの層が持つか)で扱う。
|
||||
|
||||
## 保留課題
|
||||
|
||||
- [MAPの保留課題](backlog/README.md#map)
|
||||
- [PHYの保留課題](backlog/README.md#phy)
|
||||
|
||||
## 検討済み・非採用
|
||||
|
||||
- MAPエディタをStaticに閉じる (journal/2026-09-22-map-via-workflow.md)
|
||||
|
||||
## 未確認事項
|
||||
|
||||
### P-1 割り当てる動作と保存形式の範囲
|
||||
### P-1 動作定義とキーごとの設定の保存形式
|
||||
|
||||
- 位置づけ: MAPのデータモデルを定めるための設計判断。
|
||||
- 未決事項: キーコード割り当てに加え、タップ/ホールド、コンボ、マクロ等の定義・設定をどこまで扱うか。Staticで扱う範囲、ファームウェア共通表現と固有表現の境界も未定。
|
||||
- 完了条件: 初期対応する動作と設定、その保存形式、Static出力とDynamic読み書きでの扱いをユーザーが決める。
|
||||
- 未決事項:
|
||||
- マクロ(VIAで読み書きするため内容をMAPが持つ)と、タップダンス・コンボ等のStaticで定義する動作を、MAPにどう保存するか。
|
||||
- キーごとに上書きする設定を、PHYのキー、キーとレイヤーの組、キーコードのどれに付けるか。
|
||||
- 完了条件: 動作定義とキーごとの設定の保存形式をユーザーが決める。
|
||||
|
||||
### P-2 VIAの初期対応範囲
|
||||
### P-2 VIAのコマンドはQMK 0.34.4のソースどおりに動作する
|
||||
|
||||
- 位置づけ: VIA通信と編集UIの実装に必要な対応範囲の判断。
|
||||
- 未決事項: 対応プロトコルのバージョン、キーコード体系、レイヤー別割り当て以外に読み書きする項目、対象ファームウェアの機能・容量制約の確認方法。
|
||||
- 完了条件: 対象バージョンと読み書きする項目を定め、対応する新規キーボードの構成で必要なコマンドと制約を確認する。
|
||||
- 位置づけ: 本文「VIAで読み書きする項目」が前提にしている。コマンドの内容はソース(`quantum/via.c`)と公式文書から確認したもので、実機では検証していない。
|
||||
- 格上げ条件: QMK 0.34.4でビルドした新規キーボードの構成で、対応するコマンドの読み書きと、レイヤー数・マクロの個数と容量の読み出しを実機で確認する。
|
||||
|
||||
### P-3 プロジェクトと実機の対応・状態管理
|
||||
|
||||
- 位置づけ: 実機への読み書きをMAPへ結び付けるための設計判断。
|
||||
- 未決事項: 出力した構成とPHYキーID・通信上のアドレスの対応をどこに保持し、接続した実機とどう照合するか。バリアントや配線の変更後の扱い、プロジェクトと実機の差分・保存・反映の操作も未定。
|
||||
- 完了条件: 対応情報の生成・保存・照合方法と状態管理を定め、設計から実機へ反映し、Remap等での変更を元のPHYキーIDへの割り当てとして取り込む手順を確認する。
|
||||
- 未決事項:
|
||||
- 出力した構成とPHYキーID・通信上のアドレスの対応をどこに保持し、接続した実機とどう照合するか。
|
||||
- VIAの割り当ては接続先(row/col)単位で保存されるため、同じ接続先に配線された排他キーは、実機では1つの割り当て先を共有する。書き込み時に選択外のバリアントのキーの割り当てをどう扱うか、読み出した値をどのPHYキーへ戻すか(実機側のlayout optionの選択に従うか)。
|
||||
- バリアントや配線の変更後の扱い。
|
||||
- プロジェクトと実機、プロジェクトとStaticで組み込んだ初期キーマップの差分表示・保存・反映の操作。
|
||||
- 完了条件: 対応情報の生成・保存・照合方法と状態管理を定め、設計から実機へ反映し、Remap等での変更を元のPHYキーIDへの割り当てとして取り込む手順を確認する。排他キーを含む構成で、書き込みと読み出しがバリアントの選択に従って元のPHYキーへ対応することを確認する。
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
## 概要
|
||||
|
||||
PHYレイヤーは、キースイッチやキーキャップ、その他周辺部品の物理的な配置に関する情報を提供する。
|
||||
付加的な情報として、matrix情報(ELCレイヤー)や入力キー情報(MAP/IMEレイヤー)を含ませることができるが、必須ではない。
|
||||
付加的な情報として、matrix情報(ELCレイヤー)や入力キー情報(MAP/HSTレイヤー)を含ませることができるが、必須ではない。
|
||||
|
||||
## 構造
|
||||
|
||||
|
||||
@@ -98,3 +98,67 @@
|
||||
- 再開条件: 既存コミュニティレイアウトとの互換出力を検証するとき。
|
||||
- 完了条件: 実データのキーを共通キーとバリアント別のPHYキーに対応づけ、全体の `order` から各レイアウトの要求順を取捨で再現できるか確認する。
|
||||
再現できないものが残る場合は、対応範囲と扱いを決める。
|
||||
|
||||
## MAP
|
||||
|
||||
### MAP-P-4 ON/OFF以外の入力への割り当て
|
||||
|
||||
- 関連仕様: [MAPレイヤー](../MAPレイヤー.md)「MAPデータと他レイヤーの関係」、[PHYレイヤー](../PHYレイヤー.md)「部品ノード」
|
||||
- 未決事項: ロータリーエンコーダの回転のように、ON/OFFのキーではない入力へ割り当てる方法。
|
||||
MAPはPHYのキーIDを参照するが、エンコーダはPHYで部品ノードとして置かれる。
|
||||
参照先の種類、入力ごとの割り当て先(回転方向など)、VIAでの読み書きの対象にするかが未定。
|
||||
アナログ値の解釈の所属は[全体方針のP-1](../keyboard-design-layers.md#p-1-アナログ値の解釈をどの層が持つか)で扱い、この項目とは分ける。
|
||||
- 保留できる理由: キーへの割り当てと実機との読み書きは、キー以外の入力を扱わなくても実装できる。
|
||||
- 再開条件: エンコーダ等を載せたキーボードの割り当てをMAPで扱うとき。
|
||||
- 完了条件: 対象とする入力の種類と、MAPからの参照方法・保存形式をユーザーが決め、VIAで読み書きする場合は必要なコマンドを確認する。
|
||||
|
||||
### MAP-P-5 キーコードを表示するOS配列
|
||||
|
||||
- 関連仕様: [MAPレイヤー](../MAPレイヤー.md)「持たないもの」、[HSTレイヤー](../HSTレイヤー.md)
|
||||
- 未決事項: MAPエディタがキーコードをどのOS配列の文字で表示するか。HSTのどのプロファイルを使うか。
|
||||
少なくともUS/JISの切り替えは欲しい。利用者が増えれば他言語への対応も求められる。
|
||||
- 保留できる理由: キーコードの割り当てと実機との読み書きは、表示に使うOS配列と独立して実装できる。
|
||||
- 再開条件: MAPエディタの表示を実装するとき、またはHSTの[P-2](../HSTレイヤー.md#p-2-対象ホストを複数持つか)を決めるとき。
|
||||
- 完了条件: 表示に使うHSTプロファイルの指定方法と置き場所をユーザーが決める。
|
||||
|
||||
### MAP-P-6 QMKのdevelopブランチ・Community Modulesへの対応
|
||||
|
||||
- 関連仕様: [MAPレイヤー](../MAPレイヤー.md)「DynamicとStatic」
|
||||
- 未決事項: 当面非対応としたdevelopブランチの機能とCommunity Modules(VIAモジュール以外)を、DynamicとStaticの対象に含めるか。
|
||||
含める場合、developブランチのコミットの指定方法と、UIでの対応バージョンの示し方。
|
||||
- 保留できる理由: QMK本家masterの公式機能だけで、Dynamicの読み書きとStaticの生成を実装できる。
|
||||
- 再開条件: masterの機能だけでは足りない動作や設定が必要になったとき。
|
||||
または、VIAのモジュール移行([qmk_firmware#26315](https://github.com/qmk/qmk_firmware/pull/26315))がdevelopに入ったとき。
|
||||
VIAモジュールへの対応はmasterに入る前に済ませる([MAPレイヤー「DynamicとStatic」](../MAPレイヤー.md#dynamicとstatic))。
|
||||
- 完了条件: 対象に含める範囲と、対応バージョンの管理方法をユーザーが決める。
|
||||
|
||||
### MAP-P-7 再ビルド時に実機の調整を失わないワークフロー
|
||||
|
||||
- 関連仕様: [MAPレイヤー](../MAPレイヤー.md)「DynamicとStatic」、[MAPのP-3](../MAPレイヤー.md#p-3-プロジェクトと実機の対応状態管理)
|
||||
- 未決事項: QMK本家のVIAは、実機に保存したVIAのデータ(キーマップ・マクロ・layout option)を、ビルド日時をもとにした値で検証し、一致しなければ初期化する(`quantum/via.c` の `via_eeprom_is_valid()`。実機では未検証)。
|
||||
再ビルドしたファームウェアを書き込む前に、実機の調整をプロジェクトへ読み出す手順を、ワークフローでどう保証するか。警告、読み出しの強制、Firmware Generatorとの連携などが候補。
|
||||
- 保留できる理由: 実機からの読み出しとStaticの初期キーマップへの反映はすでに仕様にある。手作業の手順で運用できる。
|
||||
- 再開条件: Firmware Generatorでの書き込みや、プロジェクトと実機の状態管理(P-3)を設計するとき。
|
||||
- 完了条件: 再ビルドの前に実機の調整を取り込めるワークフローをユーザーが決め、書き込み後にVIAのデータが初期化されることを実機で確認する。
|
||||
|
||||
### MAP-P-8 QMK以外のファームウェアでのキーコード表記
|
||||
|
||||
- 関連仕様: [MAPレイヤー](../MAPレイヤー.md)「MAPデータと他レイヤーの関係」、[全体方針のFirmware Generator](../keyboard-design-layers.md#firmware-generator)
|
||||
- 未決事項: MAPはQMKのキーコード表記を基本とする。KMK等のQMK以外のファームウェアへ出力するとき、QMK表記から変換するか、共通の表記を別に設けるか。
|
||||
- 保留できる理由: 当面の対象ファームウェアはQMKだけで、QMK表記のまま保存・読み書き・出力できる。
|
||||
- 再開条件: QMK以外のファームウェアへの出力や、実機との通信に着手するとき。
|
||||
- 完了条件: QMK以外のファームウェアで使うキーコードの表現と、QMK表記との対応方法をユーザーが決める。
|
||||
|
||||
### MAP-P-9 Cコードの生成とユーザーのCの組み込み
|
||||
|
||||
- 関連仕様: [MAPレイヤー](../MAPレイヤー.md)「MAPデータと他レイヤーの関係」「DynamicとStatic」、[全体方針のFirmware Generator](../keyboard-design-layers.md#firmware-generator)
|
||||
- 未決事項: QMKのkeymap.jsonでは、タップダンス・コンボ・キーオーバーライドや、キーごとの設定(`get_tapping_term` 等のコールバック)を表現できない。
|
||||
JSONを正本にしたままこれらをCとして生成する方法と、ユーザーが用意したC/hで一部を上書きする方法。
|
||||
QMKのコールバックは1つの関数として定義するため、生成したCとユーザーのCが同じ関数を定義するとビルドできない。候補:
|
||||
- 生成した関数の先頭でユーザー用のフックを呼び、フックが処理しなかった場合はJSONの値を使う(有力)
|
||||
- ユーザーが引き受ける関数をJSONまたはhのプロトタイプで宣言し、Generatorはその関数を出力しない
|
||||
`ACTION_TAP_DANCE_FN*` やリーダーキーのように、本質的にCで書く動作をJSONから参照する方法も含む。
|
||||
MAPの「キーマップ固有のコードには原則として対応しない」との関係も整理する。
|
||||
- 保留できる理由: レイヤー別の割り当てとVIAでの読み書きは、keymap.jsonで表現できる範囲だけで実装できる。
|
||||
- 再開条件: Firmware Generatorでタップダンス・コンボ・キーごとの設定等を出力するとき、またはP-1で動作定義とキーごとの設定の保存形式を決めるとき。
|
||||
- 完了条件: 生成するCの構成と、ユーザーのC/hを組み込む方法をユーザーが決め、両方を含む構成でQMKのビルドが通ることを確認する。
|
||||
|
||||
+45
-18
@@ -13,16 +13,41 @@ PHYの正本は相対座標の木だが、既存エディタ(KLE, kle-ng)の移
|
||||
|
||||
### テストケース
|
||||
|
||||
1. **60% ANSI** - 標準的なレイアウト
|
||||
2. **Split keyboard** - 左右分離型
|
||||
3. **Ergonomic layout** - カラムスタッガード + 回転
|
||||
4. **Macro pad** - シンプルな4x4
|
||||
入力はKLE JSONとし、取り込みを通してPHYへ変換する。
|
||||
|
||||
| ケース | サンプル | 主に確かめること |
|
||||
|---|---|---|
|
||||
| 60% | Cr0wn60 | 行スタッガード、幅の違うキー、左右対称配列の中央の隙間 |
|
||||
| 分割 | crkbd、jisplit89 | 左右の分離、カラムスタッガードと回転した親指キー(crkbd)、キー数の多いJIS配列の分割(jisplit89) |
|
||||
| 分割 + バリアント | Kyria、Iris Rev.7 | 回転したクラスター内のバリアント(Kyria)、部品(エンコーダ)を含む3択のバリアント(Iris Rev.7) |
|
||||
| マクロパッド | 4x4 | 最小構成 |
|
||||
| charlieplexing | Cr0wn60(VIA定義) | 行と列が同じピンを共有する配線を、ELCの接続先で表せるか |
|
||||
|
||||
リポジトリに置くサンプルは `samples/` にある。
|
||||
|
||||
- `kle/cr0wn60.json`: [EwdErna/Cr0wn60](https://github.com/EwdErna/Cr0wn60) の `keyboard-layout.json`(919cc9e、MIT)
|
||||
- `via/cr0wn60.json`: 同リポジトリの `cr0wn60-via.json`。ラベルにマトリクス位置を持つ
|
||||
- `kle/macropad-4x4.json`: このリポジトリで作成
|
||||
|
||||
Cr0wn60はcharlieplexingで、行と列に同じ9本のピンを割り当て、使わない位置をマスクしている。
|
||||
ピンの割り当ては、ファームウェア [EwdErna/qmk_firmware](https://github.com/EwdErna/qmk_firmware) の
|
||||
`dev/ewderna_22` ブランチ(68d9249)の `keyboards/ewderna/cr0wn/cr0wn60/` にある
|
||||
(`info.json` の `matrix_pins`、`cr0wn60.c` の `matrix_mask`)。
|
||||
|
||||
その他はコピーせず、[the-via/keyboards](https://github.com/the-via/keyboards)(GPL-3.0)から、コミット 9e3e9f4 の次のファイルの `layouts.keymap` を取得して使う。
|
||||
|
||||
- crkbd: `src/crkbd/crkbd.json`
|
||||
- jisplit89: `src/jisplit89/jisplit89.json`
|
||||
- Kyria: `src/splitkb/kyria.json`
|
||||
- Iris Rev.7: `src/keebio/iris/iris-rev7.json`
|
||||
|
||||
VIAの定義に含まれるKLE JSONは、ラベルにキー名ではなくマトリクス位置(`行,列`)を持つ。
|
||||
バリアントは、ラベルの別の欄に `選択肢の番号,候補の番号` の形で示す。
|
||||
キー名のラベルによる照合の検証には使えない。ELCの接続先とバリアントの検証に使う。
|
||||
|
||||
### データ例
|
||||
|
||||
以下は旧形式(`keys` 配列、`position` / `size.width`)で書かれており、現行のPHYスキーマ(`phase1-json-schema.md`)に合わせた変換が必要。
|
||||
|
||||
#### 60% ANSI PHY Layer
|
||||
#### 60% ANSI PHY Layer (抜粋)
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -38,20 +63,22 @@ PHYの正本は相対座標の木だが、既存エディタ(KLE, kle-ng)の移
|
||||
"unitSize": { "x": 19.05, "y": 19.05 }
|
||||
}
|
||||
],
|
||||
"keys": [
|
||||
// Escape key
|
||||
"root": [
|
||||
{
|
||||
"id": "k00", "profile": "standard",
|
||||
"position": { "x": 0, "y": 0 },
|
||||
"size": { "width": 1, "height": 1 },
|
||||
"metadata": { "label": "Esc" }
|
||||
"type": "key",
|
||||
"id": "k00",
|
||||
"profile": "standard",
|
||||
"transform": { "x": 0, "y": 0, "rotation": 0 },
|
||||
"size": { "w": 1, "h": 1 },
|
||||
"labels": ["Esc"]
|
||||
},
|
||||
// Space bar
|
||||
{
|
||||
"id": "k60", "profile": "standard",
|
||||
"position": { "x": 5, "y": 4 },
|
||||
"size": { "width": 6.25, "height": 1 },
|
||||
"metadata": { "label": "Space" }
|
||||
"type": "key",
|
||||
"id": "k60",
|
||||
"profile": "standard",
|
||||
"transform": { "x": 5, "y": 4, "rotation": 0 },
|
||||
"size": { "w": 6.25, "h": 1 },
|
||||
"labels": ["Space"]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
# QMKでのDynamic/Staticの対応範囲
|
||||
|
||||
## 結論
|
||||
|
||||
当面の対象ファームウェアはQMK。
|
||||
- Dynamic: QMK本家のVIAプロトコルが公開する項目のみ
|
||||
- Static: QMK本家の公式機能のうちVIAで変更できないものは、Firmware Generatorで生成する対象
|
||||
- 非公式機能(Vial等のフォーク、XAP等のmaster以外のブランチ)は当面非対応
|
||||
- developブランチ・Community Modulesは当面非対応(将来広げたい→backlog MAP-P-6)。キーボード・キーマップ固有コードは原則非対応
|
||||
- 対応QMKは特定コミットに固定し、更新タイミングはユーザーが個別に判断する
|
||||
- UIにはVIAプロトコルとキーコード体系のバージョンを表示し、実機とはこの2つで照合。不一致の実機は非対応
|
||||
(当初はUIにコミットを出す案だったが、実機から取れるのがこの2つだけなのでユーザーがバージョン表記に変更)
|
||||
- Staticで定義する動作(タップダンス等)はキーから名前で参照し、出力時に番号へ変換する
|
||||
- VIA管理外のEEPROM設定は読み出せない旨を制約として明記
|
||||
|
||||
どこまでを初期対応するか(P-1)、最初に対応するコミット(P-2)は未決。
|
||||
|
||||
## 案の比較
|
||||
|
||||
| 案 | 扱い |
|
||||
| --- | --- |
|
||||
| DynamicはQMK本家VIAのみ、他の公式機能はStatic | 採用(ユーザー指定) |
|
||||
| VialでDynamicの範囲を広げる(タップダンス・コンボ・QMK Settings等) | 当面非対応(フォークのため) |
|
||||
| XAP | 当面非対応(master外) |
|
||||
| QMKの最新へ自動追従 | 採用しない。ユーザーが恣意的に更新時期を決める |
|
||||
|
||||
## 調査結果(2026-09-23時点のソース)
|
||||
|
||||
実機での検証はしていない。
|
||||
|
||||
### A. QMK本家 VIA
|
||||
参照: https://raw.githubusercontent.com/qmk/qmk_firmware/master/quantum/via.h
|
||||
VIA_PROTOCOL_VERSION = 0x000D
|
||||
|
||||
command:
|
||||
- 0x01 get_protocol_version
|
||||
- 0x02/0x03 get/set_keyboard_value
|
||||
- 0x01 uptime(get), 0x02 layout_options(get/set), 0x03 switch_matrix_state(get),
|
||||
0x04 firmware_version(get), 0x05 device_indication(set), 0x06 keycodes_version(get)
|
||||
- 0x04/0x05 dynamic_keymap_get/set_keycode (layer,row,col)
|
||||
- 0x06 dynamic_keymap_reset
|
||||
- 0x07/0x08/0x09 custom_set/get_value, custom_save
|
||||
- channel 0 custom(キーボード独自メニュー)
|
||||
- 1 backlight: brightness, effect
|
||||
- 2 rgblight: brightness, effect, effect_speed, color
|
||||
- 3 rgb_matrix: brightness, effect, effect_speed, color
|
||||
- 4 audio: enable, clicky_enable
|
||||
- 5 led_matrix: brightness, effect, effect_speed
|
||||
- 0x0A eeprom_reset
|
||||
- 0x0B bootloader_jump
|
||||
- 0x0C..0x10 dynamic_keymap_macro_get_count / get_buffer_size / get_buffer / set_buffer / reset
|
||||
- 0x11 dynamic_keymap_get_layer_count
|
||||
- 0x12/0x13 dynamic_keymap_get/set_buffer
|
||||
- 0x14/0x15 dynamic_keymap_get/set_encoder
|
||||
|
||||
MAPに関係するもの: キーコード、レイヤー数、エンコーダ、マクロ、layout_options。
|
||||
照明・オーディオはMAPの所有データ外(MAPレイヤー.md「持たないもの」)。
|
||||
|
||||
### B. Vial(フォーク、今回非対応)
|
||||
参照: https://raw.githubusercontent.com/vial-kb/vial-qmk/vial/quantum/vial.h
|
||||
参照: https://raw.githubusercontent.com/vial-kb/vial-qmk/vial/quantum/qmk_settings.c
|
||||
VIAL_PROTOCOL_VERSION = 6
|
||||
|
||||
- keyboard_id、圧縮キーボード定義JSONの取得(get_size/get_def)
|
||||
- unlock/lock(物理キー押下による解除)
|
||||
- dynamic entry: tap dance, combo, key override, alt repeat key
|
||||
- 拡張マクロ(EXT_TAP/DOWN/UP)
|
||||
- QMK Settings (QSID):
|
||||
1 grave_esc_override, 2 combo_term, 3 auto_shift, 4 auto_shift_timeout,
|
||||
5 osk_tap_toggle, 6 osk_timeout, 7 tapping_term, 9-17 mousekey各種(MK_3_SPEED以外),
|
||||
18 tap_code_delay, 19 tap_hold_caps_delay, 20 tapping_toggle,
|
||||
21 magic_settings(Ctrl/Caps, Alt/GUI, Ctrl/GUI, Grave/Esc, BSpc/BSlash入替, GUI無効, NKRO),
|
||||
22 permissive_hold, 23 hold_on_other_key_press, 24 retro_tapping,
|
||||
25 quick_tap_term, 26 chordal_hold, 27 flow_tap_term
|
||||
- VialRGB(RGB Matrixエフェクト列挙・設定)。ソース未確認
|
||||
|
||||
### C. プロトコル外で実機上だけ変わるもの(Dynamicの定義外)
|
||||
当初「すべてEEPROMに保存される」と書いたが誤り。確認結果:
|
||||
- 保存されない(再起動で消える): ダイナミックマクロ(docs/features/dynamic_macros.md
|
||||
"lost when the keyboard is unplugged or otherwise rebooted")、DT_UP/DT_DOWN(docs/tap_hold.md "*not* persistent")
|
||||
- EEPROMに保存される(quantum/eeconfig.h): keymap config(Magic)、default layer、unicode mode、audio、backlight、
|
||||
rgblight/rgb_matrix/led_matrix、haptic、steno mode、handedness、connection、kb/user固有データ
|
||||
- QMK本家via.cにはこれらを読み出すコマンドがない。照明・オーディオはcustom channel 1〜5で読めるがMAPの所有外。
|
||||
custom channel 0はweakの via_custom_value_command_kb() へ流れる(キーボード固有コード、原則非対応)。
|
||||
- 参考: via_eeprom_is_valid() はビルド日時由来のmagicで検証し、不一致ならVIAのデータ(キーマップ・マクロ・layout options)を
|
||||
初期化する。再ビルドして書き込むとDynamicの変更は消える前提になる。
|
||||
|
||||
### XAP
|
||||
QMK公式の次世代プロトコルとして開発されていたが、masterには入っていない認識。未確認。
|
||||
@@ -0,0 +1,29 @@
|
||||
# GeneratorのC出力とユーザーのCによる上書き
|
||||
|
||||
## 結論
|
||||
|
||||
未決。backlog MAP-P-9 として保留(ユーザー指定)。フック方式が有力(ユーザー「フック方式いいかも」)。
|
||||
JSONを第一級にしてCを自動生成し、ユーザーのC/hで一部を上書きできるようにしたい、というのがユーザーの意向。
|
||||
|
||||
## 案の比較
|
||||
|
||||
| 案 | 内容 | 所見 |
|
||||
| --- | --- | --- |
|
||||
| (b) フック | 生成関数の先頭でユーザーのフックを呼び、未処理ならJSONの値 | キー単位の例外だけ書ける。JSONが正本のまま |
|
||||
| (a) 関数ごと置き換え(JSONで宣言) | 宣言された関数はGeneratorが出力しない | 単純。その関数の範囲ではJSONの値が無効になる |
|
||||
| (a') 関数ごと置き換え(hのプロトタイプで宣言) | ユーザーのhにあるプロトタイプの関数を出力しない(ユーザー案) | (a)と同じ性質。Generatorがhを解析する必要 |
|
||||
| weak属性で上書き | 生成側をweakにしてユーザーの定義で上書き | 使えない(下記) |
|
||||
| ユーザーのCを解析して自動判定 | — | 壊れやすい |
|
||||
|
||||
## 根拠(QMK 0.34.4)
|
||||
|
||||
- keymap.jsonで書けるもの: keyboard, keymap, layout, layers, encoders, dip_switches, macros, keycodes(名前宣言), config, modules,
|
||||
host_language 等(data/schemas/keymap.jsonschema)。タップダンス・コンボ・キーオーバーライド・キーごとの設定はない。
|
||||
- キーごとの設定は `*_PER_KEY` を定義した上での `get_tapping_term(keycode, record)` 等のコールバック。keyrecordを受けるので
|
||||
キーコード単位でも位置単位でも書ける。
|
||||
- keymap.jsonとkeymap.cを並べると、json2cで生成したkeymap.cがユーザーのkeymap.cを取り込む
|
||||
(builddefs/build_keyboard.mk:148-157、OTHER_KEYMAP_C)。QMK自体がJSON + ユーザーCの共存に対応している。
|
||||
- 取り込みは同一翻訳単位なので、生成側weak + ユーザー側strongは再定義エラーになる。QMK本体のweak既定実装もあるため、
|
||||
別ファイルにしても生成側をweakにする方式は選ばれる定義が不定。
|
||||
- プロトタイプの再宣言はCでは合法(同一シグネチャなら何度でも)。QMKが宣言済みの関数をユーザーのhに書いてもよい。
|
||||
シグネチャ違いはコンパイルエラーになるので検出にも使える。
|
||||
@@ -0,0 +1,35 @@
|
||||
# IMEレイヤーの再定義(HST)と線引き
|
||||
|
||||
## 結論
|
||||
|
||||
- IMEレイヤーをHST(ホスト)レイヤーに改める。役割は、ホストがキーコードをどう解釈するかの記述。IMEの変換はOSの仕事で対象外。
|
||||
- データは、ホスト環境ごとのプロファイルを集めた共有カタログ。キーボードに依存しない。プロジェクトはプロファイルのIDと差分だけを持つ。
|
||||
- 識別はOS×ホスト配列(+必要なら入力方式)。`win-jp` などはプリセット名。
|
||||
- プロファイルは順方向の表 f(キーコード, 修飾キー, ホスト状態) → 文字/動作/未定義/不明、成立の前提、対応可否(3値)だけを持つ。
|
||||
- 逆引き・候補の生成・ファームウェアでの実現はMAPエディタとGeneratorが行う。ユーザーは、これが実現できるかに不安がある → HSTのP-1。
|
||||
- MAPはキーコードを保存する。逆引きは入力補助で、一方向の変換。
|
||||
- 複数ホストの扱いは未決 → HSTのP-2。
|
||||
|
||||
## 案の比較
|
||||
|
||||
| 論点 | 当初の提案(人との議論) | Claude | Codex | 採用 |
|
||||
|---|---|---|---|---|
|
||||
| 名前 | SYS | HOST/HST | SYS → 最終的にHOST/HSTに同意 | HST |
|
||||
| 識別子 | WIN-JAP (OS×言語) | OS×配列の構造 | OS×配列×入力方式+プロファイル名 | OS×配列(+入力方式) |
|
||||
| 範囲 | OS・言語ごとのキーの振る舞い・表示 | ホストの解釈の記述 | 意図を環境ごとの出力に変換、まで候補 → 最終的に「対応関係を提供、変更はしない」 | 記述のみ |
|
||||
| 逆引き | - | 使う側で順方向の表から求める | 候補と成立条件をプロファイルが持つ | 使う側 |
|
||||
| ホスト状態 | - | 関数の引数として記述 | 設定と実行時の状態を分ける | 両方(矛盾しない) |
|
||||
|
||||
## 根拠・経緯
|
||||
|
||||
- SYSは、HIDのSystem Control用途ページ(電源・スリープ)や「システム設定全般」と紛らわしい。hostはHIDでキーボードの接続相手を指す用語で、QMKも「host keyboard layout」と呼ぶ。
|
||||
- 言語は軸として誤り: 日本語Windowsで英語配列を使える。MacではUS/JISが入力ソースとキーボード種別で決まる。XKBはlayout/variant/optionsの3要素。
|
||||
「英語」にもUS・UKがある。`JAP` はISOコードでもない(ja/jpn)。
|
||||
- 逆引きをプロファイルに持たせない理由: (1) 順方向の表から導けるので二重管理になる。
|
||||
(2) 候補がファームウェアの機能に依存する。例: US刻印+JISホストでShiftの組が合わないキーにはKey Overrideが要る。HSTにQMKの知識が混ざる。
|
||||
- Codexの指摘で採用したもの: 表示の切り替えと送信内容の変更を混ぜない。知らない動作を「使えない」と扱わない(対応可否を3値にする)。OS設定への依存は記述する。
|
||||
- MAPの正本をキーコードにする理由の修正: Claudeは当初「VIAでは実機にキーコードしか残らず、意図を復元できないので、キーコードでなければならない」とした。
|
||||
Codexが、意図をプロジェクト側に残す設計も可能で、難しくなるのは実機で変更された値の取り込みだけだと反論し、これが正しい。
|
||||
採用する理由は「実機との往復を単純に保てるから」とする。
|
||||
- 「コピー」のような操作の辞書は、アプリやユーザー設定まで相手が広がるので対象外。
|
||||
- 未採用のアイデア: キートップの刻印生成にHSTを使う(PHYのラベルへ流す)。検討していないので仕様には書かない。
|
||||
@@ -0,0 +1,162 @@
|
||||
# QMK 0.34.4 の機能棚卸し(MAP P-2 の下調べ)
|
||||
|
||||
## 結論
|
||||
|
||||
- 対象: QMK `0.34.4`(tag, commit `08c662f286ddfd12a985f57b584b02eca5af0ae6`, 2026-09-05)。masterの最新リリース。
|
||||
ユーザーが最初の対応環境として0.34.4を採用(2026-09-24)。
|
||||
- キーコード体系 `QMK_KEYCODES_VERSION` = `0.0.9`(quantum/keycodes.h)
|
||||
- `VIA_PROTOCOL_VERSION` = `0x000D`(quantum/via.h。9/23時点の調査と同じ)
|
||||
- MAPから見たQMKの機能は次の6種類に分かれる(下の表)。スキーマ・編集機能への落とし込みは未着手。
|
||||
- 既存ドキュメントに影響しうる事実が2つある:
|
||||
1. **VIAのモジュール化**(20260830 ChangeLog「VIA Feature Migration」#26315)。VIA統合の保守をVIAチームへ移し、
|
||||
旧来のfeature実装は将来のリリースで削除予定と告知済み。PR本体はdevelop向けのDraftで、0.34.4時点のVIAは従来の
|
||||
`quantum/via.c`。MAPレイヤー.md は「Dynamic = QMK本家のVIA」「Community Modules は当面非対応」としているため、
|
||||
VIAがモジュール側へ移った時点でこの2つが衝突する。
|
||||
2. **VIAのマトリクス状態取得の無効化**(20250831 ChangeLog #25414)。`id_switch_matrix_state` は既定で全0を返す。
|
||||
`VIA_INSECURE` 定義時、または `SECURE_ENABLE` でアンロック中のみ実値。Remap等のキーテスターは既定では動かない。
|
||||
- QMKのキーごとの設定(tapping term等)はデータテーブルではなく、keycode/keyrecordを受けるCのコールバック関数で表現される。
|
||||
keymap.json(data-driven)で書けるのはレイヤー・エンコーダ・DIPスイッチ・マクロ・カスタムキーコード・config・modules まで。
|
||||
タップダンス・コンボ・キーオーバーライド・キーごとの設定はCでしか書けない。
|
||||
|
||||
## 分類の概要
|
||||
|
||||
| 区分 | 主なもの | 実機への保存 | VIAで読み書き |
|
||||
| --- | --- | --- | --- |
|
||||
| A. キーコード(単体で完結) | 基本キー、修飾付き、MT/LT/OSM等、レイヤー操作、Magic、メディア、マウス等 | キーマップ | ○(16bit値として) |
|
||||
| B. 定義を参照するキーコード | TD(n)、QK_MACRO_n、UM/UP、QK_KB_n/QK_USER_n | 参照はキーマップ、定義はファームウェア | 参照のみ○。定義はマクロのみ○ |
|
||||
| C. キー以外の起動条件を持つ動作 | コンボ、キーオーバーライド、リーダー、オートコレクト、Tri Layer | ファームウェア | × |
|
||||
| D. タップ・ホールド等の挙動設定 | TAPPING_TERM等 + キーごとのコールバック | ファームウェア(DTTの変更は揮発) | × |
|
||||
| E. キー以外の入力への割り当て | エンコーダ、DIPスイッチ、ポインティング、ジョイスティック等 | エンコーダはキーマップ | エンコーダのみ○ |
|
||||
| F. 実機の永続状態 | Magic設定、保存されたデフォルトレイヤー、Unicodeモード等 | EEPROM | × |
|
||||
|
||||
MAPの所有外(照明・オーディオ・ディスプレイ・ハードウェア構成)は末尾にまとめた。
|
||||
|
||||
---
|
||||
|
||||
## A. キーコード体系 0.0.9
|
||||
|
||||
data/constants/keycodes/*.hjson を 0.0.1〜0.0.9 の順にマージして得た範囲。
|
||||
|
||||
| 範囲 | 名前 | 内容 |
|
||||
| --- | --- | --- |
|
||||
| 0x0000–0x00FF | QK_BASIC | KC_NO/KC_TRNS、HID基本キー(basic 161件)、system 3、media 27、mouse 19(QK_MOUSE_*)、修飾8 |
|
||||
| 0x0100–0x1FFF | QK_MODS | `LCTL(kc)` 等。kcは基本キーのみ、修飾は5bit(左右混在不可) |
|
||||
| 0x2000–0x3FFF | QK_MOD_TAP | `MT(mod, kc)`。kcは基本キーのみ |
|
||||
| 0x4000–0x4FFF | QK_LAYER_TAP | `LT(layer, kc)`。layer 0–15、kcは基本キーのみ |
|
||||
| 0x5000–0x51FF | QK_LAYER_MOD | `LM(layer, mod)`。layer 0–15 |
|
||||
| 0x5200– | QK_TO / MOMENTARY / DEF_LAYER / TOGGLE_LAYER / ONE_SHOT_LAYER / ONE_SHOT_MOD / LAYER_TAP_TOGGLE / PERSISTENT_DEF_LAYER | TO/MO/DF/TG/OSL/OSM/TT/PDF。各32(layer 0–31) |
|
||||
| 0x5600–0x56FF | QK_SWAP_HANDS | SH_T(kc)、SH_TOGG等7件 |
|
||||
| 0x5700–0x57FF | QK_TAP_DANCE | TD(0–255) |
|
||||
| 0x7000–0x70FF | QK_MAGIC | Ctrl/Caps、Alt/GUI、Ctl/GUI、Grave/Esc、BSpc/BSlash、Esc/Caps入替、GUI無効、NKRO、EE_HANDS 等35件 |
|
||||
| 0x7100–0x71FF | QK_MIDI | ノート・オクターブ・移調・ベロシティ・チャンネル等 |
|
||||
| 0x7200–0x73FF | QK_SEQUENCER | 9件 |
|
||||
| 0x7400–0x743F | QK_JOYSTICK | ボタン0–31 |
|
||||
| 0x7440–0x747F | QK_PROGRAMMABLE_BUTTON | 1–32 |
|
||||
| 0x7480–0x74BF | QK_AUDIO | Audio/Clicky/Music 15件 |
|
||||
| 0x74C0–0x751F | QK_STENO | 0.0.9で拡張・改名(STN_* → QK_STENO_* / ST_*、旧名はエイリアス) |
|
||||
| 0x7700–0x777F | QK_MACRO | QK_MACRO_0–31(名前付き)。VIA/keymap.jsonのマクロ |
|
||||
| 0x7780–0x77BF | QK_CONNECTION | 出力先切替(USB/2.4GHz/BT)、BTプロファイル1–5等15件 |
|
||||
| 0x77C0–0x77FF | QK_COMMUNITY_MODULE | Community Modules用 |
|
||||
| 0x7800–0x78FF | QK_LIGHTING | Backlight 7、LED Matrix 11、RGBLight(underglow)11 + RGB_MODE_* 10、RGB Matrix 15 |
|
||||
| 0x7C00–0x7DFF | QK_QUANTUM | 下記 |
|
||||
| 0x7E00–0x7E3F | QK_KB | QK_KB_0–31(キーボード固有) |
|
||||
| 0x7E40–0x7FFF | QK_USER | QK_USER_0–31(キーマップ固有。SAFE_RANGE以降) |
|
||||
| 0x8000–0xFFFF | QK_UNICODE / UNICODEMAP / UNICODEMAP_PAIR | UC(cp≤0x7FFF)、UM(i)、UP(i,j) |
|
||||
|
||||
QK_QUANTUM の内訳(73件): Bootloader/Reboot/Debug/EEPROMクリア/Make、Auto Shift操作6、Grave Escape、
|
||||
Velocikey、Space Cadet 7、Unicodeモード切替8、Haptic 13、Combo on/off/toggle、Dynamic Macro 5、Leader、
|
||||
Key Lock、One Shot on/off/toggle、Key Override on/off/toggle、Secure 4、Dynamic Tapping Term 3、Caps Word、
|
||||
Autocorrect 3、Tri Layer Lower/Upper、Repeat/Alt Repeat、Layer Lock。
|
||||
|
||||
補足:
|
||||
- 20250831で旧RGB・マウスの非推奨キーコードを削除(#25444)。
|
||||
- VIAはキーマップを16bit値で読み書きするため、上のどの値もキーへ書ける。ファームウェアで無効な機能の値は何もしない。
|
||||
|
||||
## B. 定義を参照するキーコード
|
||||
|
||||
| 機能 | キーコード | 定義の中身 | 定義の置き場所 |
|
||||
| --- | --- | --- | --- |
|
||||
| Tap Dance | TD(n) | `ACTION_TAP_DANCE_DOUBLE(kc1,kc2)` / `_LAYER_MOVE(kc,layer)` / `_LAYER_TOGGLE(kc,layer)` / `_FN` / `_FN_ADVANCED` / `_FN_ADVANCED_WITH_RELEASE`。組み込みは前3つで、残りはC関数 | C(`tap_dance_actions[]`) |
|
||||
| マクロ | QK_MACRO_n | tap/down/up/delay(+keymap.jsonではbeep)と文字列。VIAの保存形式は SS_TAP/DOWN/UP/DELAY_CODE を含むバイト列 | keymap.json `macros` またはVIA(EEPROM)。VIA既定16個 |
|
||||
| Unicode Map | UM(i), UP(i,j) | コードポイント表 | C(`unicode_map[]`) |
|
||||
| 固有キーコード | QK_KB_n, QK_USER_n | 任意のC処理 | C(`process_record_*`)。keymap.json `keycodes` で名前宣言のみ可 |
|
||||
| Send String | (キーコードなし) | 文字列送信。マクロやC処理から呼ぶ | C |
|
||||
|
||||
## C. キー以外の起動条件を持つ動作
|
||||
|
||||
| 機能 | 定義 | 主な設定 |
|
||||
| --- | --- | --- |
|
||||
| Combos | キーコード列(最大8、EXTRA_LONGで16)→出力キーコード | COMBO_TERM、per-combo: term/must_hold/must_tap/must_press_in_order、COMBO_STRICT_TIMER、COMBO_ONLY_FROM_LAYER / COMBO_REF_DEFAULT(参照レイヤー)、Modifier Combos、キー解放・再押下の扱い |
|
||||
| Key Overrides | trigger, trigger_mods, layers(ビットマスク), negative_mod_mask, suppressed_mods, replacement, options(ko_option_t), custom_action, enabled | MODS_TO_NEUTRALIZE |
|
||||
| Leader Key | QK_LEADER の後のキー列(1〜5キー)→C処理 | LEADER_TIMEOUT、LEADER_PER_KEY_TIMING、LEADER_NO_TIMEOUT、STRICT_KEY_PROCESSING |
|
||||
| Autocorrect | 誤字→訂正の辞書(ビルド時にtrieへ変換) | 辞書ファイル、MIN/MAX_LENGTH |
|
||||
| Tri Layer | lower+upper → adjust レイヤー | 3レイヤーの番号 |
|
||||
| Caps Word / Repeat Key / Layer Lock / Key Lock / Swap Hands | 定義データはほぼなし。Swap Handsは `hand_swap_config`(マトリクス対応表)が必要 | Caps Wordの継続キー判定等はC |
|
||||
|
||||
## D. タップ・ホールド等の挙動設定(docs/tap_hold.md 他)
|
||||
|
||||
全体設定(config.h / keyboard.jsonのconfig)とキーごとのコールバックの組で提供される。
|
||||
|
||||
| 設定 | 全体 | キーごと |
|
||||
| --- | --- | --- |
|
||||
| Tapping Term | TAPPING_TERM | TAPPING_TERM_PER_KEY → get_tapping_term(keycode, record) |
|
||||
| Dynamic Tapping Term | DYNAMIC_TAPPING_TERM_ENABLE(キーで増減、揮発) | — |
|
||||
| Permissive Hold | PERMISSIVE_HOLD | get_permissive_hold |
|
||||
| Hold On Other Key Press | HOLD_ON_OTHER_KEY_PRESS | get_hold_on_other_key_press |
|
||||
| Quick Tap Term | QUICK_TAP_TERM | get_quick_tap_term |
|
||||
| Flow Tap(2025-05追加) | FLOW_TAP_TERM | is_flow_tap_key、get_flow_tap_term(keycode, record, prev_keycode) |
|
||||
| Chordal Hold(2025-02追加) | CHORDAL_HOLD + 左右手の割り当て(chordal_hold_layout) | get_chordal_hold(tap_hold_keycode, …, other_keycode, …) |
|
||||
| Retro Tapping | RETRO_TAPPING | get_retro_tapping |
|
||||
| Speculative Hold(2025-11追加) | SPECULATIVE_HOLD | get_speculative_hold |
|
||||
| Tapping Force Hold | — | get_tapping_force_hold |
|
||||
| Tapping Toggle | TAPPING_TOGGLE(TTのタップ回数) | — |
|
||||
| Auto Shift | AUTO_SHIFT_TIMEOUT 等 | get_autoshift_timeout、get_auto_shifted_key、REPEAT/NO_AUTO_REPEAT_PER_KEY |
|
||||
| One Shot | ONESHOT_TAP_TOGGLE、ONESHOT_TIMEOUT | — |
|
||||
| Combo | COMBO_TERM | get_combo_term 等(コンボごと) |
|
||||
| その他 | TAP_CODE_DELAY、TAP_HOLD_CAPS_DELAY、DEBOUNCE | — |
|
||||
|
||||
- キーごとのコールバックは keycode と keyrecord(押された位置・レイヤーを含む)を受ける。
|
||||
つまり「キーコード単位」「物理位置単位」のどちらでも書ける(docs/tap_hold.md「Why do we include the key record」)。
|
||||
- Chordal Holdの手の割り当ては物理位置(マトリクス)単位のデータ。
|
||||
|
||||
## E. キー以外の入力への割り当て
|
||||
|
||||
| 機能 | MAP相当のデータ | 備考 |
|
||||
| --- | --- | --- |
|
||||
| Encoders | ENCODER_MAP: レイヤーごと・エンコーダごとの ccw/cw キーコード | keymap.json `encoders`。VIAで読み書き可(0x14/0x15) |
|
||||
| DIP Switch | DIP_SWITCH_MAP: スイッチごとの on/off キーコード | keymap.json `dip_switches`(2025-11追加)。VIA不可 |
|
||||
| Pointing Device | Auto Mouse Layer(レイヤー番号・タイムアウト)、ドラッグスクロール等はC | センサー設定はハードウェア寄り |
|
||||
| Joystick / Digitizer / MIDI / Steno / Programmable Button / Sequencer | キーコードでボタン・音等を割り当て。軸・プロトコル設定は全体 | Stenoは0.0.9でキーコード改名 |
|
||||
|
||||
## F. 実機の永続状態(quantum/eeconfig.h)
|
||||
|
||||
VIA管理外でEEPROMに保存されるもの: debug、keymap config(Magic: Ctrl/Caps入替、Caps→Ctrl、Alt/GUI入替、GUI無効、Grave/Esc、BSpc/BSlash、NKRO 他)、
|
||||
default layer(PDF)、Unicode入力モード、audio、backlight、rgblight/rgb_matrix/led_matrix、haptic、steno mode、
|
||||
handedness(EE_HANDS)、connection、kb/user固有データ、Community Modules の永続データ(1.1.3で追加)。
|
||||
QMK本家VIAにはこれらを読み出すコマンドがない(9/23調査の再確認)。
|
||||
|
||||
## MAP所有外の機能(参考の一覧)
|
||||
|
||||
- 照明: Backlight、RGBLight、RGB Matrix、LED Matrix、LED Indicators
|
||||
- 表示: OLED、Quantum Painter(LVGL含む)、ST7565、HD44780
|
||||
- 音・触覚: Audio、Haptic Feedback
|
||||
- ハードウェア構成: Split Keyboard、Custom Matrix、Debounce、Converters、PS/2 Mouse、Wireless、Battery、USBPD
|
||||
- ホスト連携: Raw HID、OS Detection、Secure、Command、Bootmagic、WPM、Deferred Exec、Virtser、Plover HID
|
||||
- 拡張: Community Modules(1.1.3。modules/qmk/ に hello_world, super_alt_tab, split_data_sync, nvm_test, flow_*_matrix_effect)
|
||||
|
||||
## VIA 0x000D の読み書き範囲(0.34.4で再確認)
|
||||
|
||||
9/23の journal(qmk-dynamic-scope)と同じコマンド構成。差分・補足:
|
||||
- `id_switch_matrix_state` は既定で0を返す(上記)。
|
||||
- `id_eeprom_reset` は `VIA_EEPROM_ALLOW_RESET` 定義時のみ有効。
|
||||
- エンコーダは `ENCODER_MAP_ENABLE` 時のみ。
|
||||
- 既定: DYNAMIC_KEYMAP_LAYER_COUNT 4、DYNAMIC_KEYMAP_MACRO_COUNT 16。上限はEEPROM容量に従う。
|
||||
|
||||
## 調査方法
|
||||
|
||||
- `git clone --depth 1 --branch 0.34.4 --filter=blob:none --sparse` で docs / quantum / data / builddefs を取得。
|
||||
- 機能一覧: docs/_sidebar.json、builddefs/generic_features.mk の GENERIC_FEATURES。
|
||||
- キーコード: data/constants/keycodes/keycodes_*.hjson をバージョン順にマージ。
|
||||
- 変更点: docs/ChangeLog/20250223〜20260830。
|
||||
- VIA移行PR: https://github.com/qmk/qmk_firmware/pull/26315(develop向けDraft。VIA_EEPROM_MAGIC_ADDR 以外は後方互換を維持する方針と記載)
|
||||
- 実機での検証はしていない。
|
||||
@@ -0,0 +1,46 @@
|
||||
# VIAのモジュール化への追従
|
||||
|
||||
## 結論
|
||||
|
||||
- QMKはVIA統合をCommunity Modules形式へ移し、旧実装を将来削除すると告知(20260830 ChangeLog「VIA Feature Migration」#26315)。
|
||||
- 方針「QMKとVIAの両方に追従する」は変えない(ユーザー判断)。
|
||||
→ Community Modulesは当面非対応のままだが、VIAモジュールだけは例外として、移行がmasterに入る前に対応する。
|
||||
最悪、Community Modulesへの対応はVIAだけでもよい(ユーザー発言)。
|
||||
- キーテスター(switch_matrix_state)が既定で動かない件は気にしない(ユーザー判断)。
|
||||
|
||||
## 案の比較
|
||||
|
||||
| 案 | 扱い |
|
||||
| --- | --- |
|
||||
| VIAモジュールだけCommunity Modules非対応の例外にする | 採用 |
|
||||
| Community Modules全般に対応を広げる | MAP-P-6のまま保留 |
|
||||
| 旧VIA実装が残るQMKに固定し続ける | 追従方針に反するので採用しない |
|
||||
|
||||
## 根拠(2026-09-24時点)
|
||||
|
||||
- docs/ChangeLog/20260830.md(QMK 0.34.4):
|
||||
"upkeep of the VIA integration will transition to the VIA team" /
|
||||
"in a future release, the old VIA feature-based implementation is expected to be removed."
|
||||
- PR https://github.com/qmk/qmk_firmware/pull/26315 : develop向けDraft。追加ファイルは
|
||||
modules/qmk/via/{qmk_module.json, via.c, via.h, post_config.h, post_rules.mk}。
|
||||
qmk_module.json にバージョン欄なし。VIA_EEPROM_MAGIC_ADDR 以外は後方互換を維持すると記載。
|
||||
- 0.34.4時点のVIAは従来どおり quantum/via.c、VIA_PROTOCOL_VERSION 0x000D。
|
||||
- 同梱モジュールの有効化は keymap.json の `"modules": ["qmk/via"]` の形(data/schemas/keymap.jsonschema の modules、
|
||||
builddefs/build_keyboard.mk の generate-community-modules-*)。対応コストは小さい見込み。
|
||||
- 保守がVIAチームへ移るため、将来QMKリポジトリ外へ出る可能性はあるが未確認。
|
||||
|
||||
## 追記: 対応環境の指定方法
|
||||
|
||||
結論: 対応環境 = QMKのコミット + 使うモジュールの一覧(出所とコミット)。VIAは一覧の1項目。
|
||||
QMK同梱モジュールはQMKのコミットで決まる。実機との照合は従来どおりVIAプロトコル・キーコード体系のバージョン。
|
||||
|
||||
| 案 | 扱い |
|
||||
| --- | --- |
|
||||
| QMKのコミット + モジュール一覧 | 採用。VIAが外部へ出てもMAP-P-6の他モジュールでも同じ形 |
|
||||
| QMKのコミット + VIAのバージョンだけ追加 | VIAの特別扱いになるため採用しない |
|
||||
| QMKのコミットだけ(現状) | VIAがリポジトリ外へ出ると実装が決まらない |
|
||||
|
||||
- きっかけ: ユーザーが「QMKに加えてVIAのバージョンも明記したほうがよいか」と相談。
|
||||
- #26315の案ではVIAは modules/qmk/via(QMK同梱)で、qmk_module.json にバージョン欄がない。
|
||||
この案のままならQMKのコミットだけで決まるが、保守移管後に外へ出る可能性に備える。
|
||||
- モジュールのバージョンは実機から取得できないため、照合には使わない。
|
||||
@@ -0,0 +1,33 @@
|
||||
# VIAで読み書きする項目と機能・容量の確認方法
|
||||
|
||||
## 結論
|
||||
|
||||
- 対応: バージョン読み出し、レイヤー数、キーコード割り当て(まとめ読み書き含む)、マクロ
|
||||
- 別課題: エンコーダ(MAP-P-4)、layout option(P-3)
|
||||
- 当面非対応: リセット系・ブートローダ移行、デバイスの識別表示、キーテスター、custom channel
|
||||
- 有効な機能: 新規キーボードはGeneratorのビルド設定を正とする。既存キーボードは利用者の申告を信用する(ユーザー案)。
|
||||
申告はGeneratorの設定と同じ形式にし、新規と既存を1つのモデルで扱う。
|
||||
- 容量(レイヤー数・マクロ個数・容量)は実機から読んで照合する。
|
||||
- P-2は判断が済んだので、実機で未検証という推測(P-2)に置き換えた。
|
||||
|
||||
## 案の比較(VIA 0x000D, QMK 0.34.4 quantum/via.c)
|
||||
|
||||
| 項目 | コマンド | 扱い | 理由 |
|
||||
| --- | --- | --- | --- |
|
||||
| プロトコル・キーコード体系バージョン | 0x01, 0x02 id 0x06 | 対応 | 実機照合に必須 |
|
||||
| レイヤー数 | 0x11 | 対応 | 容量確認 |
|
||||
| キーコード | 0x04/0x05, 0x12/0x13 | 対応 | MAPの本体 |
|
||||
| マクロ | 0x0C–0x10 | 対応 | P-1で内容をMAPが持つとした |
|
||||
| エンコーダ | 0x14/0x15 | 別課題 | MAP-P-4 |
|
||||
| layout options | 0x02/0x03 id 0x02 | 別課題 | P-3の排他キーの読み戻しと一体 |
|
||||
| リセット・ブートローダ | 0x06, 0x0A, 0x0B | 当面非対応 | 操作でありMAPのデータではない。0x0Aは VIA_EEPROM_ALLOW_RESET 時のみ |
|
||||
| デバイスの識別表示 | 0x03 id 0x05 | 当面非対応 | 任意の補助機能 |
|
||||
| キーテスター | 0x02 id 0x03 | 非対応 | 既定で全0(#25414)。ユーザーも不要と判断 |
|
||||
| custom channel | 0x07–0x09 | 非対応 | 照明・オーディオはMAP所有外、channel 0は固有コード |
|
||||
|
||||
## 機能・容量の確認
|
||||
|
||||
- VIAから読めるのは容量(レイヤー数、マクロ個数、マクロバッファサイズ)とバージョンだけ。
|
||||
どの機能を有効にしてビルドしたか(タップダンス、コンボ等)は読めない。キーボード固有のVIA定義JSONにも含まれない。
|
||||
- 無効な機能のキーコードを書いてもエラーにならず、実機で何もしないだけ。申告の誤りは壊れる方向には働かない。
|
||||
- 既存キーボードは初期対応の前提ではない(MAPレイヤー.md「概要」)が、申告方式ならモデルを増やさずに扱える。
|
||||
@@ -55,13 +55,16 @@ ELCはIDXを参照せず、IDXもELCを参照しない。MAPもIDXを参照し
|
||||
- **対応ツール**: MAPエディタ (Keymap Designer)
|
||||
- **出力**: MAP JSON (現行形式はレイヤー別キーコード割り当て)
|
||||
- **備考**: キーの参照にPHYのキーIDを使う。配列としての並べ替えは、出力時にバリアント選択後のIDXの並び順で行う
|
||||
- **詳細**: [MAPレイヤー](MAPレイヤー.md)。動作定義と保存形式の拡張範囲は、[MAPのP-1](MAPレイヤー.md#p-1-割り当てる動作と保存形式の範囲)で扱う
|
||||
- **詳細**: [MAPレイヤー](MAPレイヤー.md)。動作定義とキーごとの設定の保存形式は、[MAPのP-1](MAPレイヤー.md#p-1-動作定義とキーごとの設定の保存形式)で扱う
|
||||
|
||||
### 5. IMEレイヤー (入力変換)
|
||||
### 5. HSTレイヤー (ホスト)
|
||||
|
||||
- **役割**: キーコードと実際の入力文字の対応
|
||||
- **対応ツール**: OS
|
||||
- **備考**: MAPレイヤー設計時に考慮が必要
|
||||
- **役割**: 接続先のホスト(OSとキーボード配列の設定)が、キーコードをどう解釈するかの記述
|
||||
- **入力**: なし。どの層も参照せず、MAPエディタとFirmware Generatorから参照される
|
||||
- **対応ツール**: OSのキーボード配列、QMKの言語別キーコード(`keymap_japanese.h` など)
|
||||
- **出力**: ホスト環境ごとのプロファイル。キーボードに依存しない共有カタログとする
|
||||
- **備考**: IMEのかな漢字変換はOSの責務で、HSTの対象外
|
||||
- **詳細**: [HSTレイヤー](HSTレイヤー.md)
|
||||
|
||||
## ツール設計方針
|
||||
|
||||
@@ -165,7 +168,7 @@ All → Firmware
|
||||
## 既存ツールとの関係
|
||||
|
||||
- **KLE**: PHYデータを表示できる既存のビュワー。KLE JSONの読み書きで連携する
|
||||
- **VIA/Remap**: 同じVIA対応実機の割り当てを編集する外部クライアント。外部で調整した結果もMAPエディタで読み出してプロジェクトへ戻す。対応範囲は[MAPのP-2](MAPレイヤー.md#p-2-viaの初期対応範囲)、実機との対応・状態管理は[MAPのP-3](MAPレイヤー.md#p-3-プロジェクトと実機の対応状態管理)で扱う
|
||||
- **VIA/Remap**: 同じVIA対応実機の割り当てを編集する外部クライアント。外部で調整した結果もMAPエディタで読み出してプロジェクトへ戻す。読み書きする項目は[MAP「VIAで読み書きする項目」](MAPレイヤー.md#viaで読み書きする項目)、実機との対応・状態管理は[MAPのP-3](MAPレイヤー.md#p-3-プロジェクトと実機の対応状態管理)で扱う
|
||||
- **QMK Configurator**: Firmware Generatorのターゲット
|
||||
|
||||
## 配慮事項
|
||||
|
||||
@@ -646,10 +646,12 @@ ELC・IDX・MAPはどれもPHYを参照する。ELCはIDXを参照せず、MAP
|
||||
"$defs": {
|
||||
"layer": {
|
||||
"type": "object",
|
||||
"required": ["id", "name", "keymap"],
|
||||
"required": ["name", "keymap"],
|
||||
"properties": {
|
||||
"id": { "type": "integer", "minimum": 0 },
|
||||
"name": { "type": "string" },
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Layer identifier, unique within the MAP. Layer order is the array order"
|
||||
},
|
||||
"keymap": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
|
||||
@@ -0,0 +1,173 @@
|
||||
[
|
||||
[
|
||||
{
|
||||
"p": "DCS R1"
|
||||
},
|
||||
"Esc",
|
||||
{
|
||||
"x": 0.25
|
||||
},
|
||||
"!\n1",
|
||||
"@\n2",
|
||||
"#\n3",
|
||||
"$\n4",
|
||||
"%\n5",
|
||||
{
|
||||
"x": 1
|
||||
},
|
||||
"^\n6",
|
||||
"&\n7",
|
||||
"*\n8",
|
||||
"(\n9",
|
||||
")\n0",
|
||||
"_\n-",
|
||||
{
|
||||
"x": 0.75
|
||||
},
|
||||
"+\n="
|
||||
],
|
||||
[
|
||||
{
|
||||
"p": "DCS R2",
|
||||
"a": 0,
|
||||
"w": 1.5
|
||||
},
|
||||
"Tab\n\n\n\n\n1.5",
|
||||
{
|
||||
"a": 4
|
||||
},
|
||||
"Q",
|
||||
"W",
|
||||
"E",
|
||||
"R",
|
||||
"T",
|
||||
{
|
||||
"x": 0.5
|
||||
},
|
||||
"Y",
|
||||
"U",
|
||||
"I",
|
||||
"O",
|
||||
"P",
|
||||
"{\n[",
|
||||
{
|
||||
"x": 0.5,
|
||||
"a": 0,
|
||||
"w": 1.5
|
||||
},
|
||||
"Backspace\n\n\n\n\n1.5"
|
||||
],
|
||||
[
|
||||
{
|
||||
"p": "DCS R3",
|
||||
"w": 1.75
|
||||
},
|
||||
"Ctrl\n\n\n\n\n1.75",
|
||||
{
|
||||
"a": 4
|
||||
},
|
||||
"A",
|
||||
"S",
|
||||
"D",
|
||||
"F",
|
||||
"G",
|
||||
"H",
|
||||
"J",
|
||||
"K",
|
||||
"L",
|
||||
":\n;",
|
||||
"\"\n'",
|
||||
{
|
||||
"a": 0,
|
||||
"w": 2.25
|
||||
},
|
||||
"Enter\n\n\n\n\n2.25"
|
||||
],
|
||||
[
|
||||
{
|
||||
"p": "DCS R4",
|
||||
"w": 1.25
|
||||
},
|
||||
"Shift\n\n\n\n\n1.25",
|
||||
{
|
||||
"x": 0.25,
|
||||
"a": 4
|
||||
},
|
||||
"Z",
|
||||
"X",
|
||||
"C",
|
||||
"V",
|
||||
"B",
|
||||
{
|
||||
"x": 0.5
|
||||
},
|
||||
"N",
|
||||
"M",
|
||||
"<\n,",
|
||||
">\n.",
|
||||
"?\n/",
|
||||
"|\n\\",
|
||||
{
|
||||
"x": 0.25,
|
||||
"a": 0,
|
||||
"w": 1.75
|
||||
},
|
||||
"Shift\n\n\n\n\n1.75"
|
||||
],
|
||||
[
|
||||
{
|
||||
"x": 1.25,
|
||||
"w": 1.25
|
||||
},
|
||||
"Win\n\n\n\n\n1.25",
|
||||
{
|
||||
"w": 1.25
|
||||
},
|
||||
"Alt\n\n\n\n\n1.25",
|
||||
{
|
||||
"x": 6.5,
|
||||
"w": 1.25
|
||||
},
|
||||
"Alt\n\n\n\n\n1.25",
|
||||
{
|
||||
"w": 1.25
|
||||
},
|
||||
"Ctrl\n\n\n\n\n1.25"
|
||||
],
|
||||
[
|
||||
{
|
||||
"r": 180,
|
||||
"rx": 4.5,
|
||||
"ry": 4.5,
|
||||
"y": -0.5,
|
||||
"x": -0.25,
|
||||
"a": 4
|
||||
},
|
||||
"\n\n\nFn"
|
||||
],
|
||||
[
|
||||
{
|
||||
"rx": 6.75,
|
||||
"y": -0.5,
|
||||
"x": -2.5,
|
||||
"p": "DCS SPACE",
|
||||
"a": 3,
|
||||
"w": 2.25
|
||||
},
|
||||
"\n\n\n\n\n2.25",
|
||||
{
|
||||
"w": 2.25
|
||||
},
|
||||
"\n\n\n\n\n2.25"
|
||||
],
|
||||
[
|
||||
{
|
||||
"rx": 9.5,
|
||||
"y": -0.5,
|
||||
"x": -0.75,
|
||||
"p": "DCS R4",
|
||||
"a": 4
|
||||
},
|
||||
"\n\n\nCode"
|
||||
]
|
||||
]
|
||||
@@ -0,0 +1,6 @@
|
||||
[
|
||||
["7", "8", "9", "/"],
|
||||
["4", "5", "6", "*"],
|
||||
["1", "2", "3", "-"],
|
||||
["0", ".", "Enter", "+"]
|
||||
]
|
||||
@@ -0,0 +1,183 @@
|
||||
{
|
||||
"name": "cr0wn60",
|
||||
"vendorId": "0xADE1",
|
||||
"productId": "0x0001",
|
||||
"lighting": "qmk_rgblight",
|
||||
"keycodes": [],
|
||||
"matrix": { "rows": 9, "cols": 9 },
|
||||
"layouts": {
|
||||
"keymap": [
|
||||
[
|
||||
{
|
||||
"p": "DCS R1"
|
||||
},
|
||||
"1,0",
|
||||
{
|
||||
"x": 0.25
|
||||
},
|
||||
"2,0",
|
||||
"3,0",
|
||||
"4,0",
|
||||
"5,0",
|
||||
"6,0",
|
||||
{
|
||||
"x": 1
|
||||
},
|
||||
"0,1",
|
||||
"2,1",
|
||||
"3,1",
|
||||
"4,1",
|
||||
"5,1",
|
||||
"6,1",
|
||||
{
|
||||
"x": 0.75
|
||||
},
|
||||
"7,1"
|
||||
],
|
||||
[
|
||||
{
|
||||
"p": "DCS R2",
|
||||
"a": 0,
|
||||
"w": 1.5
|
||||
},
|
||||
"0,2",
|
||||
{
|
||||
"a": 4
|
||||
},
|
||||
"1,2",
|
||||
"3,2",
|
||||
"4,2",
|
||||
"5,2",
|
||||
"6,2",
|
||||
{
|
||||
"x": 0.5
|
||||
},
|
||||
"0,3",
|
||||
"1,3",
|
||||
"2,3",
|
||||
"4,3",
|
||||
"5,3",
|
||||
"6,3",
|
||||
{
|
||||
"x": 0.5,
|
||||
"a": 0,
|
||||
"w": 1.5
|
||||
},
|
||||
"7,3"
|
||||
],
|
||||
[
|
||||
{
|
||||
"p": "DCS R3",
|
||||
"w": 1.75
|
||||
},
|
||||
"0,4",
|
||||
{
|
||||
"a": 4
|
||||
},
|
||||
"1,4",
|
||||
"2,4",
|
||||
"3,4",
|
||||
"5,4",
|
||||
"6,4",
|
||||
"0,5",
|
||||
"1,5",
|
||||
"2,5",
|
||||
"3,5",
|
||||
"4,5",
|
||||
"6,5",
|
||||
{
|
||||
"a": 0,
|
||||
"w": 2.25
|
||||
},
|
||||
"7,5"
|
||||
],
|
||||
[
|
||||
{
|
||||
"p": "DCS R4",
|
||||
"w": 1.25
|
||||
},
|
||||
"0,6",
|
||||
{
|
||||
"x": 0.25,
|
||||
"a": 4
|
||||
},
|
||||
"1,6",
|
||||
"2,6",
|
||||
"3,6",
|
||||
"4,6",
|
||||
"5,6",
|
||||
{
|
||||
"x": 0.5
|
||||
},
|
||||
"0,7",
|
||||
"1,7",
|
||||
"2,7",
|
||||
"3,7",
|
||||
"4,7",
|
||||
"5,7",
|
||||
{
|
||||
"x": 0.25,
|
||||
"a": 0,
|
||||
"w": 1.75
|
||||
},
|
||||
"6,7"
|
||||
],
|
||||
[
|
||||
{
|
||||
"x": 1.25,
|
||||
"w": 1.25
|
||||
},
|
||||
"0,8",
|
||||
{
|
||||
"w": 1.25
|
||||
},
|
||||
"1,8",
|
||||
{
|
||||
"x": 6.5,
|
||||
"w": 1.25
|
||||
},
|
||||
"6,8",
|
||||
{
|
||||
"w": 1.25
|
||||
},
|
||||
"7,8"
|
||||
],
|
||||
[
|
||||
{
|
||||
"r": 180,
|
||||
"rx": 4.5,
|
||||
"ry": 4.5,
|
||||
"y": -0.5,
|
||||
"x": -0.25,
|
||||
"a": 4
|
||||
},
|
||||
"2,8"
|
||||
],
|
||||
[
|
||||
{
|
||||
"rx": 6.75,
|
||||
"y": -0.5,
|
||||
"x": -2.5,
|
||||
"p": "DCS SPACE",
|
||||
"a": 3,
|
||||
"w": 2.25
|
||||
},
|
||||
"4,8",
|
||||
{
|
||||
"w": 2.25
|
||||
},
|
||||
"3,8"
|
||||
],
|
||||
[
|
||||
{
|
||||
"rx": 9.5,
|
||||
"y": -0.5,
|
||||
"x": -0.75,
|
||||
"p": "DCS R4",
|
||||
"a": 4
|
||||
},
|
||||
"5,8"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user