25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

59 lines
1.4 KiB

  1. #include "SdPositionsBackup.h"
  2. #include "SdPositionsConfig.h"
  3. #include "SdCard.h"
  4. #include "Hardware.h"
  5. #include "Config.h"
  6. #include "SdFat.h"
  7. #include "Positions.h"
  8. namespace positions {
  9. namespace backup {
  10. namespace sd {
  11. namespace details {
  12. bool isBackupNeeded(SdPositionConfig_t &sdConfig) {
  13. Config_t referenceConfig = config::main::get();
  14. sdConfig = config::backup::sd::get();
  15. return sdConfig.lastSavedEntry == 0xFFFF ||
  16. positions::count(sdConfig.lastSavedEntry) > sdConfig.saveThreshold;
  17. }
  18. void appendPositions(const File &file, SdPositionConfig_t &sdConfig) {
  19. uint16_t currentEntryIndex = sdConfig.lastSavedEntry + 1;
  20. PositionEntry currentEntry;
  21. hardware::i2c::powerOn();
  22. do {
  23. if (!positions::get(currentEntryIndex, currentEntry)) break;
  24. sdConfig.filePosition = file.position();
  25. } while (true);
  26. hardware::i2c::powerOff();
  27. }
  28. }
  29. void SdPositionsBackup::setup() {
  30. config::backup::sd::setup();
  31. }
  32. void SdPositionsBackup::backup() {
  33. SdPositionConfig_t sdConfig;
  34. if (!details::isBackupNeeded(sdConfig)) return;
  35. char *filename;
  36. hardware::sdcard::filesystem.chdir("positions");
  37. File file = hardware::sdcard::filesystem.open(filename, O_RDWR | O_CREAT);
  38. file.seek(sdConfig.filePosition);
  39. file.find('\n');
  40. details::appendPositions(file, sdConfig);
  41. }
  42. }
  43. }
  44. }