deEEP for presets

This commit is contained in:
cschwinne 2020-10-23 17:48:01 +02:00
parent 2513bcf2c6
commit 2525429070
5 changed files with 103 additions and 41 deletions

View File

@ -207,6 +207,7 @@ void deletePreset(byte index);
void loadMacro(byte index, char* m);
void applyMacro(byte index);
void saveMacro(byte index, const String& mc, bool persist = true); //only commit on single save, not in settings
void deEEP();
//wled_serial.cpp
void handleSerial();

View File

@ -263,8 +263,10 @@ bool deserializeState(JsonObject root)
void serializeSegment(JsonObject& root, WS2812FX::Segment& seg, byte id, bool forPreset, bool segmentBounds)
{
root[F("id")] = id;
root[F("start")] = seg.start;
root[F("stop")] = seg.stop;
if (segmentBounds) {
root[F("start")] = seg.start;
root[F("stop")] = seg.stop;
}
if (!forPreset) root[F("len")] = seg.stop - seg.start;
root[F("grp")] = seg.grouping;
root[F("spc")] = seg.spacing;

View File

@ -189,7 +189,7 @@ void WLED::setup()
if (!fsinit) {
DEBUGFS_PRINTLN(F("FS failed!"));
errorFlag = ERR_FS_BEGIN;
}
} else deEEP();
updateFSInfo();
#endif

View File

@ -43,7 +43,7 @@
//#define WLED_DEBUG
// filesystem specific debugging
#define WLED_DEBUG_FS
//#define WLED_DEBUG_FS
// Library inclusions.
#include <Arduino.h>
@ -541,7 +541,7 @@ WLED_GLOBAL UsermodManager usermods _INIT(UsermodManager());
#else
#define DEBUGFS_PRINT(x)
#define DEBUGFS_PRINTLN(x)
#define DEBUGFS_PRINTF(x)
#define DEBUGFS_PRINTF(x...)
#endif
// debug macro variable definitions

View File

@ -636,7 +636,7 @@ bool applyPreset(byte index)
#endif
deserializeState(fileDoc->as<JsonObject>());
} else {
WLED_DEBUG_FS(F("Make read buf"));
DEBUGFS_PRINTLN(F("Make read buf"));
DynamicJsonDocument fDoc(JSON_BUFFER_SIZE);
errorFlag = readObjectFromFileUsingId("/presets.json", index, &fDoc) ? ERR_NONE : ERR_FS_PLOAD;
#ifdef WLED_DEBUG_FS
@ -726,41 +726,6 @@ void savePreset(byte index, bool persist, const char* pname, JsonObject saveobj)
if (!docAlloc) delete fileDoc;
presetsModifiedTime = now(); //unix time
updateFSInfo();
/*if (index > 16) return;
if (index < 1) {saveSettingsToEEPROM();return;}
uint16_t i = 380 + index*20;//min400
if (index < 16) {
EEPROM.write(i, 1);
EEPROM.write(i+1, bri);
for (uint16_t j=0; j<4; j++)
{
EEPROM.write(i+j+2, col[j]);
EEPROM.write(i+j+6, colSec[j]);
}
EEPROM.write(i+10, effectCurrent);
EEPROM.write(i+11, effectSpeed);
uint32_t colTer = strip.getSegment(strip.getMainSegmentId()).colors[2];
EEPROM.write(i+12, (colTer >> 16) & 0xFF);
EEPROM.write(i+13, (colTer >> 8) & 0xFF);
EEPROM.write(i+14, (colTer >> 0) & 0xFF);
EEPROM.write(i+15, (colTer >> 24) & 0xFF);
EEPROM.write(i+16, effectIntensity);
EEPROM.write(i+17, effectPalette);
} else { //segment 16 can save segments
EEPROM.write(i, 3);
EEPROM.write(i+1, bri);
WS2812FX::Segment* seg = strip.getSegments();
memcpy(EEPROM.getDataPtr() +i+2, seg, 240);
}
if (persist) commit();
savedToPresets();
currentPreset = index;
isPreset = true;*/
}
void deletePreset(byte index) {
@ -811,3 +776,97 @@ void saveMacro(byte index, const String& mc, bool persist) //only commit on sing
}
if (persist) commit();
}
// De-EEPROM routine, upgrade from previous versions to v0.11
void deEEP() {
if (WLED_FS.exists("/presets.json")) return;
DEBUG_PRINTLN(F("Preset file not found, attempting to load from EEPROM"));
DEBUGFS_PRINTLN(F("Allocating saving buffer for dEEP"));
DynamicJsonDocument dDoc(JSON_BUFFER_SIZE);
JsonObject sObj = dDoc.to<JsonObject>();
sObj.createNestedObject("0");
//EEPROM.begin(EEPSIZE);
if (EEPROM.read(233) == 233) { //valid EEPROM save
for (uint16_t index = 1; index <= 16; index++) { //copy presets to presets.json
uint16_t i = 380 + index*20;
byte ver = EEPROM.read(i);
if ((index < 16 && ver != 1) || (index == 16 && (ver < 2 || ver > 3))) continue;
char nbuf[16];
sprintf(nbuf, "%d", index);
JsonObject pObj = sObj.createNestedObject(nbuf);
pObj["q"] = nbuf;
sprintf_P(nbuf, "Preset %d", index);
pObj["n"] = nbuf;
pObj["bri"] = EEPROM.read(i+1);
if (index < 16) {
JsonObject segObj = pObj.createNestedObject("seg");
JsonArray colarr = segObj.createNestedArray("col");
byte numChannels = (useRGBW)? 4:3;
for (uint8_t k = 0; k < 3; k++) //k=0 primary (i+2) k=1 secondary (i+6) k=2 tertiary color (i+12)
{
JsonArray colX = colarr.createNestedArray();
uint16_t memloc = i + 6*k;
if (k == 0) memloc += 2;
for (byte j = 0; j < numChannels; j++) colX.add(EEPROM.read(memloc + j));
}
segObj[F("fx")] = EEPROM.read(i+10);
segObj[F("sx")] = EEPROM.read(i+11);
segObj[F("ix")] = EEPROM.read(i+16);
segObj[F("pal")] = EEPROM.read(i+17);
} else {
WS2812FX::Segment* seg = strip.getSegments();
memcpy(seg, EEPROM.getDataPtr() +i+2, 240);
if (ver == 2) { //versions before 2004230 did not have opacity
for (byte j = 0; j < strip.getMaxSegments(); j++)
{
strip.getSegment(j).opacity = 255;
strip.getSegment(j).setOption(SEG_OPTION_ON, 1);
}
}
serializeState(pObj, true, false, true);
strip.resetSegments();
}
}
for (uint16_t index = 1; index <= 16; index++) { //copy macros to presets.json
char m[65];
readStringFromEEPROM(1024+64*(index-1), m, 64);
if (m[0]) { //macro exists
char nbuf[16];
sprintf(nbuf, "%d", index + 16);
JsonObject pObj = sObj.createNestedObject(nbuf);
sprintf_P(nbuf, "ZMacro %d", index);
pObj["n"] = nbuf;
pObj["win"] = m;
}
}
}
//EEPROM.end();
File f = WLED_FS.open("/presets.json", "w");
if (!f) {
errorFlag = ERR_FS_GENERAL;
return;
}
serializeJson(dDoc, f);
f.close();
DEBUG_PRINTLN(F("deEEP complete!"));
}