From 3bc3a95ab20738a609674b7aa3ff31922b295d53 Mon Sep 17 00:00:00 2001 From: ElGuzo <81352961+ElGuzo@users.noreply.github.com> Date: Mon, 5 Apr 2021 17:29:34 +0200 Subject: [PATCH] Fix deepsleep Fix deepsleep issue --- examples/RTC_WakeUp/RTC_WakeUp.ino | 21 ++++++++++----- src/M5CoreInk.cpp | 20 +++++++------- src/M5CoreInk.h | 2 +- src/utility/BM8563.cpp | 42 +++++++----------------------- src/utility/BM8563.h | 2 ++ src/utility/Ink_eSPI.cpp | 2 +- src/utility/Ink_eSPI.h | 2 +- 7 files changed, 38 insertions(+), 53 deletions(-) diff --git a/examples/RTC_WakeUp/RTC_WakeUp.ino b/examples/RTC_WakeUp/RTC_WakeUp.ino index d5ab7f4..03b4c16 100644 --- a/examples/RTC_WakeUp/RTC_WakeUp.ino +++ b/examples/RTC_WakeUp/RTC_WakeUp.ino @@ -18,20 +18,27 @@ void setup() { Serial.printf("Ink Sprite creat faild"); } - InkPageSprite.drawString(10,50,"Press PWR Btn for sleep"); - InkPageSprite.drawString(15,80,"after 5 sec wakeup."); + InkPageSprite.drawString(10,50,"Press EXT Btn for sleep"); + InkPageSprite.drawString(15,80,"after 30 sec wakeup."); + InkPageSprite.drawString(10,110,"Press PWR Btn for"); + InkPageSprite.drawString(15,140,"shutdown."); InkPageSprite.pushSprite(); } void loop() { - //Press PWR Btn for sleep , after 5 sec wakeup. + //Press EXT Btn for sleep , after 30 sec wakeup. + if( M5.BtnEXT.wasPressed()) + { + Serial.printf("Btn %d was pressed \r\n",BUTTON_EXT_PIN); + M5.M5Ink.deepSleepEink(); // Eink wakeup through setup routine + M5.deepSleepESP(30); + } + //Press PWR Btn for shutdown if( M5.BtnPWR.wasPressed()) { Serial.printf("Btn %d was pressed \r\n",BUTTON_PWR_PIN); - M5.shutdown(5); - //M5.shutdown(RTC_TimeTypeDef(10,2,0)); + M5.shutdown(); } - //M5.rtc.SetAlarmIRQ(RTC_TimeTypeDef(10,2,0)); M5.update(); -} \ No newline at end of file +} diff --git a/src/M5CoreInk.cpp b/src/M5CoreInk.cpp index 118728c..56c3478 100644 --- a/src/M5CoreInk.cpp +++ b/src/M5CoreInk.cpp @@ -1,4 +1,5 @@ #include "M5CoreInk.h" +#include "driver/gpio.h" M5CoreInk::M5CoreInk(/* args */) { @@ -12,11 +13,12 @@ int M5CoreInk::begin(bool InkEnable, bool wireEnable, bool SpeakerEnable) { pinMode(POWER_HOLD_PIN, OUTPUT); digitalWrite(POWER_HOLD_PIN, HIGH); // Hold power - + gpio_hold_en((gpio_num_t)POWER_HOLD_PIN); // Hold power during deepSleep + pinMode(LED_EXT_PIN, OUTPUT); Serial.begin(115200); - Serial.printf("initializing.....OK\n"); + Serial.printf("initializing github library OK\n"); if (wireEnable) { @@ -57,34 +59,32 @@ void M5CoreInk::update() void M5CoreInk::shutdown() { - M5Ink.deepSleep(); + // Disable power to shutdown device + gpio_hold_dis((gpio_num_t)POWER_HOLD_PIN); digitalWrite(POWER_HOLD_PIN, LOW); } -int M5CoreInk::shutdown(int seconds) +int M5CoreInk::deepSleepESP(int seconds) { - M5Ink.deepSleep(); rtc.clearIRQ(); rtc.SetAlarmIRQ(seconds); delay(10); - digitalWrite(POWER_HOLD_PIN, LOW); + esp_deep_sleep_start(); return 0; } int M5CoreInk::shutdown(const RTC_TimeTypeDef &RTC_TimeStruct) { - M5Ink.deepSleep(); rtc.clearIRQ(); rtc.SetAlarmIRQ(RTC_TimeStruct); delay(10); - digitalWrite(POWER_HOLD_PIN, LOW); + esp_deep_sleep_start(); return 0; } int M5CoreInk::shutdown(const RTC_DateTypeDef &RTC_DateStruct, const RTC_TimeTypeDef &RTC_TimeStruct) { - M5Ink.deepSleep(); rtc.clearIRQ(); rtc.SetAlarmIRQ(RTC_DateStruct,RTC_TimeStruct); delay(10); - digitalWrite(POWER_HOLD_PIN, LOW); + esp_deep_sleep_start(); return 0; } diff --git a/src/M5CoreInk.h b/src/M5CoreInk.h index a5237e0..413cd24 100644 --- a/src/M5CoreInk.h +++ b/src/M5CoreInk.h @@ -25,7 +25,7 @@ class M5CoreInk void update(); void shutdown(); - int shutdown( int seconds ); + int deepSleepESP( int seconds ); int shutdown( const RTC_TimeTypeDef &RTC_TimeStruct); int shutdown( const RTC_DateTypeDef &RTC_DateStruct, const RTC_TimeTypeDef &RTC_TimeStruct); diff --git a/src/utility/BM8563.cpp b/src/utility/BM8563.cpp index b4c5d44..69aa4bf 100644 --- a/src/utility/BM8563.cpp +++ b/src/utility/BM8563.cpp @@ -217,40 +217,16 @@ void RTC::SetDate(RTC_DateTypeDef *RTC_DateStruct) int RTC::SetAlarmIRQ(int afterSeconds) { - uint8_t reg_value = 0; - reg_value = ReadReg(0x01); - - if (afterSeconds < 0) - { - reg_value &= ~(1 << 0); - WriteReg(0x01, reg_value); - reg_value = 0x03; - WriteReg(0x0E, reg_value); - return -1; - } - - uint8_t type_value = 2; - uint8_t div = 1; - if (afterSeconds > 255) - { - div = 60; - type_value = 0x83; - } - else - { - type_value = 0x82; - } - - afterSeconds = (afterSeconds / div) & 0xFF; - WriteReg(0x0F, afterSeconds); - WriteReg(0x0E, type_value); - - reg_value |= (1 << 0); - reg_value &= ~(1 << 7); - WriteReg(0x01, reg_value); - return afterSeconds * div; + if (afterSeconds > 0) + { + esp_sleep_enable_timer_wakeup(afterSeconds * uS_TO_S_FACTOR); + return 1; + } + else + { + return 0; + } } - int RTC::SetAlarmIRQ(const RTC_TimeTypeDef &RTC_TimeStruct) { uint8_t irq_enable = false; diff --git a/src/utility/BM8563.h b/src/utility/BM8563.h index e96da3d..a947d04 100644 --- a/src/utility/BM8563.h +++ b/src/utility/BM8563.h @@ -2,6 +2,8 @@ #define __BM8563_H__ #include +#include "esp_sleep.h" +#define uS_TO_S_FACTOR 1000000ULL /* Conversion factor for micro seconds to seconds */ typedef struct RTC_Time { diff --git a/src/utility/Ink_eSPI.cpp b/src/utility/Ink_eSPI.cpp index 246ca8e..05c8d51 100644 --- a/src/utility/Ink_eSPI.cpp +++ b/src/utility/Ink_eSPI.cpp @@ -331,7 +331,7 @@ uint8_t Ink_eSPI::getPix(uint16_t posX, uint16_t posY) return 0; } -void Ink_eSPI::deepSleep() +void Ink_eSPI::deepSleepEink() { writeCMD(0X50); writeData(0xf7); diff --git a/src/utility/Ink_eSPI.h b/src/utility/Ink_eSPI.h index 883b993..a605452 100644 --- a/src/utility/Ink_eSPI.h +++ b/src/utility/Ink_eSPI.h @@ -87,7 +87,7 @@ class Ink_eSPI void setDrawAddr(uint16_t posx, uint16_t posy, uint16_t width, uint16_t height); uint8_t getPix(uint16_t posX, uint16_t posY); - void deepSleep(); + void deepSleepEink(); void powerHVON(); void powerHVOFF();