implemented soft power button on-off

This commit is contained in:
2021-05-09 15:25:42 +02:00
parent ae1676c669
commit f19e7b79f4
8 changed files with 242 additions and 76 deletions

View File

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