Browse Source
Merge pull request #2663 from oltaco/no-autoshutdown-when-powered
Disable auto-shutdown when externally powered, add auto-shutdown warning for OLED displays
pull/1662/merge
ripplebiz
18 hours ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with
44 additions and
35 deletions
-
examples/companion_radio/ui-new/UITask.cpp
-
examples/companion_radio/ui-tiny/UITask.cpp
-
src/helpers/NRF52Board.cpp
-
src/helpers/NRF52Board.h
-
src/helpers/ui/DisplayDriver.h
-
src/helpers/ui/E213Display.h
-
src/helpers/ui/E290Display.h
-
src/helpers/ui/GxEPDDisplay.h
|
|
|
@ -832,22 +832,18 @@ void UITask::loop() { |
|
|
|
if (millis() > next_batt_chck) { |
|
|
|
uint16_t milliVolts = getBattMilliVolts(); |
|
|
|
if (milliVolts > 0 && milliVolts < AUTO_SHUTDOWN_MILLIVOLTS) { |
|
|
|
|
|
|
|
// show low battery shutdown alert
|
|
|
|
// we should only do this for eink displays, which will persist after power loss
|
|
|
|
#if defined(THINKNODE_M1) || defined(LILYGO_TECHO) |
|
|
|
if (_display != NULL) { |
|
|
|
_display->startFrame(); |
|
|
|
_display->setTextSize(2); |
|
|
|
_display->setColor(DisplayDriver::RED); |
|
|
|
_display->drawTextCentered(_display->width() / 2, 20, "Low Battery."); |
|
|
|
_display->drawTextCentered(_display->width() / 2, 40, "Shutting Down!"); |
|
|
|
_display->endFrame(); |
|
|
|
if(!board.isExternalPowered()) { |
|
|
|
if (_display != NULL) { |
|
|
|
_display->startFrame(); |
|
|
|
_display->setTextSize(2); |
|
|
|
_display->setColor(DisplayDriver::RED); |
|
|
|
_display->drawTextCentered(_display->width() / 2, 20, "Low Battery."); |
|
|
|
_display->drawTextCentered(_display->width() / 2, 40, "Shutting Down!"); |
|
|
|
_display->endFrame(); |
|
|
|
if (_display->isEink() == false) { delay(3000); } |
|
|
|
} |
|
|
|
shutdown(); |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
shutdown(); |
|
|
|
|
|
|
|
} |
|
|
|
next_batt_chck = millis() + 8000; |
|
|
|
} |
|
|
|
|
|
|
|
@ -727,14 +727,23 @@ void UITask::loop() { |
|
|
|
if (millis() > next_batt_chck) { |
|
|
|
_cached_batt_mv = getBattMilliVolts(); |
|
|
|
if (_cached_batt_mv > 0 && _cached_batt_mv < AUTO_SHUTDOWN_MILLIVOLTS) { |
|
|
|
|
|
|
|
shutdown(); |
|
|
|
|
|
|
|
if(!board.isExternalPowered()) { |
|
|
|
if (_display != NULL) { |
|
|
|
_display->startFrame(); |
|
|
|
_display->setTextSize(2); |
|
|
|
_display->drawTextCentered(_display->width() / 2, 6, "Low battery!"); |
|
|
|
_display->setTextSize(1); |
|
|
|
_display->drawTextCentered(_display->width() / 2, 18, "Shutting down!"); |
|
|
|
_display->endFrame(); |
|
|
|
if (_display->isEink() == false) { delay(3000); } |
|
|
|
} |
|
|
|
shutdown(); |
|
|
|
} |
|
|
|
} |
|
|
|
next_batt_chck = millis() + 8000; |
|
|
|
} |
|
|
|
#else |
|
|
|
if (_display != NULL && _display->isOn() && millis >= next_batt_chck) { |
|
|
|
if (_display != NULL && _display->isOn() && millis() >= next_batt_chck) { |
|
|
|
_cached_batt_mv = getBattMilliVolts(); |
|
|
|
next_batt_chck = millis() + 8000; |
|
|
|
} |
|
|
|
|
|
|
|
@ -66,20 +66,6 @@ void NRF52Board::initPowerMgr() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
bool NRF52Board::isExternalPowered() { |
|
|
|
// Check if SoftDevice is enabled before using its API
|
|
|
|
uint8_t sd_enabled = 0; |
|
|
|
sd_softdevice_is_enabled(&sd_enabled); |
|
|
|
|
|
|
|
if (sd_enabled) { |
|
|
|
uint32_t usb_status; |
|
|
|
sd_power_usbregstatus_get(&usb_status); |
|
|
|
return (usb_status & POWER_USBREGSTATUS_VBUSDETECT_Msk) != 0; |
|
|
|
} else { |
|
|
|
return (NRF_POWER->USBREGSTATUS & POWER_USBREGSTATUS_VBUSDETECT_Msk) != 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
const char* NRF52Board::getResetReasonString(uint32_t reason) { |
|
|
|
if (reason & POWER_RESETREAS_RESETPIN_Msk) return "Reset Pin"; |
|
|
|
if (reason & POWER_RESETREAS_DOG_Msk) return "Watchdog"; |
|
|
|
@ -251,6 +237,20 @@ void NRF52BoardDCDC::begin() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
bool NRF52Board::isExternalPowered() { |
|
|
|
// Check if SoftDevice is enabled before using its API
|
|
|
|
uint8_t sd_enabled = 0; |
|
|
|
sd_softdevice_is_enabled(&sd_enabled); |
|
|
|
|
|
|
|
if (sd_enabled) { |
|
|
|
uint32_t usb_status; |
|
|
|
sd_power_usbregstatus_get(&usb_status); |
|
|
|
return (usb_status & POWER_USBREGSTATUS_VBUSDETECT_Msk) != 0; |
|
|
|
} else { |
|
|
|
return (NRF_POWER->USBREGSTATUS & POWER_USBREGSTATUS_VBUSDETECT_Msk) != 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void NRF52Board::sleep(uint32_t secs) { |
|
|
|
// Clear FPU interrupt flags to avoid insomnia
|
|
|
|
// see errata 87 for details https://docs.nordicsemi.com/bundle/errata_nRF52840_Rev3/page/ERR/nRF52840/Rev3/latest/anomaly_840_87.html
|
|
|
|
|
|
|
|
@ -53,9 +53,9 @@ public: |
|
|
|
virtual bool getBootloaderVersion(char* version, size_t max_len) override; |
|
|
|
virtual bool startOTAUpdate(const char *id, char reply[]) override; |
|
|
|
virtual void sleep(uint32_t secs) override; |
|
|
|
bool isExternalPowered() override; |
|
|
|
|
|
|
|
#ifdef NRF52_POWER_MANAGEMENT |
|
|
|
bool isExternalPowered() override; |
|
|
|
uint16_t getBootVoltage() override { return boot_voltage_mv; } |
|
|
|
virtual uint32_t getResetReason() const override { return reset_reason; } |
|
|
|
uint8_t getShutdownReason() const override { return shutdown_reason; } |
|
|
|
|
|
|
|
@ -14,6 +14,7 @@ public: |
|
|
|
int height() const { return _h; } |
|
|
|
|
|
|
|
virtual bool isOn() = 0; |
|
|
|
virtual bool isEink() { return false; } // default to non-eink, override in eink drivers
|
|
|
|
virtual void turnOn() = 0; |
|
|
|
virtual void turnOff() = 0; |
|
|
|
virtual void clear() = 0; |
|
|
|
|
|
|
|
@ -26,6 +26,7 @@ public: |
|
|
|
} |
|
|
|
bool begin(); |
|
|
|
bool isOn() override { return _isOn; } |
|
|
|
bool isEink() override { return true; } |
|
|
|
void turnOn() override; |
|
|
|
void turnOff() override; |
|
|
|
void clear() override; |
|
|
|
|
|
|
|
@ -22,6 +22,7 @@ public: |
|
|
|
|
|
|
|
bool begin(); |
|
|
|
bool isOn() override { return _isOn; } |
|
|
|
bool isEink() override { return true; } |
|
|
|
void turnOn() override; |
|
|
|
void turnOff() override; |
|
|
|
void clear() override; |
|
|
|
|
|
|
|
@ -46,7 +46,8 @@ public: |
|
|
|
|
|
|
|
bool begin(); |
|
|
|
|
|
|
|
bool isOn() override {return _isOn;}; |
|
|
|
bool isOn() override { return _isOn; } |
|
|
|
bool isEink() override { return true; } |
|
|
|
void turnOn() override; |
|
|
|
void turnOff() override; |
|
|
|
void clear() override; |
|
|
|
|