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

View File

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

View File

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

View File

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

View File

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

View File

@ -311,13 +311,16 @@ void setup() {
APP_STATE.loadFromFile(); APP_STATE.loadFromFile();
RECENT_BOOKS.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(); onGoHome();
} else { } else {
// Clear app state to avoid getting into a boot loop if the epub doesn't load // Clear app state to avoid getting into a boot loop if the epub doesn't load
const auto path = APP_STATE.openEpubPath; const auto path = APP_STATE.openEpubPath;
APP_STATE.openEpubPath = ""; APP_STATE.openEpubPath = "";
APP_STATE.lastSleepImage = 0; APP_STATE.lastSleepImage = 0;
APP_STATE.readerActivityLoadCount++;
APP_STATE.saveToFile(); APP_STATE.saveToFile();
onGoToReader(path, MyLibraryActivity::Tab::Recent); onGoToReader(path, MyLibraryActivity::Tab::Recent);
} }