LowPower
LowPowerESP8266.h
1 #pragma once
2 
3 #include <ESP8266WiFi.h>
4 #include <PolledTimeout.h>
5 #include <coredecls.h> // crc32()
6 #include <include/WiFiState.h> // WiFiState structure details
7 #include "LowPowerCommon.h"
8 #include "gpio.h"
9 
10 namespace low_power {
11 
31  public:
32 
33  bool isProcessingOnSleep(sleep_mode_enum_t sleep_mode) {
34  bool result = false;
35  switch (sleep_mode) {
36  case sleep_mode_enum_t::modemSleep:
37  result = true;
38  break;
39  case sleep_mode_enum_t::noSleep:
40  result = true;
41  break;
42  case sleep_mode_enum_t::lightSleep:
43  result = false;
44  break;
45  case sleep_mode_enum_t::deepSleep:
46  result = false;
47  break;
48  }
49  return result;
50  }
51 
53  bool sleep(void) override {
54  bool rc = false;
55  switch (sleep_mode) {
56  // In Modem-sleep mode, ESP8266 will close the Wi-Fi module circuit
57  // between the two DTIM Beacon intervals in order to save power
58  case sleep_mode_enum_t::modemSleep:
59  rc = wifi_set_sleep_type(MODEM_SLEEP_T);
60  break;
61 
62  // wakup by external pin
63  case sleep_mode_enum_t::lightSleep:
64  if (sleep_time_us != 0 || gpio_count == 0) return false;
65  rc = wifi_set_sleep_type(LIGHT_SLEEP_T);
66  break;
67 
68  // responsible for periodic wake-ups
69  case sleep_mode_enum_t::deepSleep: {
70  if (gpio_count != 0 || sleep_time_us == 0) return false;
71  system_deep_sleep_set_option(sleep_option);
72  if (is_instant)
73  system_deep_sleep(sleep_time_us);
74  else
75  system_deep_sleep_instant(sleep_time_us);
76 
77  rc = true;
78  } break;
79 
80  case sleep_mode_enum_t::noSleep:
81  rc = true;
82  break;
83  }
84 
85  return rc;
86  }
87 
88  bool setSleepTime(uint32_t time, time_unit_t time_unit_type) override {
89  if (sleep_mode == sleep_mode_enum_t::modemSleep) return false;
90  setSleepMode(sleep_mode_enum_t::deepSleep);
91  sleep_time_us = (toUs(time, time_unit_type));
92  return gpio_count == 0;
93  }
94 
95  bool addWakeupPin(int pin, pin_change_t change_type) override {
96  if (sleep_mode == sleep_mode_enum_t::modemSleep) return false;
97  setSleepMode(sleep_mode_enum_t::lightSleep);
98  GPIO_INT_TYPE int_type = (change_type == pin_change_t::on_high)
99  ? GPIO_PIN_INTR_HILEVEL
100  : GPIO_PIN_INTR_LOLEVEL;
101  gpio_pin_wakeup_enable(digitalPinToInterrupt(pin), int_type);
102  gpio_count++;
103  return sleep_time_us == 0;
104  }
105 
112  void setDeepSleepOption(uint8_t option) { sleep_option = option; }
113 
115  void setInstant(bool instant) { is_instant = instant; }
116 
117  bool isModeSupported(sleep_mode_enum_t sleep_mode) override {
118  return true;
119  }
120 
121  void clear() {
123  sleep_time_us = 0;
124  sleep_option = 1;
125  is_instant = false;
126  gpio_count = 0;
127  }
128 
129  protected:
130  uint64_t sleep_time_us = 0;
131  uint8_t sleep_option = 1; // 1 (rf calibration)
132  bool is_instant = false;
133  uint16_t gpio_count = 0;
134 };
135 
136 static ArduinoLowPowerESP8266 LowPower;
137 
138 } // namespace low_power
Common API for power saving modes for different processor architectures.
Definition: LowPowerCommon.h:33
virtual void clear()
reset the processing
Definition: LowPowerCommon.h:117
virtual bool setSleepMode(sleep_mode_enum_t mode)
Defines the sleep mode.
Definition: LowPowerCommon.h:72
Low Power Management for ESP8266.
Definition: LowPowerESP8266.h:30
void setDeepSleepOption(uint8_t option)
Deep sleep options: values from 0 to 4 1: RF calibration: Power consumption is high 2: No RF calibrat...
Definition: LowPowerESP8266.h:112
bool isModeSupported(sleep_mode_enum_t sleep_mode) override
Provides information if the indicated mode is supported.
Definition: LowPowerESP8266.h:117
bool isProcessingOnSleep(sleep_mode_enum_t sleep_mode)
Returns true if processing is possible in the current sleep mode.
Definition: LowPowerESP8266.h:33
void setInstant(bool instant)
if instant == true -> instantly deep sleep w/o delay
Definition: LowPowerESP8266.h:115
void clear()
reset the processing
Definition: LowPowerESP8266.h:121
bool setSleepTime(uint32_t time, time_unit_t time_unit_type) override
Defines the sleep time.
Definition: LowPowerESP8266.h:88
bool sleep(void) override
sets processor into sleep mode
Definition: LowPowerESP8266.h:53
bool addWakeupPin(int pin, pin_change_t change_type) override
Defines the wakup pin.
Definition: LowPowerESP8266.h:95