3 #include "LowPowerCommon.h"
4 #include "drivers/rp2040/pico_sleep.h"
5 #include "hardware/vreg.h"
10 class ArduinoLowPowerRP2040;
11 static ArduinoLowPowerRP2040 *selfArduinoLowPowerRP2040 =
nullptr;
35 case sleep_mode_enum_t::modemSleep:
38 case sleep_mode_enum_t::noSleep:
41 case sleep_mode_enum_t::lightSleep:
44 case sleep_mode_enum_t::deepSleep:
55 case sleep_mode_enum_t::lightSleep: {
57 for (
auto pin : wakeup_pins) {
58 attachInterrupt(digitalPinToInterrupt(pin.pin), interrupt_cb,
59 toMode(pin.change_type));
60 is_wait_for_pin =
true;
62 if (is_wait_for_pin) {
64 while (is_wait_for_pin) delay(timer_update_delay);
71 case sleep_mode_enum_t::deepSleep: {
73 if (wakeup_pins.size() >= 0) {
74 if (wakeup_pins.size() > 1)
return false;
75 if (wakeup_pins[0].change_type == pin_change_t::on_high) {
76 sleep_goto_dormant_until_edge_high(wakeup_pins[0].pin);
78 sleep_goto_dormant_until_edge_low(wakeup_pins[0].pin);
80 }
else if (sleep_time_us > 0) {
82 sleep_goto_sleep_for(sleep_time_us / 1000, timer_cb);
83 if (is_restart) rp2040.reboot();
87 processor_deep_sleep();
88 if (is_restart) rp2040.reboot();
93 case sleep_mode_enum_t::modemSleep:
94 delay(sleep_time_us / 1000);
97 case sleep_mode_enum_t::noSleep:
98 delay(sleep_time_us / 1000);
106 bool setSleepTime(uint32_t time, time_unit_t time_unit_type)
override {
107 sleep_time_us = (toUs(time, time_unit_type));
108 return sleep_mode == sleep_mode_enum_t::lightSleep ||
109 wakeup_pins.size() == 0;
114 wakeup_pins.push_back(pin_change_def);
115 return sleep_mode == sleep_mode_enum_t::lightSleep || sleep_time_us == 0;
121 is_wait_for_pin =
false;
131 pin_change_t change_type;
137 std::vector<PinChangeDef> wakeup_pins;
138 uint64_t sleep_time_us = 0;
139 bool is_wait_for_pin =
false;
140 bool is_restart =
false;
141 int timer_update_delay = 2;
143 static void timer_cb(
unsigned int) {}
145 static void interrupt_cb() {
146 selfArduinoLowPowerRP2040->is_wait_for_pin =
false;
147 if (selfArduinoLowPowerRP2040->is_restart) rp2040.reboot();
150 PinStatus toMode(pin_change_t ct) {
152 case pin_change_t::on_high:
154 case pin_change_t::on_low:
163 delay(sleep_time_us / 1000);
167 void light_sleep_begin() {
168 delay(timer_update_delay);
173 delay(timer_update_delay);
174 vreg_set_voltage(VREG_VOLTAGE_0_95);
177 void light_sleep_end() {
178 if (is_restart) rp2040.reboot();
180 VREG_VOLTAGE_DEFAULT);
182 set_sys_clock_48mhz();
183 delay(timer_update_delay);
186 inline void sleep_goto_dormant_until_edge_high(uint gpio_pin) {
187 sleep_goto_dormant_until_pin(gpio_pin,
true,
true);
189 inline void sleep_goto_dormant_until_edge_low(uint gpio_pin) {
190 sleep_goto_dormant_until_pin(gpio_pin,
true,
false);
194 static ArduinoLowPowerRP2040 LowPower;
Common API for power saving modes for different processor architectures.
Definition: LowPowerCommon.h:33
virtual void clear()
reset the processing
Definition: LowPowerCommon.h:117
Low Power Management for RP2040: In lightSleep we just reduce the processor system clock and voltage....
Definition: LowPowerRP2040.h:28
bool isProcessingOnSleep(sleep_mode_enum_t sleep_mode)
Returns true if processing is possible in the current sleep mode.
Definition: LowPowerRP2040.h:32
bool setSleepTime(uint32_t time, time_unit_t time_unit_type) override
Defines the sleep time.
Definition: LowPowerRP2040.h:106
void setRestart(bool flag)
We force a restart after we wake up from sleep.
Definition: LowPowerRP2040.h:126
bool sleep(void) override
sets processor into sleep mode
Definition: LowPowerRP2040.h:52
bool addWakeupPin(int pin, pin_change_t change_type) override
Defines the wakup pin.
Definition: LowPowerRP2040.h:112
void clear()
reset the processing
Definition: LowPowerRP2040.h:118
Definition: LowPowerRP2040.h:129