diff --git a/src/PowerFSMThread.h b/src/PowerFSMThread.h new file mode 100644 index 000000000..00f31e9c3 --- /dev/null +++ b/src/PowerFSMThread.h @@ -0,0 +1,38 @@ +#include "configuration.h" +#include "concurrency/OSThread.h" +#include "main.h" +#include "PowerFSM.h" +#include "power.h" +#include "NodeDB.h" + +namespace concurrency +{ +/// Wrapper to convert our powerFSM stuff into a 'thread' +class PowerFSMThread : public OSThread +{ + public: + // callback returns the period for the next callback invocation (or 0 if we should no longer be called) + PowerFSMThread() : OSThread("PowerFSM") {} + + protected: + int32_t runOnce() override + { + powerFSM.run_machine(); + + /// If we are in power state we force the CPU to wake every 10ms to check for serial characters (we don't yet wake + /// cpu for serial rx - FIXME) + auto state = powerFSM.getState(); + canSleep = (state != &statePOWER) && (state != &stateSERIAL); + + if (powerStatus->getHasUSB()) { + timeLastPowered = millis(); + } else if (radioConfig.preferences.on_battery_shutdown_after_secs > 0 && + millis() > timeLastPowered + (1000 * radioConfig.preferences.on_battery_shutdown_after_secs)) { //shutdown after 30 minutes unpowered + powerFSM.trigger(EVENT_SHUTDOWN); + } + + return 10; + } +}; + +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 400ddff63..fcbe8d912 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -43,8 +43,9 @@ #include "SX1262Interface.h" #include "SX1268Interface.h" #include "LLCC68Interface.h" -#include "ButtonThread.h" +#include "ButtonThread.h" +#include "PowerFSMThread.h" using namespace concurrency; @@ -92,34 +93,6 @@ static int32_t ledBlinker() uint32_t timeLastPowered = 0; -/// Wrapper to convert our powerFSM stuff into a 'thread' -class PowerFSMThread : public OSThread -{ - public: - // callback returns the period for the next callback invocation (or 0 if we should no longer be called) - PowerFSMThread() : OSThread("PowerFSM") {} - - protected: - int32_t runOnce() override - { - powerFSM.run_machine(); - - /// If we are in power state we force the CPU to wake every 10ms to check for serial characters (we don't yet wake - /// cpu for serial rx - FIXME) - auto state = powerFSM.getState(); - canSleep = (state != &statePOWER) && (state != &stateSERIAL); - - if (powerStatus->getHasUSB()) { - timeLastPowered = millis(); - } else if (radioConfig.preferences.on_battery_shutdown_after_secs > 0 && - millis() > timeLastPowered + (1000 * radioConfig.preferences.on_battery_shutdown_after_secs)) { //shutdown after 30 minutes unpowered - powerFSM.trigger(EVENT_SHUTDOWN); - } - - return 10; - } -}; - bool ButtonThread::shutdown_on_long_stop = false; static Periodic *ledPeriodic; diff --git a/src/main.h b/src/main.h index c03652368..b87b1886d 100644 --- a/src/main.h +++ b/src/main.h @@ -21,6 +21,8 @@ extern graphics::Screen *screen; // Return a human readable string of the form "Meshtastic_ab13" const char *getDeviceName(); +extern uint32_t timeLastPowered; + extern uint32_t rebootAtMsec; extern uint32_t shutdownAtMsec;