Browse Source

Merge pull request #2895 from IoTThinks/MCdev-Fixed-poweroff-to-uA-202607

Fixed hibernate / poweroff for BLE companions and repeaters to stay at uA
pull/2848/merge
fdlamotte 2 days ago
committed by GitHub
parent
commit
9e66a2e246
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 3
      examples/companion_radio/ui-new/UITask.cpp
  2. 2
      examples/companion_radio/ui-orig/UITask.cpp
  3. 3
      examples/companion_radio/ui-tiny/UITask.cpp
  4. 42
      src/helpers/ESP32Board.cpp
  5. 4
      src/helpers/ESP32Board.h
  6. 30
      src/helpers/MeshadventurerBoard.h
  7. 32
      src/helpers/NRF52Board.cpp
  8. 1
      src/helpers/NRF52Board.h
  9. 2
      variants/gat562_30s_mesh_kit/GAT56230SMeshKitBoard.h
  10. 2
      variants/gat562_mesh_evb_pro/GAT562EVBProBoard.h
  11. 2
      variants/gat562_mesh_tracker_pro/GAT562MeshTrackerProBoard.h
  12. 2
      variants/gat562_mesh_watch13/GAT56MeshWatch13Board.h
  13. 27
      variants/heltec_e213/HeltecE213Board.cpp
  14. 3
      variants/heltec_e213/HeltecE213Board.h
  15. 27
      variants/heltec_e290/HeltecE290Board.cpp
  16. 3
      variants/heltec_e290/HeltecE290Board.h
  17. 10
      variants/heltec_t096/T096Board.cpp
  18. 30
      variants/heltec_t1/T1Board.cpp
  19. 7
      variants/heltec_t114/T114Board.h
  20. 27
      variants/heltec_t190/HeltecT190Board.cpp
  21. 3
      variants/heltec_t190/HeltecT190Board.h
  22. 31
      variants/heltec_tracker_v2/HeltecTrackerV2Board.cpp
  23. 2
      variants/heltec_tracker_v2/HeltecTrackerV2Board.h
  24. 25
      variants/heltec_v2/HeltecV2Board.h
  25. 29
      variants/heltec_v3/HeltecV3Board.h
  26. 31
      variants/heltec_v4/HeltecV4Board.cpp
  27. 2
      variants/heltec_v4/HeltecV4Board.h
  28. 4
      variants/keepteen_lt1/KeepteenLT1Board.h
  29. 6
      variants/lilygo_t_impulse_plus/TImpulsePlusBoard.h
  30. 24
      variants/lilygo_tdeck/TDeckBoard.h
  31. 2
      variants/lilygo_techo/TechoBoard.h
  32. 2
      variants/lilygo_techo_card/TechoCardBoard.cpp
  33. 3
      variants/lilygo_techo_lite/TechoBoard.h
  34. 4
      variants/mesh_pocket/MeshPocket.h
  35. 2
      variants/meshtiny/MeshtinyBoard.h
  36. 2
      variants/minewsemi_me25ls01/MinewsemiME25LS01Board.h
  37. 2
      variants/nano_g2_ultra/nano-g2.h
  38. 4
      variants/promicro/PromicroBoard.h
  39. 29
      variants/rak3112/RAK3112Board.h
  40. 2
      variants/rak_wismesh_tag/RAKWismeshTagBoard.h
  41. 2
      variants/sensecap_solar/SenseCapSolarBoard.h
  42. 24
      variants/station_g2/StationG2Board.h
  43. 15
      variants/station_g3_esp32/StationG3Board.cpp
  44. 31
      variants/station_g3_esp32/StationG3Board.h
  45. 2
      variants/t1000-e/T1000eBoard.h
  46. 3
      variants/thinknode_m1/ThinkNodeM1Board.h
  47. 52
      variants/thinknode_m2/ThinknodeM2Board.cpp
  48. 4
      variants/thinknode_m2/ThinknodeM2Board.h
  49. 2
      variants/thinknode_m3/ThinkNodeM3Board.h
  50. 8
      variants/thinknode_m5/ThinknodeM5Board.cpp
  51. 3
      variants/thinknode_m5/ThinknodeM5Board.h
  52. 2
      variants/thinknode_m6/ThinkNodeM6Board.h
  53. 2
      variants/wio-tracker-l1/WioTrackerL1Board.h
  54. 32
      variants/xiao_c3/XiaoC3Board.h
  55. 2
      variants/xiao_nrf52/XiaoNrf52Board.h

3
examples/companion_radio/ui-new/UITask.cpp

@ -697,8 +697,7 @@ void UITask::shutdown(bool restart){
if (restart) { if (restart) {
_board->reboot(); _board->reboot();
} else { } else {
_display->turnOff(); // Power off board including radio, display, GPS and components
radio_driver.powerOff();
_board->powerOff(); _board->powerOff();
} }
} }

2
examples/companion_radio/ui-orig/UITask.cpp

@ -307,7 +307,7 @@ void UITask::shutdown(bool restart){
if (restart) { if (restart) {
_board->reboot(); _board->reboot();
} else { } else {
radio_driver.powerOff(); // Power off board including radio, display, GPS and components
_board->powerOff(); _board->powerOff();
} }
} }

3
examples/companion_radio/ui-tiny/UITask.cpp

@ -566,8 +566,7 @@ void UITask::shutdown(bool restart){
if (restart) { if (restart) {
_board->reboot(); _board->reboot();
} else { } else {
_display->turnOff(); // Power off board including radio, display, GPS and components
radio_driver.powerOff();
_board->powerOff(); _board->powerOff();
} }
} }

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

4
src/helpers/ESP32Board.h

@ -14,6 +14,7 @@
#include <Wire.h> #include <Wire.h>
#include "soc/rtc.h" #include "soc/rtc.h"
#include "esp_system.h" #include "esp_system.h"
#include <driver/rtc_io.h>
class ESP32Board : public mesh::MainBoard { class ESP32Board : public mesh::MainBoard {
protected: protected:
@ -62,6 +63,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
} }

