update game

This commit is contained in:
2021-12-14 16:27:15 +01:00
parent 6fdeb985e7
commit cce21d299a
18 changed files with 652 additions and 234 deletions

View File

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