When picking a random sleep image from a set of custom images, compare the randomly chosen index against a cached value in settings. If the value matches, use the next image (rolling over if it's the last image). Cache the chosen image index to settings in either case. ## Summary Implements a tweak on the custom sleep image feature that ensures that the user gets a new image every time the device goes to sleep. This change adds a new setting (perhaps there's a better place to cache this?) that stores the most recently used file index. During picking the random image index, we compare this against the random index and choose the next one (modulo the number of image files) if it matches, ensuring we get a new image. ## Additional Context As mentioned, I used settings to cache this value since it is a persisted store, perhaps that's overkill. Open to suggestions on if there's a better way.
51 lines
1.2 KiB
C++
51 lines
1.2 KiB
C++
#include "CrossPointState.h"
|
|
|
|
#include <HardwareSerial.h>
|
|
#include <SDCardManager.h>
|
|
#include <Serialization.h>
|
|
|
|
namespace {
|
|
constexpr uint8_t STATE_FILE_VERSION = 2;
|
|
constexpr char STATE_FILE[] = "/.crosspoint/state.bin";
|
|
} // namespace
|
|
|
|
CrossPointState CrossPointState::instance;
|
|
|
|
bool CrossPointState::saveToFile() const {
|
|
FsFile outputFile;
|
|
if (!SdMan.openFileForWrite("CPS", STATE_FILE, outputFile)) {
|
|
return false;
|
|
}
|
|
|
|
serialization::writePod(outputFile, STATE_FILE_VERSION);
|
|
serialization::writeString(outputFile, openEpubPath);
|
|
serialization::writePod(outputFile, lastSleepImage);
|
|
outputFile.close();
|
|
return true;
|
|
}
|
|
|
|
bool CrossPointState::loadFromFile() {
|
|
FsFile inputFile;
|
|
if (!SdMan.openFileForRead("CPS", STATE_FILE, inputFile)) {
|
|
return false;
|
|
}
|
|
|
|
uint8_t version;
|
|
serialization::readPod(inputFile, version);
|
|
if (version > STATE_FILE_VERSION) {
|
|
Serial.printf("[%lu] [CPS] Deserialization failed: Unknown version %u\n", millis(), version);
|
|
inputFile.close();
|
|
return false;
|
|
}
|
|
|
|
serialization::readString(inputFile, openEpubPath);
|
|
if (version >= 2) {
|
|
serialization::readPod(inputFile, lastSleepImage);
|
|
} else {
|
|
lastSleepImage = 0;
|
|
}
|
|
|
|
inputFile.close();
|
|
return true;
|
|
}
|