#include "SdPositionsBackup.h" #include "SdPositionsConfig.h" #include "SdCard.h" #include "Hardware.h" #include "Config.h" #include "SdFat.h" #include "Positions.h" namespace positions { namespace backup { namespace sd { namespace details { bool isBackupNeeded(SdPositionConfig_t &sdConfig) { Config_t referenceConfig = config::main::get(); sdConfig = config::backup::sd::get(); return sdConfig.lastSavedEntry == 0xFFFF || positions::count(sdConfig.lastSavedEntry) > sdConfig.saveThreshold; } void appendPositions(const File &file, SdPositionConfig_t &sdConfig) { uint16_t currentEntryIndex = sdConfig.lastSavedEntry + 1; PositionEntry currentEntry; hardware::i2c::powerOn(); do { if (!positions::get(currentEntryIndex, currentEntry)) break; sdConfig.filePosition = file.position(); } while (true); hardware::i2c::powerOff(); } } void SdPositionsBackup::setup() { config::backup::sd::setup(); } void SdPositionsBackup::backup() { SdPositionConfig_t sdConfig; if (!details::isBackupNeeded(sdConfig)) return; char *filename; hardware::sdcard::filesystem.chdir("positions"); File file = hardware::sdcard::filesystem.open(filename, O_RDWR | O_CREAT); file.seek(sdConfig.filePosition); file.find('\n'); details::appendPositions(file, sdConfig); } } } }