123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- /* TODO */
- #include <ch.h>
- #include <hal.h>
- #include "matrix.h"
- #include "action.h"
- #include "action_util.h"
- #include "mousekey.h"
- #include "host.h"
- #include "suspend.h"
- #include "led.h"
- #include "wait.h"
- #ifdef AUDIO_ENABLE
- # include "audio.h"
- #endif /* AUDIO_ENABLE */
- #ifdef BACKLIGHT_ENABLE
- # include "backlight.h"
- #endif
- #if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE)
- # include "rgblight.h"
- #endif
- #ifdef LED_MATRIX_ENABLE
- # include "led_matrix.h"
- #endif
- #ifdef RGB_MATRIX_ENABLE
- # include "rgb_matrix.h"
- #endif
- /** \brief suspend idle
- *
- * FIXME: needs doc
- */
- void suspend_idle(uint8_t time) {
- // TODO: this is not used anywhere - what units is 'time' in?
- wait_ms(time);
- }
- /** \brief Run keyboard level Power down
- *
- * FIXME: needs doc
- */
- __attribute__((weak)) void suspend_power_down_user(void) {}
- /** \brief Run keyboard level Power down
- *
- * FIXME: needs doc
- */
- __attribute__((weak)) void suspend_power_down_kb(void) { suspend_power_down_user(); }
- /** \brief suspend power down
- *
- * FIXME: needs doc
- */
- void suspend_power_down(void) {
- #ifdef BACKLIGHT_ENABLE
- backlight_set(0);
- #endif
- #ifdef LED_MATRIX_ENABLE
- led_matrix_task();
- #endif
- #ifdef RGB_MATRIX_ENABLE
- rgb_matrix_task();
- #endif
- // Turn off LED indicators
- uint8_t leds_off = 0;
- #if defined(BACKLIGHT_CAPS_LOCK) && defined(BACKLIGHT_ENABLE)
- 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);
- // TODO: figure out what to power down and how
- // shouldn't power down TPM/FTM if we want a breathing LED
- // also shouldn't power down USB
- #if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE)
- rgblight_suspend();
- #endif
- #if defined(LED_MATRIX_ENABLE)
- led_matrix_set_suspend_state(true);
- #endif
- #if defined(RGB_MATRIX_ENABLE)
- rgb_matrix_set_suspend_state(true);
- #endif
- #ifdef AUDIO_ENABLE
- stop_all_notes();
- #endif /* AUDIO_ENABLE */
- suspend_power_down_kb();
- // on AVR, this enables the watchdog for 15ms (max), and goes to
- // SLEEP_MODE_PWR_DOWN
- wait_ms(17);
- }
- /** \brief suspend wakeup condition
- *
- * FIXME: needs doc
- */
- __attribute__((weak)) void matrix_power_up(void) {}
- __attribute__((weak)) void matrix_power_down(void) {}
- bool suspend_wakeup_condition(void) {
- matrix_power_up();
- matrix_scan();
- matrix_power_down();
- for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
- if (matrix_get_row(r)) return true;
- }
- return false;
- }
- /** \brief run user level code immediately after wakeup
- *
- * FIXME: needs doc
- */
- __attribute__((weak)) void suspend_wakeup_init_user(void) {}
- /** \brief run keyboard level code immediately after wakeup
- *
- * FIXME: needs doc
- */
- __attribute__((weak)) void suspend_wakeup_init_kb(void) { suspend_wakeup_init_user(); }
- /** \brief suspend wakeup condition
- *
- * run immediately after wakeup
- * FIXME: needs doc
- */
- void suspend_wakeup_init(void) {
- // clear keyboard state
- // need to do it manually, because we're running from ISR
- // and clear_keyboard() calls print
- // so only clear the variables in memory
- // the reports will be sent from main.c afterwards
- // or if the PC asks for GET_REPORT
- clear_mods();
- clear_weak_mods();
- clear_keys();
- #ifdef MOUSEKEY_ENABLE
- mousekey_clear();
- #endif /* MOUSEKEY_ENABLE */
- #ifdef EXTRAKEY_ENABLE
- host_system_send(0);
- host_consumer_send(0);
- #endif /* EXTRAKEY_ENABLE */
- #ifdef BACKLIGHT_ENABLE
- backlight_init();
- #endif /* BACKLIGHT_ENABLE */
- led_set(host_keyboard_leds());
- #if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE)
- rgblight_wakeup();
- #endif
- #if defined(LED_MATRIX_ENABLE)
- led_matrix_set_suspend_state(false);
- #endif
- #if defined(RGB_MATRIX_ENABLE)
- rgb_matrix_set_suspend_state(false);
- #endif
- suspend_wakeup_init_kb();
- }
|