MQTTPrefs.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "MQTTPrefs.h"
  2. #ifdef WITH_MQTT_UPLINK
  3. #include <stddef.h>
  4. #include <helpers/TxtDataHelpers.h>
  5. #include <string.h>
  6. namespace {
  7. constexpr uint32_t kFixedStatusIntervalMs = 300000;
  8. }
  9. void MQTTPrefsStore::setDefaults(MQTTPrefs& prefs) {
  10. memset(&prefs, 0, sizeof(prefs));
  11. prefs.magic = kMagic;
  12. prefs.enabled_mask = 0x01;
  13. prefs.packets_enabled = 1;
  14. prefs.raw_enabled = 0;
  15. prefs.status_enabled = 1;
  16. prefs.tx_enabled = 0;
  17. prefs.deprecated_web_enabled = 0;
  18. prefs.deprecated_web_stats_enabled = 0;
  19. prefs.legacy_wifi_powersave = 0;
  20. prefs.status_interval_ms = kFixedStatusIntervalMs;
  21. StrHelper::strncpy(prefs.iata, MQTT_DEFAULT_IATA, sizeof(prefs.iata));
  22. #ifdef WIFI_SSID
  23. StrHelper::strncpy(prefs.legacy_wifi_ssid, WIFI_SSID, sizeof(prefs.legacy_wifi_ssid));
  24. #endif
  25. #ifdef WIFI_PWD
  26. StrHelper::strncpy(prefs.legacy_wifi_pwd, WIFI_PWD, sizeof(prefs.legacy_wifi_pwd));
  27. #endif
  28. }
  29. bool MQTTPrefsStore::load(FILESYSTEM* fs, MQTTPrefs& prefs) {
  30. setDefaults(prefs);
  31. if (fs == nullptr || !fs->exists(kFilename)) {
  32. return false;
  33. }
  34. #if defined(RP2040_PLATFORM)
  35. File file = fs->open(kFilename, "r");
  36. #else
  37. File file = fs->open(kFilename);
  38. #endif
  39. if (!file) {
  40. return false;
  41. }
  42. MQTTPrefs persisted{};
  43. size_t bytes_to_read = min(static_cast<size_t>(file.size()), sizeof(persisted));
  44. bool ok = bytes_to_read >= sizeof(persisted.magic) &&
  45. file.read(reinterpret_cast<uint8_t*>(&persisted), bytes_to_read) == bytes_to_read;
  46. file.close();
  47. if (!ok || persisted.magic != kMagic) {
  48. // Legacy or corrupt MQTT prefs should not survive migration. Remove the
  49. // stale file and persist a clean current-format default copy immediately.
  50. fs->remove(kFilename);
  51. save(fs, prefs);
  52. return false;
  53. }
  54. prefs = persisted;
  55. if (prefs.legacy_wifi_powersave > 2) {
  56. prefs.legacy_wifi_powersave = 0;
  57. }
  58. prefs.status_interval_ms = kFixedStatusIntervalMs;
  59. prefs.enabled_mask &= 0x07;
  60. return true;
  61. }
  62. bool MQTTPrefsStore::save(FILESYSTEM* fs, const MQTTPrefs& prefs) {
  63. if (fs == nullptr) {
  64. return false;
  65. }
  66. if (fs->exists(kFilename) && !fs->remove(kFilename)) {
  67. return false;
  68. }
  69. #if defined(RP2040_PLATFORM)
  70. File file = fs->open(kFilename, "w");
  71. #else
  72. File file = fs->open(kFilename, "w", true);
  73. #endif
  74. if (!file) {
  75. return false;
  76. }
  77. bool ok = file.write(reinterpret_cast<const uint8_t*>(&prefs), sizeof(prefs)) == sizeof(prefs);
  78. file.close();
  79. return ok;
  80. }
  81. #endif