|
|
@ -20,67 +20,61 @@ |
|
|
|
/* |
|
|
|
* Abstraction of a service which stores it's settings as JSON in a file system. |
|
|
|
*/ |
|
|
|
class SettingsService : public SettingsPersistence |
|
|
|
{ |
|
|
|
class SettingsService : public SettingsPersistence { |
|
|
|
|
|
|
|
public: |
|
|
|
SettingsService(AsyncWebServer *server, FS *fs, char const *servicePath, char const *filePath) : SettingsPersistence(fs, filePath), _servicePath(servicePath) |
|
|
|
{ |
|
|
|
server->on(_servicePath, HTTP_GET, std::bind(&SettingsService::fetchConfig, this, std::placeholders::_1)); |
|
|
|
public: |
|
|
|
|
|
|
|
_updateHandler.setUri(servicePath); |
|
|
|
_updateHandler.setMethod(HTTP_POST); |
|
|
|
_updateHandler.setMaxContentLength(MAX_SETTINGS_SIZE); |
|
|
|
_updateHandler.onRequest(std::bind(&SettingsService::updateConfig, this, std::placeholders::_1, std::placeholders::_2)); |
|
|
|
server->addHandler(&_updateHandler); |
|
|
|
} |
|
|
|
SettingsService(AsyncWebServer* server, FS* fs, char const* servicePath, char const* filePath): SettingsPersistence(fs, filePath), _servicePath(servicePath) { |
|
|
|
server->on(_servicePath, HTTP_GET, std::bind(&SettingsService::fetchConfig, this, std::placeholders::_1)); |
|
|
|
|
|
|
|
virtual ~SettingsService() {} |
|
|
|
_updateHandler.setUri(servicePath); |
|
|
|
_updateHandler.setMethod(HTTP_POST); |
|
|
|
_updateHandler.setMaxContentLength(MAX_SETTINGS_SIZE); |
|
|
|
_updateHandler.onRequest(std::bind(&SettingsService::updateConfig, this, std::placeholders::_1, std::placeholders::_2)); |
|
|
|
server->addHandler(&_updateHandler); |
|
|
|
} |
|
|
|
|
|
|
|
void begin() |
|
|
|
{ |
|
|
|
// read the initial data from the file system |
|
|
|
readFromFS(); |
|
|
|
} |
|
|
|
virtual ~SettingsService() {} |
|
|
|
|
|
|
|
void begin() { |
|
|
|
// read the initial data from the file system |
|
|
|
readFromFS(); |
|
|
|
} |
|
|
|
|
|
|
|
protected: |
|
|
|
char const *_servicePath; |
|
|
|
char const* _servicePath; |
|
|
|
AsyncJsonWebHandler _updateHandler; |
|
|
|
|
|
|
|
virtual void fetchConfig(AsyncWebServerRequest *request) |
|
|
|
{ |
|
|
|
virtual void fetchConfig(AsyncWebServerRequest *request) { |
|
|
|
// handle the request |
|
|
|
AsyncJsonResponse *response = new AsyncJsonResponse(false, MAX_SETTINGS_SIZE); |
|
|
|
JsonObject jsonObject = response->getRoot(); |
|
|
|
AsyncJsonResponse * response = new AsyncJsonResponse(false, MAX_SETTINGS_SIZE); |
|
|
|
JsonObject jsonObject = response->getRoot(); |
|
|
|
writeToJsonObject(jsonObject); |
|
|
|
response->setLength(); |
|
|
|
request->send(response); |
|
|
|
} |
|
|
|
|
|
|
|
virtual void updateConfig(AsyncWebServerRequest *request, JsonDocument &jsonDocument) |
|
|
|
{ |
|
|
|
virtual void updateConfig(AsyncWebServerRequest *request, JsonDocument &jsonDocument) { |
|
|
|
// handle the request |
|
|
|
if (jsonDocument.is<JsonObject>()) |
|
|
|
{ |
|
|
|
if (jsonDocument.is<JsonObject>()){ |
|
|
|
JsonObject newConfig = jsonDocument.as<JsonObject>(); |
|
|
|
readFromJsonObject(newConfig); |
|
|
|
writeToFS(); |
|
|
|
|
|
|
|
// write settings back with a callback to reconfigure the wifi |
|
|
|
AsyncJsonCallbackResponse *response = new AsyncJsonCallbackResponse([this]() { onConfigUpdated(); }, false, MAX_SETTINGS_SIZE); |
|
|
|
JsonObject jsonObject = response->getRoot(); |
|
|
|
AsyncJsonCallbackResponse * response = new AsyncJsonCallbackResponse([this] () {onConfigUpdated();}, false, MAX_SETTINGS_SIZE); |
|
|
|
JsonObject jsonObject = response->getRoot(); |
|
|
|
writeToJsonObject(jsonObject); |
|
|
|
response->setLength(); |
|
|
|
request->send(response); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
} else { |
|
|
|
request->send(400); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// implement to perform action when config has been updated |
|
|
|
virtual void onConfigUpdated() {} |
|
|
|
virtual void onConfigUpdated(){} |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
#endif // end SettingsService |