30
src/helpers/MeshadventurerBoard.h

@ -15,8 +15,6 @@
#include "ESP32Board.h" #include "ESP32Board.h"
#include <driver/rtc_io.h>
class MeshadventurerBoard : public ESP32Board { class MeshadventurerBoard : public ESP32Board {
public: public:
@ -35,34 +33,6 @@ public:
} }
} }
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1) {
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
// Make sure the DIO1 and NSS GPIOs are held on required levels during deep sleep
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
if (pin_wake_btn < 0) {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
} else {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
}
if (secs > 0) {
esp_sleep_enable_timer_wakeup(secs * 1000000);
}
// Finally set ESP32 into sleep
esp_deep_sleep_start(); // CPU halts here and never returns!
}
void powerOff() override {
// TODO: re-enable this when there is a definite wake-up source pin:
// enterDeepSleep(0);
}
uint16_t getBattMilliVolts() override { uint16_t getBattMilliVolts() override {
analogReadResolution(12); analogReadResolution(12);

32
src/helpers/NRF52Board.cpp

@ -1,5 +1,6 @@
#if defined(NRF52_PLATFORM) #if defined(NRF52_PLATFORM)
#include "NRF52Board.h" #include "NRF52Board.h"
#include <target.h>
#include <bluefruit.h> #include <bluefruit.h>
#include <nrf_soc.h> #include <nrf_soc.h>
@ -297,6 +298,37 @@ float NRF52Board::getMCUTemperature() {
return temp * 0.25f; // Convert to *C return temp * 0.25f; // Convert to *C
} }
void NRF52Board::powerOff() {
// 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);
// Power off GPS if any
if(sensors.getLocationProvider() != NULL) {
sensors.getLocationProvider()->stop();
}
// Flush serial buffers
Serial.flush();
delay(100);
// Enter SYSTEMOFF
uint8_t sd_enabled = 0;
sd_softdevice_is_enabled(&sd_enabled);
if (sd_enabled) { // SoftDevice is enabled
sd_power_system_off();
} else { // SoftDevice is not enable
NRF_POWER->SYSTEMOFF = POWER_SYSTEMOFF_SYSTEMOFF_Enter;
}
}
bool NRF52Board::getBootloaderVersion(char* out, size_t max_len) { bool NRF52Board::getBootloaderVersion(char* out, size_t max_len) {
static const char BOOTLOADER_MARKER[] = "UF2 Bootloader "; static const char BOOTLOADER_MARKER[] = "UF2 Bootloader ";
const uint8_t* flash = (const uint8_t*)0x000FB000; // earliest known info.txt location is 0xFB90B, latest is 0xFCC4B const uint8_t* flash = (const uint8_t*)0x000FB000; // earliest known info.txt location is 0xFB90B, latest is 0xFCC4B

1
src/helpers/NRF52Board.h

@ -50,6 +50,7 @@ public:
virtual uint8_t getStartupReason() const override { return startup_reason; } virtual uint8_t getStartupReason() const override { return startup_reason; }
virtual float getMCUTemperature() override; virtual float getMCUTemperature() override;
virtual void reboot() override { NVIC_SystemReset(); } virtual void reboot() override { NVIC_SystemReset(); }
virtual void powerOff() override;
virtual bool getBootloaderVersion(char* version, size_t max_len) override; virtual bool getBootloaderVersion(char* version, size_t max_len) override;
virtual bool startOTAUpdate(const char *id, char reply[]) override; virtual bool startOTAUpdate(const char *id, char reply[]) override;
virtual void sleep(uint32_t secs) override; virtual void sleep(uint32_t secs) override;

2
variants/gat562_30s_mesh_kit/GAT56230SMeshKitBoard.h

@ -47,7 +47,7 @@ public:
uint32_t button_pin = PIN_BUTTON1; uint32_t button_pin = PIN_BUTTON1;
nrf_gpio_cfg_input(button_pin, NRF_GPIO_PIN_PULLUP); nrf_gpio_cfg_input(button_pin, NRF_GPIO_PIN_PULLUP);
nrf_gpio_cfg_sense_set(button_pin, NRF_GPIO_PIN_SENSE_LOW); nrf_gpio_cfg_sense_set(button_pin, NRF_GPIO_PIN_SENSE_LOW);
sd_power_system_off(); NRF52Board::powerOff();
} }
}; };

2
variants/gat562_mesh_evb_pro/GAT562EVBProBoard.h

@ -47,7 +47,7 @@ public:
uint32_t button_pin = PIN_BUTTON1; uint32_t button_pin = PIN_BUTTON1;
nrf_gpio_cfg_input(button_pin, NRF_GPIO_PIN_PULLUP); nrf_gpio_cfg_input(button_pin, NRF_GPIO_PIN_PULLUP);
nrf_gpio_cfg_sense_set(button_pin, NRF_GPIO_PIN_SENSE_LOW); nrf_gpio_cfg_sense_set(button_pin, NRF_GPIO_PIN_SENSE_LOW);
sd_power_system_off(); NRF52Board::powerOff();
} }
}; };

2
variants/gat562_mesh_tracker_pro/GAT562MeshTrackerProBoard.h

@ -47,7 +47,7 @@ public:
uint32_t button_pin = PIN_BUTTON1; uint32_t button_pin = PIN_BUTTON1;
nrf_gpio_cfg_input(button_pin, NRF_GPIO_PIN_PULLUP); nrf_gpio_cfg_input(button_pin, NRF_GPIO_PIN_PULLUP);
nrf_gpio_cfg_sense_set(button_pin, NRF_GPIO_PIN_SENSE_LOW); nrf_gpio_cfg_sense_set(button_pin, NRF_GPIO_PIN_SENSE_LOW);
sd_power_system_off(); NRF52Board::powerOff();
} }
}; };

2
variants/gat562_mesh_watch13/GAT56MeshWatch13Board.h

