summary refs log tree commit diff stats
path: root/src/keymaps/soispha/led/rgb.c
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/rgb.c
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/rgb.c')
-rw-r--r--src/keymaps/soispha/led/rgb.c65
1 files changed, 65 insertions, 0 deletions
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;
+}