implemented soft power button on-off
This commit is contained in:
204
src/power.cpp
204
src/power.cpp
@@ -1,28 +1,24 @@
|
||||
#include "power.h"
|
||||
#include "board.h"
|
||||
#include "rtc.h"
|
||||
#include "low_Power.h"
|
||||
#include "led.h"
|
||||
#include "buttons.h"
|
||||
|
||||
#ifdef BTN_PWR
|
||||
#include "JC_Button.h"
|
||||
Button buttonPower(BTN_PWR);
|
||||
#endif
|
||||
|
||||
bool doShutdown = false;
|
||||
Button buttonPower(BTN_PWR, 250UL, 1U, 0);
|
||||
#endif
|
||||
|
||||
#ifdef VBATTPIN
|
||||
#include "Battery.h"
|
||||
Battery battery(VBATTMIN, VBATTMAX, VBATTPIN);
|
||||
#endif
|
||||
|
||||
uint64_t delay_timer = 0;
|
||||
uint64_t powerOnOffDelay = 0;
|
||||
powerStates powerstate = off;
|
||||
|
||||
void initBattery(void)
|
||||
{
|
||||
#ifdef VBATTPIN
|
||||
#ifdef MEAS_EN
|
||||
battery.begin(VBATTREF, (R12 + R13) / R13); //R1 = 220K, R2 = 100K, factor = (R1+R2)/R2
|
||||
battery.onDemand(MEAS_EN, LOW);
|
||||
battery.onDemand(MEAS_EN, HIGH);
|
||||
#else
|
||||
battery.begin(VBATTREF, (R12 + R13) / R13); //R1 = 220K, R2 = 100K, factor = (R1+R2)/R2
|
||||
#endif
|
||||
@@ -50,76 +46,182 @@ void batterydisplay(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
void batteryCheck(void)
|
||||
void powerOn(void)
|
||||
{
|
||||
#ifdef VBATTPIN
|
||||
if (battery.voltage() < VBATTMIN)
|
||||
{
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
turnOnLed(1);
|
||||
delay(300);
|
||||
turnOffLed(1);
|
||||
delay(300);
|
||||
}
|
||||
delay(5000);
|
||||
shutdown();
|
||||
}
|
||||
#endif
|
||||
digitalWrite(PW_HOLD, HIGH);
|
||||
}
|
||||
|
||||
void initShutdown(void)
|
||||
void powerOff(void)
|
||||
{
|
||||
digitalWrite(PW_HOLD, LOW);
|
||||
}
|
||||
|
||||
bool handleBattery(void)
|
||||
{
|
||||
#ifdef VBATTPIN
|
||||
uint64_t currentmillis = millis();
|
||||
if (currentmillis - delay_timer > BATTERYMEASUREDELAY)
|
||||
{
|
||||
// uint16_t vbatt = battery.voltage();
|
||||
// if (vbatt < VBATTMIN)
|
||||
// {
|
||||
|
||||
delay_timer = currentmillis;
|
||||
// delay(5000);
|
||||
// shutdown();
|
||||
}
|
||||
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
void initPowerOn(void)
|
||||
{
|
||||
#ifdef PW_HOLD
|
||||
pinMode(PW_HOLD, OUTPUT);
|
||||
powerstate = poweringOn;
|
||||
buttonPower.begin();
|
||||
digitalWrite(PW_HOLD, LOW);
|
||||
delay(2000);
|
||||
digitalWrite(PW_HOLD, HIGH);
|
||||
doShutdown = false;
|
||||
#endif
|
||||
}
|
||||
|
||||
//low power
|
||||
void initPower(void)
|
||||
{
|
||||
LowPower_init();
|
||||
initBattery();
|
||||
initShutdown();
|
||||
initPowerOn();
|
||||
}
|
||||
|
||||
void shutdown(void)
|
||||
{
|
||||
LowPower_shutdown();
|
||||
delay(2000);
|
||||
powerOff();
|
||||
//LowPower_shutdown();
|
||||
delay(10000);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void HandlePowerOn(void)
|
||||
powerStates getPowerState(void)
|
||||
{
|
||||
if (buttonPower.read())
|
||||
return powerstate;
|
||||
}
|
||||
|
||||
//handle power asynchronious
|
||||
void handlePowerState(void)
|
||||
{
|
||||
bool buttonread = buttonPower.read(); //update powerbutton
|
||||
switch (powerstate)
|
||||
{
|
||||
if (buttonPower.pressedFor(2000))
|
||||
case off:
|
||||
{
|
||||
if (buttonread)
|
||||
{
|
||||
doShutdown = true;
|
||||
delay(500);
|
||||
powerstate = poweringOn;
|
||||
}
|
||||
powerOff();
|
||||
}
|
||||
break;
|
||||
case poweringOn:
|
||||
{
|
||||
if (buttonPower.pressedFor(POWERBUTTONDELAY))
|
||||
{
|
||||
turnOnLed(1);
|
||||
powerstate = poweringOn2;
|
||||
}
|
||||
else if (buttonPower.pressedFor(1000))
|
||||
{
|
||||
turnOnLed(2);
|
||||
}
|
||||
else if (buttonPower.pressedFor(500))
|
||||
{
|
||||
turnOnLed(3);
|
||||
}
|
||||
else
|
||||
{
|
||||
doShutdown = false;
|
||||
turnOffAllLed();
|
||||
powerstate = off;
|
||||
}
|
||||
}
|
||||
else
|
||||
break;
|
||||
case poweringOn2:
|
||||
{
|
||||
if (doShutdown & buttonPower.releasedFor(2000))
|
||||
if (!buttonread)
|
||||
{
|
||||
digitalWrite(PW_HOLD, LOW);
|
||||
powerstate = on;
|
||||
powerOn();
|
||||
turnOffAllLed();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case on:
|
||||
{
|
||||
if (buttonPower.pressedFor(500))
|
||||
{
|
||||
powerstate = poweringOff;
|
||||
turnOnAllLed();
|
||||
}
|
||||
if (HandleTimeOut())
|
||||
{
|
||||
powerstate = timeOut;
|
||||
}
|
||||
if (handleBattery())
|
||||
{
|
||||
powerstate = lowBatt;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case poweringOff:
|
||||
{
|
||||
if (buttonPower.pressedFor(3000))
|
||||
{
|
||||
turnOffLed(1);
|
||||
powerstate = poweringOff2;
|
||||
}
|
||||
else if (buttonPower.pressedFor(2000))
|
||||
{
|
||||
turnOffLed(2);
|
||||
}
|
||||
else if (buttonPower.pressedFor(1000))
|
||||
{
|
||||
turnOffLed(3);
|
||||
}
|
||||
else
|
||||
{
|
||||
turnOffAllLed();
|
||||
powerstate = on;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case poweringOff2:
|
||||
{
|
||||
if(!buttonread)
|
||||
{
|
||||
powerstate = off;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case timeOut:
|
||||
{
|
||||
powerstate = off;
|
||||
powerOff();
|
||||
delay(5000);
|
||||
}
|
||||
break;
|
||||
case lowBatt:
|
||||
{
|
||||
powerstate = off;
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
turnOnAllLed();
|
||||
delay(200);
|
||||
turnOffAllLed();
|
||||
delay(200);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void HandleTimeOut(void)
|
||||
//handleTimeout
|
||||
//return true when timed out
|
||||
bool HandleTimeOut(void)
|
||||
{
|
||||
uint64_t currentmillis = millis();
|
||||
static uint64_t lasttimeOut = 0;
|
||||
@@ -134,8 +236,7 @@ void HandleTimeOut(void)
|
||||
//check if lastTime is initialized or timeout expired
|
||||
if ((currentmillis - lasttimeOut > IDLESHUTDOWN))
|
||||
{
|
||||
turnOffAllLed();
|
||||
shutdown();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -146,11 +247,10 @@ void HandleTimeOut(void)
|
||||
lasttimeOut = currentmillis;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void HandlePower(void)
|
||||
{
|
||||
HandleTimeOut();
|
||||
batteryCheck();
|
||||
HandlePowerOn();
|
||||
handlePowerState();
|
||||
}
|
||||
Reference in New Issue
Block a user