@ -38,7 +38,7 @@ public:
uint32_t button_pin = PIN_BUTTON1; uint32_t button_pin = PIN_BUTTON1;
nrf_gpio_cfg_input(button_pin, NRF_GPIO_PIN_PULLUP); nrf_gpio_cfg_input(button_pin, NRF_GPIO_PIN_PULLUP);
nrf_gpio_cfg_sense_set(button_pin, NRF_GPIO_PIN_SENSE_LOW); nrf_gpio_cfg_sense_set(button_pin, NRF_GPIO_PIN_SENSE_LOW);
sd_power_system_off(); NRF52Board::powerOff();
} }
}; };

27
variants/heltec_e213/HeltecE213Board.cpp

@ -20,33 +20,6 @@ void HeltecE213Board::begin() {
} }
} }
void HeltecE213Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
// Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
if (pin_wake_btn < 0) {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
} else {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
}
if (secs > 0) {
esp_sleep_enable_timer_wakeup(secs * 1000000);
}
// Finally set ESP32 into sleep
esp_deep_sleep_start(); // CPU halts here and never returns!
}
void HeltecE213Board::powerOff() {
enterDeepSleep(0);
}
uint16_t HeltecE213Board::getBattMilliVolts() { uint16_t HeltecE213Board::getBattMilliVolts() {
analogReadResolution(10); analogReadResolution(10);
digitalWrite(PIN_ADC_CTRL, HIGH); digitalWrite(PIN_ADC_CTRL, HIGH);

3
variants/heltec_e213/HeltecE213Board.h

@ -3,7 +3,6 @@
#include <Arduino.h> #include <Arduino.h>
#include <helpers/RefCountedDigitalPin.h> #include <helpers/RefCountedDigitalPin.h>
#include <helpers/ESP32Board.h> #include <helpers/ESP32Board.h>
#include <driver/rtc_io.h>
class HeltecE213Board : public ESP32Board { class HeltecE213Board : public ESP32Board {
@ -13,8 +12,6 @@ public:
HeltecE213Board() : periph_power(PIN_VEXT_EN,PIN_VEXT_EN_ACTIVE) { } HeltecE213Board() : periph_power(PIN_VEXT_EN,PIN_VEXT_EN_ACTIVE) { }
void begin(); void begin();
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1);
void powerOff() override;
uint16_t getBattMilliVolts() override; uint16_t getBattMilliVolts() override;
const char* getManufacturerName() const override ; const char* getManufacturerName() const override ;
}; };

27
variants/heltec_e290/HeltecE290Board.cpp

@ -20,33 +20,6 @@ void HeltecE290Board::begin() {
} }
} }
void HeltecE290Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
// Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
if (pin_wake_btn < 0) {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
} else {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
}
if (secs > 0) {
esp_sleep_enable_timer_wakeup(secs * 1000000);
}
// Finally set ESP32 into sleep
esp_deep_sleep_start(); // CPU halts here and never returns!
}
void HeltecE290Board::powerOff() {
enterDeepSleep(0);
}
uint16_t HeltecE290Board::getBattMilliVolts() { uint16_t HeltecE290Board::getBattMilliVolts() {
analogReadResolution(10); analogReadResolution(10);
digitalWrite(PIN_ADC_CTRL, HIGH); digitalWrite(PIN_ADC_CTRL, HIGH);

3
variants/heltec_e290/HeltecE290Board.h

@ -3,7 +3,6 @@
#include <Arduino.h> #include <Arduino.h>
#include <helpers/RefCountedDigitalPin.h> #include <helpers/RefCountedDigitalPin.h>
#include <helpers/ESP32Board.h> #include <helpers/ESP32Board.h>
#include <driver/rtc_io.h>
class HeltecE290Board : public ESP32Board { class HeltecE290Board : public ESP32Board {
@ -13,8 +12,6 @@ public:
HeltecE290Board() : periph_power(PIN_VEXT_EN, PIN_VEXT_EN_ACTIVE) { } HeltecE290Board() : periph_power(PIN_VEXT_EN, PIN_VEXT_EN_ACTIVE) { }
void begin(); void begin();
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1);
void powerOff() override;
uint16_t getBattMilliVolts() override; uint16_t getBattMilliVolts() override;
const char* getManufacturerName() const override ; const char* getManufacturerName() const override ;

10
variants/heltec_t096/T096Board.cpp

@ -112,13 +112,9 @@ void T096Board::variant_shutdown() {
} }
void T096Board::powerOff() { void T096Board::powerOff() {
#if ENV_INCLUDE_GPS == 1 loRaFEMControl.setSleepModeEnable();
pinMode(PIN_GPS_EN, OUTPUT); nrf_gpio_cfg_default(PIN_GPS_EN); // 363uA down to 39uA
digitalWrite(PIN_GPS_EN, !PIN_GPS_EN_ACTIVE); NRF52Board::powerOff();
#endif
loRaFEMControl.setSleepModeEnable();
variant_shutdown();
sd_power_system_off();
} }
const char* T096Board::getManufacturerName() const { const char* T096Board::getManufacturerName() const {

30
variants/heltec_t1/T1Board.cpp

@ -81,34 +81,6 @@ uint16_t T1Board::getBattMilliVolts() {
} }
void T1Board::variant_shutdown() { void T1Board::variant_shutdown() {
nrf_gpio_cfg_default(PIN_TFT_CS);
nrf_gpio_cfg_default(PIN_TFT_DC);
nrf_gpio_cfg_default(PIN_TFT_SDA);
nrf_gpio_cfg_default(PIN_TFT_SCL);
nrf_gpio_cfg_default(PIN_TFT_RST);
nrf_gpio_cfg_default(PIN_TFT_LEDA_CTL);
nrf_gpio_cfg_default(PIN_TFT_VDD_CTL);
nrf_gpio_cfg_default(PIN_WIRE_SDA);
nrf_gpio_cfg_default(PIN_WIRE_SCL);
nrf_gpio_cfg_default(LORA_CS);
nrf_gpio_cfg_default(SX126X_DIO1);
nrf_gpio_cfg_default(SX126X_BUSY);
nrf_gpio_cfg_default(SX126X_RESET);
nrf_gpio_cfg_default(PIN_SPI_MISO);
nrf_gpio_cfg_default(PIN_SPI_MOSI);
nrf_gpio_cfg_default(PIN_SPI_SCK);
nrf_gpio_cfg_default(PIN_SPI1_MOSI);
nrf_gpio_cfg_default(PIN_SPI1_SCK);
nrf_gpio_cfg_default(PIN_GPS_RESET);
nrf_gpio_cfg_default(PIN_GPS_EN);
nrf_gpio_cfg_default(PIN_GPS_PPS);
nrf_gpio_cfg_default(PIN_GPS_RX);
nrf_gpio_cfg_default(PIN_GPS_TX);
nrf_gpio_cfg_default(PIN_BUZZER_VOLTAGE_MULTIPLIER_1); nrf_gpio_cfg_default(PIN_BUZZER_VOLTAGE_MULTIPLIER_1);
nrf_gpio_cfg_default(PIN_BUZZER_VOLTAGE_MULTIPLIER_2); nrf_gpio_cfg_default(PIN_BUZZER_VOLTAGE_MULTIPLIER_2);
@ -127,7 +99,7 @@ void T1Board::variant_shutdown() {
void T1Board::powerOff() { void T1Board::powerOff() {
variant_shutdown(); variant_shutdown();
sd_power_system_off(); NRF52Board::powerOff();
} }
const char* T1Board::getManufacturerName() const { const char* T1Board::getManufacturerName() const {

7
variants/heltec_t114/T114Board.h

@ -50,10 +50,7 @@ public:
#ifdef LED_PIN #ifdef LED_PIN
digitalWrite(LED_PIN, HIGH); digitalWrite(LED_PIN, HIGH);
#endif #endif
#if ENV_INCLUDE_GPS == 1
pinMode(GPS_EN, OUTPUT); NRF52Board::powerOff();
digitalWrite(GPS_EN, LOW);
#endif
sd_power_system_off();
} }
}; };

27
variants/heltec_t190/HeltecT190Board.cpp

@ -20,33 +20,6 @@ void HeltecT190Board::begin() {
} }
} }
void HeltecT190Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
// Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
if (pin_wake_btn < 0) {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
} else {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
}
if (secs > 0) {
esp_sleep_enable_timer_wakeup(secs * 1000000);
}
// Finally set ESP32 into sleep
esp_deep_sleep_start(); // CPU halts here and never returns!
}
void HeltecT190Board::powerOff() {
enterDeepSleep(0);
}
uint16_t HeltecT190Board::getBattMilliVolts() { uint16_t HeltecT190Board::getBattMilliVolts() {
analogReadResolution(10); analogReadResolution(10);
digitalWrite(PIN_ADC_CTRL, HIGH); digitalWrite(PIN_ADC_CTRL, HIGH);

3
variants/heltec_t190/HeltecT190Board.h

@ -3,7 +3,6 @@
#include <Arduino.h> #include <Arduino.h>
#include <helpers/RefCountedDigitalPin.h> #include <helpers/RefCountedDigitalPin.h>
#include <helpers/ESP32Board.h> #include <helpers/ESP32Board.h>
#include <driver/rtc_io.h>
class HeltecT190Board : public ESP32Board { class HeltecT190Board : public ESP32Board {
@ -13,8 +12,6 @@ public:
HeltecT190Board() : periph_power(PIN_VEXT_EN,PIN_VEXT_EN_ACTIVE) { } HeltecT190Board() : periph_power(PIN_VEXT_EN,PIN_VEXT_EN_ACTIVE) { }
void begin(); void begin();
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1);
void powerOff() override;
uint16_t getBattMilliVolts() override; uint16_t getBattMilliVolts() override;
const char* getManufacturerName() const override ; const char* getManufacturerName() const override ;

31
variants/heltec_tracker_v2/HeltecTrackerV2Board.cpp

@ -35,33 +35,12 @@ void HeltecTrackerV2Board::begin() {
loRaFEMControl.setRxModeEnable(); loRaFEMControl.setRxModeEnable();
} }
void HeltecTrackerV2Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) { void HeltecTrackerV2Board::powerOff() {
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); // Turn off PA
digitalWrite(P_LORA_PA_POWER, LOW);
rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_POWER);
// Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep ESP32Board::powerOff();
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
loRaFEMControl.setRxModeEnableWhenMCUSleep();//It also needs to be enabled in receive mode
if (pin_wake_btn < 0) {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
} else {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
}
if (secs > 0) {
esp_sleep_enable_timer_wakeup(secs * 1000000);
}
// Finally set ESP32 into sleep
esp_deep_sleep_start(); // CPU halts here and never returns!
}
void HeltecTrackerV2Board::powerOff() {
enterDeepSleep(0);
} }
uint16_t HeltecTrackerV2Board::getBattMilliVolts() { uint16_t HeltecTrackerV2Board::getBattMilliVolts() {

2
variants/heltec_tracker_v2/HeltecTrackerV2Board.h

@ -3,7 +3,6 @@
#include <Arduino.h> #include <Arduino.h>
#include <helpers/RefCountedDigitalPin.h> #include <helpers/RefCountedDigitalPin.h>
#include <helpers/ESP32Board.h> #include <helpers/ESP32Board.h>
#include <driver/rtc_io.h>
#include "LoRaFEMControl.h" #include "LoRaFEMControl.h"
class HeltecTrackerV2Board : public ESP32Board { class HeltecTrackerV2Board : public ESP32Board {
@ -17,7 +16,6 @@ public:
void begin(); void begin();
void onBeforeTransmit(void) override; void onBeforeTransmit(void) override;
void onAfterTransmit(void) override; void onAfterTransmit(void) override;
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1);
void powerOff() override; void powerOff() override;
uint16_t getBattMilliVolts() override; uint16_t getBattMilliVolts() override;
const char* getManufacturerName() const override ; const char* getManufacturerName() const override ;

25
variants/heltec_v2/HeltecV2Board.h

@ -7,8 +7,6 @@
#define PIN_VBAT_READ 37 #define PIN_VBAT_READ 37
#define PIN_LED_BUILTIN 25 #define PIN_LED_BUILTIN 25
#include <driver/rtc_io.h>
class HeltecV2Board : public ESP32Board { class HeltecV2Board : public ESP32Board {
public: public:
void begin() { void begin() {
@ -26,29 +24,6 @@ public:
} }
} }
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1) {
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
// Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_0, RTC_GPIO_MODE_INPUT_ONLY);
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_0);
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
if (pin_wake_btn < 0) {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_0), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
} else {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_0) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
}
if (secs > 0) {
esp_sleep_enable_timer_wakeup(secs * 1000000);
}
// Finally set ESP32 into sleep
esp_deep_sleep_start(); // CPU halts here and never returns!
}
uint16_t getBattMilliVolts() override { uint16_t getBattMilliVolts() override {
analogReadResolution(10); analogReadResolution(10);

29
variants/heltec_v3/HeltecV3Board.h

@ -17,8 +17,6 @@
#define PIN_ADC_CTRL_ACTIVE LOW #define PIN_ADC_CTRL_ACTIVE LOW
#define PIN_ADC_CTRL_INACTIVE HIGH #define PIN_ADC_CTRL_INACTIVE HIGH
#include <driver/rtc_io.h>
class HeltecV3Board : public ESP32Board { class HeltecV3Board : public ESP32Board {
private: private:
bool adc_active_state; bool adc_active_state;
@ -52,33 +50,6 @@ public:
} }
} }
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1) {
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
// Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
if (pin_wake_btn < 0) {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
} else {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
}
if (secs > 0) {
esp_sleep_enable_timer_wakeup(secs * 1000000);
}
// Finally set ESP32 into sleep
esp_deep_sleep_start(); // CPU halts here and never returns!
}
void powerOff() override {
enterDeepSleep(0);
}
uint16_t getBattMilliVolts() override { uint16_t getBattMilliVolts() override {
analogReadResolution(10); analogReadResolution(10);
digitalWrite(PIN_ADC_CTRL, adc_active_state); digitalWrite(PIN_ADC_CTRL, adc_active_state);

31
variants/heltec_v4/HeltecV4Board.cpp

@ -32,33 +32,12 @@ void HeltecV4Board::begin() {
loRaFEMControl.setRxModeEnable(); loRaFEMControl.setRxModeEnable();
} }
void HeltecV4Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) { void HeltecV4Board::powerOff() {
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); // Turn off PA
digitalWrite(P_LORA_PA_POWER, LOW);
rtc_gpio_hold_en((gpio_num_t)P_LORA_PA_POWER);
// Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep ESP32Board::powerOff();
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
loRaFEMControl.setRxModeEnableWhenMCUSleep();//It also needs to be enabled in receive mode
if (pin_wake_btn < 0) {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
} else {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
}
if (secs > 0) {
esp_sleep_enable_timer_wakeup(secs * 1000000);
}
// Finally set ESP32 into sleep
esp_deep_sleep_start(); // CPU halts here and never returns!
}
void HeltecV4Board::powerOff() {
enterDeepSleep(0);
} }
uint16_t HeltecV4Board::getBattMilliVolts() { uint16_t HeltecV4Board::getBattMilliVolts() {

2
variants/heltec_v4/HeltecV4Board.h

@ -3,7 +3,6 @@
#include <Arduino.h> #include <Arduino.h>
#include <helpers/RefCountedDigitalPin.h> #include <helpers/RefCountedDigitalPin.h>
#include <helpers/ESP32Board.h> #include <helpers/ESP32Board.h>
#include <driver/rtc_io.h>
#include "LoRaFEMControl.h" #include "LoRaFEMControl.h"
#ifndef ADC_MULTIPLIER #ifndef ADC_MULTIPLIER
@ -23,7 +22,6 @@ public:
void begin(); void begin();
void onBeforeTransmit(void) override; void onBeforeTransmit(void) override;
void onAfterTransmit(void) override; void onAfterTransmit(void) override;
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1);
void powerOff() override; void powerOff() override;
bool setLoRaFemLnaEnabled(bool enable) override; bool setLoRaFemLnaEnabled(bool enable) override;
bool canControlLoRaFemLna() const override; bool canControlLoRaFemLna() const override;

4
variants/keepteen_lt1/KeepteenLT1Board.h

@ -37,8 +37,4 @@ public:
digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off digitalWrite(P_LORA_TX_LED, LOW); // turn TX LED off
} }
#endif #endif
void powerOff() override {
sd_power_system_off();
}
}; };

