/
Bricks.SleepSkill.cpp
80 lines (68 loc) · 1.82 KB
/
Bricks.SleepSkill.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <Bricks.SleepSkill.h>
namespace Bricks {
#ifdef ESP32
RTC_DATA_ATTR uint32_t rtcSleepTime = 0;
#endif
SleepSkill::SleepSkill(const char *name) : Skill("sleep") {
this->name = name;
sendAwakeMessage();
if(Utils::wokeUpFromDeepSleep()) {
Log.trace("SLEE: Woke up from deep sleep");
readSleepTime();
}
}
void SleepSkill::loop() {
if(awakeTimeout()) {
deepSleep();
}
}
void SleepSkill::callback(BRICKS_CALLBACK_SIGNATURE) {
this->sleepTime = atoi(message.value);
writeSleepTime();
if(sleepTime > 0) {
sprintf(response, "Starting %d second sleep cycles", sleepTime);
}
else {
strcpy(response, "Stopping sleep cycles");
}
}
void SleepSkill::sendAwakeMessage() {
char reason[50];
char message[100];
Bricks::Utils::getWakeupReason(reason);
sprintf(message, "%s - %s", name, reason);
gOutbox.send("awake", message);
}
void SleepSkill::deepSleep() {
Log.notice("SLEE: Going to sleep for %d second(s)" CR, sleepTime);
#ifdef ESP8266
ESP.deepSleep(sleepTime * MICROSECONDS);
#elif ESP32
esp_bluedroid_disable();
esp_bluedroid_deinit();
esp_bt_controller_disable();
esp_bt_controller_deinit();
esp_bt_mem_release(ESP_BT_MODE_BTDM);
adc_power_off();
esp_wifi_stop();
esp_deep_sleep(sleepTime * MICROSECONDS);
#endif
}
bool SleepSkill::awakeTimeout() {
return sleepTime > 0 && millis() >= TIMEOUT;
}
void SleepSkill::readSleepTime() {
#ifdef ESP8266
system_rtc_mem_read(RTC_SLEEP_TIME_REGISTER, &sleepTime, sizeof(sleepTime));
#elif ESP32
sleepTime = Bricks::rtcSleepTime;
#endif
}
void SleepSkill::writeSleepTime() {
#ifdef ESP8266
system_rtc_mem_write(RTC_SLEEP_TIME_REGISTER, &sleepTime, sizeof(sleepTime));
#elif ESP32
Bricks::rtcSleepTime = sleepTime;
#endif
}
}