#include "settings.h" String Settings::getSettingsString() { return this->json_settings_string; } bool Settings::begin() { if(!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED)){ Serial.println("Settings SPIFFS Mount Failed"); return false; } File settingsFile; //SPIFFS.remove("/settings.json"); // NEED TO REMOVE THIS LINE if (SPIFFS.exists("/settings.json")) { settingsFile = SPIFFS.open("/settings.json", FILE_READ); if (!settingsFile) { settingsFile.close(); Serial.println(F("Could not find settings file")); if (this->createDefaultSettings(SPIFFS)) return true; else return false; } } else { Serial.println("Settings file does not exist"); if (this->createDefaultSettings(SPIFFS)) return true; else return false; } String json_string; DynamicJsonDocument jsonBuffer(1024); DeserializationError error = deserializeJson(jsonBuffer, settingsFile); serializeJson(jsonBuffer, json_string); //Serial.println("Settings: " + (String)json_string + "\n"); //this->printJsonSettings(json_string); this->json_settings_string = json_string; return true; } template T Settings::loadSetting(String key) {} // Get type int settings template<> int Settings::loadSetting(String key) { DynamicJsonDocument json(1024); // ArduinoJson v6 if (deserializeJson(json, this->json_settings_string)) { Serial.println("\nCould not parse json"); } for (int i = 0; i < json["Settings"].size(); i++) { if (json["Settings"][i]["name"].as() == key) return json["Settings"][i]["value"]; } return 0; } // Get type string settings template<> String Settings::loadSetting(String key) { //return this->json_settings_string; DynamicJsonDocument json(1024); // ArduinoJson v6 if (deserializeJson(json, this->json_settings_string)) { Serial.println("\nCould not parse json"); } for (int i = 0; i < json["Settings"].size(); i++) { if (json["Settings"][i]["name"].as() == key) return json["Settings"][i]["value"]; } Serial.println("Did not find setting named " + (String)key + ". Creating..."); if (this->createDefaultSettings(SPIFFS, true, json["Settings"].size(), "String", key)) return ""; return ""; } // Get type bool settings template<> bool Settings::loadSetting(String key) { DynamicJsonDocument json(1024); // ArduinoJson v6 if (deserializeJson(json, this->json_settings_string)) { Serial.println("Could not parse json to load"); } for (int i = 0; i < json["Settings"].size(); i++) { if (json["Settings"][i]["name"].as() == key) return json["Settings"][i]["value"]; } Serial.println("Did not find setting named " + (String)key + ". Creating..."); if (this->createDefaultSettings(SPIFFS, true, json["Settings"].size(), "bool", key)) return true; return false; } //Get type uint8_t settings template<> uint8_t Settings::loadSetting(String key) { DynamicJsonDocument json(1024); // ArduinoJson v6 if (deserializeJson(json, this->json_settings_string)) { Serial.println("\nCould not parse json"); } for (int i = 0; i < json["Settings"].size(); i++) { if (json["Settings"][i]["name"].as() == key) return json["Settings"][i]["value"]; } return 0; } template T Settings::saveSetting(String key, bool value) {} template<> bool Settings::saveSetting(String key, bool value) { DynamicJsonDocument json(1024); // ArduinoJson v6 if (deserializeJson(json, this->json_settings_string)) { Serial.println("\nCould not parse json"); } String settings_string; for (int i = 0; i < json["Settings"].size(); i++) { if (json["Settings"][i]["name"].as() == key) { json["Settings"][i]["value"] = value; Serial.println("Saving setting..."); File settingsFile = SPIFFS.open("/settings.json", FILE_WRITE); if (!settingsFile) { Serial.println(F("Failed to create settings file")); return false; } if (serializeJson(json, settingsFile) == 0) { Serial.println(F("Failed to write to file")); } if (serializeJson(json, settings_string) == 0) { Serial.println(F("Failed to write to string")); } // Close the file settingsFile.close(); this->json_settings_string = settings_string; this->printJsonSettings(settings_string); return true; } } return false; } template T Settings::saveSetting(String key, String value) {} template<> bool Settings::saveSetting(String key, String value) { DynamicJsonDocument json(1024); // ArduinoJson v6 if (deserializeJson(json, this->json_settings_string)) { Serial.println("\nCould not parse json"); } String settings_string; for (int i = 0; i < json["Settings"].size(); i++) { if (json["Settings"][i]["name"].as() == key) { json["Settings"][i]["value"] = value; Serial.println("Saving setting..."); File settingsFile = SPIFFS.open("/settings.json", FILE_WRITE); if (!settingsFile) { Serial.println(F("Failed to create settings file")); return false; } if (serializeJson(json, settingsFile) == 0) { Serial.println(F("Failed to write to file")); } if (serializeJson(json, settings_string) == 0) { Serial.println(F("Failed to write to string")); } // Close the file settingsFile.close(); this->json_settings_string = settings_string; this->printJsonSettings(settings_string); return true; } } return false; } bool Settings::toggleSetting(String key) { DynamicJsonDocument json(1024); // ArduinoJson v6 if (deserializeJson(json, this->json_settings_string)) { Serial.println("\nCould not parse json"); } for (int i = 0; i < json["Settings"].size(); i++) { if (json["Settings"][i]["name"].as() == key) { if (json["Settings"][i]["value"]) { saveSetting(key, false); Serial.println("Setting value to false"); return false; } else { saveSetting(key, true); Serial.println("Setting value to true"); return true; } return false; } } } String Settings::setting_index_to_name(int i) { DynamicJsonDocument json(1024); // ArduinoJson v6 if (deserializeJson(json, this->json_settings_string)) { Serial.println("\nCould not parse json"); } return json["Settings"][i]["name"]; } int Settings::getNumberSettings() { DynamicJsonDocument json(1024); // ArduinoJson v6 if (deserializeJson(json, this->json_settings_string)) { Serial.println("\nCould not parse json"); } return json["Settings"].size(); } String Settings::getSettingType(String key) { DynamicJsonDocument json(1024); // ArduinoJson v6 if (deserializeJson(json, this->json_settings_string)) { Serial.println("\nCould not parse json"); } for (int i = 0; i < json["Settings"].size(); i++) { if (json["Settings"][i]["name"].as() == key) return json["Settings"][i]["type"]; } } void Settings::printJsonSettings(String json_string) { DynamicJsonDocument json(1024); // ArduinoJson v6 if (deserializeJson(json, json_string)) { Serial.println("\nCould not parse json"); } Serial.println("Settings\n----------------------------------------------"); for (int i = 0; i < json["Settings"].size(); i++) { Serial.println("Name: " + json["Settings"][i]["name"].as()); Serial.println("Type: " + json["Settings"][i]["type"].as()); Serial.println("Value: " + json["Settings"][i]["value"].as()); Serial.println("----------------------------------------------"); } } bool Settings::createDefaultSettings(fs::FS &fs, bool spec, uint8_t index, String typeStr, String name) { Serial.println(F("Creating default settings file: settings.json")); File settingsFile = fs.open("/settings.json", FILE_WRITE); if (!settingsFile) { Serial.println(F("Failed to create settings file")); return false; } String settings_string; if (!spec) { DynamicJsonDocument jsonBuffer(1024); jsonBuffer["Settings"][0]["name"] = "ForcePMKID"; jsonBuffer["Settings"][0]["type"] = "bool"; jsonBuffer["Settings"][0]["value"] = false; jsonBuffer["Settings"][0]["range"]["min"] = false; jsonBuffer["Settings"][0]["range"]["max"] = true; jsonBuffer["Settings"][1]["name"] = "ForceProbe"; jsonBuffer["Settings"][1]["type"] = "bool"; jsonBuffer["Settings"][1]["value"] = false; jsonBuffer["Settings"][1]["range"]["min"] = false; jsonBuffer["Settings"][1]["range"]["max"] = true; jsonBuffer["Settings"][2]["name"] = "SavePCAP"; jsonBuffer["Settings"][2]["type"] = "bool"; jsonBuffer["Settings"][2]["value"] = true; jsonBuffer["Settings"][2]["range"]["min"] = false; jsonBuffer["Settings"][2]["range"]["max"] = true; jsonBuffer["Settings"][3]["name"] = "EnableLED"; jsonBuffer["Settings"][3]["type"] = "bool"; jsonBuffer["Settings"][3]["value"] = true; jsonBuffer["Settings"][3]["range"]["min"] = false; jsonBuffer["Settings"][3]["range"]["max"] = true; jsonBuffer["Settings"][4]["name"] = "EPDeauth"; jsonBuffer["Settings"][4]["type"] = "bool"; jsonBuffer["Settings"][4]["value"] = false; jsonBuffer["Settings"][4]["range"]["min"] = false; jsonBuffer["Settings"][4]["range"]["max"] = true; jsonBuffer["Settings"][5]["name"] = "ClientSSID"; jsonBuffer["Settings"][5]["type"] = "String"; jsonBuffer["Settings"][5]["value"] = ""; jsonBuffer["Settings"][5]["range"]["min"] = ""; jsonBuffer["Settings"][5]["range"]["max"] = ""; jsonBuffer["Settings"][6]["name"] = "ClientPW"; jsonBuffer["Settings"][6]["type"] = "String"; jsonBuffer["Settings"][6]["value"] = ""; jsonBuffer["Settings"][6]["range"]["min"] = ""; jsonBuffer["Settings"][6]["range"]["max"] = ""; //jsonBuffer.printTo(settingsFile); if (serializeJson(jsonBuffer, settingsFile) == 0) { Serial.println(F("Failed to write to file")); } if (serializeJson(jsonBuffer, settings_string) == 0) { Serial.println(F("Failed to write to string")); } } else { DynamicJsonDocument json(1024); // ArduinoJson v6 if (deserializeJson(json, this->json_settings_string)) { Serial.println("Could not parse json to create new setting"); return false; } if (typeStr == "bool") { Serial.println("Creating bool setting..."); json["Settings"][index]["name"] = name; json["Settings"][index]["type"] = typeStr; json["Settings"][index]["value"] = false; json["Settings"][index]["range"]["min"] = false; json["Settings"][index]["range"]["max"] = true; if (serializeJson(json, settings_string) == 0) { Serial.println("Failed to write to string"); } if (serializeJson(json, settingsFile) == 0) { Serial.println("Failed to write to file"); } } else if (typeStr == "String") { Serial.println("Creating String setting..."); json["Settings"][index]["name"] = name; json["Settings"][index]["type"] = typeStr; json["Settings"][index]["value"] = ""; json["Settings"][index]["range"]["min"] = ""; json["Settings"][index]["range"]["max"] = ""; if (serializeJson(json, settings_string) == 0) { Serial.println("Failed to write to string"); } if (serializeJson(json, settingsFile) == 0) { Serial.println("Failed to write to file"); } } } // Close the file settingsFile.close(); this->json_settings_string = settings_string; this->printJsonSettings(settings_string); return true; } void Settings::main(uint32_t currentTime) { }