Settings.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #include <Settings.h>
  2. #include <ArduinoJson.h>
  3. #include <FS.h>
  4. #include <IntParsing.h>
  5. void Settings::deserialize(Settings& settings, String json) {
  6. DynamicJsonBuffer jsonBuffer;
  7. JsonObject& parsedSettings = jsonBuffer.parseObject(json);
  8. deserialize(settings, parsedSettings);
  9. }
  10. void Settings::deserialize(Settings& settings, JsonObject& parsedSettings) {
  11. if (parsedSettings.success()) {
  12. settings.adminUsername = parsedSettings.get<String>("admin_username");
  13. settings.adminPassword = parsedSettings.get<String>("admin_password");
  14. settings.cePin = parsedSettings["ce_pin"];
  15. settings.csnPin = parsedSettings["csn_pin"];
  16. JsonArray& arr = parsedSettings["device_ids"];
  17. settings.updateDeviceIds(arr);
  18. JsonArray& gatewayArr = parsedSettings["gateway_configs"];
  19. settings.updateGatewayConfigs(gatewayArr);
  20. }
  21. }
  22. void Settings::updateDeviceIds(JsonArray& arr) {
  23. if (arr.success()) {
  24. if (this->deviceIds) {
  25. delete this->deviceIds;
  26. }
  27. this->deviceIds = new uint16_t[arr.size()];
  28. this->numDeviceIds = arr.size();
  29. arr.copyTo(this->deviceIds, arr.size());
  30. }
  31. }
  32. void Settings::updateGatewayConfigs(JsonArray& arr) {
  33. if (arr.success()) {
  34. if (this->gatewayConfigs) {
  35. delete[] this->gatewayConfigs;
  36. }
  37. this->gatewayConfigs = new GatewayConfig*[arr.size()];
  38. this->numGatewayConfigs = arr.size();
  39. for (size_t i = 0; i < arr.size(); i++) {
  40. JsonArray& params = arr[i];
  41. if (params.success() && params.size() == 3) {
  42. this->gatewayConfigs[i] = new GatewayConfig(parseInt<uint16_t>(params[0]), params[1], params[2]);
  43. } else {
  44. Serial.print("Settings - skipped parsing gateway ports settings for element #");
  45. Serial.println(i);
  46. }
  47. }
  48. }
  49. }
  50. void Settings::patch(JsonObject& parsedSettings) {
  51. if (parsedSettings.success()) {
  52. if (parsedSettings.containsKey("admin_username")) {
  53. this->adminUsername = parsedSettings.get<String>("admin_username");
  54. }
  55. if (parsedSettings.containsKey("admin_password")) {
  56. this->adminPassword = parsedSettings.get<String>("admin_password");
  57. }
  58. if (parsedSettings.containsKey("ce_pin")) {
  59. this->cePin = parsedSettings["ce_pin"];
  60. }
  61. if (parsedSettings.containsKey("csn_pin")) {
  62. this->csnPin = parsedSettings["csn_pin"];
  63. }
  64. if (parsedSettings.containsKey("device_ids")) {
  65. JsonArray& arr = parsedSettings["device_ids"];
  66. updateDeviceIds(arr);
  67. }
  68. if (parsedSettings.containsKey("gateway_configs")) {
  69. JsonArray& arr = parsedSettings["gateway_configs"];
  70. updateGatewayConfigs(arr);
  71. }
  72. }
  73. }
  74. void Settings::load(Settings& settings) {
  75. if (SPIFFS.exists(SETTINGS_FILE)) {
  76. File f = SPIFFS.open(SETTINGS_FILE, "r");
  77. String settingsContents = f.readStringUntil(SETTINGS_TERMINATOR);
  78. f.close();
  79. deserialize(settings, settingsContents);
  80. } else {
  81. settings.save();
  82. }
  83. }
  84. String Settings::toJson(const bool prettyPrint) {
  85. String buffer = "";
  86. StringStream s(buffer);
  87. serialize(s, prettyPrint);
  88. return buffer;
  89. }
  90. void Settings::save() {
  91. File f = SPIFFS.open(SETTINGS_FILE, "w");
  92. if (!f) {
  93. Serial.println("Opening settings file failed");
  94. } else {
  95. serialize(f);
  96. f.close();
  97. }
  98. }
  99. void Settings::serialize(Stream& stream, const bool prettyPrint) {
  100. DynamicJsonBuffer jsonBuffer;
  101. JsonObject& root = jsonBuffer.createObject();
  102. root["admin_username"] = this->adminUsername;
  103. root["admin_password"] = this->adminPassword;
  104. root["ce_pin"] = this->cePin;
  105. root["csn_pin"] = this->csnPin;
  106. if (this->deviceIds) {
  107. JsonArray& arr = jsonBuffer.createArray();
  108. arr.copyFrom(this->deviceIds, this->numDeviceIds);
  109. root["device_ids"] = arr;
  110. }
  111. if (this->gatewayConfigs) {
  112. JsonArray& arr = jsonBuffer.createArray();
  113. for (size_t i = 0; i < this->numGatewayConfigs; i++) {
  114. JsonArray& elmt = jsonBuffer.createArray();
  115. elmt.add(this->gatewayConfigs[i]->deviceId);
  116. elmt.add(this->gatewayConfigs[i]->port);
  117. elmt.add(this->gatewayConfigs[i]->protocolVersion);
  118. arr.add(elmt);
  119. }
  120. root["gateway_configs"] = arr;
  121. }
  122. if (prettyPrint) {
  123. root.prettyPrintTo(stream);
  124. } else {
  125. root.printTo(stream);
  126. }
  127. }