Browse Source

Put powerOff and enterDeepSleep to ESP32Board

pull/2895/head
Kevin Le 3 days ago
parent
commit
a92046b0eb
  1. 42
      src/helpers/ESP32Board.cpp
  2. 3
      src/helpers/ESP32Board.h

42
src/helpers/ESP32Board.cpp

@ -1,6 +1,7 @@
#ifdef ESP_PLATFORM #ifdef ESP_PLATFORM
#include "ESP32Board.h" #include "ESP32Board.h"
#include <target.h>
#if defined(ADMIN_PASSWORD) && !defined(DISABLE_WIFI_OTA) // Repeater or Room Server only #if defined(ADMIN_PASSWORD) && !defined(DISABLE_WIFI_OTA) // Repeater or Room Server only
#include <WiFi.h> #include <WiFi.h>
@ -44,4 +45,45 @@ bool ESP32Board::startOTAUpdate(const char* id, char reply[]) {
} }
#endif #endif
void ESP32Board::powerOff() {
enterDeepSleep(0); // Do not wakeup
}
void ESP32Board::enterDeepSleep(uint32_t secs) {
// Power off the display if any
#ifdef DISPLAY_CLASS
display.turnOff();
#endif
// Power off LoRa
radio_driver.powerOff();
// Keep LoRa inactive during deepsleep
digitalWrite(P_LORA_NSS, HIGH);
#if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)
gpio_hold_en((gpio_num_t)P_LORA_NSS);
#else
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
#endif
// Power off GPS if any
if (sensors.getLocationProvider() != NULL) {
sensors.getLocationProvider()->stop();
}
// Flush serial buffers
Serial.flush();
delay(100);
// Clear stale wakeup sources to avoid ghost wakeup
// This is required when Power Management and automatic lightsleep are enabled
esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_ALL);
if (secs > 0) {
esp_sleep_enable_timer_wakeup(secs * 1000000ULL);
}
// Finally set ESP32 into deepsleep
esp_deep_sleep_start(); // CPU halts here and never returns!
}
#endif #endif

3
src/helpers/ESP32Board.h

@ -62,6 +62,9 @@ public:
return raw / 4; return raw / 4;
} }
virtual void powerOff() override;
void enterDeepSleep(uint32_t secs);
uint32_t getIRQGpio() override { uint32_t getIRQGpio() override {
return P_LORA_DIO_1; // default for SX1262 return P_LORA_DIO_1; // default for SX1262
} }

Loading…
Cancel
Save