From ccccbaa17fb6eb3bcf14371ec1d49808f0875ff1 Mon Sep 17 00:00:00 2001 From: Ewoud Date: Sun, 11 Feb 2024 23:14:48 +0100 Subject: [PATCH] Use parentRowNr for childVars AppEffects: setEffect: set parentRowNr (WIP) SysModFiles: drSize change to progress type SysModModel: - changeFun: do not change to rowNr 0 - add jsonToChar SysModUI - add parentRowNr (static ;-( ) - remove rowNr from initVar functions - initVarAndUpdate: use parentRowNr (WIP) - initVarAndUpdate: do not change to rowNr 0 - callVarFun: default no rowNr and f_changeFun --- data/model.json | 2 +- src/App/AppEffects.h | 100 ++++++++++++++++++------------------ src/App/AppModFixture.h | 18 +++---- src/App/AppModFixtureGen.h | 12 ++--- src/App/AppModLeds.h | 12 ++--- src/Sys/SysModFiles.cpp | 21 +++++--- src/Sys/SysModFiles.h | 1 + src/Sys/SysModModel.cpp | 8 +-- src/Sys/SysModModel.h | 6 ++- src/Sys/SysModNetwork.cpp | 6 +-- src/Sys/SysModPins.cpp | 8 +-- src/Sys/SysModPrint.cpp | 2 +- src/Sys/SysModSystem.cpp | 28 +++++----- src/Sys/SysModUI.cpp | 5 +- src/Sys/SysModUI.h | 85 +++++++++++++++++------------- src/Sys/SysModWeb.cpp | 15 ++---- src/SysModules.cpp | 10 ++-- src/User/UserModArtNet.h | 2 +- src/User/UserModDDP.h | 2 +- src/User/UserModE131.h | 2 +- src/User/UserModInstances.h | 8 +-- src/testOutput.txt | 8 +-- 22 files changed, 186 insertions(+), 175 deletions(-) diff --git a/data/model.json b/data/model.json index d4dfbe4c..ff9d62f4 100644 --- a/data/model.json +++ b/data/model.json @@ -735,7 +735,7 @@ "max": 32 }, { - "id": "mdlSucces", + "id": "mdlSuccess", "type": "checkbox", "ro": true, "o": 106, diff --git a/src/App/AppEffects.h b/src/App/AppEffects.h index 9ed42c0e..19637783 100644 --- a/src/App/AppEffects.h +++ b/src/App/AppEffects.h @@ -78,8 +78,8 @@ class Effect { virtual void controls(JsonObject parentVar, Leds &leds) {} - void addPalette(JsonObject parentVar, uint8_t value, uint8_t rowNr) { - JsonObject currentVar = ui->initSelect(parentVar, "pal", value, rowNr, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + void addPalette(JsonObject parentVar, uint8_t value) { + JsonObject currentVar = ui->initSelect(parentVar, "pal", value, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_ValueFun: mdl->setValue(var, 4, rowNr); //4 is default return true; @@ -131,9 +131,9 @@ class SolidEffect: public Effect { leds.fill_solid(color); } void controls(JsonObject parentVar, Leds &leds) { - ui->initSlider(parentVar, "Red", 182, leds.rowNr); - ui->initSlider(parentVar, "Green", 15, leds.rowNr); - ui->initSlider(parentVar, "Blue", 98, leds.rowNr); + ui->initSlider(parentVar, "Red", 182); + ui->initSlider(parentVar, "Green", 15); + ui->initSlider(parentVar, "Blue", 98); } }; @@ -178,7 +178,7 @@ class SinelonEffect: public Effect { leds[pos] = leds.getPixelColor(pos) + CHSV( gHue, 255, 192); } void controls(JsonObject parentVar, Leds &leds) { - ui->initSlider(parentVar, "BPM", 60, leds.rowNr); + ui->initSlider(parentVar, "BPM", 60); } }; //Sinelon @@ -197,14 +197,14 @@ class RunningEffect: public Effect { // leds[leds.nrOfLeds -1 - pos2] = CHSV( gHue, 255, 192); //make sure the right physical leds get their value } void controls(JsonObject parentVar, Leds &leds) { - ui->initSlider(parentVar, "BPM", 60, leds.rowNr, 0, 255, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initSlider(parentVar, "BPM", 60, 0, 255, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "comment", "in BPM!"); return true; default: return false; }}); //tbd: check if memory is freed! - ui->initSlider(parentVar, "fade", 128, leds.rowNr); + ui->initSlider(parentVar, "fade", 128); } }; @@ -238,7 +238,7 @@ class BPMEffect: public Effect { } } void controls(JsonObject parentVar, Leds &leds) { - addPalette(parentVar, 4, leds.rowNr); + addPalette(parentVar, 4); } }; @@ -282,7 +282,7 @@ class Ripples3DEffect: public Effect { } } void controls(JsonObject parentVar, Leds &leds) { - ui->initSlider(parentVar, "interval", 128, leds.rowNr); + ui->initSlider(parentVar, "interval", 128); } }; @@ -347,10 +347,10 @@ class Frizzles2D: public Effect { leds.blur2d(mdl->getValue("blur", leds.rowNr)); } void controls(JsonObject parentVar, Leds &leds) { - addPalette(parentVar, 4, leds.rowNr); - ui->initSlider(parentVar, "BPM", 60, leds.rowNr); - ui->initSlider(parentVar, "intensity", 128, leds.rowNr); - ui->initSlider(parentVar, "blur", 128, leds.rowNr); + addPalette(parentVar, 4); + ui->initSlider(parentVar, "BPM", 60); + ui->initSlider(parentVar, "intensity", 128); + ui->initSlider(parentVar, "blur", 128); } }; // Frizzles2D @@ -379,8 +379,8 @@ class Lines2D: public Effect { } void controls(JsonObject parentVar, Leds &leds) { - ui->initSlider(parentVar, "BPM", 60, leds.rowNr); - ui->initCheckBox(parentVar, "Vertical", true, leds.rowNr); + ui->initSlider(parentVar, "BPM", 60); + ui->initCheckBox(parentVar, "Vertical", true); } }; // Lines2D @@ -439,8 +439,8 @@ class DistortionWaves2D: public Effect { } } void controls(JsonObject parentVar, Leds &leds) { - ui->initSlider(parentVar, "Speed", 128, leds.rowNr); - ui->initSlider(parentVar, "scale", 128, leds.rowNr); + ui->initSlider(parentVar, "Speed", 128); + ui->initSlider(parentVar, "scale", 128); } }; // DistortionWaves2D @@ -510,12 +510,11 @@ class Octopus2D: public Effect { } } void controls(JsonObject parentVar, Leds &leds) { - addPalette(parentVar, 4, leds.rowNr); - ui->initSlider(parentVar, "Speed", 128, leds.rowNr, 1, 255); //start with speed 1 - ui->initSlider(parentVar, "Offset X", 128, leds.rowNr); - ui->initSlider(parentVar, "Offset Y", 128, leds.rowNr); - USER_PRINTF("Legs %d\n", leds.rowNr); - ui->initSlider(parentVar, "Legs", 4, leds.rowNr, 1, 8); + addPalette(parentVar, 4); + ui->initSlider(parentVar, "Speed", 128, 1, 255); //start with speed 1 + ui->initSlider(parentVar, "Offset X", 128); + ui->initSlider(parentVar, "Offset Y", 128); + ui->initSlider(parentVar, "Legs", 4, 1, 8); } }; // Octopus2D @@ -562,11 +561,11 @@ class Lissajous2D: public Effect { } } void controls(JsonObject parentVar, Leds &leds) { - addPalette(parentVar, 4, leds.rowNr); - ui->initSlider(parentVar, "X frequency", 64, leds.rowNr); - ui->initSlider(parentVar, "Fade rate", 128, leds.rowNr); - ui->initSlider(parentVar, "Speed", 128, leds.rowNr); - ui->initCheckBox(parentVar, "Smooth", false, leds.rowNr); + addPalette(parentVar, 4); + ui->initSlider(parentVar, "X frequency", 64); + ui->initSlider(parentVar, "Fade rate", 128); + ui->initSlider(parentVar, "Speed", 128); + ui->initCheckBox(parentVar, "Smooth", false); } }; // Lissajous2D @@ -647,9 +646,9 @@ class BouncingBalls1D: public Effect { } void controls(JsonObject parentVar, Leds &leds) { - addPalette(parentVar, 4, leds.rowNr); - ui->initSlider(parentVar, "gravity", 128, leds.rowNr); - ui->initSlider(parentVar, "balls", 8, leds.rowNr, 1, 16); + addPalette(parentVar, 4); + ui->initSlider(parentVar, "gravity", 128); + ui->initSlider(parentVar, "balls", 8, 1, 16); } }; // BouncingBalls2D @@ -704,9 +703,9 @@ class ScrollingText2D: public Effect { } void controls(JsonObject parentVar, Leds &leds) { - ui->initText(parentVar, "text", "StarMod", leds.rowNr); - ui->initSlider(parentVar, "Speed", 128, leds.rowNr); - ui->initSelect(parentVar, "font", 0, leds.rowNr, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(parentVar, "text", "StarMod"); + ui->initSlider(parentVar, "Speed", 128); + ui->initSelect(parentVar, "font", 0, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: { JsonArray select = web->addResponseA(var["id"], "options"); select.add("4x6"); @@ -820,11 +819,11 @@ class GEQEffect:public Effect { } void controls(JsonObject parentVar, Leds &leds) { - addPalette(parentVar, 4, leds.rowNr); - ui->initSlider(parentVar, "fadeOut", 255, leds.rowNr); - ui->initSlider(parentVar, "ripple", 128, leds.rowNr); - ui->initCheckBox(parentVar, "colorBars", false, leds.rowNr); - ui->initCheckBox(parentVar, "smoothBars", true, leds.rowNr); + addPalette(parentVar, 4); + ui->initSlider(parentVar, "fadeOut", 255); + ui->initSlider(parentVar, "ripple", 128); + ui->initCheckBox(parentVar, "colorBars", false); + ui->initCheckBox(parentVar, "smoothBars", true); // Nice an effect can register it's own DMX channel, but not a fan of repeating the range and type of the param @@ -880,8 +879,8 @@ class AudioRings:public RingEffect { } void controls(JsonObject parentVar, Leds &leds) { - addPalette(parentVar, 4, leds.rowNr); - ui->initCheckBox(parentVar, "inWards", true, leds.rowNr); + addPalette(parentVar, 4); + ui->initCheckBox(parentVar, "inWards", true); } }; @@ -940,11 +939,11 @@ class FreqMatrix:public Effect { } void controls(JsonObject parentVar, Leds &leds) { - ui->initSlider(parentVar, "Speed", 255, leds.rowNr); - ui->initSlider(parentVar, "Sound effect", 128, leds.rowNr); - ui->initSlider(parentVar, "Low bin", 18, leds.rowNr); - ui->initSlider(parentVar, "High bin", 48, leds.rowNr); - ui->initSlider(parentVar, "Sensivity", 30, leds.rowNr, 10, 100); + ui->initSlider(parentVar, "Speed", 255); + ui->initSlider(parentVar, "Sound effect", 128); + ui->initSlider(parentVar, "Low bin", 18); + ui->initSlider(parentVar, "High bin", 48); + ui->initSlider(parentVar, "Sensivity", 30, 10, 100); } }; @@ -1031,9 +1030,9 @@ class Effects { bool setEffect(Leds &leds, JsonObject var, uint8_t rowNr) { bool doMap = false; - leds.fx = mdl->getValue(var, leds.rowNr); + leds.fx = mdl->getValue(var, rowNr); - USER_PRINTF("setEffect l:%d %d\n", leds.rowNr, leds.fx); + USER_PRINTF("setEffect fx[%d]: %d\n", rowNr, leds.fx); if (leds.fx < effects.size()) { @@ -1059,7 +1058,6 @@ class Effects { sharedData.clear(); //make sure all values are 0 - for (JsonObject var: var["n"].as()) { //for all controls if (var["o"].as() >= 0) { //post init var["o"] = -var["o"].as(); // set all negative @@ -1067,7 +1065,9 @@ class Effects { } Effect* effect = effects[leds.fx]; + ui->parentRowNr = rowNr; effect->controls(var, leds); //new controls are positive + ui->parentRowNr = UINT8_MAX; effect->setup(leds); //if changed then run setup once (like call==0 in WLED) diff --git a/src/App/AppModFixture.h b/src/App/AppModFixture.h index 22fdafef..715052a6 100644 --- a/src/App/AppModFixture.h +++ b/src/App/AppModFixture.h @@ -21,7 +21,7 @@ class AppModFixture:public SysModule { parentVar = ui->initAppMod(parentVar, name); if (parentVar["o"] > -1000) parentVar["o"] = -1000; //set default order. Don't use auto generated order as order can be changed in the ui (WIP) - JsonObject currentVar = ui->initCheckBox(parentVar, "on", true, UINT8_MAX, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + JsonObject currentVar = ui->initCheckBox(parentVar, "on", true, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "On/Off"); return true; @@ -30,7 +30,7 @@ class AppModFixture:public SysModule { currentVar["stage"] = true; //logarithmic slider (10) - currentVar = ui->initSlider(parentVar, "bri", 10, UINT8_MAX, 0, 255, false , [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + currentVar = ui->initSlider(parentVar, "bri", 10, 0, 255, false , [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Brightness"); @@ -84,7 +84,7 @@ class AppModFixture:public SysModule { default: return false; }}); - ui->initSelect(parentVar, "fixture", lds->fixture.fixtureNr, UINT8_MAX, false ,[](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initSelect(parentVar, "fixture", lds->fixture.fixtureNr, false ,[](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: { @@ -116,7 +116,7 @@ class AppModFixture:public SysModule { default: return false; }}); //fixture - ui->initCoord3D(parentVar, "fixSize", lds->fixture.size, UINT8_MAX, 0, UINT16_MAX, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initCoord3D(parentVar, "fixSize", lds->fixture.size, 0, UINT16_MAX, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Size"); // web->addResponse(var["id"], "value", fixture.size); @@ -134,19 +134,16 @@ class AppModFixture:public SysModule { }}); ui->initNumber(parentVar, "fps", lds->fps, 1, 999, false , [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun - case f_UIFun: web->addResponse(var["id"], "comment", "Frames per second"); return true; - case f_ChangeFun: lds->fps = var["value"]; return true; - default: return false; }}); - ui->initText(parentVar, "realFps", nullptr, UINT8_MAX, 10, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(parentVar, "realFps", nullptr, 10, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponseV(var["id"], "comment", "f(%d leds)", lds->fixture.nrOfLeds); return true; @@ -154,18 +151,15 @@ class AppModFixture:public SysModule { }}); #ifdef STARMOD_USERMOD_WLEDAUDIO - ui->initCheckBox(parentVar, "mHead", false, UINT8_MAX, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun - + ui->initCheckBox(parentVar, "mHead", false, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Moving heads"); web->addResponse(var["id"], "comment", "Move on GEQ"); return true; - case f_ChangeFun: if (!var["value"]) lds->fixture.head = {0,0,0}; return true; - default: return false; }}); #endif diff --git a/src/App/AppModFixtureGen.h b/src/App/AppModFixtureGen.h index 6c295ede..83916d4b 100644 --- a/src/App/AppModFixtureGen.h +++ b/src/App/AppModFixtureGen.h @@ -535,7 +535,7 @@ class AppModFixtureGen:public SysModule { parentVar = ui->initUserMod(parentVar, name); if (parentVar["o"] > -1000) parentVar["o"] = -1200; //set default order. Don't use auto generated order as order can be changed in the ui (WIP) - ui->initSelect(parentVar, "fixtureGen", 0, UINT8_MAX, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initSelect(parentVar, "fixtureGen", 0, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: { web->addResponse(var["id"], "label", "Fixture"); @@ -565,7 +565,7 @@ class AppModFixtureGen:public SysModule { default: return false; }}); //fixtureGen - ui->initText(parentVar, "pinList", "16", UINT8_MAX, 32, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(parentVar, "pinList", "16", 32, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "comment", "One or more e.g. 12,13,14"); return true; @@ -619,14 +619,14 @@ class AppModFixtureGen:public SysModule { ui->initNumber(parentVar, "ledCount", 24, 1, NUM_LEDS_Max); } else if (value == f_2DRings241) { - ui->initCheckBox(parentVar, "in2out", true, UINT8_MAX); + ui->initCheckBox(parentVar, "in2out", true); } else if (value == f_2DWheel) { ui->initNumber(parentVar, "nrOfSpokes", 36, 1, 360); ui->initNumber(parentVar, "ledsPerSpoke", 24, 1, 360); } else if (value == f_3DCone) { - ui->initCheckBox(parentVar, "in2out", true, UINT8_MAX); + ui->initCheckBox(parentVar, "in2out", true); ui->initNumber(parentVar, "nrOfRings", 24, 1, 360); } else if (value == f_2DMatrix) { @@ -636,7 +636,7 @@ class AppModFixtureGen:public SysModule { ui->initNumber(parentVar, "height", 8, 1, 255); - ui->initSelect(parentVar, "firstLedX", 0, UINT8_MAX, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initSelect(parentVar, "firstLedX", 0, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: { web->addResponse(var["id"], "comment", "WIP"); JsonArray select = web->addResponseA(var["id"], "options"); @@ -647,7 +647,7 @@ class AppModFixtureGen:public SysModule { default: return false; }}); - ui->initSelect(parentVar, "firstLedY", 0, UINT8_MAX, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initSelect(parentVar, "firstLedY", 0, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: { web->addResponse(var["id"], "comment", "WIP"); JsonArray select = web->addResponseA(var["id"], "options"); diff --git a/src/App/AppModLeds.h b/src/App/AppModLeds.h index 7710bb5b..9b5c62e2 100644 --- a/src/App/AppModLeds.h +++ b/src/App/AppModLeds.h @@ -105,7 +105,7 @@ class AppModLeds:public SysModule { default: return false; }}); - currentVar = ui->initSelect(tableVar, "fx", 0, UINT8_MAX, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + currentVar = ui->initSelect(tableVar, "fx", 0, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_ValueFun: mdl->setValue(var, fixture.ledsList[rowNr].fx, rowNr); return true; @@ -131,7 +131,7 @@ class AppModLeds:public SysModule { }}, fixture.ledsList.size()); currentVar["stage"] = true; - currentVar = ui->initSelect(tableVar, "pro", 2, UINT8_MAX, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + currentVar = ui->initSelect(tableVar, "pro", 2, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_ValueFun: mdl->setValue(var, fixture.ledsList[rowNr].projectionNr, rowNr); return true; @@ -162,7 +162,7 @@ class AppModLeds:public SysModule { }}, fixture.ledsList.size()); currentVar["stage"] = true; - ui->initCoord3D(tableVar, "fxStart", fixture.ledsList[0].startPos, UINT8_MAX, 0, NUM_LEDS_Max, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initCoord3D(tableVar, "fxStart", fixture.ledsList[0].startPos, 0, NUM_LEDS_Max, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_ValueFun: USER_PRINTF("fxStart[%d] valueFun %d,%d,%d\n", rowNr, fixture.ledsList[rowNr].startPos.x, fixture.ledsList[rowNr].startPos.y, fixture.ledsList[rowNr].startPos.z); mdl->setValue(var, fixture.ledsList[rowNr].startPos, rowNr); @@ -187,7 +187,7 @@ class AppModLeds:public SysModule { default: return false; }}, fixture.ledsList.size()); - ui->initCoord3D(tableVar, "fxEnd", fixture.ledsList[0].endPos, UINT8_MAX, 0, NUM_LEDS_Max, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initCoord3D(tableVar, "fxEnd", fixture.ledsList[0].endPos, 0, NUM_LEDS_Max, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_ValueFun: mdl->setValue(var, fixture.ledsList[rowNr].endPos, rowNr); USER_PRINTF("fxEnd[%d] valueFun %d,%d,%d\n", rowNr, fixture.ledsList[rowNr].endPos.x, fixture.ledsList[rowNr].endPos.y, fixture.ledsList[rowNr].endPos.z); @@ -212,14 +212,14 @@ class AppModLeds:public SysModule { default: return false; }}, fixture.ledsList.size()); - ui->initText(tableVar, "fxSize", nullptr, 0, 32, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(tableVar, "fxSize", nullptr, 32, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Size"); return true; default: return false; }}); - ui->initSelect(parentVar, "fxLayout", 0, UINT8_MAX, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initSelect(parentVar, "fxLayout", 0, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: { web->addResponse(var["id"], "label", "Layout"); JsonArray select = web->addResponseA(var["id"], "options"); diff --git a/src/Sys/SysModFiles.cpp b/src/Sys/SysModFiles.cpp index ad6b3a39..95b09830 100644 --- a/src/Sys/SysModFiles.cpp +++ b/src/Sys/SysModFiles.cpp @@ -68,7 +68,7 @@ void SysModFiles::setup() { default: return false; }}); - ui->initText(tableVar, "flName", nullptr, UINT8_MAX, 32, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(tableVar, "flName", nullptr, 32, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Name"); return true; @@ -89,26 +89,35 @@ void SysModFiles::setup() { default: return false; }}); - ui->initText(parentVar, "drsize", nullptr, UINT8_MAX, 32, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initProgress(parentVar, "drsize", UINT16_MAX, 0, files->totalBytes(), true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: - web->addResponseV(var["id"], "value", "%d / %d B", files->usedBytes(), files->totalBytes()); - web->addResponse(var["id"], "label", "Total FS size"); + web->addResponse(var["id"], "label", "FS Size"); + return true; + case f_ChangeFun: + var["max"] = files->totalBytes(); //makes sense? + web->addResponse(var["id"], "value", files->usedBytes()); + web->addResponseV(var["id"], "comment", "%d / %d B", files->usedBytes(), files->totalBytes()); return true; default: return false; }}); + } -void SysModFiles::loop(){ +void SysModFiles::loop() { // SysModule::loop(); if (filesChanged) { - mdl->setUIValueV("drsize", "%d / %d B", usedBytes(), totalBytes()); + ui->callVarFun(mdl->findVar("drsize")); filesChanged = false; ui->processUiFun("fileTbl"); } } +void SysModFiles::loop10s() { + ui->callVarFun(mdl->findVar("drsize")); +} + bool SysModFiles::remove(const char * path) { filesChange(); USER_PRINTF("File remove %s\n", path); diff --git a/src/Sys/SysModFiles.h b/src/Sys/SysModFiles.h index 01742105..bfe23d68 100644 --- a/src/Sys/SysModFiles.h +++ b/src/Sys/SysModFiles.h @@ -19,6 +19,7 @@ class SysModFiles: public SysModule { SysModFiles(); void setup(); void loop(); + void loop10s(); bool remove(const char * path); diff --git a/src/Sys/SysModModel.cpp b/src/Sys/SysModModel.cpp index 9d993114..be631da1 100644 --- a/src/Sys/SysModModel.cpp +++ b/src/Sys/SysModModel.cpp @@ -38,7 +38,7 @@ void SysModModel::setup() { parentVar = ui->initSysMod(parentVar, name); if (parentVar["o"] > -1000) parentVar["o"] = -4000; //set default order. Don't use auto generated order as order can be changed in the ui (WIP) - ui->initProgress(parentVar, "mSize", UINT16_MAX, UINT8_MAX, 0, model->capacity(), true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initProgress(parentVar, "mSize", UINT16_MAX, 0, model->capacity(), true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Size"); return true; @@ -60,7 +60,7 @@ void SysModModel::setup() { default: return false; }}); - ui->initCheckBox(parentVar, "showObsolete", doShowObsolete, UINT8_MAX, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initCheckBox(parentVar, "showObsolete", doShowObsolete, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "comment", "Show in UI (refresh)"); return true; @@ -111,7 +111,7 @@ void SysModModel::setup() { } } void SysModModel::loop10s() { - ui->callVarFun(mdl->findVar("mSize"), UINT8_MAX, f_ChangeFun); + ui->callVarFun(mdl->findVar("mSize")); } void SysModModel::cleanUpModel(JsonArray vars, bool oPos, bool ro) { @@ -224,7 +224,7 @@ void SysModModel::callChFunAndWs(JsonObject var, uint8_t rowNr, const char * val if (var["stage"]) ui->stageVarChanged = true; - ui->callVarFun(var, rowNr==UINT8_MAX?0:rowNr, f_ChangeFun); //send rowNr = 0 if no rowNr + ui->callVarFun(var, rowNr, f_ChangeFun); //if no rowNr use rowNr 0 web->sendResponseObject(); } \ No newline at end of file diff --git a/src/Sys/SysModModel.h b/src/Sys/SysModModel.h index f70b7f22..d3a2f966 100644 --- a/src/Sys/SysModModel.h +++ b/src/Sys/SysModModel.h @@ -166,7 +166,7 @@ class SysModModel:public SysModule { USER_PRINTF("dev setValue value removed %s %s\n", var["id"].as(), oldValue.c_str()); //old value } else { - USER_PRINTF("setValue changed %s %s->%s\n", var["id"].as(), oldValue.c_str(), var["value"].as().c_str()); //old value + USER_PRINTF("setValue changed %s %s -> %s\n", var["id"].as(), oldValue.c_str(), var["value"].as().c_str()); //old value callChFunAndWs(var); } } @@ -269,6 +269,10 @@ class SysModModel:public SysModule { //run the change function and send response to all? websocket clients static void callChFunAndWs(JsonObject var, uint8_t rowNr = UINT8_MAX, const char * value = nullptr); + const char * jsonToChar(JsonObject var, const char * name) { + return var[name].as(); + } + private: bool doShowObsolete = false; bool cleanUpModelDone = false; diff --git a/src/Sys/SysModNetwork.cpp b/src/Sys/SysModNetwork.cpp index 01cb3ea8..c2bc9ed2 100644 --- a/src/Sys/SysModNetwork.cpp +++ b/src/Sys/SysModNetwork.cpp @@ -30,7 +30,7 @@ void SysModNetwork::setup() { // web->addResponse(var["id"], "comment", "List of defined and available Wifi APs"); // }); - ui->initText(parentVar, "ssid", "", UINT8_MAX, 32, false); + ui->initText(parentVar, "ssid", "", 32, false); // , nullptr // , nullptr, nullptr, 1, [this](JsonObject var, uint8_t rowNr) { //valueFun // var["value"][0] = ""; @@ -54,14 +54,14 @@ void SysModNetwork::setup() { default: return false; }}); - ui->initText(parentVar, "nwstatus", nullptr, UINT8_MAX, 32, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(parentVar, "nwstatus", nullptr, 32, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Status"); return true; default: return false; }}); - ui->initText(parentVar, "rssi", nullptr, UINT8_MAX, 32, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(parentVar, "rssi", nullptr, 32, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Wifi signal"); return true; diff --git a/src/Sys/SysModPins.cpp b/src/Sys/SysModPins.cpp index b3d1d557..5f8480ad 100644 --- a/src/Sys/SysModPins.cpp +++ b/src/Sys/SysModPins.cpp @@ -63,14 +63,14 @@ void SysModPins::setup() { default: return false; }}); - ui->initText(tableVar, "pinOwner", nullptr, UINT8_MAX, 32, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(tableVar, "pinOwner", nullptr, 32, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Owner"); return true; default: return false; }}); - ui->initText(tableVar, "pinDetails", nullptr, UINT8_MAX, 256, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(tableVar, "pinDetails", nullptr, 256, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Details"); return true; @@ -110,8 +110,8 @@ void SysModPins::setup() { // ui->initCheckBox(parentVar, "pin2", true, UINT8_MAX, false, nullptr, updateGPIO); // ui->initCheckBox(parentVar, "pin4"); - ui->initCheckBox(parentVar, "pin19", true, UINT8_MAX, false, updateGPIO); - // ui->initCheckBox(parentVar, "pin33", true, UINT8_MAX); + ui->initCheckBox(parentVar, "pin19", true, false, updateGPIO); + // ui->initCheckBox(parentVar, "pin33", true); } void SysModPins::loop1s() { diff --git a/src/Sys/SysModPrint.cpp b/src/Sys/SysModPrint.cpp index efb0e804..ae5adc5c 100644 --- a/src/Sys/SysModPrint.cpp +++ b/src/Sys/SysModPrint.cpp @@ -57,7 +57,7 @@ void SysModPrint::setup() { parentVar = ui->initSysMod(parentVar, name); if (parentVar["o"] > -1000) parentVar["o"] = -2300; //set default order. Don't use auto generated order as order can be changed in the ui (WIP) - ui->initSelect(parentVar, "pOut", 1, UINT8_MAX, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initSelect(parentVar, "pOut", 1, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: { web->addResponse(var["id"], "label", "Output"); diff --git a/src/Sys/SysModSystem.cpp b/src/Sys/SysModSystem.cpp index 09bc93ae..45765b06 100644 --- a/src/Sys/SysModSystem.cpp +++ b/src/Sys/SysModSystem.cpp @@ -26,7 +26,7 @@ void SysModSystem::setup() { parentVar = ui->initSysMod(parentVar, name); if (parentVar["o"] > -1000) parentVar["o"] = -2100; //set default order. Don't use auto generated order as order can be changed in the ui (WIP) - ui->initText(parentVar, "serverName", "StarMod", UINT8_MAX, 32, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(parentVar, "serverName", "StarMod", 32, false, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Name"); web->addResponse(var["id"], "comment", "Instance name"); @@ -34,7 +34,7 @@ void SysModSystem::setup() { default: return false; }}); - ui->initText(parentVar, "upTime", nullptr, UINT8_MAX, 16, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(parentVar, "upTime", nullptr, 16, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "comment", "Uptime of board"); return true; @@ -56,11 +56,11 @@ void SysModSystem::setup() { default: return false; }}); - ui->initText(parentVar, "loops", nullptr, UINT8_MAX, 16, true); + ui->initText(parentVar, "loops", nullptr, 16, true); - ui->initText(parentVar, "chip", nullptr, UINT8_MAX, 16, true); + ui->initText(parentVar, "chip", nullptr, 16, true); - ui->initProgress(parentVar, "heap", UINT16_MAX, UINT8_MAX, 0, ESP.getHeapSize()/1000, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initProgress(parentVar, "heap", UINT16_MAX, 0, ESP.getHeapSize()/1000, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_ChangeFun: var["max"] = ESP.getHeapSize()/1000; //makes sense? web->addResponse(var["id"], "value", (ESP.getHeapSize()-ESP.getFreeHeap()) / 1000); @@ -70,7 +70,7 @@ void SysModSystem::setup() { }}); if (psramFound()) { - ui->initProgress(parentVar, "psram", UINT16_MAX, UINT8_MAX, 0, ESP.getPsramSize()/1000, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initProgress(parentVar, "psram", UINT16_MAX, 0, ESP.getPsramSize()/1000, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_ChangeFun: var["max"] = ESP.getPsramSize()/1000; //makes sense? web->addResponse(var["id"], "value", (ESP.getPsramSize()-ESP.getFreePsram()) / 1000); @@ -80,7 +80,7 @@ void SysModSystem::setup() { }}); } - ui->initProgress(parentVar, "stack", UINT16_MAX, UINT8_MAX, 0, 4096, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initProgress(parentVar, "stack", UINT16_MAX, 0, 4096, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_ChangeFun: web->addResponse(var["id"], "value", uxTaskGetStackHighWaterMark(NULL)); web->addResponseV(var["id"], "comment", "%d / 4096 B", uxTaskGetStackHighWaterMark(NULL)); @@ -88,7 +88,7 @@ void SysModSystem::setup() { default: return false; }}); - ui->initSelect(parentVar, "reset0", (int)rtc_get_reset_reason(0), UINT8_MAX, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initSelect(parentVar, "reset0", (int)rtc_get_reset_reason(0), true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Reset 0"); web->addResponse(var["id"], "comment", "Reason Core 0"); @@ -98,7 +98,7 @@ void SysModSystem::setup() { }}); if (ESP.getChipCores() > 1) - ui->initSelect(parentVar, "reset1", (int)rtc_get_reset_reason(1), UINT8_MAX, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initSelect(parentVar, "reset1", (int)rtc_get_reset_reason(1), true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Reset 1"); web->addResponse(var["id"], "comment", "Reason Core 1"); @@ -107,7 +107,7 @@ void SysModSystem::setup() { default: return false; }}); - ui->initSelect(parentVar, "restartReason", (int)esp_reset_reason(), UINT8_MAX, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initSelect(parentVar, "restartReason", (int)esp_reset_reason(), true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Restart"); web->addResponse(var["id"], "comment", "Reason restart"); @@ -127,7 +127,7 @@ void SysModSystem::setup() { USER_PRINTF("version %s %s %s %d:%d:%d\n", version, __DATE__, __TIME__, hour, minute, second); - ui->initText(parentVar, "version", nullptr, UINT8_MAX, 16, true); + ui->initText(parentVar, "version", nullptr, 16, true); // ui->initText(parentVar, "date", __DATE__, 16, true); // ui->initText(parentVar, "time", __TIME__, 16, true); @@ -166,11 +166,11 @@ void SysModSystem::loop10s() { mdl->setUIValueV("chip", "%s %s c#:%d %d mHz f:%d KB %d mHz %d", ESP.getChipModel(), ESP.getSdkVersion(), ESP.getChipCores(), ESP.getCpuFreqMHz(), ESP.getFlashChipSize()/1024, ESP.getFlashChipSpeed()/1000000, ESP.getFlashChipMode()); - ui->callVarFun(mdl->findVar("heap"), UINT8_MAX, f_ChangeFun); - ui->callVarFun(mdl->findVar("stack"), UINT8_MAX, f_ChangeFun); + ui->callVarFun(mdl->findVar("heap")); + ui->callVarFun(mdl->findVar("stack")); if (psramFound()) { - ui->callVarFun(mdl->findVar("psram"), UINT8_MAX, f_ChangeFun); + ui->callVarFun(mdl->findVar("psram")); } USER_PRINTF("❤️"); //heartbeat } diff --git a/src/Sys/SysModUI.cpp b/src/Sys/SysModUI.cpp index ef843348..fd4383ae 100644 --- a/src/Sys/SysModUI.cpp +++ b/src/Sys/SysModUI.cpp @@ -18,6 +18,7 @@ std::vector SysModUI::varFunctions; std::vector SysModUI::loopFunctions; int SysModUI::varCounter = 1; //start with 1 so it can be negative, see var["o"] bool SysModUI::stageVarChanged = false; +uint8_t SysModUI::parentRowNr = UINT8_MAX; SysModUI::SysModUI() :SysModule("UI") { }; @@ -46,7 +47,7 @@ void SysModUI::setup() { default: return false; }}); - initText(tableVar, "vlVar", nullptr, UINT8_MAX, 32, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + initText(tableVar, "vlVar", nullptr, 32, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Name"); return true; @@ -258,7 +259,7 @@ void SysModUI::processJson(JsonVariant json) { void SysModUI::processUiFun(const char * id) { web->sendResponseObject(); //send old stuff first - JsonObject responseObject = web->getResponseDoc()->as(); + JsonObject responseObject = web->getResponseObject(); JsonArray array = responseObject.createNestedArray("uiFun"); array.add(id); diff --git a/src/Sys/SysModUI.h b/src/Sys/SysModUI.h index 4492e8a7..a4f434b3 100644 --- a/src/Sys/SysModUI.h +++ b/src/Sys/SysModUI.h @@ -59,6 +59,8 @@ class SysModUI:public SysModule { static bool stageVarChanged;// = false; //tbd: move mechanism to UserModInstances as there it will be used static std::vector varFunctions; //static because of static functions callChFunAndWs, processJson... + static uint8_t parentRowNr; + SysModUI(); //serve index.htm @@ -68,76 +70,80 @@ class SysModUI:public SysModule { void loop1s(); JsonObject initAppMod(JsonObject parent, const char * id, const char * value = nullptr, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { - return initVarAndUpdate(parent, id, "appmod", value, UINT8_MAX, 0, 0, readOnly, varFun, nrOfRows); + return initVarAndUpdate(parent, id, "appmod", value, 0, 0, readOnly, varFun, nrOfRows); } JsonObject initSysMod(JsonObject parent, const char * id, const char * value = nullptr, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { - return initVarAndUpdate(parent, id, "sysmod", value, UINT8_MAX, 0, 0, readOnly, varFun, nrOfRows); + return initVarAndUpdate(parent, id, "sysmod", value, 0, 0, readOnly, varFun, nrOfRows); } JsonObject initUserMod(JsonObject parent, const char * id, const char * value = nullptr, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { - return initVarAndUpdate(parent, id, "usermod", value, UINT8_MAX, 0, 0, readOnly, varFun, nrOfRows); + return initVarAndUpdate(parent, id, "usermod", value, 0, 0, readOnly, varFun, nrOfRows); } JsonObject initTable(JsonObject parent, const char * id, const char * value = nullptr, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { - return initVarAndUpdate(parent, id, "table", value, UINT8_MAX, 0, 0, readOnly, varFun, nrOfRows); + return initVarAndUpdate(parent, id, "table", value, 0, 0, readOnly, varFun, nrOfRows); } - JsonObject initText(JsonObject parent, const char * id, const char * value = nullptr, uint8_t rowNr = UINT8_MAX, uint16_t max = 32, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { - return initVarAndUpdate(parent, id, "text", value, rowNr, 0, max, readOnly, varFun, nrOfRows); + JsonObject initText(JsonObject parent, const char * id, const char * value = nullptr, uint16_t max = 32, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { + return initVarAndUpdate(parent, id, "text", value, 0, max, readOnly, varFun, nrOfRows); } JsonObject initPassword(JsonObject parent, const char * id, const char * value = nullptr, uint8_t max = 32, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { - return initVarAndUpdate(parent, id, "password", value, UINT8_MAX, 0, 0, readOnly, varFun, nrOfRows); + return initVarAndUpdate(parent, id, "password", value, 0, 0, readOnly, varFun, nrOfRows); } JsonObject initNumber(JsonObject parent, const char * id, int value = UINT16_MAX, int min = 0, int max = UINT16_MAX, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { - return initVarAndUpdate(parent, id, "number", value, UINT8_MAX, min, max, readOnly, varFun, nrOfRows); + return initVarAndUpdate(parent, id, "number", value, min, max, readOnly, varFun, nrOfRows); } - JsonObject initProgress(JsonObject parent, const char * id, int value = UINT16_MAX, uint8_t rowNr = UINT8_MAX, int min = 0, int max = 255, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { - return initVarAndUpdate(parent, id, "progress", value, rowNr, min, max, readOnly, varFun, nrOfRows); + JsonObject initProgress(JsonObject parent, const char * id, int value = UINT16_MAX, int min = 0, int max = 255, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { + return initVarAndUpdate(parent, id, "progress", value, min, max, readOnly, varFun, nrOfRows); } - JsonObject initCoord3D(JsonObject parent, const char * id, Coord3D value = {UINT16_MAX, UINT16_MAX, UINT16_MAX}, uint8_t rowNr = UINT8_MAX, int min = 0, int max = UINT16_MAX, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { - return initVarAndUpdate(parent, id, "coord3D", value, rowNr, min, max, readOnly, varFun, nrOfRows); + JsonObject initCoord3D(JsonObject parent, const char * id, Coord3D value = {UINT16_MAX, UINT16_MAX, UINT16_MAX}, int min = 0, int max = UINT16_MAX, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { + return initVarAndUpdate(parent, id, "coord3D", value, min, max, readOnly, varFun, nrOfRows); } //init a range slider, range between 0 and 255! - JsonObject initSlider(JsonObject parent, const char * id, int value = UINT16_MAX, uint8_t rowNr = UINT8_MAX, int min = 0, int max = 255, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { - return initVarAndUpdate(parent, id, "range", value, rowNr, min, max, readOnly, varFun, nrOfRows); + JsonObject initSlider(JsonObject parent, const char * id, int value = UINT16_MAX, int min = 0, int max = 255, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { + return initVarAndUpdate(parent, id, "range", value, min, max, readOnly, varFun, nrOfRows); } JsonObject initCanvas(JsonObject parent, const char * id, int value = UINT16_MAX, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { - return initVarAndUpdate(parent, id, "canvas", value, UINT8_MAX, 0, 0, readOnly, varFun, nrOfRows); + return initVarAndUpdate(parent, id, "canvas", value, 0, 0, readOnly, varFun, nrOfRows); } //supports 3 state value: if UINT16_MAX it is indeterminated - JsonObject initCheckBox(JsonObject parent, const char * id, int value = UINT16_MAX, uint8_t rowNr = UINT8_MAX, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { - return initVarAndUpdate(parent, id, "checkbox", value, rowNr, 0, 0, readOnly, varFun, nrOfRows); + JsonObject initCheckBox(JsonObject parent, const char * id, int value = UINT16_MAX, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { + return initVarAndUpdate(parent, id, "checkbox", value, 0, 0, readOnly, varFun, nrOfRows); } //a button never gets a value JsonObject initButton(JsonObject parent, const char * id, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { - return initVarAndUpdate(parent, id, "button", false, UINT8_MAX, 0, 0, readOnly, varFun, nrOfRows); + return initVarAndUpdate(parent, id, "button", false, 0, 0, readOnly, varFun, nrOfRows); } - JsonObject initSelect(JsonObject parent, const char * id, int value = UINT16_MAX, uint8_t rowNr = UINT8_MAX, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { - return initVarAndUpdate(parent, id, "select", value, rowNr, 0, 0, readOnly, varFun, nrOfRows); + JsonObject initSelect(JsonObject parent, const char * id, int value = UINT16_MAX, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { + return initVarAndUpdate(parent, id, "select", value, 0, 0, readOnly, varFun, nrOfRows); } JsonObject initTextArea(JsonObject parent, const char * id, const char * value = nullptr, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { - return initVarAndUpdate(parent, id, "textarea", value, UINT8_MAX, 0, 0, readOnly, varFun, nrOfRows); + return initVarAndUpdate(parent, id, "textarea", value, 0, 0, readOnly, varFun, nrOfRows); } JsonObject initURL(JsonObject parent, const char * id, const char * value = nullptr, bool readOnly = false, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { - return initVarAndUpdate(parent, id, "url", value, UINT8_MAX, 0, 0, readOnly, varFun, nrOfRows); + return initVarAndUpdate(parent, id, "url", value, 0, 0, readOnly, varFun, nrOfRows); } template - JsonObject initVarAndUpdate(JsonObject parent, const char * id, const char * type, Type value, uint8_t rowNr = UINT8_MAX, int min = 0, int max = 255, bool readOnly = true, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { + JsonObject initVarAndUpdate(JsonObject parent, const char * id, const char * type, Type value, int min = 0, int max = 255, bool readOnly = true, VarFun varFun = nullptr, uint8_t nrOfRows = 0) { JsonObject var = initVar(parent, id, type, readOnly, varFun); if (min) var["min"] = min; if (max && max != UINT16_MAX) var["max"] = max; + if (parentRowNr != UINT8_MAX) { + USER_PRINTF("parentRowNr %s: %d for %s\n", mdl->jsonToChar(parent, "id"), parentRowNr, mdl->jsonToChar(var, "id")); + } + bool valueNeedsUpdate = false; if (strcmp(type, "button") != 0) { //button never gets a value if (var["value"].isNull()) { @@ -145,10 +151,10 @@ class SysModUI:public SysModule { // print->printJson("initVarAndUpdate varFun value is null", var); } else if (var["value"].is()) { JsonArray valueArray = var["value"].as(); - if (rowNr != UINT8_MAX) { - if (rowNr >= valueArray.size()) + if (parentRowNr != UINT8_MAX) { // if var in table + if (parentRowNr >= valueArray.size()) valueNeedsUpdate = true; - else if (valueArray[rowNr].isNull()) + else if (valueArray[parentRowNr].isNull()) valueNeedsUpdate = true; } else if (nrOfRows && valueArray.size() != nrOfRows) { @@ -161,15 +167,20 @@ class SysModUI:public SysModule { if (valueNeedsUpdate) { bool valueFunExists = false; if (varFun) { - USER_PRINTF("initVarAndUpdate valueFun %s nrOfRows:%d\n", id, nrOfRows); - for (int rowNr=0;rowNrsetValue(var, value, rowNr); //does changefun if needed + mdl->setValue(var, value, parentRowNr); //does changefun if needed, if var in table, update the table row + else + USER_PRINTF("initVarAndUpdate %s valueFun prn:%d of %d\n", id, parentRowNr, nrOfRows); } else { //do changeFun on existing value //no call of chFun for buttons otherwise all buttons will be fired which is highly undesirable @@ -181,11 +192,12 @@ class SysModUI:public SysModule { changeFunExists |= varFun(var, rowNr++, f_ChangeFun); } } - else - changeFunExists = varFun(var, 0, f_ChangeFun); //if no rowNr use rowNr 0 + else { + changeFunExists = varFun(var, UINT8_MAX, f_ChangeFun); //if no rowNr use rowNr 0 + } if (changeFunExists) - USER_PRINTF("initVarAndUpdate chFun V2 !!! init %s v:%s\n", var["id"].as(), var["value"].as().c_str()); + USER_PRINTF("initVarAndUpdate chFun init %s[x] <- %s\n", mdl->jsonToChar(var, "id"), var["value"].as().c_str()); } } @@ -194,8 +206,9 @@ class SysModUI:public SysModule { JsonObject initVar(JsonObject parent, const char * id, const char * type, bool readOnly = true, VarFun varFun = nullptr); - uint8_t callVarFun(JsonObject var, uint8_t rowNr, uint8_t funType) { + uint8_t callVarFun(JsonObject var, uint8_t rowNr = UINT8_MAX, uint8_t funType = f_ChangeFun) { uint8_t result = false; + if (!var["fun"].isNull()) {//isNull needed here! size_t funNr = var["fun"]; if (funNr < varFunctions.size()) { diff --git a/src/Sys/SysModWeb.cpp b/src/Sys/SysModWeb.cpp index aeec59df..3d823869 100644 --- a/src/Sys/SysModWeb.cpp +++ b/src/Sys/SysModWeb.cpp @@ -72,7 +72,6 @@ void SysModWeb::setup() { }}); ui->initNumber(tableVar, "clNr", UINT16_MAX, 0, 999, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun - case f_ValueFun: { //workaround as WebClient * client = ws->getClients().nth(rowNr); not working @@ -90,12 +89,10 @@ void SysModWeb::setup() { case f_UIFun: web->addResponse(var["id"], "label", "Nr"); return true; - default: return false; }}, ws->count()); - ui->initText(tableVar, "clIp", nullptr, UINT8_MAX, 16, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun - + ui->initText(tableVar, "clIp", nullptr, 16, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_ValueFun: { //workaround as WebClient * client = ws->getClients().nth(rowNr); not working @@ -109,8 +106,7 @@ void SysModWeb::setup() { default: return false; }}, ws->count()); - ui->initCheckBox(tableVar, "clIsFull", UINT16_MAX, UINT8_MAX, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun - + ui->initCheckBox(tableVar, "clIsFull", UINT16_MAX, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_ValueFun: { //workaround as WebClient * client = ws->getClients().nth(rowNr); not working @@ -120,12 +116,10 @@ void SysModWeb::setup() { case f_UIFun: web->addResponse(var["id"], "label", "Is full"); return true; - default: return false; }}, ws->count()); - ui->initSelect(tableVar, "clStatus", UINT16_MAX, UINT8_MAX, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun - + ui->initSelect(tableVar, "clStatus", UINT16_MAX, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_ValueFun: { //workaround as WebClient * client = ws->getClients().nth(rowNr); not working @@ -146,7 +140,6 @@ void SysModWeb::setup() { }}, ws->count()); ui->initNumber(tableVar, "clLength", UINT16_MAX, 0, WS_MAX_QUEUED_MESSAGES, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun - case f_ValueFun: { //workaround as WebClient * client = ws->getClients().nth(rowNr); not working @@ -160,7 +153,7 @@ void SysModWeb::setup() { default: return false; }}, ws->count()); - ui->initText(parentVar, "wsCounter", nullptr, UINT8_MAX, 16, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(parentVar, "wsCounter", nullptr, 16, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "comment", "#web socket calls"); return true; diff --git a/src/SysModules.cpp b/src/SysModules.cpp index b5ba2d7b..ee59d6e3 100644 --- a/src/SysModules.cpp +++ b/src/SysModules.cpp @@ -39,7 +39,7 @@ void SysModules::setup() { default: return false; }}); - ui->initText(tableVar, "mdlName", nullptr, UINT8_MAX, 32, true, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(tableVar, "mdlName", nullptr, 32, true, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_ValueFun: mdl->setValue(var, modules[rowNr]->name, rowNr); return true; @@ -49,7 +49,7 @@ void SysModules::setup() { default: return false; }}, modules.size()); - ui->initCheckBox(tableVar, "mdlSucces", UINT16_MAX, UINT8_MAX, true, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initCheckBox(tableVar, "mdlSuccess", UINT16_MAX, true, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_ValueFun: mdl->setValue(var, modules[rowNr]->success, rowNr); return true; @@ -59,9 +59,7 @@ void SysModules::setup() { default: return false; }}, modules.size()); - ui->initCheckBox(tableVar, "mdlEnabled", UINT16_MAX, UINT8_MAX, false - , [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun not readonly! (tbd) - + ui->initCheckBox(tableVar, "mdlEnabled", UINT16_MAX, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun not readonly! (tbd) case f_ValueFun: mdl->setValue(var, modules[rowNr]->isEnabled, rowNr); return true; @@ -69,7 +67,6 @@ void SysModules::setup() { //initially set to true, but as enabled are table cells, will be updated to an array web->addResponse(var["id"], "label", "Enabled"); return true; - case f_ChangeFun: if (rowNr != UINT8_MAX && rowNr < modules.size()) { modules[rowNr]->isEnabled = mdl->getValue(var, rowNr); @@ -80,7 +77,6 @@ void SysModules::setup() { } // print->printJson(" ", var); return true; - default: return false; }}, modules.size()); } diff --git a/src/User/UserModArtNet.h b/src/User/UserModArtNet.h index 1b2ff7c3..ee87f757 100644 --- a/src/User/UserModArtNet.h +++ b/src/User/UserModArtNet.h @@ -31,7 +31,7 @@ class UserModArtNet:public SysModule { parentVar = ui->initUserMod(parentVar, name); if (parentVar["o"] > -1000) parentVar["o"] = -3100; //set default order. Don't use auto generated order as order can be changed in the ui (WIP) - ui->initSelect(parentVar, "artInst", UINT16_MAX, UINT8_MAX, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initSelect(parentVar, "artInst", UINT16_MAX, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: { web->addResponse(var["id"], "label", "Instance"); diff --git a/src/User/UserModDDP.h b/src/User/UserModDDP.h index d2c5409e..b6c3d1d3 100644 --- a/src/User/UserModDDP.h +++ b/src/User/UserModDDP.h @@ -48,7 +48,7 @@ class UserModDDP:public SysModule { parentVar = ui->initUserMod(parentVar, name); if (parentVar["o"] > -1000) parentVar["o"] = -3000; //set default order. Don't use auto generated order as order can be changed in the ui (WIP) - ui->initSelect(parentVar, "ddpInst", UINT16_MAX, UINT8_MAX, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initSelect(parentVar, "ddpInst", UINT16_MAX, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: { web->addResponse(var["id"], "label", "Instance"); diff --git a/src/User/UserModE131.h b/src/User/UserModE131.h index aaaf3013..b4cd4dfb 100644 --- a/src/User/UserModE131.h +++ b/src/User/UserModE131.h @@ -76,7 +76,7 @@ class UserModE131:public SysModule { default: return false; }}, varsToWatch.size()); - ui->initText(tableVar, "e131Name", nullptr, UINT8_MAX, 32, true, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(tableVar, "e131Name", nullptr, 32, true, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_ValueFun: mdl->setValue(var, JsonString(varsToWatch[rowNr].id, JsonString::Copied), rowNr); return true; diff --git a/src/User/UserModInstances.h b/src/User/UserModInstances.h index 68667091..67e153c3 100644 --- a/src/User/UserModInstances.h +++ b/src/User/UserModInstances.h @@ -186,7 +186,7 @@ class UserModInstances:public SysModule { default: return false; }}); - ui->initText(tableVar, "insName", nullptr, UINT8_MAX, 32, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(tableVar, "insName", nullptr, 32, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Name"); return true; @@ -200,14 +200,14 @@ class UserModInstances:public SysModule { default: return false; }}); - ui->initText(tableVar, "insIp", nullptr, UINT8_MAX, 16, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(tableVar, "insIp", nullptr, 16, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "IP"); return true; default: return false; }}); - ui->initText(tableVar, "insType", nullptr, UINT8_MAX, 16, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + ui->initText(tableVar, "insType", nullptr, 16, true, [](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: web->addResponse(var["id"], "label", "Type"); return true; @@ -230,7 +230,7 @@ class UserModInstances:public SysModule { JsonObject currentVar; - currentVar = ui->initSelect(parentVar, "sma", 0, UINT8_MAX, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun + currentVar = ui->initSelect(parentVar, "sma", 0, false, [this](JsonObject var, uint8_t rowNr, uint8_t funType) { switch (funType) { //varFun case f_UIFun: { web->addResponse(var["id"], "label", "Sync Master"); web->addResponse(var["id"], "comment", "Instance to sync from"); diff --git a/src/testOutput.txt b/src/testOutput.txt index 2097ab43..d936dc2b 100644 --- a/src/testOutput.txt +++ b/src/testOutput.txt @@ -1,6 +1,6 @@ Reading model from /model.json... (deserializeConfigFromFS) File /model.json open to read, size 6847 bytes -Read model [{"id":"Preview","type":"appmod","ro":false,"o":1,"n":[{"id":"pview","type":"canvas","ro":false,"o":2,"loopFun":0,"interval":160}]},{"id":"Leds","type":"appmod","ro":false,"o":3,"n":[{"id":"on","type":"checkbox","ro":false,"o":4,"value":1,"stage":true},{"id":"bri","type":"range","ro":false,"o":5,"value":10,"max":255,"log":true,"stage":true},{"id":"fxTbl","type":"table","ro":false,"o":6,"n":[{"id":"pro","type":"select","ro":false,"o":13,"value":2,"stage":true},{"id":"fxStart","type":"coord3D","ro":false,"o":14,"value":[{"x":0,"y":0,"z":0}],"max":127},{"id":"fxEnd","type":"coord3D","ro":false,"o":15,"value":[{"x":32,"y":32,"z":0}],"max":127},{"id":"fxSize","type":"coord3D","ro":true,"o":16,"max":127},{"id":"fxCount","type":"number","ro":true,"o":17,"max":255}]},{"id":"fx","type":"select","ro":false,"o":7,"value":13,"stage":true,"n":[{"id":"pal","type":"select","ro":false,"o":8,"value":4,"stage":true},{"id":"speed","type":"range","ro":false,"o":9,"min":1,"max":255,"value":128},{"id":"Offset X","type":"range","ro":false,"o":10,"max":255,"value":128},{"id":"Offset Y","type":"range","ro":false,"o":11,"max":255,"value":128},{"id":"Legs","type":"range","ro":false,"o":12,"min":1,"max":8,"value":4}]},{"id":"fixture","type":"select","ro":false,"o":18,"value":0},{"id":"fixSize","type":"coord3D","ro":true,"o":19,"max":127},{"id":"fixCount","type":"number","ro":true,"o":20,"max":255},{"id":"fps","type":"number","ro":false,"o":21,"value":60,"min":1,"max":999},{"id":"realFps","type":"text","ro":true,"o":22,"max":10}]},{"id":"Fixture Generator","type":"usermod","ro":false,"o":23,"n":[{"id":"fixtureGen","type":"select","ro":false,"o":24,"value":0,"n":[{"id":"ledCount","type":"number","ro":false,"o":25,"min":1,"max":4096,"value":64}]},{"id":"pinList","type":"text","ro":false,"o":26,"value":"16","max":32},{"id":"generate","type":"button","ro":false,"o":27}]},{"id":"Files","type":"sysmod","ro":false,"o":28,"n":[{"id":"fileTbl","type":"table","ro":false,"o":29,"n":[{"id":"flName","type":"text","ro":true,"o":30,"max":32},{"id":"flSize","type":"number","ro":true,"o":31},{"id":"flLink","type":"url","ro":true,"o":32}]},{"id":"drsize","type":"text","ro":true,"o":33,"max":32}]},{"id":"System","type":"sysmod","ro":false,"o":34,"n":[{"id":"serverName","type":"text","ro":false,"o":35,"value":"StarMod16MB","max":32},{"id":"upTime","type":"text","ro":true,"o":36,"max":16},{"id":"loops","type":"text","ro":true,"o":37,"max":16},{"id":"chip","type":"text","ro":true,"o":38,"max":16},{"id":"heap","type":"text","ro":true,"o":39,"max":32},{"id":"stack","type":"text","ro":true,"o":40,"max":16},{"id":"reboot","type":"button","ro":false,"o":41},{"id":"reset0","type":"select","ro":true,"o":42},{"id":"reset1","type":"select","ro":true,"o":43},{"id":"restartReason","type":"select","ro":true,"o":44},{"id":"version","type":"text","ro":true,"o":45,"max":16}],"view":"vAll"},{"id":"Pins","type":"sysmod","ro":false,"o":46,"n":[{"id":"pinTbl","type":"table","ro":true,"o":47,"n":[{"id":"pinNr","type":"number","ro":true,"o":48,"max":50},{"id":"pinOwner","type":"text","ro":true,"o":49,"max":32},{"id":"pinDetails","type":"text","ro":true,"o":50,"max":256}]},{"id":"board","type":"canvas","ro":true,"o":51,"loopFun":1,"interval":1000},{"id":"pin19","type":"checkbox","ro":false,"o":52,"value":1}]},{"id":"Print","type":"sysmod","ro":false,"o":53,"n":[{"id":"pOut","type":"select","ro":false,"o":54,"value":1},{"id":"log","type":"textarea","ro":true,"o":55}]},{"id":"Web","type":"sysmod","ro":false,"o":56,"n":[{"id":"clTbl","type":"table","ro":true,"o":57,"n":[{"id":"clNr","type":"number","ro":true,"o":58,"max":999},{"id":"clIp","type":"text","ro":true,"o":59,"max":16},{"id":"clIsFull","type":"checkbox","ro":true,"o":60},{"id":"clStatus","type":"select","ro":true,"o":61},{"id":"clLength","type":"number","ro":true,"o":62,"max":64}]},{"id":"wsCounter","type":"text","ro":true,"o":63,"max":16},{"id":"queueLength","type":"number","ro":true,"o":64,"max":64}]},{"id":"Network","type":"sysmod","ro":false,"o":65,"n":[{"id":"ssid","type":"text","ro":false,"o":66,"value":"ewtr","max":32},{"id":"pw","type":"password","ro":false,"o":67,"value":"zonledmod"},{"id":"connect","type":"button","ro":false,"o":68},{"id":"nwstatus","type":"text","ro":true,"o":69,"max":32},{"id":"rssi","type":"text","ro":true,"o":70,"max":32}]},{"id":"DDP","type":"usermod","ro":false,"o":71,"n":[{"id":"ddpInst","type":"select","ro":false,"o":72}]},{"id":"ArtNet","type":"usermod","ro":false,"o":73,"n":[{"id":"artInst","type":"select","ro":false,"o":74}]},{"id":"e131-sACN","type":"usermod","ro":false,"o":75,"n":[{"id":"dun","type":"number","ro":false,"o":76,"value":1,"max":7},{"id":"dch","type":"number","ro":false,"o":77,"value":1,"min":1,"max":512,"stage":true},{"id":"e131Tbl","type":"table","ro":true,"o":78,"n":[{"id":"e131Channel","type":"number","ro":true,"o":79,"min":1,"max":512},{"id":"e131Name","type":"text","ro":true,"o":80,"max":32},{"id":"e131Max","type":"number","ro":true,"o":81},{"id":"e131Value","type":"number","ro":true,"o":82,"max":255}]}]},{"id":"Model","type":"sysmod","ro":false,"o":83,"n":[{"id":"mSize","type":"text","ro":true,"o":84,"max":32},{"id":"saveModel","type":"button","ro":false,"o":85},{"id":"showObsolete","type":"checkbox","ro":false,"o":86,"value":0},{"id":"deleteObsolete","type":"button","ro":false,"o":87}]},{"id":"UI","type":"sysmod","ro":false,"o":88,"n":[{"id":"vlTbl","type":"table","ro":true,"o":89,"n":[{"id":"vlVar","type":"text","ro":true,"o":90,"max":32},{"id":"vlLoopps","type":"number","ro":true,"o":91,"max":999}]}]},{"id":"Instances","type":"sysmod","ro":false,"o":92,"n":[{"id":"insTbl","type":"table","ro":true,"o":93,"n":[{"id":"insName","type":"text","ro":true,"o":94,"max":32},{"id":"insLink","type":"url","ro":true,"o":95},{"id":"insIp","type":"text","ro":true,"o":96,"max":16},{"id":"insType","type":"text","ro":true,"o":97,"max":16},{"id":"insVersion","type":"number","ro":true,"o":98,"max":-1},{"id":"insUp","type":"number","ro":true,"o":99,"max":-1},{"id":"inson","type":"checkbox","ro":false,"o":101},{"id":"insbri","type":"range","ro":false,"o":102,"max":255,"log":true},{"id":"inspro","type":"select","ro":false,"o":103},{"id":"insfx","type":"select","ro":false,"o":104},{"id":"insdch","type":"number","ro":false,"o":106,"min":1,"max":512},{"id":"inssma","type":"select","ro":false,"o":107},{"id":"inspal","type":"select","ro":false,"o":105}]},{"id":"sma","type":"select","ro":false,"o":100,"value":0,"stage":true}]},{"id":"Modules","type":"sysmod","ro":false,"o":108,"n":[{"id":"mdlTbl","type":"table","ro":true,"o":109,"n":[{"id":"mdlName","type":"text","ro":true,"o":110,"max":32},{"id":"mdlSucces","type":"checkbox","ro":true,"o":111},{"id":"mdlEnabled","type":"checkbox","ro":false,"o":112,"value":[true,true,true,true,true,true,true,true,true,false,false,true,true,true,true,true,true]}]}]}] +Read model [{"id":"Preview","type":"appmod","ro":false,"o":1,"n":[{"id":"pview","type":"canvas","ro":false,"o":2,"loopFun":0,"interval":160}]},{"id":"Leds","type":"appmod","ro":false,"o":3,"n":[{"id":"on","type":"checkbox","ro":false,"o":4,"value":1,"stage":true},{"id":"bri","type":"range","ro":false,"o":5,"value":10,"max":255,"log":true,"stage":true},{"id":"fxTbl","type":"table","ro":false,"o":6,"n":[{"id":"pro","type":"select","ro":false,"o":13,"value":2,"stage":true},{"id":"fxStart","type":"coord3D","ro":false,"o":14,"value":[{"x":0,"y":0,"z":0}],"max":127},{"id":"fxEnd","type":"coord3D","ro":false,"o":15,"value":[{"x":32,"y":32,"z":0}],"max":127},{"id":"fxSize","type":"coord3D","ro":true,"o":16,"max":127},{"id":"fxCount","type":"number","ro":true,"o":17,"max":255}]},{"id":"fx","type":"select","ro":false,"o":7,"value":13,"stage":true,"n":[{"id":"pal","type":"select","ro":false,"o":8,"value":4,"stage":true},{"id":"speed","type":"range","ro":false,"o":9,"min":1,"max":255,"value":128},{"id":"Offset X","type":"range","ro":false,"o":10,"max":255,"value":128},{"id":"Offset Y","type":"range","ro":false,"o":11,"max":255,"value":128},{"id":"Legs","type":"range","ro":false,"o":12,"min":1,"max":8,"value":4}]},{"id":"fixture","type":"select","ro":false,"o":18,"value":0},{"id":"fixSize","type":"coord3D","ro":true,"o":19,"max":127},{"id":"fixCount","type":"number","ro":true,"o":20,"max":255},{"id":"fps","type":"number","ro":false,"o":21,"value":60,"min":1,"max":999},{"id":"realFps","type":"text","ro":true,"o":22,"max":10}]},{"id":"Fixture Generator","type":"usermod","ro":false,"o":23,"n":[{"id":"fixtureGen","type":"select","ro":false,"o":24,"value":0,"n":[{"id":"ledCount","type":"number","ro":false,"o":25,"min":1,"max":4096,"value":64}]},{"id":"pinList","type":"text","ro":false,"o":26,"value":"16","max":32},{"id":"generate","type":"button","ro":false,"o":27}]},{"id":"Files","type":"sysmod","ro":false,"o":28,"n":[{"id":"fileTbl","type":"table","ro":false,"o":29,"n":[{"id":"flName","type":"text","ro":true,"o":30,"max":32},{"id":"flSize","type":"number","ro":true,"o":31},{"id":"flLink","type":"url","ro":true,"o":32}]},{"id":"drsize","type":"text","ro":true,"o":33,"max":32}]},{"id":"System","type":"sysmod","ro":false,"o":34,"n":[{"id":"serverName","type":"text","ro":false,"o":35,"value":"StarMod16MB","max":32},{"id":"upTime","type":"text","ro":true,"o":36,"max":16},{"id":"loops","type":"text","ro":true,"o":37,"max":16},{"id":"chip","type":"text","ro":true,"o":38,"max":16},{"id":"heap","type":"text","ro":true,"o":39,"max":32},{"id":"stack","type":"text","ro":true,"o":40,"max":16},{"id":"reboot","type":"button","ro":false,"o":41},{"id":"reset0","type":"select","ro":true,"o":42},{"id":"reset1","type":"select","ro":true,"o":43},{"id":"restartReason","type":"select","ro":true,"o":44},{"id":"version","type":"text","ro":true,"o":45,"max":16}],"view":"vAll"},{"id":"Pins","type":"sysmod","ro":false,"o":46,"n":[{"id":"pinTbl","type":"table","ro":true,"o":47,"n":[{"id":"pinNr","type":"number","ro":true,"o":48,"max":50},{"id":"pinOwner","type":"text","ro":true,"o":49,"max":32},{"id":"pinDetails","type":"text","ro":true,"o":50,"max":256}]},{"id":"board","type":"canvas","ro":true,"o":51,"loopFun":1,"interval":1000},{"id":"pin19","type":"checkbox","ro":false,"o":52,"value":1}]},{"id":"Print","type":"sysmod","ro":false,"o":53,"n":[{"id":"pOut","type":"select","ro":false,"o":54,"value":1},{"id":"log","type":"textarea","ro":true,"o":55}]},{"id":"Web","type":"sysmod","ro":false,"o":56,"n":[{"id":"clTbl","type":"table","ro":true,"o":57,"n":[{"id":"clNr","type":"number","ro":true,"o":58,"max":999},{"id":"clIp","type":"text","ro":true,"o":59,"max":16},{"id":"clIsFull","type":"checkbox","ro":true,"o":60},{"id":"clStatus","type":"select","ro":true,"o":61},{"id":"clLength","type":"number","ro":true,"o":62,"max":64}]},{"id":"wsCounter","type":"text","ro":true,"o":63,"max":16},{"id":"queueLength","type":"number","ro":true,"o":64,"max":64}]},{"id":"Network","type":"sysmod","ro":false,"o":65,"n":[{"id":"ssid","type":"text","ro":false,"o":66,"value":"ewtr","max":32},{"id":"pw","type":"password","ro":false,"o":67,"value":"zonledmod"},{"id":"connect","type":"button","ro":false,"o":68},{"id":"nwstatus","type":"text","ro":true,"o":69,"max":32},{"id":"rssi","type":"text","ro":true,"o":70,"max":32}]},{"id":"DDP","type":"usermod","ro":false,"o":71,"n":[{"id":"ddpInst","type":"select","ro":false,"o":72}]},{"id":"ArtNet","type":"usermod","ro":false,"o":73,"n":[{"id":"artInst","type":"select","ro":false,"o":74}]},{"id":"e131-sACN","type":"usermod","ro":false,"o":75,"n":[{"id":"dun","type":"number","ro":false,"o":76,"value":1,"max":7},{"id":"dch","type":"number","ro":false,"o":77,"value":1,"min":1,"max":512,"stage":true},{"id":"e131Tbl","type":"table","ro":true,"o":78,"n":[{"id":"e131Channel","type":"number","ro":true,"o":79,"min":1,"max":512},{"id":"e131Name","type":"text","ro":true,"o":80,"max":32},{"id":"e131Max","type":"number","ro":true,"o":81},{"id":"e131Value","type":"number","ro":true,"o":82,"max":255}]}]},{"id":"Model","type":"sysmod","ro":false,"o":83,"n":[{"id":"mSize","type":"text","ro":true,"o":84,"max":32},{"id":"saveModel","type":"button","ro":false,"o":85},{"id":"showObsolete","type":"checkbox","ro":false,"o":86,"value":0},{"id":"deleteObsolete","type":"button","ro":false,"o":87}]},{"id":"UI","type":"sysmod","ro":false,"o":88,"n":[{"id":"vlTbl","type":"table","ro":true,"o":89,"n":[{"id":"vlVar","type":"text","ro":true,"o":90,"max":32},{"id":"vlLoopps","type":"number","ro":true,"o":91,"max":999}]}]},{"id":"Instances","type":"sysmod","ro":false,"o":92,"n":[{"id":"insTbl","type":"table","ro":true,"o":93,"n":[{"id":"insName","type":"text","ro":true,"o":94,"max":32},{"id":"insLink","type":"url","ro":true,"o":95},{"id":"insIp","type":"text","ro":true,"o":96,"max":16},{"id":"insType","type":"text","ro":true,"o":97,"max":16},{"id":"insVersion","type":"number","ro":true,"o":98,"max":-1},{"id":"insUp","type":"number","ro":true,"o":99,"max":-1},{"id":"inson","type":"checkbox","ro":false,"o":101},{"id":"insbri","type":"range","ro":false,"o":102,"max":255,"log":true},{"id":"inspro","type":"select","ro":false,"o":103},{"id":"insfx","type":"select","ro":false,"o":104},{"id":"insdch","type":"number","ro":false,"o":106,"min":1,"max":512},{"id":"inssma","type":"select","ro":false,"o":107},{"id":"inspal","type":"select","ro":false,"o":105}]},{"id":"sma","type":"select","ro":false,"o":100,"value":0,"stage":true}]},{"id":"Modules","type":"sysmod","ro":false,"o":108,"n":[{"id":"mdlTbl","type":"table","ro":true,"o":109,"n":[{"id":"mdlName","type":"text","ro":true,"o":110,"max":32},{"id":"mdlSuccess","type":"checkbox","ro":true,"o":111},{"id":"mdlEnabled","type":"checkbox","ro":false,"o":112,"value":[true,true,true,true,true,true,true,true,true,false,false,true,true,true,true,true,true]}]}]}] sendDataWs no ws setValue value removed Preview setValue value removed pview @@ -129,8 +129,8 @@ setValue value removed Modules setValue value removed mdlTbl initVarAndUpdate valueFun mdlName count:17 setValue var mdlName[0] value null not array, creating -initVarAndUpdate valueFun mdlSucces count:17 -setValue var mdlSucces[0] value null not array, creating +initVarAndUpdate valueFun mdlSuccess count:17 +setValue var mdlSuccess[0] value null not array, creating initVarAndUpdate chFun init mdlEnabled v:[true,true,true,true,true,true,true,true,true,false,false,true,true,true,true,true,true] seqNrToName: 2DMatrix3232.json 9640 JsonRDWS constructing /2DMatrix3232.json r @@ -238,7 +238,7 @@ setValue var clIsFull[0] value null not array, creating αWS_EVT_DATA info 1301 / 3072 (42%) (6 0 4) setValue var clStatus[0] value null not array, creating αWS event data client: 2 ...126 q:0 l:28 s:1 (#:1) -αWS_EVT_DATA json {"mdlName":{"label":"Name"},"mdlSucces":{"label":"Success"},"mdlEnabled":{"label":"Enabled"}} +αWS_EVT_DATA json {"mdlName":{"label":"Name"},"mdlSuccess":{"label":"Success"},"mdlEnabled":{"label":"Enabled"}} αWS_EVT_DATA info 96 / 3072 (3%) (3 0 2) sαWS event data client: 2 ...126 q:0 l:30 s:1 (#:1) αWS_EVT_DATA json {"mdlTbl":{"label":"Modules","comment":"List of modules"}}