2020-02-22 20:01:59 +00:00
|
|
|
|
|
|
|
#include "sleep.h"
|
|
|
|
#include "MeshService.h"
|
|
|
|
#include "NodeDB.h"
|
|
|
|
#include "configuration.h"
|
|
|
|
#include "screen.h"
|
|
|
|
#include "PowerFSM.h"
|
2020-02-22 21:14:10 +00:00
|
|
|
#include "GPS.h"
|
2020-02-22 20:01:59 +00:00
|
|
|
|
|
|
|
static void sdsEnter()
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
|
|
|
|
// Don't deepsleep if we have USB power or if the user as pressed a button recently
|
|
|
|
// !isUSBPowered <- doesn't work yet because the axp192 isn't letting the battery fully charge when we are awake - FIXME
|
|
|
|
if (millis() - lastPressMs > radioConfig.preferences.mesh_sds_timeout_secs)
|
|
|
|
{
|
|
|
|
doDeepSleep(radioConfig.preferences.sds_secs);
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
doDeepSleep(radioConfig.preferences.sds_secs * 1000LL);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void lsEnter()
|
|
|
|
{
|
2020-02-22 21:14:10 +00:00
|
|
|
/*
|
2020-02-22 20:01:59 +00:00
|
|
|
// while we have bluetooth on, we can't do light sleep, but once off stay in light_sleep all the time
|
|
|
|
// we will wake from light sleep on button press or interrupt from the RF95 radio
|
|
|
|
if (!bluetoothOn && !is_screen_on() && service.radio.rf95.canSleep() && gps.canSleep())
|
|
|
|
doLightSleep(radioConfig.preferences.ls_secs);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
delay(msecstosleep);
|
|
|
|
} */
|
|
|
|
|
2020-02-22 21:14:10 +00:00
|
|
|
gps.prepareSleep(); // abandon in-process parsing
|
|
|
|
setGPSPower(false); // kill GPS power
|
2020-02-22 20:01:59 +00:00
|
|
|
doLightSleep(radioConfig.preferences.ls_secs * 1000LL);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void lsIdle()
|
|
|
|
{
|
|
|
|
// FIXME - blink led when we occasionally wake from timer, then go back to light sleep
|
|
|
|
}
|
|
|
|
|
|
|
|
static void lsExit()
|
|
|
|
{
|
2020-02-22 21:14:10 +00:00
|
|
|
setGPSPower(true); // restore GPS power
|
|
|
|
gps.startLock();
|
2020-02-22 20:01:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void nbEnter()
|
|
|
|
{
|
|
|
|
setBluetoothEnable(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void darkEnter()
|
|
|
|
{
|
2020-02-22 21:14:10 +00:00
|
|
|
screen.setOn(false);
|
2020-02-22 20:01:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void onEnter()
|
|
|
|
{
|
|
|
|
screen.setOn(true);
|
|
|
|
setBluetoothEnable(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void onExit()
|
|
|
|
{
|
|
|
|
screen.setOn(false);
|
|
|
|
}
|
|
|
|
static void wakeForPing()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static void screenPress()
|
|
|
|
{
|
|
|
|
screen.onPress();
|
|
|
|
}
|
|
|
|
|
2020-02-22 21:14:10 +00:00
|
|
|
State stateSDS(sdsEnter, NULL, NULL, "SDS");
|
|
|
|
State stateLS(lsEnter, lsIdle, lsExit, "LS");
|
|
|
|
State stateNB(nbEnter, NULL, NULL, "NB");
|
|
|
|
State stateDARK(darkEnter, NULL, NULL, "DARK");
|
|
|
|
State stateON(onEnter, NULL, onExit, "ON");
|
2020-02-22 20:01:59 +00:00
|
|
|
Fsm powerFSM(&stateDARK);
|
|
|
|
|
|
|
|
void PowerFSM_setup()
|
|
|
|
{
|
2020-02-22 21:14:10 +00:00
|
|
|
powerFSM.add_transition(&stateDARK, &stateON, EVENT_BOOT, NULL, "Boot");
|
|
|
|
powerFSM.add_transition(&stateLS, &stateDARK, EVENT_WAKE_TIMER, wakeForPing, "Wake timer");
|
|
|
|
powerFSM.add_transition(&stateLS, &stateNB, EVENT_RECEIVED_PACKET, NULL, "Received packet");
|
2020-02-22 21:50:08 +00:00
|
|
|
powerFSM.add_transition(&stateNB, &stateNB, EVENT_RECEIVED_PACKET, NULL, "Received packet, resetting win wake");
|
2020-02-22 21:14:10 +00:00
|
|
|
|
|
|
|
powerFSM.add_transition(&stateLS, &stateON, EVENT_PRESS, NULL, "Press");
|
|
|
|
powerFSM.add_transition(&stateNB, &stateON, EVENT_PRESS, NULL, "Press");
|
|
|
|
powerFSM.add_transition(&stateDARK, &stateON, EVENT_PRESS, NULL, "Press");
|
|
|
|
powerFSM.add_transition(&stateON, &stateON, EVENT_PRESS, screenPress, "Press"); // reenter On to restart our timers
|
2020-02-22 20:01:59 +00:00
|
|
|
|
2020-02-22 21:14:10 +00:00
|
|
|
powerFSM.add_transition(&stateLS, &stateON, EVENT_RECEIVED_TEXT_MSG, NULL, "Received text");
|
|
|
|
powerFSM.add_transition(&stateNB, &stateON, EVENT_RECEIVED_TEXT_MSG, NULL, "Received text");
|
|
|
|
powerFSM.add_transition(&stateDARK, &stateON, EVENT_RECEIVED_TEXT_MSG, NULL, "Received text");
|
2020-02-22 20:01:59 +00:00
|
|
|
|
2020-02-22 21:14:10 +00:00
|
|
|
powerFSM.add_transition(&stateNB, &stateDARK, EVENT_PACKET_FOR_PHONE, NULL, "Packet for phone");
|
2020-02-22 20:01:59 +00:00
|
|
|
|
2020-02-22 21:50:08 +00:00
|
|
|
powerFSM.add_timed_transition(&stateON, &stateDARK, radioConfig.preferences.screen_on_secs * 1000, NULL, "Screen-on timeout");
|
2020-02-22 20:01:59 +00:00
|
|
|
|
2020-02-22 21:50:08 +00:00
|
|
|
powerFSM.add_timed_transition(&stateDARK, &stateNB, radioConfig.preferences.phone_timeout_secs * 1000, NULL, "Phone timeout");
|
|
|
|
|
|
|
|
powerFSM.add_timed_transition(&stateNB, &stateLS, radioConfig.preferences.min_wake_secs * 1000, NULL, "Min wake timeout");
|
|
|
|
|
|
|
|
powerFSM.add_timed_transition(&stateDARK, &stateLS, radioConfig.preferences.wait_bluetooth_secs * 1000, NULL, "Bluetooth timeout");
|
2020-02-22 20:01:59 +00:00
|
|
|
|
2020-02-22 21:14:10 +00:00
|
|
|
powerFSM.run_machine(); // run one interation of the state machine, so we run our on enter tasks for the initial DARK state
|
2020-02-22 20:01:59 +00:00
|
|
|
}
|