6
variants/lilygo_t_impulse_plus/TImpulsePlusBoard.h

@ -48,12 +48,10 @@ public:
} }
void powerOff() override { void powerOff() override {
// power off system
NRF52Board::powerOff();
// turn off 3.3v // turn off 3.3v
digitalWrite(RT9080_EN, LOW); digitalWrite(RT9080_EN, LOW);
// power off system
sd_power_system_off();
} }
}; };

24
variants/lilygo_tdeck/TDeckBoard.h

@ -3,7 +3,6 @@
#include <Wire.h> #include <Wire.h>
#include <Arduino.h> #include <Arduino.h>
#include "helpers/ESP32Board.h" #include "helpers/ESP32Board.h"
#include <driver/rtc_io.h>
#define PIN_VBAT_READ 4 #define PIN_VBAT_READ 4
#define BATTERY_SAMPLES 8 #define BATTERY_SAMPLES 8
@ -23,29 +22,6 @@ public:
} }
#endif #endif
void enterDeepSleep(uint32_t secs, int pin_wake_btn) {
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
// Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
if (pin_wake_btn < 0) {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
} else {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
}
if (secs > 0) {
esp_sleep_enable_timer_wakeup(secs * 1000000);
}
// Finally set ESP32 into sleep
esp_deep_sleep_start(); // CPU halts here and never returns!
}
uint16_t getBattMilliVolts() { uint16_t getBattMilliVolts() {
#if defined(PIN_VBAT_READ) && defined(ADC_MULTIPLIER) #if defined(PIN_VBAT_READ) && defined(ADC_MULTIPLIER)
analogReadResolution(12); analogReadResolution(12);

2
variants/lilygo_techo/TechoBoard.h

@ -24,6 +24,7 @@ public:
} }
void powerOff() override { void powerOff() override {
NRF52Board::powerOff();
#ifdef LED_RED #ifdef LED_RED
digitalWrite(LED_RED, HIGH); digitalWrite(LED_RED, HIGH);
#endif #endif
@ -39,6 +40,5 @@ public:
#ifdef PIN_PWR_EN #ifdef PIN_PWR_EN
digitalWrite(PIN_PWR_EN, LOW); digitalWrite(PIN_PWR_EN, LOW);
#endif #endif
sd_power_system_off();
} }
}; };

