1-4no diary

自作キーボード, CSS, その他好きなことなど

Helix の OLED に RGB_MODE を表示する

Helix ユーザーの僕ですが、会社ではステンレス版、自宅では通常版を使用しています。
そして、どちらもバックライト仕様のものを作成しました。
やはり光ると綺麗ですし、折角はんだ付けしたのであれば光らせないともったいないですよね。

ただ、デフォルトの設定では、左の OKED に Mac or Window と Layer の表示がされていますが、バックライトのモードがわかりません。
特にモードは同じで速さが変わるものは、「このモードになってから◯回目」というように判断するしかありませんでした。

そこで、OLED に今のパターンを表示したいと思いました。

いろいろ試した結果、とりあえず下記のようになりました。(反射してしまうためカバーを外しています)
※この後更に修正し改良しています。最後に少し記述しています。

LED_MODE14 と表示されています。 これを表示させるための手順をまとめていきます。

その前に注意点です。 僕は C言語は専門外で全く書いたことがありません。
普段は、Java, RubyRailsを本当に少し)、Javascript, html, css などを書いています。
そのため、なんとなくは読めてもメソッドなどはさっぱりなので、既存コードを真似てなんとかなっただけです。

手順

書き換えるのは、 keymap.c です。
キーマップを変更するときに書き換えるファイルです。

この中に render_status というメソッドが定義された箇所があります。

qmk_firmware/keymap.c at master · qmk/qmk_firmware · GitHub

ここを見ると、Layer を表示している箇所があることがわかると思います。
matrix_write_P とか matrix_write を使えばいいようです。 これを真似ていきます。

RGB_MODE はちょっとコードを追ってみると、 rgblight_config.mode のようです。 これを表示すればよさそうだとわかりました。

ただ、これはそのままだとダメのようです。
型変換が必要なようです。
とりあえず下記を真似てみました。

qmk_firmware/keymap.c at master · qmk/qmk_firmware · GitHub

char rgblight[40];
snprintf(rgblight,sizeof(rgblight), "LED_MODE%d", rgblight_config.mode);

そしてこれを matrix_write(matrix, rgblight); と書いてあげれば表示されます。
これによって LED_MODE14 と表示されます。MODE を切り替えると 14 の部分が変更されていきます。

参考になるかわかりませんが、最終的にできあがったものが下記になります。
GitHub のリンク貼るほどでもないので該当部分だけそのまま貼っておきます。参考にしてみてください。
OLED 表示スペースの都合で、既存の表示部分を省略したりしています。

// Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below
  char buf[40];
  char rgblight[40];
  snprintf(buf,sizeof(buf), "Undef-%ld", layer_state);
  snprintf(rgblight,sizeof(rgblight), "LED_MODE%d", rgblight_config.mode);

  matrix_write_P(matrix, PSTR("\n"));
  matrix_write(matrix, rgblight);

  matrix_write_P(matrix, PSTR(" "));
  switch (layer_state) {
      case L_BASE:
          matrix_write_P(matrix, PSTR("Default"));
          break;
      case L_RAISE:
          matrix_write_P(matrix, PSTR("Raise"));
          break;
      case L_LOWER:
          matrix_write_P(matrix, PSTR("Lower"));
          break;
      case L_ADJUST:
      case L_ADJUST_TRI:
          matrix_write_P(matrix, PSTR("Adjust"));
          break;
      default:
          matrix_write(matrix, buf);
  }

もう少し頑張ってみたらこんな感じにもできました。 ロゴを行毎に挿入する必要があるので、2回に分けてロゴをいれればいけます。 AppleWindows のロゴは2行に分かれているようです。 そのため、各行の先頭で読み込む形になります。