66bad2b6f8
* Single/static JSON buffer for all requests. * Missing json.cpp changes. * Async fix. * Added conditional compile (WLED_USE_DYNAMIC_JSON). * Advanced locking with time-out. * Missing releaseJSONBufferLock() on error response. * Fix for config saving. * Fixes and optimisations. Dadded debugging information. * Fix for ledmaps. * No unsolicited serial sending if GPIO1 allocated * Stray semicolons * Fix JSON ledmap Co-authored-by: Blaz Kristan <blaz@kristan-sp.si>
96 lines
2.7 KiB
C++
96 lines
2.7 KiB
C++
#include "wled.h"
|
|
|
|
/*
|
|
* Methods to handle saving and loading presets to/from the filesystem
|
|
*/
|
|
|
|
bool applyPreset(byte index, byte callMode)
|
|
{
|
|
if (index == 0) return false;
|
|
|
|
const char *filename = index < 255 ? "/presets.json" : "/tmp.json";
|
|
|
|
if (fileDoc) {
|
|
errorFlag = readObjectFromFileUsingId(filename, index, fileDoc) ? ERR_NONE : ERR_FS_PLOAD;
|
|
JsonObject fdo = fileDoc->as<JsonObject>();
|
|
if (fdo["ps"] == index) fdo.remove("ps"); //remove load request for same presets to prevent recursive crash
|
|
#ifdef WLED_DEBUG_FS
|
|
serializeJson(*fileDoc, Serial);
|
|
#endif
|
|
deserializeState(fdo, callMode, index);
|
|
} else {
|
|
DEBUGFS_PRINTLN(F("Make read buf"));
|
|
#ifdef WLED_USE_DYNAMIC_JSON
|
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
|
#else
|
|
if (!requestJSONBufferLock(9)) return false;
|
|
#endif
|
|
errorFlag = readObjectFromFileUsingId(filename, index, &doc) ? ERR_NONE : ERR_FS_PLOAD;
|
|
JsonObject fdo = doc.as<JsonObject>();
|
|
if (fdo["ps"] == index) fdo.remove("ps");
|
|
#ifdef WLED_DEBUG_FS
|
|
serializeJson(doc, Serial);
|
|
#endif
|
|
deserializeState(fdo, callMode, index);
|
|
releaseJSONBufferLock();
|
|
}
|
|
|
|
if (!errorFlag) {
|
|
if (index < 255) currentPreset = index;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void savePreset(byte index, bool persist, const char* pname, JsonObject saveobj)
|
|
{
|
|
if (index == 0 || (index > 250 && persist) || (index<255 && !persist)) return;
|
|
JsonObject sObj = saveobj;
|
|
|
|
const char *filename = persist ? "/presets.json" : "/tmp.json";
|
|
|
|
if (!fileDoc) {
|
|
DEBUGFS_PRINTLN(F("Allocating saving buffer"));
|
|
#ifdef WLED_USE_DYNAMIC_JSON
|
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
|
#else
|
|
if (!requestJSONBufferLock(10)) return;
|
|
#endif
|
|
sObj = doc.to<JsonObject>();
|
|
if (pname) sObj["n"] = pname;
|
|
|
|
DEBUGFS_PRINTLN(F("Save current state"));
|
|
serializeState(sObj, true);
|
|
if (persist) currentPreset = index;
|
|
|
|
writeObjectToFileUsingId(filename, index, &doc);
|
|
|
|
releaseJSONBufferLock();
|
|
} else { //from JSON API (fileDoc != nullptr)
|
|
DEBUGFS_PRINTLN(F("Reuse recv buffer"));
|
|
sObj.remove(F("psave"));
|
|
sObj.remove(F("v"));
|
|
|
|
if (!sObj["o"]) {
|
|
DEBUGFS_PRINTLN(F("Save current state"));
|
|
serializeState(sObj, true, sObj["ib"], sObj["sb"]);
|
|
if (persist) currentPreset = index;
|
|
}
|
|
sObj.remove("o");
|
|
sObj.remove("ib");
|
|
sObj.remove("sb");
|
|
sObj.remove(F("error"));
|
|
sObj.remove(F("time"));
|
|
|
|
writeObjectToFileUsingId(filename, index, fileDoc);
|
|
}
|
|
if (persist) presetsModifiedTime = toki.second(); //unix time
|
|
updateFSInfo();
|
|
}
|
|
|
|
void deletePreset(byte index) {
|
|
StaticJsonDocument<24> empty;
|
|
writeObjectToFileUsingId("/presets.json", index, &empty);
|
|
presetsModifiedTime = toki.second(); //unix time
|
|
updateFSInfo();
|
|
} |