2
variants/lilygo_techo_card/TechoCardBoard.cpp

@ -91,7 +91,7 @@ void TechoCardBoard::powerOff() {
nrf_gpio_cfg_sense_input(BUTTON_PIN, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW); nrf_gpio_cfg_sense_input(BUTTON_PIN, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);
turnOffLeds(); turnOffLeds();
digitalWrite(PIN_PWR_EN, LOW); digitalWrite(PIN_PWR_EN, LOW);
sd_power_system_off(); NRF52Board::powerOff();
} }
#endif #endif

3
variants/lilygo_techo_lite/TechoBoard.h

@ -22,6 +22,8 @@ public:
} }
void powerOff() override { void powerOff() override {
NRF52Board::powerOff();
digitalWrite(PIN_VBAT_MEAS_EN, LOW); digitalWrite(PIN_VBAT_MEAS_EN, LOW);
#ifdef LED_RED #ifdef LED_RED
digitalWrite(LED_RED, LOW); digitalWrite(LED_RED, LOW);
@ -38,6 +40,5 @@ public:
#ifdef PIN_PWR_EN #ifdef PIN_PWR_EN
digitalWrite(PIN_PWR_EN, LOW); digitalWrite(PIN_PWR_EN, LOW);
#endif #endif
sd_power_system_off();
} }
}; };

