update game
This commit is contained in:
@@ -3,66 +3,204 @@
|
||||
bool powerbutton_released = true;
|
||||
|
||||
uint32_t PowerLastKeepAlive = 0;
|
||||
uint32_t PowerOtaLongPressTime = 0;
|
||||
uint64_t measure_timer = 0;
|
||||
|
||||
POWERSTATES powerstate = off;
|
||||
|
||||
Button buttonPower(PWR_BTN, 250UL, 1U, 0);
|
||||
|
||||
Battery battery(VBATTMIN, VBATTMAX, MEAS_ADC, &getvbatt);
|
||||
|
||||
void initPowerOn(void)
|
||||
{
|
||||
// disable brownout
|
||||
if (digitalRead(PWR_BTN))
|
||||
{
|
||||
// enable LDO
|
||||
pinMode(PWR_HOLD, OUTPUT);
|
||||
pinMode(PWR_BTN, INPUT);
|
||||
digitalWrite(PWR_HOLD, HIGH);
|
||||
powerbutton_released = false;
|
||||
|
||||
// dac_sdMode
|
||||
pinMode(DAC_SDMODE, OUTPUT);
|
||||
digitalWrite(DAC_SDMODE, HIGH);
|
||||
// powerstate = poweringOn;
|
||||
// buttonPower.begin();
|
||||
}
|
||||
else
|
||||
{
|
||||
ESP.deepSleep(10000);
|
||||
}
|
||||
pinMode(PWR_HOLD, OUTPUT);
|
||||
powerstate = poweringOn;
|
||||
buttonPower.begin();
|
||||
}
|
||||
|
||||
void powerDown(uint16_t delayMs)
|
||||
void initBattery(void)
|
||||
{
|
||||
log_w("poweringDown!");
|
||||
digitalWrite(PWR_HOLD, LOW);
|
||||
delay(delayMs);
|
||||
ESP.restart();
|
||||
battery.onDemand(MEAS_EN, LOW);
|
||||
battery.begin(VBATTREF, (R12 + R13) / R13); // R1 = 220K, R2 = 100K, factor = (R1+R2)/R2
|
||||
}
|
||||
|
||||
void initPower(void)
|
||||
POWERSTATES getPowerState(void)
|
||||
{
|
||||
log_i("Power: init");
|
||||
initPowerOn();
|
||||
log_i("Power: init: done");
|
||||
}
|
||||
|
||||
void handlePower(void)
|
||||
{
|
||||
if (digitalRead(PWR_BTN) && powerbutton_released)
|
||||
{
|
||||
while (digitalRead(PWR_BTN))
|
||||
{
|
||||
}
|
||||
powerDown(1000);
|
||||
}
|
||||
else
|
||||
{
|
||||
powerbutton_released = true;
|
||||
}
|
||||
// check timeout
|
||||
if ( millis() - PowerLastKeepAlive > TIMEOUT_POWER)
|
||||
{
|
||||
powerDown(1000);
|
||||
}
|
||||
return powerstate;
|
||||
}
|
||||
|
||||
void PowerKeepAlive(void)
|
||||
{
|
||||
PowerLastKeepAlive = millis();
|
||||
}
|
||||
|
||||
void powerOn(void)
|
||||
{
|
||||
digitalWrite(PWR_HOLD, HIGH);
|
||||
}
|
||||
|
||||
void powerOff(void)
|
||||
{
|
||||
log_w("poweringDown!");
|
||||
digitalWrite(PWR_HOLD, LOW);
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
bool measureBattery(void)
|
||||
{
|
||||
uint16_t vbatt = battery.voltage();
|
||||
if (vbatt < VBATTMIN)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool handleBattery(void)
|
||||
{
|
||||
uint64_t currentmillis = millis();
|
||||
if (currentmillis - measure_timer > BATTERYMEASUREDELAY)
|
||||
{
|
||||
return measureBattery();
|
||||
measure_timer = currentmillis;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// handle power asynchronious
|
||||
void handlePowerState(void)
|
||||
{
|
||||
bool buttonread = buttonPower.read(); // update powerbutton
|
||||
switch (powerstate)
|
||||
{
|
||||
case off:
|
||||
{
|
||||
if (buttonread)
|
||||
{
|
||||
powerstate = poweringOn;
|
||||
}
|
||||
powerOff();
|
||||
log_w("Powered-off");
|
||||
}
|
||||
break;
|
||||
case poweringOn:
|
||||
{
|
||||
if (buttonPower.pressedFor(POWERBUTTONDELAY))
|
||||
{
|
||||
powerstate = poweringOn2;
|
||||
log_i("poweron 3/3 => Go");
|
||||
}
|
||||
else if (buttonPower.pressedFor(500))
|
||||
{
|
||||
log_i("poweron 2/3");
|
||||
}
|
||||
else if (buttonPower.pressedFor(200))
|
||||
{
|
||||
log_i("poweron 1/3");
|
||||
}
|
||||
else
|
||||
{
|
||||
powerstate = off;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case poweringOn2:
|
||||
{
|
||||
if (!buttonread)
|
||||
{
|
||||
powerstate = powerinit;
|
||||
powerOn();
|
||||
// if (measureBattery())
|
||||
// {
|
||||
// log_w("poweringOn: Lowbat");
|
||||
// powerstate = lowBatt;
|
||||
// }
|
||||
}
|
||||
}
|
||||
break;
|
||||
case powerinit:
|
||||
{
|
||||
// init all
|
||||
log_i("powerinit");
|
||||
powerstate = on;
|
||||
}
|
||||
break;
|
||||
case on:
|
||||
{
|
||||
if (buttonPower.pressedFor(100))
|
||||
{
|
||||
powerstate = poweringOff;
|
||||
break;
|
||||
}
|
||||
// if (handleBattery())
|
||||
// {
|
||||
// log_w("on: Lowbat");
|
||||
// powerstate = lowBatt;
|
||||
// break;
|
||||
// }
|
||||
}
|
||||
break;
|
||||
case poweringOff:
|
||||
{
|
||||
if (buttonPower.pressedFor(POWERBUTTONDELAY))
|
||||
{
|
||||
powerstate = poweringOff2;
|
||||
log_w("poweringoff: 3/3 ==> powerOff");
|
||||
}
|
||||
else if (buttonPower.pressedFor(500))
|
||||
{
|
||||
log_w("poweringoff: 2/3");
|
||||
}
|
||||
else if (buttonPower.pressedFor(200))
|
||||
{
|
||||
log_w("poweringoff: 1/3");
|
||||
}
|
||||
else
|
||||
{
|
||||
powerstate = on;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case poweringOff2:
|
||||
{
|
||||
if (!buttonread)
|
||||
{
|
||||
powerstate = off;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case timeOut:
|
||||
{
|
||||
log_w("timeout ==> off");
|
||||
powerstate = off;
|
||||
powerOff();
|
||||
delay(5000);
|
||||
}
|
||||
break;
|
||||
case lowBatt:
|
||||
{
|
||||
powerstate = off;
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
log_w("lowbatt");
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* public functions */
|
||||
|
||||
void initPower(void)
|
||||
{
|
||||
log_i("Power: init");
|
||||
initPowerOn();
|
||||
initBattery();
|
||||
log_i("Power: init: done");
|
||||
}
|
||||
|
||||
void handlePower(void)
|
||||
{
|
||||
handlePowerState();
|
||||
}
|
||||
Reference in New Issue
Block a user