Kaynağa Gözat

Merge pull request #2663 from oltaco/no-autoshutdown-when-powered

Disable auto-shutdown when externally powered, add auto-shutdown warning for OLED displays
ripplebiz 2 ay önce
ebeveyn
işleme
6be398d748

+ 11 - 15
examples/companion_radio/ui-new/UITask.cpp

@@ -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;
   }

+ 13 - 4
examples/companion_radio/ui-tiny/UITask.cpp

@@ -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;
   }

+ 14 - 14
src/helpers/NRF52Board.cpp

@@ -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

+ 1 - 1
src/helpers/NRF52Board.h

@@ -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; }

+ 1 - 0
src/helpers/ui/DisplayDriver.h

@@ -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;

+ 1 - 0
src/helpers/ui/E213Display.h

@@ -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;

+ 1 - 0
src/helpers/ui/E290Display.h

@@ -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;

+ 2 - 1
src/helpers/ui/GxEPDDisplay.h

@@ -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;