4
variants/mesh_pocket/MeshPocket.h

@ -32,8 +32,4 @@ public:
const char* getManufacturerName() const override { const char* getManufacturerName() const override {
return "Heltec MeshPocket"; return "Heltec MeshPocket";
} }
void powerOff() override {
sd_power_system_off();
}
}; };

2
variants/meshtiny/MeshtinyBoard.h

@ -60,7 +60,7 @@ public:
nrf_gpio_cfg_sense_input(g_ADigitalPinMap[PIN_USER_BTN], NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW); nrf_gpio_cfg_sense_input(g_ADigitalPinMap[PIN_USER_BTN], NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);
#endif #endif
sd_power_system_off(); NRF52Board::powerOff();
} }
}; };

2
variants/minewsemi_me25ls01/MinewsemiME25LS01Board.h

@ -65,7 +65,7 @@ public:
#ifdef BUTTON_PIN #ifdef BUTTON_PIN
nrf_gpio_cfg_sense_input(digitalPinToInterrupt(BUTTON_PIN), NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW); nrf_gpio_cfg_sense_input(digitalPinToInterrupt(BUTTON_PIN), NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);
#endif #endif
sd_power_system_off(); NRF52Board::powerOff();
} }
#if defined(P_LORA_TX_LED) #if defined(P_LORA_TX_LED)

2
variants/nano_g2_ultra/nano-g2.h

@ -52,6 +52,6 @@ public:
nrf_gpio_cfg_sense_input(digitalPinToInterrupt(PIN_USER_BTN), NRF_GPIO_PIN_NOPULL, nrf_gpio_cfg_sense_input(digitalPinToInterrupt(PIN_USER_BTN), NRF_GPIO_PIN_NOPULL,
NRF_GPIO_PIN_SENSE_LOW); NRF_GPIO_PIN_SENSE_LOW);
sd_power_system_off(); NRF52Board::powerOff();
} }
}; };

4
variants/promicro/PromicroBoard.h

@ -72,8 +72,4 @@ public:
#endif #endif
return 0; return 0;
} }
void powerOff() override {
sd_power_system_off();
}
}; };

29
variants/rak3112/RAK3112Board.h

@ -16,8 +16,6 @@
#define ADC_MULTIPLIER (3 * 1.73 * 1.187 * 1000) #define ADC_MULTIPLIER (3 * 1.73 * 1.187 * 1000)
#define BATTERY_SAMPLES 8 #define BATTERY_SAMPLES 8
#include <driver/rtc_io.h>
class RAK3112Board : public ESP32Board { class RAK3112Board : public ESP32Board {
private: private:
bool adc_active_state; bool adc_active_state;
@ -51,33 +49,6 @@ public:
} }
} }
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1) {
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
// Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
if (pin_wake_btn < 0) {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
} else {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
}
if (secs > 0) {
esp_sleep_enable_timer_wakeup(secs * 1000000);
}
// Finally set ESP32 into sleep
esp_deep_sleep_start(); // CPU halts here and never returns!
}
void powerOff() override {
enterDeepSleep(0);
}
uint16_t getBattMilliVolts() override { uint16_t getBattMilliVolts() override {
analogReadResolution(12); analogReadResolution(12);

2
variants/rak_wismesh_tag/RAKWismeshTagBoard.h

@ -69,6 +69,6 @@ public:
nrf_gpio_cfg_sense_input(digitalPinToInterrupt(BUTTON_PIN), NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW); nrf_gpio_cfg_sense_input(digitalPinToInterrupt(BUTTON_PIN), NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);
#endif #endif
sd_power_system_off(); NRF52Board::powerOff();
} }
}; };

2
variants/sensecap_solar/SenseCapSolarBoard.h

@ -54,7 +54,7 @@ public:
#ifdef NRF52_POWER_MANAGEMENT #ifdef NRF52_POWER_MANAGEMENT
initiateShutdown(SHUTDOWN_REASON_USER); initiateShutdown(SHUTDOWN_REASON_USER);
#else #else
sd_power_system_off(); NRF52Board::powerOff();
#endif #endif
} }
}; };

