NiZ のアプリケーションは Windows 向けしかない。プロトコルが気になったので、とりあえず打鍵回数を読み出すところをまでをやってみた。環境は macOS で hid_api gem を使い、Ruby で書いた。
できたもの
実行するとこういう出力をする。最後の数字がキーに対応するカウント。
key= 1 hwcode= 1 ESC: 35 key= 2 hwcode= 15 1: 66 key= 3 hwcode= 16 2: 92 key= 4 hwcode= 17 3: 114 key= 5 hwcode= 18 4: 119 key= 6 hwcode= 19 5: 53 key= 7 hwcode= 20 6: 99 key= 8 hwcode= 21 7: 18 key= 9 hwcode= 22 8: 115 key= 10 hwcode= 23 9: 76 key= 11 hwcode= 24 0: 171 key= 12 hwcode= 25 -: 307 key= 13 hwcode= 26 =: 78 key= 14 hwcode= 41 \: 38 key= 15 hwcode= 14 `: 33 key= 16 hwcode= 28 TAB: 575 key= 17 hwcode= 29 Q: 253 key= 18 hwcode= 30 W: 627 key= 19 hwcode= 31 E: 1461 key= 20 hwcode= 32 R: 911 key= 21 hwcode= 33 T: 1137 key= 22 hwcode= 34 Y: 616 key= 23 hwcode= 35 U: 1317 key= 24 hwcode= 36 I: 1662 key= 25 hwcode= 37 O: 1536 key= 26 hwcode= 38 P: 549 key= 27 hwcode= 39 [: 584 key= 28 hwcode= 40 ]: 41 key= 29 hwcode= 27 BS: 1662 key= 30 hwcode= 67 L-CTRL: 18 key= 31 hwcode= 43 A: 1794 key= 32 hwcode= 44 S: 914 key= 33 hwcode= 45 D: 853 key= 34 hwcode= 46 F: 249 key= 35 hwcode= 47 G: 520 key= 36 hwcode= 48 H: 828 key= 37 hwcode= 49 J: 671 key= 38 hwcode= 50 K: 1424 key= 39 hwcode= 51 L: 696 key= 40 hwcode= 52 ;: 452 key= 41 hwcode= 53 ': 155 key= 42 hwcode= 54 RET: 1281 key= 43 hwcode= 55 L-Shift: 1610 key= 44 hwcode= 56 Z: 177 key= 45 hwcode= 57 X: 128 key= 46 hwcode= 58 C: 459 key= 47 hwcode= 59 V: 253 key= 48 hwcode= 60 B: 384 key= 49 hwcode= 61 N: 1352 key= 50 hwcode= 62 M: 482 key= 51 hwcode= 63 ,: 383 key= 52 hwcode= 64 .: 255 key= 53 hwcode= 65 /: 161 key= 54 hwcode= 66 R-Shift: 850 key= 55 hwcode= 156 R-Fn: 135 key= 56 hwcode= 67 L-CTRL: 1653 key= 57 hwcode= 166 L-Fn: 6 key= 58 hwcode= 69 L-Alt: 35 key= 59 hwcode= 68 Super: 703 key= 60 hwcode= 70 Space: 2037 key= 61 hwcode= 68 Super: 7 key= 62 hwcode= 71 R-Alt: 5 key= 63 hwcode= 74 R-Ctrl: 5 key= 64 hwcode= 88 Left Arrow: 24 key= 65 hwcode= 89 Down Arrow: 19 key= 66 hwcode= 90 Right Arrow: 34 key= 67 hwcode= 0 : 0 key= 68 hwcode= 0 : 0 key= 69 hwcode= 0 : 0 key= 70 hwcode= 0 : 0 key= 71 hwcode= 0 : 0 key= 72 hwcode= 0 : 0 key= 73 hwcode= 0 : 0 key= 74 hwcode= 0 : 0 key= 75 hwcode= 0 : 0
プロトコルの概要
すべて HID 上で行われる。64bytes 固定で read/write する。
日本語で説明するよりソースコード読んだほうが早いので説明するのをやめる。
カウントを得るためにすること
キーマップを得る
NiZ キーボード側から、現在のキーマップを取得する。66キーのモデルなので、66キー × 3レイヤー (ノーマル・左Fn・右Fn) で 198 個の論理キー定義がある。
これによって、キーID (1〜66) と、割当られているキーコード (.pro ファイルの HWCODE) のマッピングを得られる。
カウント一覧を得る
カウントは66個の数値の配列のようなものが得られる。インデックスがそれぞれキーIDに対応していると思われる。
インデックスからキーマップを得てカウントと共に表示すればおわり。
備考
macOS だからか、実装が悪いのか、どこが悪いのかわからないが、挙動が不安定
- HidApi.open がしばしば失敗する
- read に失敗する (タイムアウト)
何回か繰替えすと成功する。
hid_api
hid_api は timeout のメソッドがあるにも関わらず timeout の処理が抜けているので、モンキーパッチを書いてる。PR 作ろうかと思ったけど結構放置されてそうでめんどい。
macOS でもキーマップを書きかえたいんだけど???
read した形式で書き戻せばいいだけだと思う。
どうやって解析したか?
Windows に USBPcap を入れて、公式のアプリケーションを操作しながらログをとった。
あとは気合
ソースコード
https://github.com/cho45/niz-tools-ruby github にうつしました
>