summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Challis <git@zvecr.com>2020-11-08 22:31:16 +0000
committerDrashna Jael're <drashna@live.com>2021-01-12 22:43:34 -0800
commita0a288159974600803080b82b85375edb340294b (patch)
tree4f12c632e784841965a14fdc9b0f375e2cf9951b
parent781cc0ed5161446ba2df6222b6c7568a4a5b2109 (diff)
Indicator LEDs as config (#10816)
* First pass * Add config options to docs * Update some wording * Slight tidy up of backlight caps logic * Init pin to correct state * Move init location * Reverse default state
-rw-r--r--common_features.mk1
-rw-r--r--quantum/led.c137
-rw-r--r--quantum/quantum.c54
-rw-r--r--tmk_core/common/led.h6
4 files changed, 144 insertions, 54 deletions
diff --git a/common_features.mk b/common_features.mk
index 2e5b6df47c..f65b4cf81c 100644
--- a/common_features.mk
+++ b/common_features.mk
@@ -17,6 +17,7 @@ SERIAL_PATH := $(QUANTUM_PATH)/serial_link
QUANTUM_SRC += \
$(QUANTUM_DIR)/quantum.c \
+ $(QUANTUM_DIR)/led.c \
$(QUANTUM_DIR)/keymap_common.c \
$(QUANTUM_DIR)/keycode_config.c
diff --git a/quantum/led.c b/quantum/led.c
new file mode 100644
index 0000000000..3e30b1a5ad
--- /dev/null
+++ b/quantum/led.c
@@ -0,0 +1,137 @@
+/* Copyright 2020 zvecr<git@zvecr.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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"
+
+#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
+#endif
+
+#ifndef LED_PIN_ON_STATE
+# define LED_PIN_ON_STATE 1
+#endif
+
+#if defined(BACKLIGHT_CAPS_LOCK)
+/** \brief Caps Lock indicator using backlight (for keyboards without dedicated LED)
+ */
+static void handle_backlight_caps_lock(led_t led_state) {
+ // Use backlight as Caps Lock indicator
+ uint8_t bl_toggle_lvl = 0;
+
+ if (led_state.caps_lock && !backlight_config.enable) {
+ // Turning Caps Lock ON and backlight is disabled in config
+ // Toggling backlight to the brightest level
+ bl_toggle_lvl = BACKLIGHT_LEVELS;
+ } else if (!led_state.caps_lock && backlight_config.enable) {
+ // Turning Caps Lock OFF and backlight is enabled in config
+ // Toggling backlight and restoring config level
+ bl_toggle_lvl = backlight_config.level;
+ }
+
+ // Set level without modify backlight_config to keep ability to restore state
+ backlight_set(bl_toggle_lvl);
+}
+#endif
+
+/** \brief Lock LED set callback - keymap/user level
+ *
+ * \deprecated Use led_update_user() instead.
+ */
+__attribute__((weak)) void led_set_user(uint8_t usb_led) {}
+
+/** \brief Lock LED set callback - keyboard level
+ *
+ * \deprecated Use led_update_kb() instead.
+ */
+__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; }
+
+/** \brief Lock LED update callback - keyboard level
+ *
+ * \return Ignored for now.
+ */
+__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
+ }
+ return res;
+}
+
+/** \brief Initialise any LED related hardware and/or state
+ */
+__attribute__((weak)) void led_init_ports(void) {
+#ifdef LED_NUM_LOCK_PIN
+ setPinOutput(LED_NUM_LOCK_PIN);
+ writePin(LED_NUM_LOCK_PIN, !LED_PIN_ON_STATE);
+#endif
+#ifdef LED_CAPS_LOCK_PIN
+ setPinOutput(LED_CAPS_LOCK_PIN);
+ writePin(LED_CAPS_LOCK_PIN, !LED_PIN_ON_STATE);
+#endif
+#ifdef LED_SCROLL_LOCK_PIN
+ setPinOutput(LED_SCROLL_LOCK_PIN);
+ writePin(LED_SCROLL_LOCK_PIN, !LED_PIN_ON_STATE);
+#endif
+#ifdef LED_COMPOSE_PIN
+ setPinOutput(LED_COMPOSE_PIN);
+ writePin(LED_COMPOSE_PIN, !LED_PIN_ON_STATE);
+#endif
+#ifdef LED_KANA_PIN
+ setPinOutput(LED_KANA_PIN);
+ writePin(LED_KANA_PIN, !LED_PIN_ON_STATE);
+#endif
+}
+
+/** \brief Entrypoint for protocol to LED binding
+ */
+__attribute__((weak)) void led_set(uint8_t usb_led) {
+#ifdef BACKLIGHT_CAPS_LOCK
+ handle_backlight_caps_lock((led_t)usb_led);
+#endif
+
+ led_set_kb(usb_led);
+ led_update_kb((led_t)usb_led);
+} \ No newline at end of file
diff --git a/quantum/quantum.c b/quantum/quantum.c
index 6ec658eb5f..4f21e6eea9 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -23,7 +23,6 @@
#ifdef BACKLIGHT_ENABLE
# include "backlight.h"
-extern backlight_config_t backlight_config;
#endif
#ifdef FAUXCLICKY_ENABLE
@@ -615,6 +614,10 @@ void matrix_init_quantum() {
#if defined(ORYX_ENABLE) && defined(DYNAMIC_KEYMAP_ENABLE)
matrix_init_oryx();
#endif
+#if defined(LED_NUM_LOCK_PIN) || defined(LED_CAPS_LOCK_PIN) || defined(LED_SCROLL_LOCK_PIN) || defined(LED_COMPOSE_PIN) || defined(LED_KANA_PIN)
+ // TODO: remove calls to led_init_ports from keyboards and remove ifdef
+ led_init_ports();
+#endif
#ifdef BACKLIGHT_ENABLE
# ifdef LED_MATRIX_ENABLE
led_matrix_init();
@@ -738,55 +741,6 @@ void api_send_unicode(uint32_t unicode) {
#endif
}
-/** \brief Lock LED set callback - keymap/user level
- *
- * \deprecated Use led_update_user() instead.
- */
-__attribute__((weak)) void led_set_user(uint8_t usb_led) {}
-
-/** \brief Lock LED set callback - keyboard level
- *
- * \deprecated Use led_update_kb() instead.
- */
-__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; }
-
-/** \brief Lock LED update callback - keyboard level
- *
- * \return Ignored for now.
- */
-__attribute__((weak)) bool led_update_kb(led_t led_state) { return led_update_user(led_state); }
-
-__attribute__((weak)) void led_init_ports(void) {}
-
-__attribute__((weak)) void led_set(uint8_t usb_led) {
-#if defined(BACKLIGHT_CAPS_LOCK) && defined(BACKLIGHT_ENABLE)
- // Use backlight as Caps Lock indicator
- uint8_t bl_toggle_lvl = 0;
-
- if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK) && !backlight_config.enable) {
- // Turning Caps Lock ON and backlight is disabled in config
- // Toggling backlight to the brightest level
- bl_toggle_lvl = BACKLIGHT_LEVELS;
- } else if (IS_LED_OFF(usb_led, USB_LED_CAPS_LOCK) && backlight_config.enable) {
- // Turning Caps Lock OFF and backlight is enabled in config
- // Toggling backlight and restoring config level
- bl_toggle_lvl = backlight_config.level;
- }
-
- // Set level without modify backlight_config to keep ability to restore state
- backlight_set(bl_toggle_lvl);
-#endif
-
- led_set_kb(usb_led);
- led_update_kb((led_t) usb_led);
-}
-
//------------------------------------------------------------------------------
// Override these functions in your keymap file to play different tunes on
// different events such as startup and bootloader jump
diff --git a/tmk_core/common/led.h b/tmk_core/common/led.h
index daf974bed4..0bf87c8af5 100644
--- a/tmk_core/common/led.h
+++ b/tmk_core/common/led.h
@@ -15,8 +15,8 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef LED_H
-#define LED_H
+#pragma once
+
#include "stdint.h"
#include "stdbool.h"
@@ -52,5 +52,3 @@ void led_init_ports(void);
#ifdef __cplusplus
}
#endif
-
-#endif