Browse Source

quantum: led: split out led_update_ports() for customization of led behaviour (#14452)

Thomas Weißschuh 2 years ago
parent
commit
cbe1c22d46
3 changed files with 34 additions and 22 deletions
  1. 7 0
      docs/feature_led_indicators.md
  2. 26 22
      quantum/led.c
  3. 1 0
      quantum/led.h

+ 7 - 0
docs/feature_led_indicators.md

@@ -101,6 +101,13 @@ The `host_keyboard_led_state()` function will report the LED state returned from
 bool caps = host_keyboard_led_state().caps_lock;
 bool caps = host_keyboard_led_state().caps_lock;
 ```
 ```
 
 
+## `led_update_ports()`
+
+This function writes the LED state to the actual hardware. Call it manually
+from your `led_update_*()` callbacks to modify the handling of the standard
+keyboard LEDs.
+For example when repurposing a standard LED indicator as layer indicator.
+
 ## Setting Physical LED State
 ## Setting Physical LED State
 
 
 Some keyboard implementations provide convenient methods for setting the state of the physical LEDs.
 Some keyboard implementations provide convenient methods for setting the state of the physical LEDs.

+ 26 - 22
quantum/led.c

@@ -92,32 +92,36 @@ __attribute__((weak)) bool led_update_user(led_t led_state) {
 __attribute__((weak)) bool led_update_kb(led_t led_state) {
 __attribute__((weak)) bool led_update_kb(led_t led_state) {
     bool res = led_update_user(led_state);
     bool res = led_update_user(led_state);
     if (res) {
     if (res) {
-#if defined(LED_NUM_LOCK_PIN) || defined(LED_CAPS_LOCK_PIN) || defined(LED_SCROLL_LOCK_PIN) || defined(LED_COMPOSE_PIN) || defined(LED_KANA_PIN)
+        led_update_ports(led_state);
-#    if LED_PIN_ON_STATE == 0
-        // invert the whole thing to avoid having to conditionally !led_state.x later
-        led_state.raw = ~led_state.raw;
-#    endif
-
-#    ifdef LED_NUM_LOCK_PIN
-        writePin(LED_NUM_LOCK_PIN, led_state.num_lock);
-#    endif
-#    ifdef LED_CAPS_LOCK_PIN
-        writePin(LED_CAPS_LOCK_PIN, led_state.caps_lock);
-#    endif
-#    ifdef LED_SCROLL_LOCK_PIN
-        writePin(LED_SCROLL_LOCK_PIN, led_state.scroll_lock);
-#    endif
-#    ifdef LED_COMPOSE_PIN
-        writePin(LED_COMPOSE_PIN, led_state.compose);
-#    endif
-#    ifdef LED_KANA_PIN
-        writePin(LED_KANA_PIN, led_state.kana);
-#    endif
-#endif
     }
     }
     return res;
     return res;
 }
 }
 
 
+/** \brief Write LED state to hardware
+ */
+__attribute__((weak)) void led_update_ports(led_t led_state) {
+#if LED_PIN_ON_STATE == 0
+    // invert the whole thing to avoid having to conditionally !led_state.x later
+    led_state.raw = ~led_state.raw;
+#endif
+
+#ifdef LED_NUM_LOCK_PIN
+    writePin(LED_NUM_LOCK_PIN, led_state.num_lock);
+#endif
+#ifdef LED_CAPS_LOCK_PIN
+    writePin(LED_CAPS_LOCK_PIN, led_state.caps_lock);
+#endif
+#ifdef LED_SCROLL_LOCK_PIN
+    writePin(LED_SCROLL_LOCK_PIN, led_state.scroll_lock);
+#endif
+#ifdef LED_COMPOSE_PIN
+    writePin(LED_COMPOSE_PIN, led_state.compose);
+#endif
+#ifdef LED_KANA_PIN
+    writePin(LED_KANA_PIN, led_state.kana);
+#endif
+}
+
 /** \brief Initialise any LED related hardware and/or state
 /** \brief Initialise any LED related hardware and/or state
  */
  */
 __attribute__((weak)) void led_init_ports(void) {
 __attribute__((weak)) void led_init_ports(void) {

+ 1 - 0
quantum/led.h

@@ -60,6 +60,7 @@ void led_set_user(uint8_t usb_led);
 void led_set_kb(uint8_t usb_led);
 void led_set_kb(uint8_t usb_led);
 bool led_update_user(led_t led_state);
 bool led_update_user(led_t led_state);
 bool led_update_kb(led_t led_state);
 bool led_update_kb(led_t led_state);
+void led_update_ports(led_t led_state);
 
 
 uint32_t last_led_activity_time(void);    // Timestamp of the LED activity
 uint32_t last_led_activity_time(void);    // Timestamp of the LED activity
 uint32_t last_led_activity_elapsed(void); // Number of milliseconds since the last LED activity
 uint32_t last_led_activity_elapsed(void); // Number of milliseconds since the last LED activity