Files
Flipdot-display/src/esp32/logic/boot_policy.cpp
T
mangavalkandClaude Opus 5.5 c9e0800e36 Show status messages on the display
- Clock firmware: 'Connecting to WiFi...' and 'Getting the time...' at
  boot, 'Crashed!' in the OTA-only modes, and 'No WiFi' with the time
  when WiFi is down for over a minute (new DisplayController screen)
- Recovery app: shows its reason, the setup WiFi name, or its IP address,
  then powers the display off (flipdots keep the image)
- StatusScreen and drawTextLines shared by both apps
- Driver: ESP begin() no longer draws 'ESP Connected'
- Tests: No WiFi screen, short reason texts (70 total)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 01:34:04 +02:00

89 lines
2.0 KiB
C++

#include "logic/boot_policy.h"
#include "config.h"
BootDecision decideBoot(ResetKind reset, uint8_t crash_count)
{
switch (reset)
{
case ResetKind::PowerOn:
return {BootMode::Normal, 0};
case ResetKind::Crash:
if (crash_count < 255)
crash_count++;
if (crash_count >= SAFE_MODE_CRASHES)
return {BootMode::SafeMode, crash_count};
return {BootMode::PanicWindow, crash_count};
case ResetKind::Software:
case ResetKind::Other:
default:
return {BootMode::Normal, crash_count};
}
}
uint8_t crashCountAfterSafeMode()
{
return SAFE_MODE_CRASHES - 1;
}
bool shouldMarkFirmwareValid(uint32_t running_ms, bool wifi_connected)
{
return running_ms >= FIRMWARE_VALID_TIME && wifi_connected;
}
bool shouldClearCrashCount(uint32_t running_ms)
{
return running_ms >= CRASH_FREE_TIME;
}
const char *recoveryReasonText(RecoveryReason reason)
{
switch (reason)
{
case RecoveryReason::Wifi:
return "the clock firmware could not connect to WiFi";
case RecoveryReason::Crash:
return "the clock firmware crashed repeatedly";
case RecoveryReason::Manual:
return "requested from Home Assistant";
case RecoveryReason::PowerCycle:
return "the power was switched on and off quickly";
case RecoveryReason::None:
default:
return "no working clock firmware";
}
}
const char *recoveryReasonShort(RecoveryReason reason)
{
switch (reason)
{
case RecoveryReason::Wifi:
return "no WiFi";
case RecoveryReason::Crash:
return "crashed";
case RecoveryReason::Manual:
return "requested";
case RecoveryReason::PowerCycle:
return "power cycled";
case RecoveryReason::None:
default:
return "no firmware";
}
}
bool powerCyclesRequestRecovery(uint8_t power_on_count)
{
return power_on_count >= POWER_CYCLES_FOR_RECOVERY;
}
bool recoveryShouldStartMain(RecoveryReason reason, uint32_t running_ms, bool wifi_connected,
bool main_available)
{
if (!main_available)
return false;
if (reason == RecoveryReason::Wifi)
return wifi_connected && running_ms >= RECOVERY_MIN_TIME;
return running_ms >= RECOVERY_TIME;
}