Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

116 rindas
3.1 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. #include "Debug.h"
  9. #define LOGGER_NAME "Positions::backup::sd"
  10. namespace positions {
  11. namespace backup {
  12. namespace sd {
  13. namespace details {
  14. bool isBackupNeeded(SdPositionConfig_t &sdConfig) {
  15. Config_t referenceConfig = config::main::get();
  16. sdConfig = config::backup::sd::get();
  17. return sdConfig.lastSavedEntry == 0xFFFF ||
  18. positions::count(sdConfig.lastSavedEntry) > sdConfig.saveThreshold;
  19. }
  20. void getPositionsFileName(uint16_t fileIndex, char *buffer) {
  21. sprintf(buffer, POSITIONS_FILENAME, fileIndex);
  22. }
  23. void ensurePositionsFolder() {
  24. char positionsFolder[] = POSITIONS_FOLDER;
  25. hardware::sdcard::filesystem.chdir();
  26. if (!hardware::sdcard::filesystem.exists(positionsFolder)) {
  27. hardware::sdcard::filesystem.mkdir(positionsFolder, true);
  28. }
  29. hardware::sdcard::filesystem.chdir(positionsFolder);
  30. }
  31. void selectFile(SdPositionConfig_t &sdConfig, File &file) {
  32. char positionFileName[POSITIONS_FILENAME_LENGTH];
  33. if (sdConfig.fileRecords >= sdConfig.maxRecordsPerFile) {
  34. if (file.isOpen()) {
  35. file.close();
  36. config::backup::sd::set(sdConfig);
  37. }
  38. sdConfig.fileIndex++;
  39. sdConfig.filePosition = 0;
  40. sdConfig.fileRecords = 0;
  41. }
  42. if (!file.isOpen()) {
  43. ensurePositionsFolder();
  44. getPositionsFileName(sdConfig.fileIndex, positionFileName);
  45. file.open(positionFileName, O_RDWR | O_CREAT);
  46. }
  47. }
  48. void appendPosition(File &file, SdPositionConfig_t &sdConfig, PositionEntry &entry) {
  49. VERBOSE("appendPosition");
  50. const char fieldTerminator = ',';
  51. file.printField(entry.metadata.batteryLevel, fieldTerminator);
  52. file.printField(entry.metadata.batteryVoltage, fieldTerminator);
  53. file.printField(entry.metadata.temperature, fieldTerminator);
  54. file.printField(entry.metadata.timeToFix, fieldTerminator);
  55. file.printField(static_cast<uint8_t>(entry.metadata.status), fieldTerminator);
  56. file.println(entry.position);
  57. sdConfig.filePosition = file.position();
  58. }
  59. void appendPositions(SdPositionConfig_t &sdConfig) {
  60. VERBOSE("appendPositions");
  61. uint16_t currentEntryIndex = sdConfig.lastSavedEntry + 1;
  62. PositionEntry currentEntry;
  63. File file;
  64. hardware::i2c::powerOn();
  65. do {
  66. if (!positions::get(currentEntryIndex, currentEntry)) break;
  67. selectFile(sdConfig, file);
  68. appendPosition(file, sdConfig, currentEntry);
  69. sdConfig.lastSavedEntry = currentEntryIndex;
  70. } while (positions::moveNext(currentEntryIndex));
  71. hardware::i2c::powerOff();
  72. if (file.isOpen()) file.close();
  73. config::backup::sd::set(sdConfig);
  74. }
  75. }
  76. void SdPositionsBackup::setup() { }
  77. void SdPositionsBackup::backup() {
  78. VERBOSE("backup");
  79. if (!hardware::sdcard::available) {
  80. VERBOSE_MSG("backup", "not available");
  81. return;
  82. }
  83. SdPositionConfig_t sdConfig;
  84. if (!details::isBackupNeeded(sdConfig)) return;
  85. details::appendPositions(sdConfig);
  86. }
  87. }
  88. }
  89. }