#include #include #include #include #include #include #include #include #include #include #include #include #include uint32_t mock_now=0; #if defined(ESP32) #include int mock_reset_reason=ESP_RST_POWERON; #elif defined(RP2040_PLATFORM) bool mock_watchdog_enabled=false,mock_watchdog_any=false; #else namespace mesh { namespace power { volatile RecoveryRecord test_retained; ResetKind test_reset=ResetKind::Cold; volatile RecoveryRecord& platformRecoveryRecord() { return test_retained; } ResetKind platformResetKind() { return test_reset; } bool platformRecoverySupported() { return true; } unsigned configured_percent_calls=0; uint8_t configuredBatteryPercent(uint16_t mv) { ++configured_percent_calls; return mv<=3000 ? 0 : mv>=4200 ? 100 : uint8_t((mv-3000)*100/1200); } }} #endif #if !defined(NRF52_PLATFORM) && !defined(STM32_PLATFORM) #include #endif #if defined(NRF52_PLATFORM) // Compile the production writer implementation, including independent CRC32C // validation and the public-file verification after an attempted rename. #define ATOMIC_FILE_WRITER_IMPLEMENTATION #include #undef ATOMIC_FILE_WRITER_IMPLEMENTATION #endif #include using namespace mesh::power; static void retainedClear() { volatile uint8_t* p=reinterpret_cast(&platformRecoveryRecord()); for(size_t i=0;iwrites && fallback_saved); assert(last_battery==mock_now && last_save==mock_now-10); fresh(board,radio,fs,ResetKind::Cold,true); assert(board.active==RegulatorMode::Ldo && radio.active==RegulatorMode::Ldo); } } else if(test=="retry") { fresh(board,radio,fs,ResetKind::Cold,true); for(unsigned n=1;n<=2;++n){advance(1000);fresh(board,radio,fs,ResetKind::Crash);counts(n,n);} fs.fail_write=true;advance(1000);fresh(board,radio,fs,ResetKind::Crash); assert(command("get radio.regulator").find("fallback not saved")!=std::string::npos); fs.fail_write=false;advance(30000); assert(command("get radio.regulator").find("fallback not saved")==std::string::npos); fresh(board,radio,fs,ResetKind::Cold,true); assert(board.active==RegulatorMode::Ldo && radio.active==RegulatorMode::Ldo); } else assert(false); }