QMKでキルスイッチ機能をキーボードに実装する

キーボード

東プレさんから発売されているゲーミングキーボード GX1にはキルスイッチという後入力優先機能が搭載されています。

QMK firmwareを用いて自作キーボードに同等?の機能を搭載してみたところ結構反響があったため残しておこうと思います。

そのため今回紹介する方法はqmk対応キーボードで自分でファームウェアを入れることができるものすべてに導入することは可能だと思います。

qmkの環境構築に関しては調べれば色々出てくると思うので割愛します。

下記は実際にqmkの環境構築からキルスイッチを導入された方の備忘録になります。一から始める方には参考になるのではないでしょうか。

Keychron k3 proにキルスイッチを導入した備忘録

Monsgeek M1にQMKでキルスイッチ機能を実装したので注意点とやり方を紹介 & Monsgeek M1 with Durock splash brothersの所感

市販のメーカー品だと色々カスタムされていてちょっとややこしそうです。

qmkでキルスイッチを実装する

どのようにして導入するのかというとカスタムキーコードという機能を使用します。

カスタムキーコードをどこに実装するかというと、keymap.cにキルスイッチ機能を書き加えます。

Build software better, together
GitHub is where people build software. More than 100 million people use GitHub to discover, fork, and contribute to over...

下記部分を書き加えるだけで実装することができます。

プログラムすることに関して私は素人でこれが最適なのかはわかりませんが動作はしているのでまあ

static bool wkeep = false;
static bool akeep = false;
static bool skeep = false;
static bool dkeep = false;

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {
/*
aka killswitch
 */

    case QK_KB_0:
        if (record->event.pressed) {
			wkeep = true;
			unregister_code(KC_S);
            register_code(KC_W);
        } else {
			wkeep = false;
            unregister_code(KC_W);
			if (skeep) {
				register_code(KC_S);
			}
        }
        break;

    case QK_KB_1:
        if (record->event.pressed) {
			akeep = true;
			unregister_code(KC_D);
            register_code(KC_A);
        } else {
			akeep = false;
            unregister_code(KC_A);
			if (dkeep) {
				register_code(KC_D);
			}
        }
        break;

    case QK_KB_2:
        if (record->event.pressed) {
			skeep = true;
			unregister_code(KC_W);
            register_code(KC_S);
        } else {
			skeep = false;
            unregister_code(KC_S);
			if (wkeep) {
				register_code(KC_W);
			}
        }
        break;

    case QK_KB_3:
        if (record->event.pressed) {
			dkeep = true;
			unregister_code(KC_A);
            register_code(KC_D);
        } else {
			dkeep = false;
            unregister_code(KC_D);
			if (akeep) {
				register_code(KC_A);
			}
        }
        break;


    }
    return true;
};

下記部分はキルスイッチの判定に用いる変数を定義しています。

true, falseの二値の変数でW,A,S,Dをそれぞれを押しているかどうかを判定します。

static bool wkeep = false;
static bool akeep = false;
static bool skeep = false;
static bool dkeep = false;

この中に記述することでカスタムキーコードを設定することができます。

どのキーを押したときに、どういった処理をするか入力をするか記述します。

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    switch (keycode) {

・・・

    }
    return true;
};

これがキルスイッチの部分となります。

QK_KB_0はあらかじめqmkで設定されているカスタムキーコード名で、QK_KB_[数字]のキーコードはremap等で自由に出し入れすることができます。

case QK_KB_0: でキーコードQK_KB_0を押したときにどうするか

if (record->event.pressed) {押したときにどうするか} else {離したときどうするか}

    case QK_KB_0:
//キーを押したときの処理
        if (record->event.pressed) {
			wkeep = true;    //←wを押しているときにwkeepはtrue
			unregister_code(KC_S);    //←sの入力を強制オフ
            register_code(KC_W);    //←wをオン
//キーを離したときの処理
        } else {
			wkeep = false;    //←wを離しているときにwkeepはfalse
            unregister_code(KC_W);    //←wをオフ
			if (skeep) {    //←もしsが押しっぱなしだったら
				register_code(KC_S);    //←sをオン
			}
        }
        break;

ここではwを押したときにsの入力を強制的にオフにする処理が必要です。

またwを離したときに、sが押しっぱなしで会った時には強制的にオフにしたsの入力を再度オンにすることが必要です。

 

あとはキーマップに作成したキルスイッチ用キーコードをWASDの位置にキーバインドすれば完了です。

[0] = LAYOUT(
  KC_0, KC_1, KC_2, KC_3, KC_4, KC_5,
  KC_TAB, KC_Q, QK_KB_0, KC_E, KC_R, KC_T,
  KC_J,  QK_KB_1, QK_KB_2, QK_KB_3, KC_F, KC_G,KC_H,
  KC_LSFT, KC_Z,    KC_X, KC_C, KC_V, KC_B,
  KC_LCTL, 		    KC_ESC, KC_LALT, KC_SPC, KC_N
  ),

remapで入れ替えたりするためにはremap用のjsonファイルに設定する必要があります。

QK_KB_Xだと名前がわかりにくいので名前を付けます。

するとremapのfunctionのvia user keyに変更した名前が反映されます。

  {
    "name": "nitingale_lit",
    "vendorId": "0x0121",
    "productId": "0x0012",
    "lighting": "none",
    "matrix": { "rows": 5, "cols": 7},
  "customKeycodes": [ 
{		"name": "WkS", "title": "press W + release S", "shortName": "WkS"},
{		"name": "AkD", "title": "press A + release D", "shortName": "AkD"},
{		"name": "SkW", "title": "press S + release W", "shortName": "SkW"},
{		"name": "DkA", "title": "press D + release A", "shortName": "DkA"}
	],
    "layouts": {
      "keymap": [
[		"0,0","0,1","0,2","0,3","0,4","0,5"	],
[		{"w":1.5},"1,0","1,1","1,2","1,3","1,4","1,5"	],
[		{"w":1.75},"2,0","2,1","2,2","2,3","2,4","2,5","2,6"	],
[		{"w":2},"3,0","3,1",{"x":0.5},"3,3","3,4","3,5","3,6"	],
[		{"w":1.25},"4,0",{"x":2.5},"4,3","4,4","4,5","4,6"	]
]
    }
    }

おわり

常に理論値で減速せずに切り返しをするのだ


コメント

タイトルとURLをコピーしました