From 48e0062d0241e302b22bb8d00c974720660810e8 Mon Sep 17 00:00:00 2001 From: ewowi Date: Tue, 10 Feb 2026 09:46:01 +0100 Subject: [PATCH 1/5] Add esp32-s3-seeed_xiao board, all effects use palette Firmware ======== - add esp32-s3-seeed_xiao Backend ======= - IO: configure board preset LuxceoMood1XiaoMod - Effects: all use palette - WIP Backend ======= - All effects use palettes (WIP) --- docs/develop/layers.md | 2 +- docs/gettingstarted/installer.md | 1 + docs/moonlight/lightscontrol.md | 2 +- docs/moonlight/overview.md | 1 - firmware/esp32-s3.ini | 10 ++++- .../installer/images/esp32-s3-seeed_xiao.png | Bin 0 -> 117718 bytes .../manifest_esp32-s3-seeed_xiao-nightly.json | 18 +++++++++ .../manifest_esp32-s3-seeed_xiao.json | 18 +++++++++ src/MoonBase/Modules/ModuleIO.h | 24 +++++++++--- src/MoonLight/Nodes/Effects/E_MoonLight.h | 28 +++++++------- src/MoonLight/Nodes/Effects/E_MoonModules.h | 4 +- src/MoonLight/Nodes/Effects/E_MovingHeads.h | 16 ++++---- src/MoonLight/Nodes/Effects/E_WLED.h | 36 +++++++++--------- src/MoonLight/Nodes/Effects/E__Sandbox.h | 2 +- 14 files changed, 109 insertions(+), 53 deletions(-) create mode 100644 firmware/installer/images/esp32-s3-seeed_xiao.png create mode 100644 firmware/installer/manifest_esp32-s3-seeed_xiao-nightly.json create mode 100644 firmware/installer/manifest_esp32-s3-seeed_xiao.json diff --git a/docs/develop/layers.md b/docs/develop/layers.md index 39d2be224..094791fb5 100644 --- a/docs/develop/layers.md +++ b/docs/develop/layers.md @@ -47,7 +47,7 @@ { "nodes": [ { - "name": "Lissajous 🔥🎨🐙", + "name": "Lissajous 🔥🐙", "on": true, "controls": [ { diff --git a/docs/gettingstarted/installer.md b/docs/gettingstarted/installer.md index 76ed50907..6787f7fe7 100644 --- a/docs/gettingstarted/installer.md +++ b/docs/gettingstarted/installer.md @@ -50,6 +50,7 @@ After a successful install, go to **Logs & Console**, press **Reset Device**, an | esp32-p4-nano | ![esp32-p4-nano](../firmware/installer/images/esp32-p4-nano.jpg){: style="width:100px"} | First Install
[esp32-c6-firmware-update](https://esp32-c6-firmware-update.github.io)
| | [Waveshare](https://www.waveshare.com/esp32-p4-nano.htm){:target="_blank"}
[ESP32-P4 shield](https://shop.myhome-control.de/en/ABC-WLED-ESP32-P4-shield/HW10027):
![ESP32-P4 shield](https://shop.myhome-control.de/thumbnail/ed/a1/f1/1762031307/WLED_ESP32_P4_Shield_04_1920x1354.jpg?ts=1762031316){: style="width:100px"} | | esp32-s3-n8r8v | ![esp32-s3-n8r8v](../firmware/installer/images/esp32-s3-n8r8v.jpg){: style="width:100px"} | | Nightly | SE-16p
![SE-16p](../firmware/installer/images/esp32-s3-stephanelec-16p.jpg){: style="width:100px"} | | esp32-s3-n16r8v | ![esp32-s3-n16r8v](../firmware/installer/images/esp32-s3-n8r8v.jpg){: style="width:100px"} | | Nightly | [Ali*](https://s.click.aliexpress.com/e/_DBAtJ2H){:target="_blank"} | +| esp32-s3-seeed_xiao | ![esp32-s3-seeed_xiao](../firmware/installer/images/esp32-s3-seeed_xiao.png){: style="width:100px"} | | | [Seeed store](https://www.seeedstudio.com/XIAO-ESP32S3-p-5627.html){:target="_blank"} | | esp32-s3-atoms3r | ![esp32-s3-atoms3r](../firmware/installer/images/esp32-s3-atoms3r.jpg){: style="width:100px"} | | | [M5Stack store](https://shop.m5stack.com/products/atoms3r-dev-kit){:target="_blank"} | | esp32-s3-zero-n4r2 | ![esp32-s3-zero-n4r2](../firmware/installer/images/esp32-s3-zero-n4r2.jpg){: style="width:100px"} | | | [Ali*](https://s.click.aliexpress.com/e/_EukjHX8){:target="_blank"} | | esp32-d0-wrover | ![esp32-d0-wrover](../firmware/installer/images/esp32-d0-wrover.jpg){: style="width:100px"} | | | [Ali*](https://a.aliexpress.com/_EzhPi6g){:target="_blank"} | diff --git a/docs/moonlight/lightscontrol.md b/docs/moonlight/lightscontrol.md index 4ea5a62a2..550193cee 100644 --- a/docs/moonlight/lightscontrol.md +++ b/docs/moonlight/lightscontrol.md @@ -7,7 +7,7 @@ Controls: * On: lights on or off * Brightness: brightness of the LEDs when on * RGB Sliders: control each color separately. -* Palette: Global palette setting. Effects with the palette icon 🎨 use this palette setting. +* Palette: Global palette setting used in Effects. * Presets: Store the current effects and modifiers or retrieve earlier saved presets. 64 slots available: * Blue: Empty preset * Green: Saved preset diff --git a/docs/moonlight/overview.md b/docs/moonlight/overview.md index 06a645930..a14676eb7 100644 --- a/docs/moonlight/overview.md +++ b/docs/moonlight/overview.md @@ -125,7 +125,6 @@ Contact us in the MoonLight channels on [Discord MoonModules](https://discord.gg Effects, Modifiers, Layouts and drivers use emoji's to visualize their usage. See below for an overview: * 🔥 Effect - * 🎨 Using palette * 🐙 WLED origin * 💫 MoonLight origin * ⚡️ FastLED origin diff --git a/firmware/esp32-s3.ini b/firmware/esp32-s3.ini index d4863102d..d6984eb3b 100644 --- a/firmware/esp32-s3.ini +++ b/firmware/esp32-s3.ini @@ -103,4 +103,12 @@ board_upload.before_reset = usb_reset build_flags = ${esp32-s3-base.build_flags} lib_deps = ${esp32-s3-base.lib_deps} ; RAM: [=== ] 29.7% (used 97188 bytes from 327680 bytes) -; Flash: [======= ] 71.6% (used 2252106 bytes from 3145728 bytes) \ No newline at end of file +; Flash: [======= ] 71.6% (used 2252106 bytes from 3145728 bytes) + + +; https://www.seeedstudio.com/XIAO-ESP32S3-p-5627.html +[env:esp32-s3-seeed_xiao] +board = seeed_xiao_esp32s3 ; https://github.com/platformio/platform-espressif32/blob/develop/boards/seeed_xiao_esp32s3.json +board_build.psram_type = opi +build_flags = ${esp32-s3-base.build_flags} +lib_deps = ${esp32-s3-base.lib_deps} \ No newline at end of file diff --git a/firmware/installer/images/esp32-s3-seeed_xiao.png b/firmware/installer/images/esp32-s3-seeed_xiao.png new file mode 100644 index 0000000000000000000000000000000000000000..ee92cce5e06a77b70fe456fe28b6e038ce585691 GIT binary patch literal 117718 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 |<7 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 h6ts;x3)i_*dB39S-*klMq#qb3tNu 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.x / 2.0f, layer->size.z / 2.0f, 0.0f, (float)pos.x, (float)pos.z, 0.0f) / 9.899495f * layer->size.y; pos.y = floor(layer->size.y / 2.0f * (1 + sinf(d / ripple_interval + time_interval))); // between 0 and layer->size.y - layer->setRGB(pos, (CRGB)CHSV(pal::millis() / 50 + random8(64), 200, 255)); + layer->setRGB(pos, ColorFromPalette(layerP.palette, pal::millis() / 50 + random8(64))); } } } @@ -430,7 +430,7 @@ class SinusEffect : public Node { // Map the sine wave value to a color hue uint8_t hue = wave + hueOffset; // Set the LED color using the calculated hue - layer->setRGB(i, (CRGB)CHSV(hue, 255, brightness)); + layer->setRGB(i, ColorFromPalette(layerP.palette, hue, brightness)); } // Increment the phase to animate the wave @@ -467,7 +467,7 @@ class SphereMoveEffect : public Node { float d = distance(pos.x, pos.y, pos.z, origin.x, origin.y, origin.z); if (d > diameter && d < diameter + 1.0) { - layer->setRGB(pos, (CRGB)CHSV(pal::millis() / 50 + random8(64), 200, 255)); + layer->setRGB(pos, ColorFromPalette(layerP.palette, pal::millis() / 50 + random8(64))); } } } @@ -480,7 +480,7 @@ class StarFieldEffect : public Node { // Inspired by Daniel Shiffman's Coding T public: static const char* name() { return "StarField"; } static uint8_t dim() { return _2D; } - static const char* tags() { return "🔥🎨"; } + static const char* tags() { return "🔥"; } struct Star { int x, y, z; @@ -554,7 +554,7 @@ class PraxisEffect : public Node { public: static const char* name() { return "Praxis"; } static uint8_t dim() { return _2D; } - static const char* tags() { return "🔥🎨"; } + static const char* tags() { return "🔥"; } uint8_t macroMutatorFreq = 3; uint8_t macroMutatorMin = 250; @@ -623,7 +623,7 @@ class WaveEffect : public Node { void loop() override { layer->fadeToBlackBy(fade); // should only fade rgb ... - CRGB color = CHSV(pal::millis() / 50, 255, 255); + CRGB color = ColorFromPalette(layerP.palette, pal::millis() / 50); int prevPos = layer->size.y / 2; // somewhere in the middle @@ -671,7 +671,7 @@ class FreqSawsEffect : public Node { public: static const char* name() { return "Frequency Saws"; } static uint8_t dim() { return _2D; } - static const char* tags() { return "🔥♫🎨🪚"; } + static const char* tags() { return "🔥♫🪚"; } uint8_t fade = 4; uint8_t increaser = 211; @@ -1071,7 +1071,7 @@ class ParticlesEffect : public Node { public: static const char* name() { return "Particles"; } static uint8_t dim() { return _3D; } - static const char* tags() { return "🔥💫🧭🎨"; } + static const char* tags() { return "🔥💫🧭"; } struct Particle { float x, y, z; @@ -1307,7 +1307,7 @@ class MoonManEffect : public Node { public: static const char* name() { return "Moon Man"; } static uint8_t dim() { return _2D; } - static const char* tags() { return "🔥🎵🎨☾"; } + static const char* tags() { return "🔥🎵☾"; } // Create an M5Canvas for PNG processing M5Canvas* canvas; //(&M5.Display); @@ -1372,7 +1372,7 @@ class SpiralFireEffect : public Node { public: static const char* name() { return "Spiral Fire"; } static uint8_t dim() { return _3D; } - static const char* tags() { return "🔥🎨⏳"; } + static const char* tags() { return "🔥⏳"; } uint8_t speed = 60; uint8_t intensity = 180; @@ -1615,7 +1615,7 @@ class PixelMapEffect : public Node { void loop() override { layer->fill_solid(CRGB::Black); - layer->setRGB(pos, CHSV(pal::millis() / 50 + random8(64), 255, 255)); // ColorFromPalette(layerP.palette,call, bri); + layer->setRGB(pos, ColorFromPalette(layerP.palette, pal::millis() / 50 + random8(64))); } }; // PixelMap @@ -1696,7 +1696,7 @@ class RingRandomFlowEffect : public RingEffect { if (hue) { hue[0] = random(0, 255); for (int r = 0; r < hueSize; r++) { - setRing(r, CHSV(hue[r], 255, 255)); + setRing(r, ColorFromPalette(layerP.palette, hue[r])); } for (int r = (hueSize - 1); r >= 1; r--) { hue[r] = hue[(r - 1)]; // set this ruing based on the inner diff --git a/src/MoonLight/Nodes/Effects/E_MoonModules.h b/src/MoonLight/Nodes/Effects/E_MoonModules.h index 4369e483b..e9c409e81 100644 --- a/src/MoonLight/Nodes/Effects/E_MoonModules.h +++ b/src/MoonLight/Nodes/Effects/E_MoonModules.h @@ -18,7 +18,7 @@ class GameOfLifeEffect : public Node { public: static const char* name() { return "Game Of Life"; } static uint8_t dim() { return _3D; } // supports 3D but also 2D (1D as well?) - static const char* tags() { return "🔥💫🎨"; } + static const char* tags() { return "🔥💫"; } void placePentomino(uint8_t* futureCells, bool colorByAge) { uint8_t pattern[5][2] = {{1, 0}, {0, 1}, {1, 1}, {2, 1}, {2, 2}}; // R-pentomino @@ -520,7 +520,7 @@ class PaintBrushEffect : public Node { public: static const char* name() { return "Paintbrush"; } static uint8_t dim() { return _3D; } - static const char* tags() { return "🔥🎨♫🐺"; } + static const char* tags() { return "🔥♫🐺"; } uint8_t oscillatorOffset = 6 * 160 / 255; uint8_t numLines = 255; diff --git a/src/MoonLight/Nodes/Effects/E_MovingHeads.h b/src/MoonLight/Nodes/Effects/E_MovingHeads.h index 071eb12a5..db8d0e729 100644 --- a/src/MoonLight/Nodes/Effects/E_MovingHeads.h +++ b/src/MoonLight/Nodes/Effects/E_MovingHeads.h @@ -27,7 +27,7 @@ class Troy1ColorEffect : public Node { layer->setRGB(x, CRGB(sharedData.bands[NUM_GEQ_CHANNELS - 1], sharedData.bands[7], sharedData.bands[0])); layer->setBrightness(x, (sharedData.bands[0] > 200) ? 0 : layerP.lights.header.brightness); } else { - layer->setRGB(x, CHSV(beatsin8(10), 255, 255)); + layer->setRGB(x, ColorFromPalette(layerP.palette, beatsin8(10))); // layer->setBrightness(x, layerP.lights.header.brightness); // done automatically } } @@ -159,7 +159,7 @@ class Troy2ColorEffect : public Node { layer->setBrightness(x, 0); } } else { - layer->setRGB(x, CHSV(beatsin8(10), 255, 255)); + layer->setRGB(x, ColorFromPalette(layerP.palette, beatsin8(10))); // layer->setBrightness(x, layerP.lights.header.brightness); // done automatically } } @@ -270,14 +270,14 @@ class FreqColorsEffect : public Node { uint8_t delta = 256 / nrOfLights; // set the 3 LED groups for each moving head light - layer->setRGB({x, 0, 0}, CHSV((x)*delta, 255, sharedData.bands[(x * 3) % 16])); - layer->setRGB1({x, 0, 0}, CHSV((x + 3) * delta, 255, sharedData.bands[(x * 3 + 1) % 16])); - layer->setRGB2({x, 0, 0}, CHSV((x + 6) * delta, 255, sharedData.bands[(x * 3 + 2) % 16])); + layer->setRGB({x, 0, 0}, ColorFromPalette(layerP.palette, (x)*delta, sharedData.bands[(x * 3) % 16])); + layer->setRGB1({x, 0, 0}, ColorFromPalette(layerP.palette, (x + 3) * delta, sharedData.bands[(x * 3 + 1) % 16])); + layer->setRGB2({x, 0, 0}, ColorFromPalette(layerP.palette, (x + 6) * delta, sharedData.bands[(x * 3 + 2) % 16])); } else { if (x == beatsin8(bpm, 0, layer->size.x - 1)) { // sinelon over moving heads - layer->setRGB({x, 0, 0}, CHSV(beatsin8(10), 255, 255)); // colorwheel 10 times per minute - layer->setRGB1({x, 0, 0}, CHSV(beatsin8(10), 255, 255)); // colorwheel 10 times per minute - layer->setRGB2({x, 0, 0}, CHSV(beatsin8(10), 255, 255)); // colorwheel 10 times per minute + layer->setRGB({x, 0, 0}, ColorFromPalette(layerP.palette, beatsin8(10))); // colorwheel 10 times per minute + layer->setRGB1({x, 0, 0}, ColorFromPalette(layerP.palette, beatsin8(10))); // colorwheel 10 times per minute + layer->setRGB2({x, 0, 0}, ColorFromPalette(layerP.palette, beatsin8(10))); // colorwheel 10 times per minute } } diff --git a/src/MoonLight/Nodes/Effects/E_WLED.h b/src/MoonLight/Nodes/Effects/E_WLED.h index 7279ee2e0..76ad5ce90 100644 --- a/src/MoonLight/Nodes/Effects/E_WLED.h +++ b/src/MoonLight/Nodes/Effects/E_WLED.h @@ -15,7 +15,7 @@ class BouncingBallsEffect : public Node { public: static const char* name() { return "Bouncing Balls"; } static uint8_t dim() { return _2D; } - static const char* tags() { return "🔥🎨🐙"; } + static const char* tags() { return "🔥🐙"; } uint8_t grav = 128; uint8_t numBalls = 8; @@ -97,7 +97,7 @@ class BlurzEffect : public Node { public: static const char* name() { return "Blurz"; } static uint8_t dim() { return _3D; } // test... - static const char* tags() { return "🔥🎵🎨☾"; } + static const char* tags() { return "🔥🎵☾"; } // static const char _data_FX_MODE_BLURZ[] PROGMEM = "Blurz Plus ☾@Fade rate,Blur,,,,FreqMap ☾,GEQ Scanner ☾,;!,Color mix;!;01f;sx=48,ix=127,m12=7,si=0"; // Pinwheel, Beatsin @@ -284,7 +284,7 @@ class FreqMatrixEffect : public Node { int freqMapped = lowerLimit != upperLimit ? ::map(sharedData.majorPeak, lowerLimit, upperLimit, 0, 255) : sharedData.majorPeak; // WLEDMM preserve overflows uint8_t i = abs(freqMapped) & 0xFF; // WLEDMM we embrace overflow ;-) by "modulo 256" - color = CHSV(i, 240, (uint8_t)pixVal); // implicit conversion to RGB supplied by FastLED + color = ColorFromPalette(layerP.palette, i, (uint8_t)pixVal); } // shift the pixels one pixel up @@ -302,7 +302,7 @@ class GEQEffect : public Node { public: static const char* name() { return "GEQ"; } static uint8_t dim() { return _2D; } - static const char* tags() { return "🔥🎨♫🐙"; } + static const char* tags() { return "🔥♫🐙"; } uint8_t fadeOut = 255; uint8_t ripple = 128; @@ -403,7 +403,7 @@ class GEQEffect : public Node { if (previousBarHeight && pos.x < previousBarHeightSize) { if (barHeight > previousBarHeight[pos.x]) previousBarHeight[pos.x] = barHeight; // drive the peak up if ((ripple > 0) && (previousBarHeight[pos.x] > 0) && (previousBarHeight[pos.x] < layer->size.y)) // WLEDMM avoid "overshooting" into other segments - layer->setRGB(Coord3D(pos.x, layer->size.y - previousBarHeight[pos.x]), (CRGB)CHSV(millis() / 50, 255, 255)); // take millis()/50 color for the time being + layer->setRGB(Coord3D(pos.x, layer->size.y - previousBarHeight[pos.x]), ColorFromPalette(layerP.palette, millis() / 50)); // take millis()/50 color for the time being if (rippleTime && previousBarHeight[pos.x] > 0) previousBarHeight[pos.x]--; // delay/ripple effect } @@ -415,7 +415,7 @@ class LissajousEffect : public Node { public: static const char* name() { return "Lissajous"; } static uint8_t dim() { return _2D; } - static const char* tags() { return "🔥🎨🐙"; } + static const char* tags() { return "🔥🐙"; } uint8_t xFrequency = 64; uint8_t fadeRate = 128; @@ -446,7 +446,7 @@ class Noise2DEffect : public Node { public: static const char* name() { return "Noise2D"; } static uint8_t dim() { return _2D; } - static const char* tags() { return "🔥🎨🐙"; } + static const char* tags() { return "🔥🐙"; } uint8_t speed = 8; uint8_t scale = 64; @@ -470,7 +470,7 @@ class NoiseMeterEffect : public Node { public: static const char* name() { return "Noise Meter"; } static uint8_t dim() { return _1D; } - static const char* tags() { return "♪🐙🎨"; } + static const char* tags() { return "♪🐙"; } uint8_t fadeRate = 248; uint8_t width = 128; @@ -788,7 +788,7 @@ class AntEffect : public Node { public: static const char* name() { return "Ants"; } static uint8_t dim() { return _1D; } - static const char* tags() { return "🔥🎨"; } + static const char* tags() { return "🔥"; } uint8_t antSpeed = 192; uint8_t nrOfAnts = MAX_ANTS / 2; @@ -955,7 +955,7 @@ class TetrixEffect : public Node { public: static const char* name() { return "Tetrix"; } static uint8_t dim() { return _2D; } - static const char* tags() { return "🔥🐙🎨"; } // use emojis see https://moonmodules.org/MoonLight/moonlight/overview/#emoji-coding, 🔥 for effect, 🎨 if palette used (recommended) + static const char* tags() { return "🔥🐙"; } uint8_t speedControl = 0; // 1 beat per second uint8_t width = 0; @@ -1060,7 +1060,7 @@ class PopCornEffect : public Node { public: static const char* name() { return "PopCorn"; } static uint8_t dim() { return _1D; } // 2D-ish? check latest in WLED... - static const char* tags() { return "♪🎨🐙"; } + static const char* tags() { return "♪🐙"; } uint8_t speed = 128; uint8_t numPopcorn = maxNumPopcorn / 2; @@ -1136,7 +1136,7 @@ class WaverlyEffect : public Node { public: static const char* name() { return "Waverly"; } static uint8_t dim() { return _2D; } - static const char* tags() { return "🔥♪🎨🐙"; } + static const char* tags() { return "🔥♪🐙"; } uint8_t fadeRate = 128; uint8_t amplification = 30; @@ -1181,7 +1181,7 @@ class BlackholeEffect : public Node { public: static const char* name() { return "Blackhole"; } static uint8_t dim() { return _2D; } - static const char* tags() { return "🔥🎨⏳🐙"; } + static const char* tags() { return "🔥⏳🐙"; } uint8_t fadeRate = 128; // speed uint8_t outerYfreq = 128; // intensity @@ -1581,7 +1581,7 @@ class FunkyPlankEffect : public Node { int hue = sharedData.bands[map(band, 0, bands - 1, 0, NUM_GEQ_CHANNELS - 1)]; int v = ::map(hue, 0, 255, 10, 255); - layer->setRGB(Coord3D(posx, 0), CHSV(hue, 255, v)); + layer->setRGB(Coord3D(posx, 0), ColorFromPalette(layerP.palette, hue, v)); } // drip down: @@ -1986,8 +1986,8 @@ class DJLightEffect : public Node { class ColorTwinkleEffect : public Node { public: static const char* name() { return "ColorTwinkle"; } - static uint8_t dim() { return _3D; } // Dimensions supported _3D prefered, _2D or _1D can be used for first phase - static const char* tags() { return "🔥🎨⏳"; } // use emojis see https://moonmodules.org/MoonLight/moonlight/overview/#emoji-coding, 🔥 for effect, 🎨 if palette used (recommended) + static uint8_t dim() { return _3D; } + static const char* tags() { return "🔥⏳"; } uint8_t fadeSpeed = 128; uint8_t spawnSpeed = 128; @@ -2066,7 +2066,7 @@ class PlasmaEffect : public Node { public: static const char* name() { return "Plasma"; } static uint8_t dim() { return _1D; } - static const char* tags() { return "🔥🎨"; } + static const char* tags() { return "🔥"; } uint8_t speed = 60; uint8_t intensity = 128; @@ -2098,7 +2098,7 @@ class JuliaEffect : public Node { public: static const char* name() { return "Julia"; } static uint8_t dim() { return _3D; } - static const char* tags() { return "🔥🎨"; } + static const char* tags() { return "🔥"; } uint8_t speed = 60; // 1 beat per second uint8_t iterations = 64; // 24; diff --git a/src/MoonLight/Nodes/Effects/E__Sandbox.h b/src/MoonLight/Nodes/Effects/E__Sandbox.h index 6e1e54ad4..56721fd7b 100644 --- a/src/MoonLight/Nodes/Effects/E__Sandbox.h +++ b/src/MoonLight/Nodes/Effects/E__Sandbox.h @@ -18,7 +18,7 @@ class ExampleEffect : public Node { public: static const char* name() { return "Example"; } static uint8_t dim() { return _3D; } // Dimensions supported _3D prefered, _2D or _1D can be used for first phase - static const char* tags() { return "🔥🎨⏳"; } // use emojis see https://moonmodules.org/MoonLight/moonlight/overview/#emoji-coding, 🔥 for effect, 🎨 if palette used (recommended) + static const char* tags() { return "🔥⏳"; } // use emojis see https://moonmodules.org/MoonLight/moonlight/overview/#emoji-coding, 🔥 for effect uint8_t bpm = 60; // 1 beat per second uint8_t intensity = 128; From 03509aaaa01b46543b89f0f6ea88dac2f339e2dc Mon Sep 17 00:00:00 2001 From: ewowi Date: Tue, 10 Feb 2026 11:27:03 +0100 Subject: [PATCH 2/5] Saveneeded and board preset fixes pio.ini: httpd stack size 6144 for board presets updates backend ======= - Module: processUpdatedItem: saveNeeded also if oldValue is empty --- .../installer/manifest_esp32-s3-seeed_xiao-nightly.json | 2 +- firmware/installer/manifest_esp32-s3-seeed_xiao.json | 2 +- platformio.ini | 2 +- src/MoonBase/Module.h | 8 +++++--- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/firmware/installer/manifest_esp32-s3-seeed_xiao-nightly.json b/firmware/installer/manifest_esp32-s3-seeed_xiao-nightly.json index e38225ae8..add2787f2 100644 --- a/firmware/installer/manifest_esp32-s3-seeed_xiao-nightly.json +++ b/firmware/installer/manifest_esp32-s3-seeed_xiao-nightly.json @@ -9,7 +9,7 @@ { "chipFamily": "ESP32-S3", "name": "esp32-s3-seeed_xiao", - "image": "./images/esp32-s3-seeed_xiao.jpg", + "image": "./images/esp32-s3-seeed_xiao.png", "parts": [ { "path": "https://proxy.corsfix.com/?https://github.com/MoonModules/MoonLight/releases/download/v0.8.1/MoonLight_esp32-s3-seeed_xiao_0-8-1_webflash.bin", "offset": 0 } ] diff --git a/firmware/installer/manifest_esp32-s3-seeed_xiao.json b/firmware/installer/manifest_esp32-s3-seeed_xiao.json index 85a1c713c..661c603c3 100644 --- a/firmware/installer/manifest_esp32-s3-seeed_xiao.json +++ b/firmware/installer/manifest_esp32-s3-seeed_xiao.json @@ -9,7 +9,7 @@ { "chipFamily": "ESP32-S3", "name": "esp32-s3-seeed_xiao", - "image": "./images/esp32-s3-seeed_xiao.jpg", + "image": "./images/esp32-s3-seeed_xiao.png", "parts": [ { "path": "https://proxy.corsfix.com/?https://github.com/MoonModules/MoonLight/releases/download/v0.8.0/MoonLight_esp32-s3-seeed_xiao_0-8-0_webflash.bin", "offset": 0 } ] diff --git a/platformio.ini b/platformio.ini index c2cfb6766..4df91426e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -62,7 +62,7 @@ build_flags = -D FT_MOONBASE=1 - -D HTTPD_STACK_SIZE=5120 ; default 4096 but not enough for more complex read and update + -D HTTPD_STACK_SIZE=6144 ; default 4096 but not enough for more complex read and update board presets needs 6144 -D SVELTEKIT_STACK_SIZE=6144 ; psramFound() ? 8 * 1024 : 6 * 1024🌙 4096 to 8192 / 6144 ; 🌙 Move ESP32SvelteKit (HTTP/WebSocket) to Core 1 (APP_CPU) to avoid WiFi preemption on Core 0 diff --git a/src/MoonBase/Module.h b/src/MoonBase/Module.h index 52565f088..aa47885ff 100644 --- a/src/MoonBase/Module.h +++ b/src/MoonBase/Module.h @@ -128,10 +128,12 @@ class Module : public StatefulService { void processUpdatedItem(const UpdatedItem& updatedItem, const String& originId) { if (updatedItem.name == "swap") { onReOrderSwap(updatedItem.index[0], updatedItem.index[1]); - saveNeeded = true; + if (originId.toInt()) + saveNeeded = true; } else { - if (updatedItem.oldValue != "" && updatedItem.name != "channel") { // todo: fix the problem at channel, not here... - if (originId.toInt()) { // Front-end client IDs are numeric; internal origins ("module", etc.) return 0 + // if (updatedItem.parent[0] != "devices" && updatedItem.parent[0] != "tasks" && updatedItem.name != "core0") EXT_LOGD(ML_TAG, "%s[%d]%s[%d].%s = %s -> %s", updatedItem.parent[0].c_str(), updatedItem.index[0], updatedItem.parent[1].c_str(), updatedItem.index[1], updatedItem.name.c_str(), updatedItem.oldValue.c_str(), updatedItem.value.as().c_str()); + if (updatedItem.name != "channel") { // todo: fix the problem at channel, not here... + if (originId.toInt()) { // Front-end client IDs are numeric; internal origins ("module", etc.) return 0 saveNeeded = true; } } From 2cba94d961e4f6e91498cdd94da5540f95acc0c7 Mon Sep 17 00:00:00 2001 From: ewowi Date: Tue, 10 Feb 2026 13:46:36 +0100 Subject: [PATCH 3/5] enable SharedFSPersistence backend ======= - main: enable SharedFSPersistence - Module: remove _fsPersistence - NodeManager: comment _fileManager->read() readFromFS(); - WIP --- src/MoonBase/Module.cpp | 6 +++--- src/MoonBase/Module.h | 7 +++---- src/MoonBase/NodeManager.h | 2 +- src/MoonBase/SharedFSPersistence.h | 13 ++++++++----- src/main.cpp | 17 +++++++++-------- 5 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/MoonBase/Module.cpp b/src/MoonBase/Module.cpp index 93daf9e1d..93c948102 100644 --- a/src/MoonBase/Module.cpp +++ b/src/MoonBase/Module.cpp @@ -261,8 +261,8 @@ StateUpdateResult ModuleState::update(JsonObject& newData, ModuleState& state, c } Module::Module(const char* moduleName, PsychicHttpServer* server, ESP32SvelteKit* sveltekit) - : _socket(sveltekit->getSocket()), - _fsPersistence(ModuleState::read, ModuleState::update, this, sveltekit->getFS(), (String("/.config/") + moduleName + ".json").c_str(), true) // 🌙 true: delayedWrites + : _socket(sveltekit->getSocket()) + // _fsPersistence(ModuleState::read, ModuleState::update, this, sveltekit->getFS(), (String("/.config/") + moduleName + ".json").c_str(), true) // 🌙 true: delayedWrites { _moduleName = (moduleName && moduleName[0] != '\0') ? moduleName : "unnamed"; @@ -277,7 +277,7 @@ Module::Module(const char* moduleName, PsychicHttpServer* server, ESP32SvelteKit void Module::begin() { EXT_LOGV(MB_TAG, ""); - _fsPersistence.readFromFS(); // overwrites the default settings in state + // _fsPersistence.readFromFS(); // overwrites the default settings in state // no virtual functions in constructor so this is in begin() _state.setupDefinition = [&](const JsonArray& controls) { diff --git a/src/MoonBase/Module.h b/src/MoonBase/Module.h index aa47885ff..7e346b06a 100644 --- a/src/MoonBase/Module.h +++ b/src/MoonBase/Module.h @@ -158,12 +158,11 @@ class Module : public StatefulService { protected: EventSocket* _socket; - void readFromFS() { // used in ModuleEffects, for live scripts... - _fsPersistence.readFromFS(); // overwrites the default settings in state - } + // void readFromFS() { // used in ModuleEffects, for live scripts... + // _fsPersistence.readFromFS(); // overwrites the default settings in state + // } private: - FSPersistence _fsPersistence; PsychicHttpServer* _server; }; diff --git a/src/MoonBase/NodeManager.h b/src/MoonBase/NodeManager.h index b832df87c..a0929f251 100644 --- a/src/MoonBase/NodeManager.h +++ b/src/MoonBase/NodeManager.h @@ -51,7 +51,7 @@ class NodeManager : public Module { name.format("/.config/%s.json", _moduleName); if (equal(updatedItem.c_str(), name.c_str())) { EXT_LOGV(ML_TAG, " %s updated -> call update %s", name.c_str(), updatedItem.c_str()); - readFromFS(); // repopulates the state, processing file changes + // readFromFS(); // repopulates the state, processing file changes. Comment temporary !!! } // uint8_t index = 0; // for (JsonObject nodeState: _state.data["nodes"].as()) { diff --git a/src/MoonBase/SharedFSPersistence.h b/src/MoonBase/SharedFSPersistence.h index 77836c0e8..e20264065 100644 --- a/src/MoonBase/SharedFSPersistence.h +++ b/src/MoonBase/SharedFSPersistence.h @@ -33,11 +33,9 @@ class SharedFSPersistence { ModuleInfo() : module(nullptr), delayedWriting(false), hasDelayedWrite(false), updateHandlerId(0) {} }; struct CStrComparator { - bool operator()(const char* a, const char* b) const { - return strcmp(a, b) < 0; - } + bool operator()(const char* a, const char* b) const { return strcmp(a, b) < 0; } }; - std::map _modules; // moduleName -> info + std::map _modules; // moduleName -> info public: SharedFSPersistence(FS* fs) : _fs(fs) {} @@ -75,7 +73,12 @@ class SharedFSPersistence { void enableUpdateHandler(const char* moduleName) { auto it = _modules.find(moduleName); if (it != _modules.end() && !it->second.updateHandlerId) { - it->second.updateHandlerId = it->second.module->addUpdateHandler([this, module = it->second.module](const String& originId) { writeToFS(module->_moduleName); }, false); + it->second.updateHandlerId = it->second.module->addUpdateHandler( + [this, module = it->second.module](const String& originId) { + ESP_LOGD(SVK_TAG, "writeToFS %s", originId.c_str()); + writeToFS(module->_moduleName); + }, + false); } } diff --git a/src/main.cpp b/src/main.cpp index 3b2db1a0f..6c2e9f034 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -223,15 +223,15 @@ static int custom_vprintf(const char* fmt, va_list args) { std::vector modules; #include "MoonBase/SharedEventEndpoint.h" +#include "MoonBase/SharedFSPersistence.h" #include "MoonBase/SharedHttpEndpoint.h" #include "MoonBase/SharedWebSocketServer.h" -// #include "MoonBase/SharedFSPersistence.h" // ADDED: Shared routers (one instance each) SharedHttpEndpoint* sharedHttpEndpoint = nullptr; SharedWebSocketServer* sharedWebSocketServer = nullptr; SharedEventEndpoint* sharedEventEndpoint = nullptr; -// SharedFSPersistence* sharedFsPersistence = nullptr; +SharedFSPersistence* sharedFsPersistence = nullptr; void setup() { #ifdef USE_ESP_IDF_LOG // 🌙 @@ -292,8 +292,8 @@ void setup() { sharedHttpEndpoint = new SharedHttpEndpoint(&server, esp32sveltekit.getSecurityManager()); sharedWebSocketServer = new SharedWebSocketServer(&server, esp32sveltekit.getSecurityManager()); sharedEventEndpoint = new SharedEventEndpoint(esp32sveltekit.getSocket()); - // sharedFsPersistence = new SharedFSPersistence(esp32sveltekit.getFS()); - if (!sharedHttpEndpoint || !sharedWebSocketServer || !sharedEventEndpoint) { + sharedFsPersistence = new SharedFSPersistence(esp32sveltekit.getFS()); + if (!sharedHttpEndpoint || !sharedWebSocketServer || !sharedEventEndpoint || !sharedFsPersistence) { EXT_LOGE(ML_TAG, "dev: Failed to allocate shared routers"); return; } @@ -301,7 +301,6 @@ void setup() { modules.reserve(12); // Adjust based on actual module count modules.push_back(&moduleTasks); modules.push_back(&moduleIO); -// modules.push_back(&fileManager); // MoonLight #if FT_ENABLED(FT_MOONLIGHT) @@ -321,19 +320,21 @@ void setup() { sharedHttpEndpoint->registerModule(module); sharedWebSocketServer->registerModule(module); sharedEventEndpoint->registerModule(module); - // sharedFsPersistence->registerModule(module); + sharedFsPersistence->registerModule(module, true); // delayedWriting } // Begin shared routers (one-time setup) sharedHttpEndpoint->begin(); sharedWebSocketServer->begin(); sharedEventEndpoint->begin(); -// sharedFsPersistence->begin(); + sharedFsPersistence->begin(); // MoonBase #if FT_ENABLED(FT_MOONBASE) fileManager.begin(); - for (Module* module : modules) module->begin(); + for (Module* module : modules) { + module->begin(); + } // 🌙 #if FT_ENABLED(FT_MOONLIGHT) From 45c03a5de34e0f3e5ee34f7826b9f2598da1c617 Mon Sep 17 00:00:00 2001 From: ewowi Date: Tue, 10 Feb 2026 15:21:04 +0100 Subject: [PATCH 4/5] SharedFsPersistence: fix delayed writes backend ======= - main: first module.begin, then shared*.begin - FileManager: use shared writeToFSDelayed - SharedFsPersistence: readFromFs from register to begin - NodeManager: _fileManager->read() : fix sharedFsPersistence->readFromFS(_moduleName); --- src/MoonBase/Modules/FileManager.cpp | 15 +++++++++------ src/MoonBase/NodeManager.h | 5 ++++- src/MoonBase/SharedFSPersistence.h | 14 +++++--------- src/main.cpp | 12 ++++++------ 4 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/MoonBase/Modules/FileManager.cpp b/src/MoonBase/Modules/FileManager.cpp index 620422116..f2b61820a 100644 --- a/src/MoonBase/Modules/FileManager.cpp +++ b/src/MoonBase/Modules/FileManager.cpp @@ -13,6 +13,7 @@ #include "FileManager.h" + #include "MoonBase/SharedFSPersistence.h" #include "MoonBase/Utilities.h" // recursively fill a fileArray with all files and folders on the FS @@ -55,7 +56,7 @@ void FilesState::read(FilesState& state, JsonObject& stateJson) { EXT_LOGI(MB_TAG, ""); } -StateUpdateResult FilesState::update(JsonObject& newData, FilesState& state, const String &originId) { +StateUpdateResult FilesState::update(JsonObject& newData, FilesState& state, const String& originId) { bool changed = false; if (newData["showHidden"] != state.showHidden) { @@ -139,13 +140,13 @@ StateUpdateResult FilesState::update(JsonObject& newData, FilesState& state, con } FileManager::FileManager(PsychicHttpServer* server, ESP32SvelteKit* sveltekit) - : _httpEndpoint(FilesState::read, FilesState::update, this, server, "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/rest/FileManager", sveltekit->getSecurityManager(), AuthenticationPredicates::IS_AUTHENTICATED), + : _httpEndpoint(FilesState::read, FilesState::update, this, server, "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/rest/FileManager", // + sveltekit->getSecurityManager(), AuthenticationPredicates::IS_AUTHENTICATED), _eventEndpoint(FilesState::read, FilesState::update, this, sveltekit->getSocket(), "FileManager"), _webSocketServer(FilesState::read, FilesState::update, this, server, "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/ws/FileManager", sveltekit->getSecurityManager(), AuthenticationPredicates::IS_AUTHENTICATED), _socket(sveltekit->getSocket()), _server(server), - _sveltekit(sveltekit) { -} + _sveltekit(sveltekit) {} void FileManager::begin() { _httpEndpoint.begin(); @@ -160,7 +161,7 @@ void FileManager::begin() { [this](PsychicRequest* request) { request->reply(200); - FSPersistence::writeToFSDelayed('W'); // write all delayed writes to the FS + SharedFSPersistence::writeToFSDelayed('W'); // write all delayed writes to the FS saveNeeded = false; @@ -172,7 +173,9 @@ void FileManager::begin() { _sveltekit->getSecurityManager()->wrapRequest( [this](PsychicRequest* request) { request->reply(200); - FSPersistence::writeToFSDelayed('C'); // read back from FS + + SharedFSPersistence::writeToFSDelayed('C'); // read back from FS + // update UI... saveNeeded = false; diff --git a/src/MoonBase/NodeManager.h b/src/MoonBase/NodeManager.h index a0929f251..cce8d3223 100644 --- a/src/MoonBase/NodeManager.h +++ b/src/MoonBase/NodeManager.h @@ -15,8 +15,11 @@ #if FT_MOONLIGHT #include "MoonBase/Module.h" + #include "MoonBase/SharedFSPersistence.h" #include "Nodes.h" //Nodes.h will include VirtualLayer.h which will include PhysicalLayer.h +extern SharedFSPersistence* sharedFsPersistence; + class NodeManager : public Module { public: Char<32> defaultNodeName; @@ -51,7 +54,7 @@ class NodeManager : public Module { name.format("/.config/%s.json", _moduleName); if (equal(updatedItem.c_str(), name.c_str())) { EXT_LOGV(ML_TAG, " %s updated -> call update %s", name.c_str(), updatedItem.c_str()); - // readFromFS(); // repopulates the state, processing file changes. Comment temporary !!! + sharedFsPersistence->readFromFS(_moduleName); // repopulates the state, processing file changes. Comment temporary !!! } // uint8_t index = 0; // for (JsonObject nodeState: _state.data["nodes"].as()) { diff --git a/src/MoonBase/SharedFSPersistence.h b/src/MoonBase/SharedFSPersistence.h index e20264065..fe7474573 100644 --- a/src/MoonBase/SharedFSPersistence.h +++ b/src/MoonBase/SharedFSPersistence.h @@ -52,12 +52,13 @@ class SharedFSPersistence { info.updateHandlerId = module->addUpdateHandler([this, module](const String& originId) { writeToFS(module->_moduleName); }, false); _modules[module->_moduleName] = info; - - // Read initial state from filesystem - readFromFS(module->_moduleName); } void begin() { + // Read initial state from filesystem + for (auto& pair : _modules) { + readFromFS(pair.first); + } // All setup happens in registerModule } @@ -73,12 +74,7 @@ class SharedFSPersistence { void enableUpdateHandler(const char* moduleName) { auto it = _modules.find(moduleName); if (it != _modules.end() && !it->second.updateHandlerId) { - it->second.updateHandlerId = it->second.module->addUpdateHandler( - [this, module = it->second.module](const String& originId) { - ESP_LOGD(SVK_TAG, "writeToFS %s", originId.c_str()); - writeToFS(module->_moduleName); - }, - false); + it->second.updateHandlerId = it->second.module->addUpdateHandler([this, module = it->second.module](const String& originId) { writeToFS(module->_moduleName); }, false); } } diff --git a/src/main.cpp b/src/main.cpp index 6c2e9f034..8404d6819 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -323,12 +323,6 @@ void setup() { sharedFsPersistence->registerModule(module, true); // delayedWriting } - // Begin shared routers (one-time setup) - sharedHttpEndpoint->begin(); - sharedWebSocketServer->begin(); - sharedEventEndpoint->begin(); - sharedFsPersistence->begin(); - // MoonBase #if FT_ENABLED(FT_MOONBASE) fileManager.begin(); @@ -336,6 +330,12 @@ void setup() { module->begin(); } + // Begin shared routers (one-time setup) + sharedHttpEndpoint->begin(); + sharedWebSocketServer->begin(); + sharedEventEndpoint->begin(); + sharedFsPersistence->begin(); + // 🌙 #if FT_ENABLED(FT_MOONLIGHT) xTaskCreatePinnedToCore(effectTask, // task function From 8f60da02bb8fd2f1e891df4f01f242335cfdc3b6 Mon Sep 17 00:00:00 2001 From: ewowi Date: Tue, 10 Feb 2026 16:03:01 +0100 Subject: [PATCH 5/5] carLights layouts adjustments, nodename emoji resilient backend ======= - main.cpp: update sizeof() -> much better - Nodemanager: checkAndAlloc: update name if non AZaz09 part changed. addNode: name is by reference argument - Layouts: carLights: adjustments --- src/MoonBase/NodeManager.h | 10 +++++--- src/MoonLight/Modules/ModuleDrivers.h | 2 +- src/MoonLight/Modules/ModuleEffects.h | 2 +- src/MoonLight/Nodes/Layouts/L_MoonLight.h | 14 +++++------- src/main.cpp | 28 +++++++++++------------ 5 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/MoonBase/NodeManager.h b/src/MoonBase/NodeManager.h index cce8d3223..57e700680 100644 --- a/src/MoonBase/NodeManager.h +++ b/src/MoonBase/NodeManager.h @@ -82,11 +82,12 @@ class NodeManager : public Module { virtual void addNodes(const JsonObject& control) {} - virtual Node* addNode(const uint8_t index, const char* name, const JsonArray& controls) const { return nullptr; } + virtual Node* addNode(const uint8_t index, char* name, const JsonArray& controls) const { return nullptr; } template - Node* checkAndAlloc(const char* name) const { + Node* checkAndAlloc(char* name) const { if (equalAZaz09(name, T::name())) { + strlcpy(name, getNameAndTags().c_str(), 32); // if the non AZaz09 part of the name changed, reassign the right name return allocMBObject(); } else return nullptr; @@ -173,7 +174,10 @@ class NodeManager : public Module { } } - Node* nodeClass = addNode(updatedItem.index[0], updatedItem.value, nodeState["controls"]); // set controls to valid + char name[32]; + strlcpy(name, updatedItem.value, 32); + Node* nodeClass = addNode(updatedItem.index[0], name, nodeState["controls"]); // set controls to valid + if (updatedItem.value != name) nodeState["name"] = name; // if the non AZaz09 part of the name changed, reassign the right name // remove invalid controls // Iterate backwards to avoid index shifting issues diff --git a/src/MoonLight/Modules/ModuleDrivers.h b/src/MoonLight/Modules/ModuleDrivers.h index bd5010077..40dfeb3e8 100644 --- a/src/MoonLight/Modules/ModuleDrivers.h +++ b/src/MoonLight/Modules/ModuleDrivers.h @@ -118,7 +118,7 @@ class ModuleDrivers : public NodeManager { _moduleName); } - Node* addNode(const uint8_t index, const char* name, const JsonArray& controls) const override { + Node* addNode(const uint8_t index, char* name, const JsonArray& controls) const override { Node* node = nullptr; // Layouts, most used first diff --git a/src/MoonLight/Modules/ModuleEffects.h b/src/MoonLight/Modules/ModuleEffects.h index ea479b92c..2e8b2dabc 100644 --- a/src/MoonLight/Modules/ModuleEffects.h +++ b/src/MoonLight/Modules/ModuleEffects.h @@ -173,7 +173,7 @@ class ModuleEffects : public NodeManager { rootFolder.close(); } - Node* addNode(const uint8_t index, const char* name, const JsonArray& controls) const override { + Node* addNode(const uint8_t index, char* name, const JsonArray& controls) const override { Node* node = nullptr; // MoonLight effects, Solid first then alphabetically diff --git a/src/MoonLight/Nodes/Layouts/L_MoonLight.h b/src/MoonLight/Nodes/Layouts/L_MoonLight.h index 52c25cf9c..0f9bef5f5 100644 --- a/src/MoonLight/Nodes/Layouts/L_MoonLight.h +++ b/src/MoonLight/Nodes/Layouts/L_MoonLight.h @@ -539,10 +539,8 @@ class Rings16Layout : public Node { static const char* tags() { return "🚥"; } uint8_t scale = 1; - - void setup() override { - addControl(scale, "scale", "slider", 1, 10); - } + + void setup() override { addControl(scale, "scale", "slider", 1, 10); } bool hasOnLayout() const override { return true; } @@ -658,7 +656,7 @@ class CarLightsLayout : public Node { uint8_t leftMargin = 9; // inner light left - ringLayout.ringCenter = {leftMargin + 11, 10, 0}; + ringLayout.ringCenter = {leftMargin + 11, 8, 0}; ringLayout.nrOfLEDs = 1; ringLayout.onLayout(); ringLayout.nrOfLEDs = 8; @@ -682,13 +680,13 @@ class CarLightsLayout : public Node { ringLayout.onLayout(); ringLayout.nrOfLEDs = 24; ringLayout.onLayout(); - ringLayout.nrOfLEDs = 34; + ringLayout.nrOfLEDs = 32; ringLayout.onLayout(); nextPin(); // inner light right - ringLayout.ringCenter = {leftMargin + 25, 10, 0}; + ringLayout.ringCenter = {leftMargin + 25, 8, 0}; ringLayout.nrOfLEDs = 1; ringLayout.onLayout(); ringLayout.nrOfLEDs = 8; @@ -712,7 +710,7 @@ class CarLightsLayout : public Node { ringLayout.onLayout(); ringLayout.nrOfLEDs = 24; ringLayout.onLayout(); - ringLayout.nrOfLEDs = 34; + ringLayout.nrOfLEDs = 32; ringLayout.onLayout(); nextPin(); diff --git a/src/main.cpp b/src/main.cpp index 8404d6819..92cd1b11f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -252,7 +252,7 @@ void setup() { } // // check sizes ... - // sizeof(esp32sveltekit); // 4152 + // sizeof(esp32sveltekit); // 4152 -> 4376 // sizeof(WiFiSettingsService); // 456 // sizeof(SystemStatus); // 16 // sizeof(UploadFirmwareService); // 32 @@ -260,29 +260,29 @@ void setup() { // sizeof(EventEndpoint); // 112 // sizeof(SharedEventEndpoint); // 8 // sizeof(WebSocketServer); // 488 - // sizeof(SharedWebSocketServer); // 352 + // sizeof(SharedWebSocketServer); // 352 -> 432 // sizeof(FSPersistence); // 128 // sizeof(PsychicHttpServer*); // 8 // sizeof(HttpEndpoint); // 152 - // sizeof(SharedHttpEndpoint); // 16 + // sizeof(SharedHttpEndpoint); // 16 -> 48 // sizeof(FSPersistence); // 128 // sizeof(APSettingsService); // 600; // sizeof(PsychicWebSocketHandler); // 336 // sizeof(fileManager); // 864 - // sizeof(Module); // 1144 -> 472 - // sizeof(moduleDevices); // 1320 - // sizeof(moduleIO); // 1144 + // sizeof(Module); // 1144 -> 472 -> 208 ! + // sizeof(moduleDevices); // 1320 -> 392 + // sizeof(moduleIO); // 1144 -> 240 // #if FT_ENABLED(FT_MOONLIGHT) - // sizeof(moduleEffects); // 1208 - // sizeof(moduleDrivers); // 1216 - // sizeof(moduleLightsControl); // 1176 + // sizeof(moduleEffects); // 1208 -> 264 + // sizeof(moduleDrivers); // 1216 -> 288 + // sizeof(moduleLightsControl); // 1176 -> 296 // #if FT_ENABLED(FT_LIVESCRIPT) - // sizeof(moduleLiveScripts); // 1176 + // sizeof(moduleLiveScripts); // 1176 -> 240 // #endif - // sizeof(moduleChannels); // 1144 - // sizeof(moduleMoonLightInfo); // 1144 - // sizeof(layerP.lights); // 56 - // sizeof(layerP.lights.header); // 40 + // sizeof(moduleChannels); // 1144 -> 208 + // sizeof(moduleMoonLightInfo); // 1144 -> 208 + // sizeof(layerP.lights); // 56 -> 96 + // sizeof(layerP.lights.header); // 40 -> 64 // #endif // start ESP32-SvelteKit