24
variants/station_g2/StationG2Board.h

@ -2,7 +2,6 @@
#include <Arduino.h> #include <Arduino.h>
#include <helpers/ESP32Board.h> #include <helpers/ESP32Board.h>
#include <driver/rtc_io.h>
class StationG2Board : public ESP32Board { class StationG2Board : public ESP32Board {
public: public:
@ -21,29 +20,6 @@ public:
} }
} }
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1) {
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
// Make sure the DIO1 and NSS GPIOs are hold on required levels during deep sleep
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
if (pin_wake_btn < 0) {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet
} else {
esp_sleep_enable_ext1_wakeup( (1L << P_LORA_DIO_1) | (1L << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH); // wake up on: recv LoRa packet OR wake btn
}
if (secs > 0) {
esp_sleep_enable_timer_wakeup(secs * 1000000);
}
// Finally set ESP32 into sleep
esp_deep_sleep_start(); // CPU halts here and never returns!
}
uint16_t getBattMilliVolts() override { uint16_t getBattMilliVolts() override {
return 0; return 0;
} }

15
variants/station_g3_esp32/StationG3Board.cpp

@ -0,0 +1,15 @@
#include "StationG3Board.h"
void StationG3Board::powerOff() {
#ifdef P_PA1_EN
setPAModeHigh(false);
rtc_gpio_hold_en((gpio_num_t)P_PA1_EN);
#endif
#ifdef P_PRIMARY_LNA_EN
setPrimaryLNAControl(true);
rtc_gpio_hold_en((gpio_num_t)P_PRIMARY_LNA_EN);
#endif
ESP32Board::powerOff();
}

31
variants/station_g3_esp32/StationG3Board.h

@ -73,36 +73,7 @@ public:
setPrimaryLNAControl(true); setPrimaryLNAControl(true);
} }
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1) { void powerOff() override;
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
rtc_gpio_set_direction((gpio_num_t)P_LORA_DIO_1, RTC_GPIO_MODE_INPUT_ONLY);
rtc_gpio_pulldown_en((gpio_num_t)P_LORA_DIO_1);
rtc_gpio_hold_en((gpio_num_t)P_LORA_NSS);
#ifdef P_PA1_EN
setPAModeHigh(false);
rtc_gpio_hold_en((gpio_num_t)P_PA1_EN);
#endif
#ifdef P_PRIMARY_LNA_EN
setPrimaryLNAControl(true);
rtc_gpio_hold_en((gpio_num_t)P_PRIMARY_LNA_EN);
#endif
if (pin_wake_btn < 0) {
esp_sleep_enable_ext1_wakeup((1ULL << P_LORA_DIO_1), ESP_EXT1_WAKEUP_ANY_HIGH);
} else {
esp_sleep_enable_ext1_wakeup((1ULL << P_LORA_DIO_1) | (1ULL << pin_wake_btn), ESP_EXT1_WAKEUP_ANY_HIGH);
}
if (secs > 0) {
esp_sleep_enable_timer_wakeup(secs * 1000000);
}
esp_deep_sleep_start();
}
uint16_t getBattMilliVolts() override { uint16_t getBattMilliVolts() override {
return 0; return 0;

2
variants/t1000-e/T1000eBoard.h

@ -88,6 +88,6 @@ public:
nrf_gpio_cfg_sense_input(BUTTON_PIN, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_HIGH); nrf_gpio_cfg_sense_input(BUTTON_PIN, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_HIGH);
#endif #endif
sd_power_system_off(); NRF52Board::powerOff();
} }
}; };

3
variants/thinknode_m1/ThinkNodeM1Board.h

@ -40,7 +40,6 @@ public:
#endif #endif
// power off board // power off board
sd_power_system_off(); NRF52Board::powerOff();
} }
}; };

52
variants/thinknode_m2/ThinknodeM2Board.cpp

@ -1,40 +1,30 @@
#include "ThinknodeM2Board.h" #include "ThinknodeM2Board.h"
void ThinknodeM2Board::begin() { void ThinknodeM2Board::begin() {
pinMode(PIN_VEXT_EN, OUTPUT); pinMode(PIN_VEXT_EN, OUTPUT);
digitalWrite(PIN_VEXT_EN, !PIN_VEXT_EN_ACTIVE); // force power cycle digitalWrite(PIN_VEXT_EN, !PIN_VEXT_EN_ACTIVE); // force power cycle
delay(20); // allow power rail to discharge delay(20); // allow power rail to discharge
digitalWrite(PIN_VEXT_EN, PIN_VEXT_EN_ACTIVE); // turn backlight back on digitalWrite(PIN_VEXT_EN, PIN_VEXT_EN_ACTIVE); // turn backlight back on
delay(120); // give display time to bias on cold boot delay(120); // give display time to bias on cold boot
ESP32Board::begin(); ESP32Board::begin();
pinMode(PIN_STATUS_LED, OUTPUT); // init power led pinMode(PIN_STATUS_LED, OUTPUT); // init power led
} }
void ThinknodeM2Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) { uint16_t ThinknodeM2Board::getBattMilliVolts() {
esp_deep_sleep_start(); analogReadResolution(12);
} analogSetPinAttenuation(PIN_VBAT_READ, ADC_11db);
void ThinknodeM2Board::powerOff() { uint32_t mv = 0;
enterDeepSleep(0); for (int i = 0; i < 8; ++i) {
mv += analogReadMilliVolts(PIN_VBAT_READ);
delayMicroseconds(200);
} }
mv /= 8;
uint16_t ThinknodeM2Board::getBattMilliVolts() { analogReadResolution(10);
analogReadResolution(12); return static_cast<uint16_t>(mv * ADC_MULTIPLIER);
analogSetPinAttenuation(PIN_VBAT_READ, ADC_11db);
uint32_t mv = 0;
for (int i = 0; i < 8; ++i) {
mv += analogReadMilliVolts(PIN_VBAT_READ);
delayMicroseconds(200);
}
mv /= 8;
analogReadResolution(10);
return static_cast<uint16_t>(mv * ADC_MULTIPLIER );
} }
const char* ThinknodeM2Board::getManufacturerName() const { const char *ThinknodeM2Board::getManufacturerName() const {
return "Elecrow ThinkNode M2"; return "Elecrow ThinkNode M2";
} }

