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

This commit is contained in:
Thomas Weißschuh 2022-10-06 12:24:41 +02:00 committed by GitHub
parent c255174cf3
commit cbe1c22d46
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 22 deletions

View File

@ -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.

View File

@ -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) {

View File

@ -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