summary refs log tree commit diff stats
path: root/src/keymaps/soispha/led
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-07-26 09:45:04 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-07-26 09:45:04 +0200
commite9fb5b31db9bdc4b3b593eae3897b7bc79710c80 (patch)
tree2f65d1409108394bbcaca493af0f83d548fb1699 /src/keymaps/soispha/led
parentchore(deploy): Another deploy (diff)
downloadqmk_layout-e9fb5b31db9bdc4b3b593eae3897b7bc79710c80.zip
refactor(rgb): Make the Rgb map readable and changeable
The previous one was an unchangeable array blob.
Diffstat (limited to 'src/keymaps/soispha/led')
-rw-r--r--src/keymaps/soispha/led/ledlayout.h76
-rw-r--r--src/keymaps/soispha/led/ledmap.h16
-rw-r--r--src/keymaps/soispha/led/rgb.c65
-rw-r--r--src/keymaps/soispha/led/translation.h10
4 files changed, 167 insertions, 0 deletions
diff --git a/src/keymaps/soispha/led/ledlayout.h b/src/keymaps/soispha/led/ledlayout.h
new file mode 100644
index 0000000..0ce994b
--- /dev/null
+++ b/src/keymaps/soispha/led/ledlayout.h
@@ -0,0 +1,76 @@
+// clang-format off
+const uint8_t PROGMEM ledmap[][RGB_MATRIX_LED_COUNT][3] = {
+  /* Dvorak */
+  [0] = {
+    RED,          RED,    RED,    RED,           RED,           RED,           RED,                    RED,          RED,           RED,           RED,          RED,    RED,    RED,
+    GREEN,        ORANGE, ORANGE, ORANGE,        ORANGE,        ORANGE,        ORANGE,                 ORANGE,       ORANGE,        ORANGE,        ORANGE,       ORANGE, ORANGE, GREEN,
+    GREEN,        GREEN,  GREEN,  GREEN,         YELLOW,        GREEN,         ORANGE,                 ORANGE,       GREEN,         YELLOW,        GREEN,        GREEN,  GREEN,  GREEN,
+    BLUE,         BLUE,   BLUE,   BLUE,          BLUE,          BLUE,                                                BLUE,          BLUE,          BLUE,         BLUE,   BLUE,   BLUE,
+    PURPLE,       PURPLE, PURPLE, PURPLE,        PURPLE,        OFF,                                                 OFF,           PURPLE,        PURPLE,       PURPLE, PURPLE, BLUE,
+                                  ASSASSINS_RED, ASSASSINS_RED, ASSASSINS_RED,                                       ASSASSINS_RED, ASSASSINS_RED, ASSASSINS_RED
+  },
+  /* Modifier */
+  [1] = {
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+                                  ASSASSINS_RED, ASSASSINS_RED, ASSASSINS_RED,                                       ASSASSINS_RED, ASSASSINS_RED, BRAIN_FREEZE
+  },
+  /* Symbols */
+  [2] = {
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+                                  BRAIN_FREEZE,  ASSASSINS_RED, ASSASSINS_RED,                                       ASSASSINS_RED, ASSASSINS_RED, ASSASSINS_RED
+  },
+  /* Numbers */
+  [3] = {
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+                                  ASSASSINS_RED, BRAIN_FREEZE,  ASSASSINS_RED,                                       ASSASSINS_RED, ASSASSINS_RED, ASSASSINS_RED
+  },
+  /* Media */
+  [4] = {
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    BRAIN_FREEZE, OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    BRAIN_FREEZE,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           ASSASSINS_RED,                                       ASSASSINS_RED, OFF,           OFF,          OFF,    OFF,    OFF,
+                                  ASSASSINS_RED, ASSASSINS_RED, ASSASSINS_RED,                                       ASSASSINS_RED, ASSASSINS_RED, ASSASSINS_RED
+  },
+  /* German characters */
+  [5] = {
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    BRAIN_FREEZE, PURPLE, PURPLE, OFF,           PURPLE,        OFF,           OFF,                    OFF,          OFF,           PURPLE,        OFF,          PURPLE, PURPLE, BRAIN_FREEZE,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+                                  OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF
+  },
+  /* Swedish characters */
+  [6] = {
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          PURPLE, OFF,    OFF,           OFF,           OFF,           BRAIN_FREEZE,           BRAIN_FREEZE, OFF,           OFF,           OFF,          OFF,    PURPLE, OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+                                  OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF
+  },
+  /* Special characters */
+  [7] = {
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    BRAIN_FREEZE,  OFF,           OFF,           OFF,                    OFF,          OFF,           OFF,           BRAIN_FREEZE, OFF,    OFF,    OFF,
+    OFF,          PURPLE, OFF,    OFF,           PURPLE,        OFF,           OFF,                    OFF,          OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+    OFF,          OFF,    OFF,    OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF,          OFF,    OFF,    OFF,
+                                  OFF,           OFF,           OFF,                                                 OFF,           OFF,           OFF
+  },
+};
+// clang-format on
diff --git a/src/keymaps/soispha/led/ledmap.h b/src/keymaps/soispha/led/ledmap.h
new file mode 100644
index 0000000..c2d1847
--- /dev/null
+++ b/src/keymaps/soispha/led/ledmap.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#define hsv(H, S, V) {H, S, V}
+
+#define OFF hsv(0, 0, 0) // 0x000000
+#define RED hsv(0, 255, 255) // 0xFF0000
+#define ORANGE hsv(27, 255, 255) // 0xFFA500
+#define GREEN hsv(85,255,128) // 0x008000
+#define YELLOW hsv(42,255,255) // 0xFFFF00
+#define BLUE hsv(170,255,255) // 0x0000FF
+#define PURPLE hsv(212,255,128) // 0x800080
+#define ASSASSINS_RED hsv(0,245,245) // 0xF50909
+#define BRAIN_FREEZE hsv(130,255,255) // 0x00F0FF
+
+#include "ledlayout.h"
+#include "translation.h"
diff --git a/src/keymaps/soispha/led/rgb.c b/src/keymaps/soispha/led/rgb.c
new file mode 100644
index 0000000..13ab60f
--- /dev/null
+++ b/src/keymaps/soispha/led/rgb.c
@@ -0,0 +1,65 @@
+#include QMK_KEYBOARD_H
+
+#include "ledmap.h"
+#define MOON_LED_LEVEL LED_LEVEL
+
+extern rgb_config_t rgb_matrix_config;
+
+void keyboard_post_init_user(void) {
+  rgb_matrix_enable();
+}
+
+void set_layer_color(int layer) {
+  int n = sizeof(ledmap[layer]) / sizeof(*ledmap[layer]);
+
+  for (int i = 0; i < n; i++) {
+    /* The rgb index is counted from top to bottom, e.g.:
+    *   0 4
+    *   1 5
+    *   2 6
+    *   3 7 ..
+    *
+    *   But we have an index (`i`) which counts from left to right, e.g.:
+    *   0 1 2 3
+    *   4 5 6 7
+    *   ..
+    *
+    *   Thus we use an translation table for the conversions (`i` -> `rgb_i`).
+    */
+    int rgb_i = translation[i];
+
+    HSV hsv = {
+        .h = pgm_read_byte(&ledmap[layer][i][0]),
+        .s = pgm_read_byte(&ledmap[layer][i][1]),
+        .v = pgm_read_byte(&ledmap[layer][i][2]),
+    };
+
+    if (!hsv.h && !hsv.s && !hsv.v) {
+      rgb_matrix_set_color(rgb_i, 0, 0, 0);
+    } else {
+      RGB rgb = hsv_to_rgb(hsv);
+      float f = (float)rgb_matrix_config.hsv.v / UINT8_MAX;
+      rgb_matrix_set_color(rgb_i, f * rgb.r, f * rgb.g, f * rgb.b);
+    }
+  }
+}
+
+/* Callback. Is called once every time a new “frame” is rendered */
+bool rgb_matrix_indicators_user(void) {
+  if (keyboard_config.disable_layer_led) {
+    return false;
+  }
+
+  int layer = biton32(layer_state);
+  int defined_layer = sizeof(ledmap) / sizeof(*ledmap);
+
+  if (layer <= (defined_layer - 1)) {
+    set_layer_color(layer);
+  } else {
+    if (rgb_matrix_get_flags() == LED_FLAG_NONE) {
+      rgb_matrix_set_color_all(0, 0, 0);
+    }
+  }
+
+  return true;
+}
diff --git a/src/keymaps/soispha/led/translation.h b/src/keymaps/soispha/led/translation.h
new file mode 100644
index 0000000..0140b79
--- /dev/null
+++ b/src/keymaps/soispha/led/translation.h
@@ -0,0 +1,10 @@
+// clang-format off
+const uint8_t translation[RGB_MATRIX_LED_COUNT] = {
+    0, 5, 10, 15, 20, 25, 29,           65, 61, 56, 51, 46, 41, 36,
+    1, 6, 11, 16, 21, 26, 30,           66, 62, 57, 52, 47, 42, 37,
+    2, 7, 12, 17, 22, 27, 31,           67, 63, 58, 53, 48, 43, 38,
+    3, 8, 13, 18, 23, 28,                   64, 59, 54, 49, 44, 39,
+    4, 9, 14, 19, 24, 35,                   71, 60, 55, 50, 45, 39,
+              32, 33, 34,                   70, 69, 68
+};
+// clang-format on