4
variants/thinknode_m2/ThinknodeM2Board.h

@ -3,15 +3,11 @@
#include <Arduino.h> #include <Arduino.h>
#include <helpers/RefCountedDigitalPin.h> #include <helpers/RefCountedDigitalPin.h>
#include <helpers/ESP32Board.h> #include <helpers/ESP32Board.h>
#include <driver/rtc_io.h>
class ThinknodeM2Board : public ESP32Board { class ThinknodeM2Board : public ESP32Board {
public: public:
void begin(); void begin();
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1);
void powerOff() override;
uint16_t getBattMilliVolts() override; uint16_t getBattMilliVolts() override;
const char* getManufacturerName() const override ; const char* getManufacturerName() const override ;

2
variants/thinknode_m3/ThinkNodeM3Board.h

@ -49,6 +49,6 @@ public:
#endif #endif
// power off board // power off board
sd_power_system_off(); NRF52Board::powerOff();
} }
}; };

8
variants/thinknode_m5/ThinknodeM5Board.cpp

@ -19,14 +19,6 @@ void ThinknodeM5Board::begin() {
ESP32Board::begin(); ESP32Board::begin();
} }
void ThinknodeM5Board::enterDeepSleep(uint32_t secs, int pin_wake_btn) {
esp_deep_sleep_start();
}
void ThinknodeM5Board::powerOff() {
enterDeepSleep(0);
}
uint16_t ThinknodeM5Board::getBattMilliVolts() { uint16_t ThinknodeM5Board::getBattMilliVolts() {
analogReadResolution(12); analogReadResolution(12);
analogSetPinAttenuation(PIN_VBAT_READ, ADC_11db); analogSetPinAttenuation(PIN_VBAT_READ, ADC_11db);

3
variants/thinknode_m5/ThinknodeM5Board.h

@ -3,7 +3,6 @@
#include <Arduino.h> #include <Arduino.h>
#include <helpers/RefCountedDigitalPin.h> #include <helpers/RefCountedDigitalPin.h>
#include <helpers/ESP32Board.h> #include <helpers/ESP32Board.h>
#include <driver/rtc_io.h>
#include <PCA9557.h> #include <PCA9557.h>
extern PCA9557 expander; extern PCA9557 expander;
@ -13,8 +12,6 @@ class ThinknodeM5Board : public ESP32Board {
public: public:
void begin(); void begin();
void enterDeepSleep(uint32_t secs, int pin_wake_btn = -1);
void powerOff() override;
uint16_t getBattMilliVolts() override; uint16_t getBattMilliVolts() override;
const char* getManufacturerName() const override ; const char* getManufacturerName() const override ;

2
variants/thinknode_m6/ThinkNodeM6Board.h

@ -44,6 +44,6 @@ public:
#endif #endif
// power off board // power off board
sd_power_system_off(); NRF52Board::powerOff();
} }
}; };

2
variants/wio-tracker-l1/WioTrackerL1Board.h

@ -35,6 +35,6 @@ public:
} }
void powerOff() override { void powerOff() override {
sd_power_system_off(); NRF52Board::powerOff();
} }
}; };

32
variants/xiao_c3/XiaoC3Board.h

@ -3,7 +3,6 @@
#include <helpers/ESP32Board.h> #include <helpers/ESP32Board.h>
#include <Arduino.h> #include <Arduino.h>
#include <driver/rtc_io.h>
#include <driver/uart.h> #include <driver/uart.h>
class XiaoC3Board : public ESP32Board { class XiaoC3Board : public ESP32Board {
@ -40,37 +39,6 @@ public:
#endif #endif
} }
void enterDeepSleep(uint32_t secs, int8_t wake_pin = -1) {
gpio_set_direction(gpio_num_t(P_LORA_DIO_1), GPIO_MODE_INPUT);
if (wake_pin >= 0) {
gpio_set_direction((gpio_num_t)wake_pin, GPIO_MODE_INPUT);
}
//hold disable, isolate and power domain config functions may be unnecessary
//gpio_deep_sleep_hold_dis();
//esp_sleep_config_gpio_isolate();
gpio_deep_sleep_hold_en();
#if defined(LORA_TX_BOOST_PIN)
gpio_hold_en((gpio_num_t) LORA_TX_BOOST_PIN);
gpio_deep_sleep_hold_en();
#endif
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
if (wake_pin >= 0) {
esp_deep_sleep_enable_gpio_wakeup((1 << P_LORA_DIO_1) | (1 << wake_pin), ESP_GPIO_WAKEUP_GPIO_HIGH);
} else {
esp_deep_sleep_enable_gpio_wakeup(1 << P_LORA_DIO_1, ESP_GPIO_WAKEUP_GPIO_HIGH);
}
if (secs > 0) {
esp_sleep_enable_timer_wakeup(secs * 1000000);
}
// Finally set ESP32 into sleep
esp_deep_sleep_start(); // CPU halts here and never returns!
}
#if defined(LORA_TX_BOOST_PIN) || defined(P_LORA_TX_LED) #if defined(LORA_TX_BOOST_PIN) || defined(P_LORA_TX_LED)
void onBeforeTransmit() override { void onBeforeTransmit() override {
#if defined(P_LORA_TX_LED) #if defined(P_LORA_TX_LED)

2
variants/xiao_nrf52/XiaoNrf52Board.h

@ -50,7 +50,7 @@ public:
nrf_gpio_cfg_sense_input(digitalPinToInterrupt(g_ADigitalPinMap[PIN_USER_BTN]), NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_LOW); nrf_gpio_cfg_sense_input(digitalPinToInterrupt(g_ADigitalPinMap[PIN_USER_BTN]), NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_SENSE_LOW);
#endif #endif
sd_power_system_off(); NRF52Board::powerOff();
} }
}; };

Loading…
Cancel
Save