diff options
| -rw-r--r-- | docs/feature_led_indicators.md | 7 | ||||
| -rw-r--r-- | quantum/led.c | 48 | ||||
| -rw-r--r-- | quantum/led.h | 1 | 
3 files changed, 34 insertions, 22 deletions
| diff --git a/docs/feature_led_indicators.md b/docs/feature_led_indicators.md index a2a2e17c6f..d89562a377 100644 --- a/docs/feature_led_indicators.md +++ b/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;  ``` +## `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  Some keyboard implementations provide convenient methods for setting the state of the physical LEDs. diff --git a/quantum/led.c b/quantum/led.c index 444d38f751..7db38bb88c 100644 --- a/quantum/led.c +++ b/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) {      bool res = led_update_user(led_state);      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) -#    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 +        led_update_ports(led_state);      }      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   */  __attribute__((weak)) void led_init_ports(void) { diff --git a/quantum/led.h b/quantum/led.h index b8262cbd8e..d12e519ea2 100644 --- a/quantum/led.h +++ b/quantum/led.h @@ -60,6 +60,7 @@ void led_set_user(uint8_t usb_led);  void led_set_kb(uint8_t usb_led);  bool led_update_user(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_elapsed(void); // Number of milliseconds since the last LED activity | 
