LowPower
LowPowerSAMD.h
1 #pragma once
2 
3 #include "LowPowerCommon.h"
4 #include "drivers/samd/samd.h"
5 
6 namespace low_power {
7 
16  public:
17  bool setSleepMode(sleep_mode_enum_t sleep_mode) {
18  bool result = false;
19  switch (sleep_mode) {
20  case sleep_mode_enum_t::modemSleep:
21  result = true;
22  break;
23  case sleep_mode_enum_t::noSleep:
24  result = true;
25  break;
26  case sleep_mode_enum_t::lightSleep:
27  result = false;
28  break;
29  case sleep_mode_enum_t::deepSleep:
30  result = false;
31  break;
32  }
33  return result;
34  }
35 
37  bool sleep(void) override {
38  bool rc = false;
39  switch (sleep_mode) {
40  case sleep_mode_enum_t::lightSleep:
41  samd.sleep(sleep_time_us / 1000);
42  rc = true;
43  break;
44 
45  case sleep_mode_enum_t::deepSleep:
46  samd.deepSleep(sleep_time_us / 1000);
47  rc = true;
48  break;
49 
50  case sleep_mode_enum_t::modemSleep:
51  case sleep_mode_enum_t::noSleep:
52  delay(sleep_time_us / 1000);
53  rc = true;
54  break;
55  }
56 
57  return rc;
58  }
59 
60  bool setSleepTime(uint32_t time, time_unit_t time_unit_type) override {
61  sleep_time_us = (toUs(time, time_unit_type));
62  return true;
63  }
64 
65  bool addWakeupPin(int pin, pin_change_t change_type) override {
66  samd.attachInterruptWakeup(pin, callback, toMode(change_type));
67  return true;
68  }
69 
70  void clear() {
72  samd.detachAdcInterrupt();
73  sleep_time_us = 0;
74  }
75 
76  bool isProcessingOnSleep(sleep_mode_enum_t sleep_mode) {
77  bool result = false;
78  switch (sleep_mode) {
79  case sleep_mode_enum_t::modemSleep:
80  result = true;
81  break;
82  case sleep_mode_enum_t::noSleep:
83  result = true;
84  break;
85  case sleep_mode_enum_t::lightSleep:
86  result = false;
87  break;
88  case sleep_mode_enum_t::deepSleep:
89  result = false;
90  break;
91  }
92  return result;
93  }
94  protected:
95  uint32_t sleep_time_us = 0;
96  ArduinoLowPowerClass samd;
97 
98  static void callback() {}
99 
100  PinStatus toMode(pin_change_t ct) {
101  switch (ct) {
102  case pin_change_t::on_high:
103  return RISING;
104  case pin_change_t::on_low:
105  return FALLING;
106  default:
107  return CHANGE;
108  }
109  }
110 };
111 
112 static ArduinoLowPowerSAMD LowPower;
113 
114 } // 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
Low Power Management for SAMD. Depends on RTCZero!
Definition: LowPowerSAMD.h:15
bool setSleepMode(sleep_mode_enum_t sleep_mode)
Defines the sleep mode.
Definition: LowPowerSAMD.h:17
bool isProcessingOnSleep(sleep_mode_enum_t sleep_mode)
Returns true if processing is possible in the current sleep mode.
Definition: LowPowerSAMD.h:76
bool sleep(void) override
sets processor into sleep mode
Definition: LowPowerSAMD.h:37
bool setSleepTime(uint32_t time, time_unit_t time_unit_type) override
Defines the sleep time.
Definition: LowPowerSAMD.h:60
void clear()
reset the processing
Definition: LowPowerSAMD.h:70
bool addWakeupPin(int pin, pin_change_t change_type) override
Defines the wakup pin.
Definition: LowPowerSAMD.h:65