Missing presets.json on factory reset bugfix.

Clarification on loading ledmaps in UI.
Added manual ledmap loading.
This commit is contained in:
Blaz Kristan 2022-11-16 20:55:21 +01:00
parent f104fb0586
commit c47d6cffa8
11 changed files with 3819 additions and 3772 deletions

View File

@ -964,7 +964,8 @@ void WS2812FX::finalizeInit(void)
}
//segments are created in makeAutoSegments();
setBrightness(_brightness);
loadCustomPalettes(); // (re)load all custom palettes
deserializeMap(); // (re)load default ledmap
}
void WS2812FX::service() {
@ -1500,6 +1501,7 @@ void WS2812FX::loadCustomPalettes()
{
byte tcp[72]; //support gradient palettes with up to 18 entries
CRGBPalette16 targetPalette;
customPalettes.clear(); // start fresh
for (int index = 0; index<10; index++) {
char fileName[32];
sprintf_P(fileName, PSTR("/palette%d.json"), index);

View File

@ -740,7 +740,7 @@ input[type=range]::-moz-range-thumb {
margin-top: var(--bmt);
}
#picker, #rgbwrap, #kwrap, #wwrap, #wbal, #vwrap, #qcs-w, #hexw, #pall {
#picker, #rgbwrap, #kwrap, #wwrap, #wbal, #vwrap, #qcs-w, #hexw, #pall, #ledmap {
margin: 0 auto;
width: 260px;
}
@ -898,6 +898,10 @@ div.sel-p:after {
select.sel-ple {
text-align: center;
}
select.sel-sg {
margin: 5px 0;
height: 40px;
}
option {
background-color: var(--c-3);
color: var(--c-f);

View File

@ -311,6 +311,7 @@
<button class="btn btn-s" id="rsbtn" onclick="rSegs()">Reset segments</button>
</div>
<p>Transition: <input id="tt" class="noslide" type="number" min="0" max="65.5" step="0.1" value="0.7">&nbsp;s</p>
<p id="ledmap" class="hide"></p>
</div>
<div id="Presets" class="tabcontent">

View File

@ -810,6 +810,16 @@ function populateSegments(s)
if (segCount < 2) gId(`segd${lSeg}`).style.display = "none";
if (!isM && !noNewSegs && (cfg.comp.seglen?parseInt(gId(`seg${lSeg}s`).value):0)+parseInt(gId(`seg${lSeg}e`).value)<ledCount) gId(`segr${lSeg}`).style.display = "inline";
gId('segutil2').style.display = (segCount > 1) ? "block":"none"; // rsbtn parent
if (Array.isArray(li.maps) && li.maps.length>1) {
let cont = `Ledmap:&nbsp;<select class="sel-sg" onchange="requestJson({'ledmap':parseInt(this.value)})"><option value="" selected>Unchanged</option>`;
for (const k of (li.maps||[])) cont += `<option value="${k}">${k==0?'Default':'ledmap'+k+'.json'}</option>`;
cont += "</select></div>";
gId("ledmap").innerHTML = cont;
gId("ledmap").classList.remove("hide");
} else {
gId("ledmap").classList.add("hide");
}
}
function populateEffects()
@ -1819,9 +1829,9 @@ ${makePlSel(plJson[i].end?plJson[i].end:0, true)}
<input type="checkbox" id="p${i}sbchk">
<span class="checkmark"></span>
</label>`;
if (Array.isArray(lastinfo.maps) && lastinfo.maps.length>0) {
content += `<div class="lbl-l">Ledmap:&nbsp;<div class="sel-p"><select class="sel-p" id="p${i}lmp"><option value="">None</option>`;
for (const k of (lastinfo.maps||[])) content += `<option value="${k}"${(i>0 && pJson[i].ledmap==k)?" selected":""}>${k}</option>`;
if (Array.isArray(lastinfo.maps) && lastinfo.maps.length>1) {
content += `<div class="lbl-l">Ledmap:&nbsp;<div class="sel-p"><select class="sel-p" id="p${i}lmp"><option value="">Unchanged</option>`;
for (const k of (lastinfo.maps||[])) content += `<option value="${k}"${(i>0 && pJson[i].ledmap==k)?" selected":""}>${k==0?'Default':'ledmap'+k+'.json'}</option>`;
content += "</select></div></div>";
}
}

View File

@ -195,6 +195,7 @@ void handlePlaylist();
void serializePlaylist(JsonObject obj);
//presets.cpp
void initPresetsFile();
void handlePresets();
bool applyPreset(byte index, byte callMode = CALL_MODE_DIRECT_CHANGE);
inline bool applyTemporaryPreset() {return applyPreset(255);};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -11,6 +11,7 @@ static char *tmpRAMbuffer = nullptr;
static volatile byte presetToApply = 0;
static volatile byte callModeToApply = 0;
static volatile byte presetToSave = 0;
static volatile int8_t saveLedmap = -1;
static char quickLoad[3];
static char saveName[33];
static bool includeBri = true, segBounds = true, selectedOnly = false, playlistSave = false;;
@ -25,6 +26,7 @@ static void doSaveState() {
if (!requestJSONBufferLock(10)) return; // will set fileDoc
initPresetsFile(); // just in case if someone deleted presets.json using /edit
JsonObject sObj = doc.to<JsonObject>();
DEBUG_PRINTLN(F("Serialize current state"));
@ -36,6 +38,7 @@ static void doSaveState() {
}
sObj["n"] = saveName;
if (quickLoad[0]) sObj[F("ql")] = quickLoad;
if (saveLedmap >= 0) sObj[F("ledmap")] = saveLedmap;
/*
#ifdef WLED_DEBUG
DEBUG_PRINTLN(F("Serialized preset"));
@ -69,6 +72,7 @@ static void doSaveState() {
updateFSInfo();
// clean up
saveLedmap = -1;
presetToSave = 0;
saveName[0] = '\0';
quickLoad[0] = '\0';
@ -79,7 +83,7 @@ bool getPresetName(byte index, String& name)
{
if (!requestJSONBufferLock(9)) return false;
bool presetExists = false;
if (readObjectFromFileUsingId("/presets.json", index, &doc))
if (readObjectFromFileUsingId(getName(), index, &doc))
{
JsonObject fdo = doc.as<JsonObject>();
if (fdo["n"]) {
@ -91,6 +95,22 @@ bool getPresetName(byte index, String& name)
return presetExists;
}
void initPresetsFile()
{
if (WLED_FS.exists(getName())) return;
StaticJsonDocument<64> doc;
JsonObject sObj = doc.to<JsonObject>();
sObj.createNestedObject("0");
File f = WLED_FS.open(getName(), "w");
if (!f) {
errorFlag = ERR_FS_GENERAL;
return;
}
serializeJson(doc, f);
f.close();
}
bool applyPreset(byte index, byte callMode)
{
DEBUG_PRINT(F("Request to apply preset: "));
@ -188,6 +208,7 @@ void savePreset(byte index, const char* pname, JsonObject sObj)
includeBri = sObj["ib"].as<bool>() || index==255; // temporary preset needs brightness
segBounds = sObj["sb"].as<bool>() || index==255; // temporary preset needs bounds
selectedOnly = sObj[F("sc")].as<bool>();
saveLedmap = sObj[F("ledmap")] | -1;
sObj.remove("ib");
sObj.remove("sb");
sObj.remove(F("sc"));
@ -198,6 +219,7 @@ void savePreset(byte index, const char* pname, JsonObject sObj)
presetToSave = 0; // we will save API immediately
if (index < 251 && fileDoc) {
if (sObj["n"].isNull()) sObj["n"] = saveName;
initPresetsFile(); // just in case if someone deleted presets.json using /edit
writeObjectToFileUsingId(getName(index), index, fileDoc);
presetsModifiedTime = toki.second(); //unix time
updateFSInfo();

View File

@ -361,6 +361,8 @@ void WLED::setup()
}
#ifdef WLED_ADD_EEPROM_SUPPORT
else deEEP();
#else
initPresetsFile();
#endif
updateFSInfo();
@ -452,8 +454,6 @@ void WLED::beginStrip()
{
// Initialize NeoPixel Strip and button
strip.finalizeInit(); // busses created during deserializeConfig()
strip.loadCustomPalettes();
strip.deserializeMap();
strip.makeAutoSegments();
strip.setBrightness(0);
strip.setShowCallback(handleOverlayDraw);

View File

@ -8,7 +8,7 @@
*/
// version code in format yymmddb (b = daily build)
#define VERSION 2211130
#define VERSION 2211160
//uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG