diff --git a/keyboards/lotus/lotus.c b/keyboards/lotus/lotus.c index 688ff97346..1cbce88f95 100644 --- a/keyboards/lotus/lotus.c +++ b/keyboards/lotus/lotus.c @@ -4,16 +4,6 @@ #include "quantum.h" #include "lotus.h" -#define MUX_ENABLE_GPIO GP4 -#define BOOT_DONE_GPIO GP5 -// Pin SDB to enable the RGB controller -#ifdef PICO_LOTUS -// 22 only on RPi Pico because it doesn't have GP29 -#define IS31FL3743A_ENABLE_GPIO GP22 -#else -#define IS31FL3743A_ENABLE_GPIO GP29 -#endif - void keyboard_post_init_kb(void) { keyboard_post_init_user(); @@ -40,7 +30,30 @@ void keyboard_pre_init_kb(void) { writePinHigh(MUX_ENABLE_GPIO); #ifdef RGB_MATRIX_ENABLE - //// TODO: Do we ever need to disable it to save power? + setPinOutput(IS31FL3743A_ENABLE_GPIO); + writePinHigh(IS31FL3743A_ENABLE_GPIO); +#endif + setPinInput(SLEEP_GPIO); +} + +/** + * Called by QMK when the keyboard suspends + */ +void suspend_power_down_kb(void) { + suspend_power_down_user(); + +#ifdef RGB_MATRIX_ENABLE + writePinLow(IS31FL3743A_ENABLE_GPIO); +#endif +} + +/** + * Called by QMK when the keyboard wakes up from suspend + */ +void suspend_wakeup_init_kb(void) { + suspend_wakeup_init_user(); + +#ifdef RGB_MATRIX_ENABLE setPinOutput(IS31FL3743A_ENABLE_GPIO); writePinHigh(IS31FL3743A_ENABLE_GPIO); #endif diff --git a/keyboards/lotus/lotus.h b/keyboards/lotus/lotus.h index ae4275e191..cfdbd2e019 100644 --- a/keyboards/lotus/lotus.h +++ b/keyboards/lotus/lotus.h @@ -21,3 +21,15 @@ enum lotus_keycodes { // Custom keycode to change screen modes (e.g. enable external screen) KC_SCRN = SAFE_RANGE, }; + +#define SLEEP_GPIO GP0 +#define MUX_ENABLE_GPIO GP4 +#define BOOT_DONE_GPIO GP5 +// Pin SDB to enable the RGB controller +#ifdef PICO_LOTUS +// 22 only on RPi Pico because it doesn't have GP29 +#define IS31FL3743A_ENABLE_GPIO GP22 +#else +#define IS31FL3743A_ENABLE_GPIO GP29 +#endif + diff --git a/keyboards/lotus/matrix.c b/keyboards/lotus/matrix.c index a6f2de665c..e7948e3a4b 100644 --- a/keyboards/lotus/matrix.c +++ b/keyboards/lotus/matrix.c @@ -4,13 +4,14 @@ #include #include #include "debug.h" -#include "matrix.h" #include "analog.h" #include "print.h" #include "quantum.h" #include "hal_adc.h" #include "chprintf.h" + #include "matrix.h" +#include "lotus.h" // Use raw ChibiOS ADC functions instead of those from QMK // Using the QMK functions doesn't work yet @@ -361,6 +362,19 @@ static void read_adc(void) { print_float(adc_voltage); } +/** + * Handle the host going to sleep or the keyboard being idle + * If the host is asleep the keyboard should reduce the scan rate and turn backlight off. + * + * If the host is awake but the keyboard is idle it should enter a low-power state + */ +void handle_idle(void) { + bool asleep = readPin(SLEEP_GPIO); + uprintf("Host asleep: %d\n", asleep); + + // TODO: Implement idle behavior +} + /** * Overriding behavior of matrix_scan from quantum/matrix.c */ @@ -369,6 +383,8 @@ bool matrix_scan_custom(matrix_row_t current_matrix[]) { print("scan\n"); + handle_idle(); + for (int col = 0; col < MATRIX_COLS; col++) { // Drive column low so we can measure the resistors on each row in this column drive_col(col, false);