feat: add automatic bootloop recovery

This commit is contained in:
GenesiaW 2026-01-28 19:57:19 +08:00
parent 74f2552c29
commit 7f9b5787c1
6 changed files with 17 additions and 2 deletions

View File

@ -5,7 +5,7 @@
#include <Serialization.h>
namespace {
constexpr uint8_t STATE_FILE_VERSION = 2;
constexpr uint8_t STATE_FILE_VERSION = 3;
constexpr char STATE_FILE[] = "/.crosspoint/state.bin";
} // namespace
@ -20,6 +20,7 @@ bool CrossPointState::saveToFile() const {
serialization::writePod(outputFile, STATE_FILE_VERSION);
serialization::writeString(outputFile, openEpubPath);
serialization::writePod(outputFile, lastSleepImage);
serialization::writePod(outputFile, readerActivityLoadCount);
outputFile.close();
return true;
}
@ -45,6 +46,10 @@ bool CrossPointState::loadFromFile() {
lastSleepImage = 0;
}
if (version >= 3) {
serialization::readPod(inputFile, readerActivityLoadCount);
}
inputFile.close();
return true;
}

View File

@ -9,6 +9,7 @@ class CrossPointState {
public:
std::string openEpubPath;
uint8_t lastSleepImage;
uint8_t readerActivityLoadCount = 0;
~CrossPointState() = default;
// Get singleton instance

View File

@ -112,6 +112,8 @@ void EpubReaderActivity::onExit() {
}
vSemaphoreDelete(renderingMutex);
renderingMutex = nullptr;
APP_STATE.readerActivityLoadCount = 0;
APP_STATE.saveToFile();
section.reset();
epub.reset();
}

View File

@ -89,6 +89,8 @@ void TxtReaderActivity::onExit() {
renderingMutex = nullptr;
pageOffsets.clear();
currentPageLines.clear();
APP_STATE.readerActivityLoadCount = 0;
APP_STATE.saveToFile();
txt.reset();
}

View File

@ -69,6 +69,8 @@ void XtcReaderActivity::onExit() {
}
vSemaphoreDelete(renderingMutex);
renderingMutex = nullptr;
APP_STATE.readerActivityLoadCount = 0;
APP_STATE.saveToFile();
xtc.reset();
}

View File

@ -311,13 +311,16 @@ void setup() {
APP_STATE.loadFromFile();
RECENT_BOOKS.loadFromFile();
if (APP_STATE.openEpubPath.empty() || mappedInputManager.isPressed(MappedInputManager::Button::Back)) {
// Boot to home screen directly when back button is held or when reader activity crashes 3 times
if (APP_STATE.openEpubPath.empty() || mappedInputManager.isPressed(MappedInputManager::Button::Back) ||
APP_STATE.readerActivityLoadCount > 2) {
onGoHome();
} else {
// Clear app state to avoid getting into a boot loop if the epub doesn't load
const auto path = APP_STATE.openEpubPath;
APP_STATE.openEpubPath = "";
APP_STATE.lastSleepImage = 0;
APP_STATE.readerActivityLoadCount++;
APP_STATE.saveToFile();
onGoToReader(path, MyLibraryActivity::Tab::Recent);
}