|
| 1 | +# 自分でレポートパーサを実装する |
| 2 | + |
| 3 | +## サンプル |
| 4 | + |
| 5 | +- Thinkpad trackpoint keyboard専用のパーサを実装した[サンプル](https://github.com/sekigon-gonnoc/qmk_firmware/blob/dev/sekigon/keyboards/keyboard_quantizer/keymaps/user_parser_sample/keymap.c) |
| 6 | + |
| 7 | +## 編集するファイルと関数 |
| 8 | +- 自分で用意したパーサを使用するにはconfig.hへのオプション追加とkeymap.cへの関数の実装が必要です |
| 9 | +### config.h |
| 10 | +- 下記のオプションを追加 |
| 11 | + ```c |
| 12 | + // Use user parser |
| 13 | + #undef QUANTIZER_REPORT_PARSER |
| 14 | + #define QUANTIZER_REPORT_PARSER REPORT_PARSER_USER |
| 15 | + ``` |
| 16 | +
|
| 17 | +### keymap.c |
| 18 | +- `void report_descriptor_parser_user(uint8_t interface, uint8_t const* desc, uint16_t len)` |
| 19 | + - 受信したレポートディスクリプタを解析する |
| 20 | + - サンプルでは特定のキーボードの種類を想定しているのでレポートディスクリプタは解析不要のため、空の関数 |
| 21 | +
|
| 22 | +- `void on_disconnect_device_user(uint8_t device)` |
| 23 | + - Quantizerからデバイスを抜いたときに実行する関数 |
| 24 | + - サンプルではキーが押しっぱなしにならないように受信したデータをクリアしている |
| 25 | +
|
| 26 | +- `bool report_parser_user(uint8_t const* buf, uint16_t len, matrix_row_t* current_matrix)` |
| 27 | + - 受信したレポートを解析しキーマトリクスを更新する。戻り値はマトリクスの更新の有無 |
| 28 | + - サンプルではVID:PIDがトラックポイントキーボードと一致した場合は専用の関数を、それ以外では6KROキーボード用の関数を呼び出している |
| 29 | +
|
| 30 | +## レポートの形式を調べる |
| 31 | +defaultキーマップのデバッグ機能を使ってどんなレポートが送られてくるか調べられます |
| 32 | +
|
| 33 | +- defaultキーマップの書き込み |
| 34 | + - `make keyboard_quantizer/rev3:default:flash` |
| 35 | +- TeraTermなどでシリアルポートを開く(ボーレートは1200bps以外) |
| 36 | +- シリアルポートから`d`を送信 |
| 37 | + - デバッグプリントが表示される |
| 38 | + ``` |
| 39 | + d |
| 40 | + Enable dprint |
| 41 | + matrix scan frequency: 3762 |
| 42 | + ``` |
| 43 | +- キーを押したりマウスを操作したときのレポートを確認 |
| 44 | + - 先頭10バイトはホストICが付加したヘッダ |
| 45 | + - サンプルの場合以下の三種類 |
| 46 | + ```bash |
| 47 | + # Aキーを押したとき |
| 48 | + Receive: device:0, ep:1 |
| 49 | + 08 00 04 06 00 01 EF 17 47 60 00 00 04 00 00 00 00 00 |
| 50 | + #<------ header ----->|<-------report--------> |
| 51 | + |
| 52 | + # カーソルを動かしたとき |
| 53 | + Receive: device:1, ep:2 |
| 54 | + 06 00 04 02 01 02 EF 17 47 60 01 00 00 02 00 00 |
| 55 | + #<------ header ----->|<----report-----> |
| 56 | + |
| 57 | + # 横スクロールしたとき |
| 58 | + Receive: device:1, ep:2 |
| 59 | + 03 00 04 02 01 02 EF 17 47 60 16 FF 00 |
| 60 | + #<------ header ----->|<report> |
| 61 | + ``` |
| 62 | + - device0はキーボード |
| 63 | + - device1のID0はマウス(横スクロールは除く、xyは8bit)、ID0x16は横スクロール |
0 commit comments