Corne Cherry で LED とレイヤーキー同時押しを実装したかった

久しぶりにキーマップを変えようと思ったら、ソースコードのバックアップが消失していたため、復旧に5時間近くかかったので戒め。大体自分用のメモ。

# ソースコード

やったことはこっちに上げてるんで参考になればどうぞ。

https://github.com/winwinzu/cornecherry_mylayout

# やりたかったこと
1. レイヤーキー同時押しで ``Adjust`` レイヤーに移行したい
2. LED の色をセットしたい

# やったこと
# ``Adjust``レイヤーの調整
```c:keymap.c
#define L_BASE 0
#define L_LOWER 2
#define L_RAISE 4
#define L_ADJUST 8

// 先にレイヤー状態を定義しておく

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [L_BASE] = LAYOUT_split_3x6_3(
  //,-----------------------------------------------------.                    ,-----------------------------------------------------.
       KC_TAB,    KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,                         KC_Y,    KC_U,    KC_I,    KC_O,   KC_P,  KC_MINS,
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      KC_LCTL,    KC_A,    KC_S,    KC_D,    KC_F,    KC_G,                         KC_H,    KC_J,    KC_K,    KC_L, KC_SCLN, KC_QUOT,
  //|--------+--------+--------+--------+--------+--------|                    |--------+--------+--------+--------+--------+--------|
      KC_LSFT,    KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,                         KC_B,    KC_N, KC_M,  KC_COMM, KC_DOT,  KC_RSFT,
  //|--------+--------+--------+--------+--------+--------+--------|  |--------+--------+--------+--------+--------+--------+--------|
                                          KC_LALT, MO(L_LOWER),  KC_SPC, KC_ENT, MO(L_RAISE), KC_RSFT
                                      //`--------------------------'  `--------------------------'
                                                  // ↑ ここがMO(1) みたいな形になっていたので修正
```

細かい説明は省略するが、QMK ではレイヤーの状態はビット演算で表される。レイヤーキー同時押しを有効にするため、レイヤー番号の値を修正する必要がある。

**2. ``update_tri_layer()`` を追加する**
```c:keymap.c

bool process_record_user(uint16_t keycode, keyrecord_t *record) {    

  update_tri_layer(L_LOWER, L_RAISE, L_ADJUST);
  // ここを追加

  if (record->event.pressed) { 
    set_keylog(keycode, record);    
  }  
  return true;
}

```

``update_tri_layer()``を追加してやることにより、レイヤーキー同時押しを有効化できる。仕様については以下を参考されたし。

https://github.com/qmk/qmk_firmware/blob/master/docs/ja/ref_functions.md#update_tri_layerx-y-z

# LED のアニメーション制御
セットアップ全般についてはこちらを参照

https://github.com/qmk/qmk_firmware/tree/master/keyboards/crkbd#rgb-matrix

**1. ``RGB_MATRIX`` を有効化するため、``rules.mk`` を修正**
```makefile:rules.mk
MOUSEKEY_ENABLE = yes    
RGBLIGHT_ENABLE = no

RGB_MATRIX_ENABLE = yes
# ここを追加

# RGB_MATRIX_ENABLE = no
OLED_ENABLE     = yes
OLED_DRIVER     = SSD1306
LTO_ENABLE      = yes

# ファームウェアの容量を削減するために宣言
MOUSEKEY_ENABLE = no
EXTRAKEY_ENABLE = no
LTO_ENABLE = yes
```

**2. ``config.h`` を修正**



- その上で、設定したいアニメーションを、``#define`` にて宣言しておく
- 今回の場合、``ENABLE_RGB_MATRIX_TYPING_HEATMAP``と宣言し、アニメーションを設定した。
- アニメーションについては以下を参考に
    
https://www.youtube.com/watch?v=7f3usatOIKM

**3. LEDの色を設定**
- ``config.h``を修正したのみだと、LEDは赤色にしか光らないのでデフォルトの色を設定

```c:keymap.c
bool oled_task_user(void) {
    rgb_matrix_sethsv(HSV_AZURE);
    // ここで色を HSV 形式でセットしてやる
    if (is_keyboard_master()) {
        
        oled_render_keylog();
    } else {
        oled_render_logo();
    }
    return false;
}
```


- ``rgb_matrix_sethsv()`` にて色を設定する
- この関数を呼び出す場所は特にこだわらなくても良い？
- **rgb_matrix_set_color_all() なんかを使うとLEDが激しくちらつくので注意**
- 色についてはこちらを参照

https://docs.qmk.fm/#/feature_rgb_matrix?id=colors

# 感想
バックアップはちゃんととろう。（戒め）
これで 3 台目組んでも大丈夫だね。