summaryrefslogtreecommitdiff
path: root/quantum/led.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/led.c')
-rw-r--r--quantum/led.c67
1 files changed, 58 insertions, 9 deletions
diff --git a/quantum/led.c b/quantum/led.c
index 8f0eccf55d..c5ddbc22c5 100644
--- a/quantum/led.c
+++ b/quantum/led.c
@@ -13,21 +13,26 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "quantum.h"
+#include "led.h"
+#include "host.h"
+#include "debug.h"
+#include "gpio.h"
-#ifdef BACKLIGHT_ENABLE
-# include "backlight.h"
+#ifdef BACKLIGHT_CAPS_LOCK
+# ifdef BACKLIGHT_ENABLE
+# include "backlight.h"
extern backlight_config_t backlight_config;
-#else
-// Cannot use BACKLIGHT_CAPS_LOCK without backlight being enabled
-# undef BACKLIGHT_CAPS_LOCK
+# else
+# pragma message "Cannot use BACKLIGHT_CAPS_LOCK without backlight being enabled"
+# undef BACKLIGHT_CAPS_LOCK
+# endif
#endif
#ifndef LED_PIN_ON_STATE
# define LED_PIN_ON_STATE 1
#endif
-#if defined(BACKLIGHT_CAPS_LOCK)
+#ifdef BACKLIGHT_CAPS_LOCK
/** \brief Caps Lock indicator using backlight (for keyboards without dedicated LED)
*/
static void handle_backlight_caps_lock(led_t led_state) {
@@ -59,13 +64,17 @@ __attribute__((weak)) void led_set_user(uint8_t usb_led) {}
*
* \deprecated Use led_update_kb() instead.
*/
-__attribute__((weak)) void led_set_kb(uint8_t usb_led) { led_set_user(usb_led); }
+__attribute__((weak)) void led_set_kb(uint8_t usb_led) {
+ led_set_user(usb_led);
+}
/** \brief Lock LED update callback - keymap/user level
*
* \return True if led_update_kb() should run its own code, false otherwise.
*/
-__attribute__((weak)) bool led_update_user(led_t led_state) { return true; }
+__attribute__((weak)) bool led_update_user(led_t led_state) {
+ return true;
+}
/** \brief Lock LED update callback - keyboard level
*
@@ -135,3 +144,43 @@ __attribute__((weak)) void led_set(uint8_t usb_led) {
led_set_kb(usb_led);
led_update_kb((led_t)usb_led);
}
+
+/** \brief Trigger behaviour on transition to suspend
+ */
+void led_suspend(void) {
+ uint8_t leds_off = 0;
+#ifdef BACKLIGHT_CAPS_LOCK
+ if (is_backlight_enabled()) {
+ // Don't try to turn off Caps Lock indicator as it is backlight and backlight is already off
+ leds_off |= (1 << USB_LED_CAPS_LOCK);
+ }
+#endif
+ led_set(leds_off);
+}
+
+/** \brief Trigger behaviour on transition from suspend
+ */
+void led_wakeup(void) {
+ led_set(host_keyboard_leds());
+}
+
+/** \brief set host led state
+ *
+ * Only sets state if change detected
+ */
+void led_task(void) {
+ static uint8_t last_led_status = 0;
+
+ // update LED
+ uint8_t led_status = host_keyboard_leds();
+ if (last_led_status != led_status) {
+ last_led_status = led_status;
+
+ if (debug_keyboard) {
+ debug("led_task: ");
+ debug_hex8(led_status);
+ debug("\n");
+ }
+ led_set(led_status);
+ }
+}