diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile index 29d75d19..cab85e35 100644 --- a/.gitpod.Dockerfile +++ b/.gitpod.Dockerfile @@ -1,5 +1,3 @@ FROM gitpod/workspace-full - -USER gitpod -RUN pip3 install -U platformio +USER gitpod diff --git a/.gitpod.yml b/.gitpod.yml index cc416b1c..8452f08b 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -1,12 +1,11 @@ tasks: - - command: platformio run + - command: pip3 install -U platformio && platformio run image: file: .gitpod.Dockerfile vscode: extensions: - - ms-vscode.cpptools@0.26.3:u3GsZ5PK12Ddr79vh4TWgQ== - - eamodio.gitlens@10.2.1:e0IYyp0efFqVsrZwsIe8CA== - - Atishay-Jain.All-Autocomplete@0.0.23:fbZNfSpnd8XkAHGfAPS2rA== - - 2gua.rainbow-brackets@0.0.6:Tbu8dTz0i+/bgcKQTQ5b8g== + - Atishay-Jain.All-Autocomplete + - esbenp.prettier-vscode + - shardulm94.trailing-spaces diff --git a/package-lock.json b/package-lock.json index 819b4f04..839e4c61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "wled", - "version": "0.14.0.2.2", + "version": "0.14.0.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "wled", - "version": "0.14.0.2.2", + "version": "0.14.0.3.0", "license": "ISC", "dependencies": { "clean-css": "^4.2.3", diff --git a/package.json b/package.json index 1ef6ed9e..f3c756fc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wled", - "version": "0.14.0.2.2", + "version": "0.14.0.3.0", "description": "Tools for WLED project", "main": "tools/cdata.js", "directories": { diff --git a/usermods/Analog_Clock/Analog_Clock.h b/usermods/Analog_Clock/Analog_Clock.h index 10c47588..b8f44f78 100644 --- a/usermods/Analog_Clock/Analog_Clock.h +++ b/usermods/Analog_Clock/Analog_Clock.h @@ -44,6 +44,8 @@ private: // configuration (available in API and stored in flash) bool enabled = false; Segment mainSegment; + bool hourMarksEnabled = true; + uint32_t hourMarkColor = 0xFF0000; uint32_t hourColor = 0x0000FF; uint32_t minuteColor = 0x00FF00; bool secondsEnabled = true; @@ -87,10 +89,9 @@ private: } bool hexStringToColor(String const& s, uint32_t& c, uint32_t def) { - errno = 0; - char* ep; + char *ep; unsigned long long r = strtoull(s.c_str(), &ep, 16); - if (*ep == 0 && errno != ERANGE) { + if (*ep == 0) { c = r; return true; } else { @@ -162,11 +163,18 @@ public: lastOverlayDraw = millis(); auto time = toki.getTime(); - auto localSec = tz ? tz->toLocal(time.sec) : time.sec; - double secondP = second(localSec) / 60.0; - double minuteP = minute(localSec) / 60.0; - double hourP = (hour(localSec) % 12) / 12.0 + minuteP / 12.0; - + double secondP = second(localTime) / 60.0; + double minuteP = minute(localTime) / 60.0; + double hourP = (hour(localTime) % 12) / 12.0 + minuteP / 12.0; + + if (hourMarksEnabled) { + for (int Led = 0; Led <= 55; Led = Led + 5) + { + int16_t hourmarkled = adjustToSegment(Led / 60.0, mainSegment); + setPixelColor(hourmarkled, hourMarkColor); + } + } + if (secondsEnabled) { int16_t secondLed = adjustToSegment(secondP, secondsSegment); @@ -200,6 +208,8 @@ public: top["First LED (Main Ring)"] = mainSegment.firstLed; top["Last LED (Main Ring)"] = mainSegment.lastLed; top["Center/12h LED (Main Ring)"] = mainSegment.centerLed; + top["Hour Marks Enabled"] = hourMarksEnabled; + top["Hour Mark Color (RRGGBB)"] = colorToHexString(hourMarkColor); top["Hour Color (RRGGBB)"] = colorToHexString(hourColor); top["Minute Color (RRGGBB)"] = colorToHexString(minuteColor); top["Show Seconds"] = secondsEnabled; @@ -221,6 +231,8 @@ public: configComplete &= getJsonValue(top["First LED (Main Ring)"], mainSegment.firstLed, 0); configComplete &= getJsonValue(top["Last LED (Main Ring)"], mainSegment.lastLed, 59); configComplete &= getJsonValue(top["Center/12h LED (Main Ring)"], mainSegment.centerLed, 0); + configComplete &= getJsonValue(top["Hour marks Enabled"], hourMarksEnabled, false); + configComplete &= getJsonValue(top["Hour mark Color (RRGGBB)"], color, "FF0000") && hexStringToColor(color, hourMarkColor, 0x0000FF); configComplete &= getJsonValue(top["Hour Color (RRGGBB)"], color, "0000FF") && hexStringToColor(color, hourColor, 0x0000FF); configComplete &= getJsonValue(top["Minute Color (RRGGBB)"], color, "00FF00") && hexStringToColor(color, minuteColor, 0x00FF00); configComplete &= getJsonValue(top["Show Seconds"], secondsEnabled, true); diff --git a/usermods/sd_card/readme.md b/usermods/sd_card/readme.md new file mode 100644 index 00000000..299b68eb --- /dev/null +++ b/usermods/sd_card/readme.md @@ -0,0 +1,34 @@ +# SD-card mod + +## Build +- modify `platformio.ini` and add to the `build_flags` of your configuration the following +- choose the way your SD is connected + 1. via `-D WLED_USE_SD_MMC` when connected via MMC + 2. via `-D WLED_USE_SD_SPI` when connected via SPI (use usermod page to setup SPI pins) + +### Test +- enable `-D SD_PRINT_HOME_DIR` and `-D WLED_DEBUG` +- this will print all files in `/` on boot via serial + +## Configuration +### MMC +- The MMC port / pins needs no configuration as they are specified by Espressif +### SPI +- The SPI port / pins can be modified via the WLED web-UI: `Config → Usermod → SD Card` + | option | effect | default | + | ----------------- | ------------------------------------------------------------------------------------------------ | ------- | + | `pinSourceSelect` | GPIO that is connected to SD's `SS`(source select) / `CS`(chip select) | 16 | + | `pinSourceClock` | GPIO that is connected to SD's `SCLK` (source clock) / `CLK`(clock) | 14 | + | `pinPoci` | GPIO that is connected to SD's `POCI` (Peripheral-Out-Ctrl-In) / `MISO` (deprecated) | 36 | + | `pinPico` | GPIO that is connected to SD's `PICO` (Peripheral-In-Ctrl-Out) / `MOSI` (deprecated) | 14 | + | `sdEnable` | Enable to read data from the SD-card | true | + + Following new naming convention of [OSHWA](https://www.oshwa.org/a-resolution-to-redefine-spi-signal-names/) + +## Usage in other mods +- creates a macro `SD_ADAPTER` which is either mapped to `SD` or `SD_MMC` (see `SD_Test.ino` how to use SD / SD_MMC functions) + +- checks if the specified file is available on the SD card + ```cpp + bool file_onSD(const char *filepath) {...} + ``` \ No newline at end of file diff --git a/usermods/sd_card/usermod_sd_card.h b/usermods/sd_card/usermod_sd_card.h new file mode 100644 index 00000000..5dac7915 --- /dev/null +++ b/usermods/sd_card/usermod_sd_card.h @@ -0,0 +1,243 @@ +#pragma once + +#include "wled.h" + +// SD connected via MMC / SPI +#if defined(WLED_USE_SD_MMC) + #define USED_STORAGE_FILESYSTEMS "SD MMC, LittleFS" + #define SD_ADAPTER SD_MMC + #include "SD_MMC.h" +// SD connected via SPI (adjustable via usermod config) +#elif defined(WLED_USE_SD_SPI) + #define SD_ADAPTER SD + #define USED_STORAGE_FILESYSTEMS "SD SPI, LittleFS" + #include "SD.h" + #include "SPI.h" +#endif + +#ifdef WLED_USE_SD_MMC +#elif defined(WLED_USE_SD_SPI) + SPIClass spiPort = SPIClass(VSPI); +#endif + +void listDir( const char * dirname, uint8_t levels); + +class UsermodSdCard : public Usermod { + private: + bool sdInitDone = false; + + #ifdef WLED_USE_SD_SPI + int8_t configPinSourceSelect = 16; + int8_t configPinSourceClock = 14; + int8_t configPinPoci = 36; // confusing names? Then have a look :) + int8_t configPinPico = 15; // https://www.oshwa.org/a-resolution-to-redefine-spi-signal-names/ + + //acquired and initialize the SPI port + void init_SD_SPI() + { + if(!configSdEnabled) return; + if(sdInitDone) return; + + PinManagerPinType pins[5] = { + { configPinSourceSelect, true }, + { configPinSourceClock, true }, + { configPinPoci, false }, + { configPinPico, true } + }; + + if (!pinManager.allocateMultiplePins(pins, 4, PinOwner::UM_SdCard)) { + DEBUG_PRINTF("[%s] SD (SPI) pin allocation failed!\n", _name); + sdInitDone = false; + return; + } + + bool returnOfInitSD = false; + + #if defined(WLED_USE_SD_SPI) + spiPort.begin(configPinSourceClock, configPinPoci, configPinPico, configPinSourceSelect); + returnOfInitSD = SD_ADAPTER.begin(configPinSourceSelect, spiPort); + #endif + + if(!returnOfInitSD) { + DEBUG_PRINTF("[%s] SPI begin failed!\n", _name); + sdInitDone = false; + return; + } + + sdInitDone = true; + } + + //deinitialize the acquired SPI port + void deinit_SD_SPI() + { + if(!sdInitDone) return; + + SD_ADAPTER.end(); + + DEBUG_PRINTF("[%s] deallocate pins!\n", _name); + pinManager.deallocatePin(configPinSourceSelect, PinOwner::UM_SdCard); + pinManager.deallocatePin(configPinSourceClock, PinOwner::UM_SdCard); + pinManager.deallocatePin(configPinPoci, PinOwner::UM_SdCard); + pinManager.deallocatePin(configPinPico, PinOwner::UM_SdCard); + + sdInitDone = false; + } + + // some SPI pin was changed, while SPI was initialized, reinit to new port + void reinit_SD_SPI() + { + deinit_SD_SPI(); + init_SD_SPI(); + } + #endif + + #ifdef WLED_USE_SD_MMC + void init_SD_MMC() { + if(sdInitDone) return; + bool returnOfInitSD = false; + returnOfInitSD = SD_ADAPTER.begin(); + DEBUG_PRINTF("[%s] MMC begin\n", _name); + + if(!returnOfInitSD) { + DEBUG_PRINTF("[%s] MMC begin failed!\n", _name); + sdInitDone = false; + return; + } + + sdInitDone = true; + } + #endif + + public: + static bool configSdEnabled; + static const char _name[]; + + void setup() { + DEBUG_PRINTF("[%s] usermod loaded \n", _name); + #if defined(WLED_USE_SD_SPI) + init_SD_SPI(); + #elif defined(WLED_USE_SD_MMC) + init_SD_MMC(); + #endif + + #if defined(SD_ADAPTER) && defined(SD_PRINT_HOME_DIR) + listDir("/", 0); + #endif + } + + void loop(){ + + } + + uint16_t getId() + { + return USERMOD_ID_SD_CARD; + } + + void addToConfig(JsonObject& root) + { + #ifdef WLED_USE_SD_SPI + JsonObject top = root.createNestedObject(FPSTR(_name)); + top["pinSourceSelect"] = configPinSourceSelect; + top["pinSourceClock"] = configPinSourceClock; + top["pinPoci"] = configPinPoci; + top["pinPico"] = configPinPico; + top["sdEnabled"] = configSdEnabled; + #endif + } + + bool readFromConfig(JsonObject &root) + { + #ifdef WLED_USE_SD_SPI + JsonObject top = root[FPSTR(_name)]; + if (top.isNull()) { + DEBUG_PRINTF("[%s] No config found. (Using defaults.)\n", _name); + return false; + } + + uint8_t oldPinSourceSelect = configPinSourceSelect; + uint8_t oldPinSourceClock = configPinSourceClock; + uint8_t oldPinPoci = configPinPoci; + uint8_t oldPinPico = configPinPico; + bool oldSdEnabled = configSdEnabled; + + getJsonValue(top["pinSourceSelect"], configPinSourceSelect); + getJsonValue(top["pinSourceClock"], configPinSourceClock); + getJsonValue(top["pinPoci"], configPinPoci); + getJsonValue(top["pinPico"], configPinPico); + getJsonValue(top["sdEnabled"], configSdEnabled); + + if(configSdEnabled != oldSdEnabled) { + configSdEnabled ? init_SD_SPI() : deinit_SD_SPI(); + DEBUG_PRINTF("[%s] SD card %s\n", _name, configSdEnabled ? "enabled" : "disabled"); + } + + if( configSdEnabled && ( + oldPinSourceSelect != configPinSourceSelect || + oldPinSourceClock != configPinSourceClock || + oldPinPoci != configPinPoci || + oldPinPico != configPinPico) + ) + { + DEBUG_PRINTF("[%s] Init SD card based of config\n", _name); + DEBUG_PRINTF("[%s] Config changes \n - SS: %d -> %d\n - MI: %d -> %d\n - MO: %d -> %d\n - En: %d -> %d\n", _name, oldPinSourceSelect, configPinSourceSelect, oldPinSourceClock, configPinSourceClock, oldPinPoci, configPinPoci, oldPinPico, configPinPico); + reinit_SD_SPI(); + } + #endif + + return true; + } +}; + +const char UsermodSdCard::_name[] PROGMEM = "SD Card"; +bool UsermodSdCard::configSdEnabled = true; + +#ifdef SD_ADAPTER +//checks if the file is available on SD card +bool file_onSD(const char *filepath) +{ + #ifdef WLED_USE_SD_SPI + if(!UsermodSdCard::configSdEnabled) return false; + #endif + + uint8_t cardType = SD_ADAPTER.cardType(); + if(cardType == CARD_NONE) { + DEBUG_PRINTF("[%s] not attached / cardType none\n", UsermodSdCard::_name); + return false; // no SD card attached + } + if(cardType == CARD_MMC || cardType == CARD_SD || cardType == CARD_SDHC) + { + return SD_ADAPTER.exists(filepath); + } + + return false; // unknown card type +} + +void listDir( const char * dirname, uint8_t levels){ + DEBUG_PRINTF("Listing directory: %s\n", dirname); + + File root = SD_ADAPTER.open(dirname); + if(!root){ + DEBUG_PRINTF("Failed to open directory\n"); + return; + } + if(!root.isDirectory()){ + DEBUG_PRINTF("Not a directory\n"); + return; + } + + File file = root.openNextFile(); + while(file){ + if(file.isDirectory()){ + DEBUG_PRINTF(" DIR : %s\n",file.name()); + if(levels){ + listDir(file.name(), levels -1); + } + } else { + DEBUG_PRINTF(" FILE: %s SIZE: %d\n",file.name(), file.size()); + } + file = root.openNextFile(); + } +} + +#endif \ No newline at end of file diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 29ee1fee..2a7a8122 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -120,7 +120,7 @@ uint16_t blink(uint32_t color1, uint32_t color2, bool strobe, bool do_palette) { uint16_t mode_blink(void) { return blink(SEGCOLOR(0), SEGCOLOR(1), false, true); } -static const char _data_FX_MODE_BLINK[] PROGMEM = "Blink@!,Duty cycle;!,!,;!;1d"; +static const char _data_FX_MODE_BLINK[] PROGMEM = "Blink@!,Duty cycle;!,!;!;1d"; /* @@ -129,7 +129,7 @@ static const char _data_FX_MODE_BLINK[] PROGMEM = "Blink@!,Duty cycle;!,!,;!;1d" uint16_t mode_blink_rainbow(void) { return blink(SEGMENT.color_wheel(SEGENV.call & 0xFF), SEGCOLOR(1), false, false); } -static const char _data_FX_MODE_BLINK_RAINBOW[] PROGMEM = "Blink Rainbow@Frequency,Blink duration;!,!,;!;1d"; +static const char _data_FX_MODE_BLINK_RAINBOW[] PROGMEM = "Blink Rainbow@Frequency,Blink duration;!,!;!;1d"; /* @@ -138,7 +138,7 @@ static const char _data_FX_MODE_BLINK_RAINBOW[] PROGMEM = "Blink Rainbow@Frequen uint16_t mode_strobe(void) { return blink(SEGCOLOR(0), SEGCOLOR(1), true, true); } -static const char _data_FX_MODE_STROBE[] PROGMEM = "Strobe@!,;!,!,;!;1d"; +static const char _data_FX_MODE_STROBE[] PROGMEM = "Strobe@!;!,!;!;1d"; /* @@ -147,7 +147,7 @@ static const char _data_FX_MODE_STROBE[] PROGMEM = "Strobe@!,;!,!,;!;1d"; uint16_t mode_strobe_rainbow(void) { return blink(SEGMENT.color_wheel(SEGENV.call & 0xFF), SEGCOLOR(1), true, false); } -static const char _data_FX_MODE_STROBE_RAINBOW[] PROGMEM = "Strobe Rainbow@!,;,!,;!;1d"; +static const char _data_FX_MODE_STROBE_RAINBOW[] PROGMEM = "Strobe Rainbow@!;,!;!;1d"; /* @@ -213,7 +213,7 @@ uint16_t color_wipe(bool rev, bool useRandomColors) { uint16_t mode_color_wipe(void) { return color_wipe(false, false); } -static const char _data_FX_MODE_COLOR_WIPE[] PROGMEM = "Wipe@!,!;!,!,;!;1d"; +static const char _data_FX_MODE_COLOR_WIPE[] PROGMEM = "Wipe@!,!;!,!;!;1d"; /* @@ -222,7 +222,7 @@ static const char _data_FX_MODE_COLOR_WIPE[] PROGMEM = "Wipe@!,!;!,!,;!;1d"; uint16_t mode_color_sweep(void) { return color_wipe(true, false); } -static const char _data_FX_MODE_COLOR_SWEEP[] PROGMEM = "Sweep@!,!;!,!,;!;1d"; +static const char _data_FX_MODE_COLOR_SWEEP[] PROGMEM = "Sweep@!,!;!,!;!;1d"; /* @@ -232,7 +232,7 @@ static const char _data_FX_MODE_COLOR_SWEEP[] PROGMEM = "Sweep@!,!;!,!,;!;1d"; uint16_t mode_color_wipe_random(void) { return color_wipe(false, true); } -static const char _data_FX_MODE_COLOR_WIPE_RANDOM[] PROGMEM = "Wipe Random@!,;1,2,3;!;1d"; +static const char _data_FX_MODE_COLOR_WIPE_RANDOM[] PROGMEM = "Wipe Random@!;1,2,3;!;1d"; /* @@ -348,7 +348,7 @@ uint16_t mode_breath(void) { return FRAMETIME; } -static const char _data_FX_MODE_BREATH[] PROGMEM = "Breathe@!,;!,!;!;1d"; +static const char _data_FX_MODE_BREATH[] PROGMEM = "Breathe@!;!,!;!;1d"; /* @@ -364,7 +364,7 @@ uint16_t mode_fade(void) { return FRAMETIME; } -static const char _data_FX_MODE_FADE[] PROGMEM = "Fade@!,;!,!,;!;1d"; +static const char _data_FX_MODE_FADE[] PROGMEM = "Fade@!;!,!;!;1d"; /* @@ -488,7 +488,7 @@ uint16_t running(uint32_t color1, uint32_t color2, bool theatre = false) { uint16_t mode_theater_chase(void) { return running(SEGCOLOR(0), SEGCOLOR(1), true); } -static const char _data_FX_MODE_THEATER_CHASE[] PROGMEM = "Theater@!,Gap size;!,!,;!;1d"; +static const char _data_FX_MODE_THEATER_CHASE[] PROGMEM = "Theater@!,Gap size;!,!;!;1d"; /* @@ -550,7 +550,7 @@ static const char _data_FX_MODE_RUNNING_DUAL[] PROGMEM = "Running Dual"; uint16_t mode_running_lights(void) { return running_base(false); } -static const char _data_FX_MODE_RUNNING_LIGHTS[] PROGMEM = "Running@!,Wave width;!,!,;!;1d"; +static const char _data_FX_MODE_RUNNING_LIGHTS[] PROGMEM = "Running@!,Wave width;!,!;!;1d"; /* @@ -559,7 +559,7 @@ static const char _data_FX_MODE_RUNNING_LIGHTS[] PROGMEM = "Running@!,Wave width uint16_t mode_saw(void) { return running_base(true); } -static const char _data_FX_MODE_SAW[] PROGMEM = "Saw@!,Width;!,!,;!;1d"; +static const char _data_FX_MODE_SAW[] PROGMEM = "Saw@!,Width;!,!;!;1d"; /* @@ -596,7 +596,7 @@ uint16_t mode_twinkle(void) { return FRAMETIME; } -static const char _data_FX_MODE_TWINKLE[] PROGMEM = "Twinkle@!,;!,!,;!;mp12=0,1d"; //pixels +static const char _data_FX_MODE_TWINKLE[] PROGMEM = "Twinkle@!;!,!;!;mp12=0,1d"; //pixels /* @@ -642,7 +642,7 @@ uint16_t dissolve(uint32_t color) { uint16_t mode_dissolve(void) { return dissolve(SEGCOLOR(0)); } -static const char _data_FX_MODE_DISSOLVE[] PROGMEM = "Dissolve@Repeat speed,Dissolve speed;!,!,;!;1d"; +static const char _data_FX_MODE_DISSOLVE[] PROGMEM = "Dissolve@Repeat speed,Dissolve speed;!,!;!;1d"; /* @@ -651,7 +651,7 @@ static const char _data_FX_MODE_DISSOLVE[] PROGMEM = "Dissolve@Repeat speed,Diss uint16_t mode_dissolve_random(void) { return dissolve(SEGMENT.color_wheel(random8())); } -static const char _data_FX_MODE_DISSOLVE_RANDOM[] PROGMEM = "Dissolve Rnd@Repeat speed,Dissolve speed;,!,;!;1d"; +static const char _data_FX_MODE_DISSOLVE_RANDOM[] PROGMEM = "Dissolve Rnd@Repeat speed,Dissolve speed;,!;!;1d"; /* @@ -673,7 +673,7 @@ uint16_t mode_sparkle(void) { SEGMENT.setPixelColor(SEGENV.aux0, SEGCOLOR(0)); return FRAMETIME; } -static const char _data_FX_MODE_SPARKLE[] PROGMEM = "Sparkle@!,;!,!,;!;mp12=0,1d"; +static const char _data_FX_MODE_SPARKLE[] PROGMEM = "Sparkle@!;!,!;!;mp12=0,1d"; /* @@ -694,7 +694,7 @@ uint16_t mode_flash_sparkle(void) { } return FRAMETIME; } -static const char _data_FX_MODE_FLASH_SPARKLE[] PROGMEM = "Sparkle Dark@!,!;Bg,Fx,;!;mp12=0,1d"; +static const char _data_FX_MODE_FLASH_SPARKLE[] PROGMEM = "Sparkle Dark@!,!;Bg,Fx;!;mp12=0,1d"; /* @@ -717,7 +717,7 @@ uint16_t mode_hyper_sparkle(void) { } return FRAMETIME; } -static const char _data_FX_MODE_HYPER_SPARKLE[] PROGMEM = "Sparkle+@!,!;Bg,Fx,;!;mp12=0,1d"; +static const char _data_FX_MODE_HYPER_SPARKLE[] PROGMEM = "Sparkle+@!,!;Bg,Fx;!;mp12=0,1d"; /* @@ -747,7 +747,7 @@ uint16_t mode_multi_strobe(void) { return FRAMETIME; } -static const char _data_FX_MODE_MULTI_STROBE[] PROGMEM = "Strobe Mega@!,!;!,!,;!;1d"; +static const char _data_FX_MODE_MULTI_STROBE[] PROGMEM = "Strobe Mega@!,!;!,!;!;1d"; /* @@ -799,7 +799,7 @@ uint16_t mode_android(void) { return 3 + ((8 * (uint32_t)(255 - SEGMENT.speed)) / SEGLEN); } -static const char _data_FX_MODE_ANDROID[] PROGMEM = "Android@!,Width;!,!,;!;mp12=1,1d"; //vertical +static const char _data_FX_MODE_ANDROID[] PROGMEM = "Android@!,Width;!,!;!;mp12=1,1d"; //vertical /* @@ -903,7 +903,7 @@ uint16_t mode_chase_rainbow(void) { return chase(color, SEGCOLOR(0), SEGCOLOR(1), false); } -static const char _data_FX_MODE_CHASE_RAINBOW[] PROGMEM = "Chase Rainbow@!,Width;!,!,;;1d"; +static const char _data_FX_MODE_CHASE_RAINBOW[] PROGMEM = "Chase Rainbow@!,Width;!,!;;1d"; /* @@ -917,7 +917,7 @@ uint16_t mode_chase_rainbow_white(void) { return chase(SEGCOLOR(0), color2, color3, false); } -static const char _data_FX_MODE_CHASE_RAINBOW_WHITE[] PROGMEM = "Rainbow Runner@!,Size;Bg,,;;1d"; +static const char _data_FX_MODE_CHASE_RAINBOW_WHITE[] PROGMEM = "Rainbow Runner@!,Size;Bg;;1d"; /* @@ -993,7 +993,7 @@ uint16_t mode_traffic_light(void) { return FRAMETIME; } -static const char _data_FX_MODE_TRAFFIC_LIGHT[] PROGMEM = "Traffic Light@!,;,!,;!;1d"; +static const char _data_FX_MODE_TRAFFIC_LIGHT[] PROGMEM = "Traffic Light@!;,!;!;1d"; /* @@ -1023,7 +1023,7 @@ uint16_t mode_chase_flash(void) { } return delay; } -static const char _data_FX_MODE_CHASE_FLASH[] PROGMEM = "Chase Flash@!,;Bg,Fx,!;!;1d"; +static const char _data_FX_MODE_CHASE_FLASH[] PROGMEM = "Chase Flash@!;Bg,Fx,!;!;1d"; /* @@ -1058,7 +1058,7 @@ uint16_t mode_chase_flash_random(void) { } return delay; } -static const char _data_FX_MODE_CHASE_FLASH_RANDOM[] PROGMEM = "Chase Flash Rnd@!,;,Fx,;0;1d"; +static const char _data_FX_MODE_CHASE_FLASH_RANDOM[] PROGMEM = "Chase Flash Rnd@!;,Fx;0;1d"; /* @@ -1067,7 +1067,7 @@ static const char _data_FX_MODE_CHASE_FLASH_RANDOM[] PROGMEM = "Chase Flash Rnd@ uint16_t mode_running_color(void) { return running(SEGCOLOR(0), SEGCOLOR(1)); } -static const char _data_FX_MODE_RUNNING_COLOR[] PROGMEM = "Chase 2@!,Width;!,!,;!;1d"; +static const char _data_FX_MODE_RUNNING_COLOR[] PROGMEM = "Chase 2@!,Width;!,!;!;1d"; /* @@ -1146,7 +1146,7 @@ uint16_t larson_scanner(bool dual) { uint16_t mode_larson_scanner(void){ return larson_scanner(false); } -static const char _data_FX_MODE_LARSON_SCANNER[] PROGMEM = "Scanner@!,Fade rate;!,!,;!;mp12=0,1d"; +static const char _data_FX_MODE_LARSON_SCANNER[] PROGMEM = "Scanner@!,Fade rate;!,!;!;mp12=0,1d"; /* @@ -1156,7 +1156,7 @@ static const char _data_FX_MODE_LARSON_SCANNER[] PROGMEM = "Scanner@!,Fade rate; uint16_t mode_dual_larson_scanner(void){ return larson_scanner(true); } -static const char _data_FX_MODE_DUAL_LARSON_SCANNER[] PROGMEM = "Scanner Dual@!,Fade rate;!,!,;!;mp12=0,1d"; +static const char _data_FX_MODE_DUAL_LARSON_SCANNER[] PROGMEM = "Scanner Dual@!,Fade rate;!,!;!;mp12=0,1d"; /* @@ -1221,7 +1221,7 @@ uint16_t mode_fireworks() { } return FRAMETIME; } -static const char _data_FX_MODE_FIREWORKS[] PROGMEM = "Fireworks@,Frequency;!,!,;!;ix=192,pal=11,1d,2d"; +static const char _data_FX_MODE_FIREWORKS[] PROGMEM = "Fireworks@,Frequency;!,!;!;ix=192,pal=11,1d,2d"; //Twinkling LEDs running. Inspired by https://github.com/kitesurfer1404/WS2812FX/blob/master/src/custom/Rain.h @@ -1256,7 +1256,7 @@ uint16_t mode_rain() } return mode_fireworks(); } -static const char _data_FX_MODE_RAIN[] PROGMEM = "Rain@!,Spawning rate;!,!,;;ix=128,pal=0,1d,2d"; +static const char _data_FX_MODE_RAIN[] PROGMEM = "Rain@!,Spawning rate;!,!;;ix=128,pal=0,1d,2d"; /* @@ -1285,7 +1285,7 @@ uint16_t mode_fire_flicker(void) { SEGENV.step = it; return FRAMETIME; } -static const char _data_FX_MODE_FIRE_FLICKER[] PROGMEM = "Fire Flicker@!,!;!,,;!;1d"; +static const char _data_FX_MODE_FIRE_FLICKER[] PROGMEM = "Fire Flicker@!,!;!;!;1d"; /* @@ -1323,7 +1323,7 @@ uint16_t gradient_base(bool loading) { uint16_t mode_gradient(void) { return gradient_base(false); } -static const char _data_FX_MODE_GRADIENT[] PROGMEM = "Gradient@!,Spread;!,!,;!;ix=16,1d"; +static const char _data_FX_MODE_GRADIENT[] PROGMEM = "Gradient@!,Spread;!,!;!;ix=16,1d"; /* @@ -1332,7 +1332,7 @@ static const char _data_FX_MODE_GRADIENT[] PROGMEM = "Gradient@!,Spread;!,!,;!;i uint16_t mode_loading(void) { return gradient_base(true); } -static const char _data_FX_MODE_LOADING[] PROGMEM = "Loading@!,Fade;!,!,;!;ix=16,1d"; +static const char _data_FX_MODE_LOADING[] PROGMEM = "Loading@!,Fade;!,!;!;ix=16,1d"; //American Police Light with all LEDs Red and Blue @@ -1360,7 +1360,7 @@ uint16_t police_base(uint32_t color1, uint32_t color2) // SEGMENT.fill(SEGCOLOR(1)); // return police_base(RED, BLUE); //} -//static const char _data_FX_MODE_POLICE[] PROGMEM = "Police@!,Width;,Bg,;0"; +//static const char _data_FX_MODE_POLICE[] PROGMEM = "Police@!,Width;,Bg;0"; //Police Lights with custom colors @@ -1621,7 +1621,7 @@ uint16_t mode_tricolor_wipe(void) return FRAMETIME; } -static const char _data_FX_MODE_TRICOLOR_WIPE[] PROGMEM = "Tri Wipe@!,;1,2,3;0;1d"; +static const char _data_FX_MODE_TRICOLOR_WIPE[] PROGMEM = "Tri Wipe@!;1,2,3;0;1d"; /* @@ -1894,7 +1894,7 @@ uint16_t mode_pride_2015(void) SEGENV.aux0 = sHue16; return FRAMETIME; } -static const char _data_FX_MODE_PRIDE_2015[] PROGMEM = "Pride 2015@!,;;;1d"; +static const char _data_FX_MODE_PRIDE_2015[] PROGMEM = "Pride 2015@!;;;1d"; //eight colored dots, weaving in and out of sync with each other @@ -1911,7 +1911,7 @@ uint16_t mode_juggle(void){ } return FRAMETIME; } -static const char _data_FX_MODE_JUGGLE[] PROGMEM = "Juggle@!,Trail;!,!,;!;sx=16,ix=240,1d"; +static const char _data_FX_MODE_JUGGLE[] PROGMEM = "Juggle@!,Trail;!,!;!;sx=16,ix=240,1d"; uint16_t mode_palette() @@ -1931,7 +1931,7 @@ uint16_t mode_palette() } return FRAMETIME; } -static const char _data_FX_MODE_PALETTE[] PROGMEM = "Palette@Cycle speed,;1,2,3;!;1d"; +static const char _data_FX_MODE_PALETTE[] PROGMEM = "Palette@Cycle speed;1,2,3;!;1d"; // WLED limitation: Analog Clock overlay will NOT work when Fire2012 is active @@ -2087,7 +2087,7 @@ uint16_t mode_bpm() } return FRAMETIME; } -static const char _data_FX_MODE_BPM[] PROGMEM = "Bpm@!,;1,2,3;!;sx=64,1d"; +static const char _data_FX_MODE_BPM[] PROGMEM = "Bpm@!;1,2,3;!;sx=64,1d"; uint16_t mode_fillnoise8() @@ -2269,7 +2269,7 @@ uint16_t mode_lake() { } return FRAMETIME; } -static const char _data_FX_MODE_LAKE[] PROGMEM = "Lake@!,;1,2,3;!;1d"; +static const char _data_FX_MODE_LAKE[] PROGMEM = "Lake@!;1,2,3;!;1d"; // meteor effect @@ -2306,7 +2306,7 @@ uint16_t mode_meteor() { return FRAMETIME; } -static const char _data_FX_MODE_METEOR[] PROGMEM = "Meteor@!,Trail length;!,,;!;1d"; +static const char _data_FX_MODE_METEOR[] PROGMEM = "Meteor@!,Trail length;!;!;1d"; // smooth meteor effect @@ -2345,7 +2345,7 @@ uint16_t mode_meteor_smooth() { SEGENV.step += SEGMENT.speed +1; return FRAMETIME; } -static const char _data_FX_MODE_METEOR_SMOOTH[] PROGMEM = "Meteor Smooth@!,Trail length;!,,;!;1d"; +static const char _data_FX_MODE_METEOR_SMOOTH[] PROGMEM = "Meteor Smooth@!,Trail length;!;!;1d"; //Railway Crossing / Christmas Fairy lights @@ -2684,7 +2684,7 @@ uint16_t mode_halloween_eyes() return FRAMETIME; } -static const char _data_FX_MODE_HALLOWEEN_EYES[] PROGMEM = "Halloween Eyes@Duration,Eye fade time;!,!,;!;1d,2d"; +static const char _data_FX_MODE_HALLOWEEN_EYES[] PROGMEM = "Halloween Eyes@Duration,Eye fade time;!,!;!;1d,2d"; //Speed slider sets amount of LEDs lit, intensity sets unlit @@ -2706,7 +2706,7 @@ uint16_t mode_static_pattern() return FRAMETIME; } -static const char _data_FX_MODE_STATIC_PATTERN[] PROGMEM = "Solid Pattern@Fg size,Bg size;Fg,Bg,;!;pal=0,1d"; +static const char _data_FX_MODE_STATIC_PATTERN[] PROGMEM = "Solid Pattern@Fg size,Bg size;Fg,Bg;!;pal=0,1d"; uint16_t mode_tri_static_pattern() @@ -2767,7 +2767,7 @@ uint16_t mode_spots() { return spots_base((255 - SEGMENT.speed) << 8); } -static const char _data_FX_MODE_SPOTS[] PROGMEM = "Spots@Spread,Width;!,!,;!;1d"; +static const char _data_FX_MODE_SPOTS[] PROGMEM = "Spots@Spread,Width;!,!;!;1d"; //Intensity slider sets number of "lights", LEDs per light fade in and out @@ -2778,7 +2778,7 @@ uint16_t mode_spots_fade() uint16_t tr = (t >> 1) + (t >> 2); return spots_base(tr); } -static const char _data_FX_MODE_SPOTS_FADE[] PROGMEM = "Spots Fade@Spread,Width;!,!,;!;1d"; +static const char _data_FX_MODE_SPOTS_FADE[] PROGMEM = "Spots Fade@Spread,Width;!,!;!;1d"; //each needs 12 bytes @@ -3087,14 +3087,14 @@ uint16_t mode_candle() { return candle(false); } -static const char _data_FX_MODE_CANDLE[] PROGMEM = "Candle@Flicker rate,Flicker intensity;!,!,;;sx=96,ix=224,pal=0,1d"; +static const char _data_FX_MODE_CANDLE[] PROGMEM = "Candle@Flicker rate,Flicker intensity;!,!;!;sx=96,ix=224,pal=0,1d"; uint16_t mode_candle_multi() { return candle(true); } -static const char _data_FX_MODE_CANDLE_MULTI[] PROGMEM = "Candle Multi@Flicker rate,Flicker intensity;!,!,;;sx=96,ix=224,pal=0,1d"; +static const char _data_FX_MODE_CANDLE_MULTI[] PROGMEM = "Candle Multi@Flicker rate,Flicker intensity;!,!;!;sx=96,ix=224,pal=0,1d"; /* @@ -3227,7 +3227,7 @@ uint16_t mode_starburst(void) { return FRAMETIME; } #undef STARBURST_MAX_FRAG -static const char _data_FX_MODE_STARBURST[] PROGMEM = "Fireworks Starburst@Chance,Fragments;,!,;!;pal=11,mp12=0,1d"; +static const char _data_FX_MODE_STARBURST[] PROGMEM = "Fireworks Starburst@Chance,Fragments;,!;!;pal=11,mp12=0,1d"; /* @@ -3363,7 +3363,7 @@ uint16_t mode_exploding_fireworks(void) return FRAMETIME; } #undef MAX_SPARKS -static const char _data_FX_MODE_EXPLODING_FIREWORKS[] PROGMEM = "Fireworks 1D@Gravity,Firing side;!,!,;!=11;ix=128,1d,2d"; +static const char _data_FX_MODE_EXPLODING_FIREWORKS[] PROGMEM = "Fireworks 1D@Gravity,Firing side;!,!;!=11;ix=128,1d,2d"; /* @@ -3566,7 +3566,7 @@ uint16_t mode_plasma(void) { return FRAMETIME; } -static const char _data_FX_MODE_PLASMA[] PROGMEM = "Plasma@Phase,;1,2,3;!;1d"; +static const char _data_FX_MODE_PLASMA[] PROGMEM = "Plasma@Phase;1,2,3;!;1d"; /* @@ -3619,7 +3619,7 @@ uint16_t mode_percent(void) { return FRAMETIME; } -static const char _data_FX_MODE_PERCENT[] PROGMEM = "Percent@,% of fill,,,,One color;!,!,;!;1d"; +static const char _data_FX_MODE_PERCENT[] PROGMEM = "Percent@,% of fill,,,,One color;!,!;!;1d"; /* @@ -3652,7 +3652,7 @@ uint16_t mode_heartbeat(void) { return FRAMETIME; } -static const char _data_FX_MODE_HEARTBEAT[] PROGMEM = "Heartbeat@!,!;!,!,;!;mp12=1,1d"; +static const char _data_FX_MODE_HEARTBEAT[] PROGMEM = "Heartbeat@!,!;!,!;!;mp12=1,1d"; // "Pacifica" @@ -3784,7 +3784,7 @@ uint16_t mode_solid_glitter() return FRAMETIME; } -static const char _data_FX_MODE_SOLID_GLITTER[] PROGMEM = "Solid Glitter@,!;!,,;0;mp12=0,1d"; +static const char _data_FX_MODE_SOLID_GLITTER[] PROGMEM = "Solid Glitter@,!;!;0;mp12=0,1d"; /* @@ -3837,7 +3837,7 @@ uint16_t mode_sunrise() { return FRAMETIME; } -static const char _data_FX_MODE_SUNRISE[] PROGMEM = "Sunrise@Time [min],;;!;sx=60,1d"; +static const char _data_FX_MODE_SUNRISE[] PROGMEM = "Sunrise@Time [min];;!;sx=60,1d"; /* @@ -3893,7 +3893,7 @@ uint16_t mode_twinkleup(void) { // A very short twinkle routine return FRAMETIME; } -static const char _data_FX_MODE_TWINKLEUP[] PROGMEM = "Twinkleup@!,Intensity;!,!,;!;mp12=0,1d"; +static const char _data_FX_MODE_TWINKLEUP[] PROGMEM = "Twinkleup@!,Intensity;!,!;!;mp12=0,1d"; // Peaceful noise that's slow and with gradually changing palettes. Does not support WLED palettes or default colours or controls. @@ -4018,7 +4018,7 @@ uint16_t mode_chunchun(void) } return FRAMETIME; } -static const char _data_FX_MODE_CHUNCHUN[] PROGMEM = "Chunchun@!,Gap size;!,!,;!;1d"; +static const char _data_FX_MODE_CHUNCHUN[] PROGMEM = "Chunchun@!,Gap size;!,!;!;1d"; //13 bytes @@ -4930,7 +4930,7 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https: return FRAMETIME_FIXED * (128-(SEGMENT.speed>>1)); // update only when appropriate time passes (in 42 FPS slots) } // mode_2Dgameoflife() -static const char _data_FX_MODE_2DGAMEOFLIFE[] PROGMEM = "Game Of Life@!,;!,!;!;2d"; +static const char _data_FX_MODE_2DGAMEOFLIFE[] PROGMEM = "Game Of Life@!;!,!;!;2d"; ///////////////////////// @@ -5158,7 +5158,7 @@ uint16_t mode_2Dmatrix(void) { // Matrix2D. By Jeremy Williams. return FRAMETIME; } // mode_2Dmatrix() -static const char _data_FX_MODE_2DMATRIX[] PROGMEM = "Matrix@Falling speed,Spawning rate,Trail,,,Custom color,,;Spawn,Trail;;pal=0,2d"; +static const char _data_FX_MODE_2DMATRIX[] PROGMEM = "Matrix@Falling speed,Spawning rate,Trail,,,Custom color;Spawn,Trail;;pal=0,2d"; ///////////////////////// @@ -5438,7 +5438,7 @@ uint16_t mode_2Dsquaredswirl(void) { // By: Mark Kriegsman. https://g return FRAMETIME; } // mode_2Dsquaredswirl() -static const char _data_FX_MODE_2DSQUAREDSWIRL[] PROGMEM = "Squared Swirl@,,,,Blur;,,;!;2d"; +static const char _data_FX_MODE_2DSQUAREDSWIRL[] PROGMEM = "Squared Swirl@,,,,Blur;;!;2d"; ////////////////////////////// @@ -5832,7 +5832,7 @@ uint16_t mode_2Dfloatingblobs(void) { return FRAMETIME; } #undef MAX_BLOBS -static const char _data_FX_MODE_2DBLOBS[] PROGMEM = "Blobs@!,# blobs,Blur;!,!,;!;c1=8,2d"; +static const char _data_FX_MODE_2DBLOBS[] PROGMEM = "Blobs@!,# blobs,Blur;!,!;!;c1=8,2d"; //////////////////////////// @@ -6050,7 +6050,7 @@ uint16_t mode_ripplepeak(void) { // * Ripple peak. By Andrew Tuli return FRAMETIME; } // mode_ripplepeak() -static const char _data_FX_MODE_RIPPLEPEAK[] PROGMEM = "Ripple Peak@Fade rate,Max # of ripples,Select bin,Volume (minimum);!,!;!;c2=0,mp12=0,ssim=0,1d,vo"; // Pixel, Beatsin +static const char _data_FX_MODE_RIPPLEPEAK[] PROGMEM = "Ripple Peak@Fade rate,Max # of ripples,Select bin,Volume (min);!,!;!;c2=0,mp12=0,ssim=0,1d,vo"; // Pixel, Beatsin #ifndef WLED_DISABLE_2D @@ -6578,7 +6578,7 @@ uint16_t mode_puddlepeak(void) { // Puddlepeak. By Andrew Tuline. return FRAMETIME; } // mode_puddlepeak() -static const char _data_FX_MODE_PUDDLEPEAK[] PROGMEM = "Puddlepeak@Fade rate,Puddle size,Select bin,Volume (minimum);!,!;!;c2=0,mp12=0,ssim=0,1d,vo"; // Pixels, Beatsin +static const char _data_FX_MODE_PUDDLEPEAK[] PROGMEM = "Puddlepeak@Fade rate,Puddle size,Select bin,Volume (min);!,!;!;c2=0,mp12=0,ssim=0,1d,vo"; // Pixels, Beatsin ////////////////////// @@ -7080,7 +7080,7 @@ uint16_t mode_waterfall(void) { // Waterfall. By: Andrew Tulin return FRAMETIME; } // mode_waterfall() -static const char _data_FX_MODE_WATERFALL[] PROGMEM = "Waterfall@!,Adjust color,Select bin,Volume (minimum);!,!;!;c2=0,mp12=2,ssim=0,1d,fr"; // Circles, Beatsin +static const char _data_FX_MODE_WATERFALL[] PROGMEM = "Waterfall@!,Adjust color,Select bin,Volume (min);!,!;!;c2=0,mp12=2,ssim=0,1d,fr"; // Circles, Beatsin #ifndef WLED_DISABLE_2D @@ -7140,7 +7140,7 @@ uint16_t mode_2DGEQ(void) { // By Will Tatam. Code reduction by Ewoud Wijma. return FRAMETIME; } // mode_2DGEQ() -static const char _data_FX_MODE_2DGEQ[] PROGMEM = "GEQ@Fade speed,Ripple decay,# of bands,,,Color bars,,;!,,Peak Color;!;c1=255,c2=64,pal=11,ssim=0,2d,fr"; // Beatsin +static const char _data_FX_MODE_2DGEQ[] PROGMEM = "GEQ@Fade speed,Ripple decay,# of bands,,,Color bars;!,,Peak Color;!;c1=255,c2=64,pal=11,ssim=0,2d,fr"; // Beatsin ///////////////////////// @@ -7339,6 +7339,7 @@ void WS2812FX::setupEffectData() { // now replace all pre-allocated effects // --- 1D non-audio effects --- addEffect(FX_MODE_BLINK, &mode_blink, _data_FX_MODE_BLINK); + addEffect(FX_MODE_BREATH, &mode_breath, _data_FX_MODE_BREATH); addEffect(FX_MODE_COLOR_WIPE, &mode_color_wipe, _data_FX_MODE_COLOR_WIPE); addEffect(FX_MODE_COLOR_WIPE_RANDOM, &mode_color_wipe_random, _data_FX_MODE_COLOR_WIPE_RANDOM); addEffect(FX_MODE_RANDOM_COLOR, &mode_random_color, _data_FX_MODE_RANDOM_COLOR); @@ -7351,6 +7352,7 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_FADE, &mode_fade, _data_FX_MODE_FADE); addEffect(FX_MODE_THEATER_CHASE, &mode_theater_chase, _data_FX_MODE_THEATER_CHASE); addEffect(FX_MODE_THEATER_CHASE_RAINBOW, &mode_theater_chase_rainbow, _data_FX_MODE_THEATER_CHASE_RAINBOW); + addEffect(FX_MODE_RUNNING_LIGHTS, &mode_running_lights, _data_FX_MODE_RUNNING_LIGHTS); addEffect(FX_MODE_SAW, &mode_saw, _data_FX_MODE_SAW); addEffect(FX_MODE_TWINKLE, &mode_twinkle, _data_FX_MODE_TWINKLE); addEffect(FX_MODE_DISSOLVE, &mode_dissolve, _data_FX_MODE_DISSOLVE); @@ -7383,29 +7385,27 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_FIRE_FLICKER, &mode_fire_flicker, _data_FX_MODE_FIRE_FLICKER); addEffect(FX_MODE_GRADIENT, &mode_gradient, _data_FX_MODE_GRADIENT); addEffect(FX_MODE_LOADING, &mode_loading, _data_FX_MODE_LOADING); - addEffect(FX_MODE_WAVESINS, &mode_wavesins, _data_FX_MODE_WAVESINS); + addEffect(FX_MODE_FAIRY, &mode_fairy, _data_FX_MODE_FAIRY); addEffect(FX_MODE_TWO_DOTS, &mode_two_dots, _data_FX_MODE_TWO_DOTS); addEffect(FX_MODE_FAIRYTWINKLE, &mode_fairytwinkle, _data_FX_MODE_FAIRYTWINKLE); addEffect(FX_MODE_RUNNING_DUAL, &mode_running_dual, _data_FX_MODE_RUNNING_DUAL); - addEffect(FX_MODE_PERLINMOVE, &mode_perlinmove, _data_FX_MODE_PERLINMOVE); + addEffect(FX_MODE_TRICOLOR_CHASE, &mode_tricolor_chase, _data_FX_MODE_TRICOLOR_CHASE); addEffect(FX_MODE_TRICOLOR_WIPE, &mode_tricolor_wipe, _data_FX_MODE_TRICOLOR_WIPE); addEffect(FX_MODE_TRICOLOR_FADE, &mode_tricolor_fade, _data_FX_MODE_TRICOLOR_FADE); - addEffect(FX_MODE_BREATH, &mode_breath, _data_FX_MODE_BREATH); - addEffect(FX_MODE_RUNNING_LIGHTS, &mode_running_lights, _data_FX_MODE_RUNNING_LIGHTS); addEffect(FX_MODE_LIGHTNING, &mode_lightning, _data_FX_MODE_LIGHTNING); addEffect(FX_MODE_ICU, &mode_icu, _data_FX_MODE_ICU); addEffect(FX_MODE_MULTI_COMET, &mode_multi_comet, _data_FX_MODE_MULTI_COMET); addEffect(FX_MODE_DUAL_LARSON_SCANNER, &mode_dual_larson_scanner, _data_FX_MODE_DUAL_LARSON_SCANNER); addEffect(FX_MODE_RANDOM_CHASE, &mode_random_chase, _data_FX_MODE_RANDOM_CHASE); addEffect(FX_MODE_OSCILLATE, &mode_oscillate, _data_FX_MODE_OSCILLATE); - addEffect(FX_MODE_FIRE_2012, &mode_fire_2012, _data_FX_MODE_FIRE_2012); addEffect(FX_MODE_PRIDE_2015, &mode_pride_2015, _data_FX_MODE_PRIDE_2015); - addEffect(FX_MODE_BPM, &mode_bpm, _data_FX_MODE_BPM); addEffect(FX_MODE_JUGGLE, &mode_juggle, _data_FX_MODE_JUGGLE); addEffect(FX_MODE_PALETTE, &mode_palette, _data_FX_MODE_PALETTE); + addEffect(FX_MODE_FIRE_2012, &mode_fire_2012, _data_FX_MODE_FIRE_2012); addEffect(FX_MODE_COLORWAVES, &mode_colorwaves, _data_FX_MODE_COLORWAVES); + addEffect(FX_MODE_BPM, &mode_bpm, _data_FX_MODE_BPM); addEffect(FX_MODE_FILLNOISE8, &mode_fillnoise8, _data_FX_MODE_FILLNOISE8); addEffect(FX_MODE_NOISE16_1, &mode_noise16_1, _data_FX_MODE_NOISE16_1); addEffect(FX_MODE_NOISE16_2, &mode_noise16_2, _data_FX_MODE_NOISE16_2); @@ -7451,49 +7451,13 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_CHUNCHUN, &mode_chunchun, _data_FX_MODE_CHUNCHUN); addEffect(FX_MODE_DANCING_SHADOWS, &mode_dancing_shadows, _data_FX_MODE_DANCING_SHADOWS); addEffect(FX_MODE_WASHING_MACHINE, &mode_washing_machine, _data_FX_MODE_WASHING_MACHINE); - addEffect(FX_MODE_FLOWSTRIPE, &mode_FlowStripe, _data_FX_MODE_FLOWSTRIPE); + addEffect(FX_MODE_BLENDS, &mode_blends, _data_FX_MODE_BLENDS); addEffect(FX_MODE_TV_SIMULATOR, &mode_tv_simulator, _data_FX_MODE_TV_SIMULATOR); addEffect(FX_MODE_DYNAMIC_SMOOTH, &mode_dynamic_smooth, _data_FX_MODE_DYNAMIC_SMOOTH); - // --- 2D non-audio effects --- -#ifndef WLED_DISABLE_2D - addEffect(FX_MODE_2DSPACESHIPS, &mode_2Dspaceships, _data_FX_MODE_2DSPACESHIPS); - addEffect(FX_MODE_2DCRAZYBEES, &mode_2Dcrazybees, _data_FX_MODE_2DCRAZYBEES); - addEffect(FX_MODE_2DGHOSTRIDER, &mode_2Dghostrider, _data_FX_MODE_2DGHOSTRIDER); - addEffect(FX_MODE_2DBLOBS, &mode_2Dfloatingblobs, _data_FX_MODE_2DBLOBS); - addEffect(FX_MODE_2DSCROLLTEXT, &mode_2Dscrollingtext, _data_FX_MODE_2DSCROLLTEXT); - addEffect(FX_MODE_2DDRIFTROSE, &mode_2Ddriftrose, _data_FX_MODE_2DDRIFTROSE); - addEffect(FX_MODE_2DBLACKHOLE, &mode_2DBlackHole, _data_FX_MODE_2DBLACKHOLE); - addEffect(FX_MODE_2DDNASPIRAL, &mode_2DDNASpiral, _data_FX_MODE_2DDNASPIRAL); - addEffect(FX_MODE_2DHIPHOTIC, &mode_2DHiphotic, _data_FX_MODE_2DHIPHOTIC); - addEffect(FX_MODE_2DPLASMABALL, &mode_2DPlasmaball, _data_FX_MODE_2DPLASMABALL); - addEffect(FX_MODE_2DSINDOTS, &mode_2DSindots, _data_FX_MODE_2DSINDOTS); - addEffect(FX_MODE_2DFRIZZLES, &mode_2DFrizzles, _data_FX_MODE_2DFRIZZLES); - addEffect(FX_MODE_2DLISSAJOUS, &mode_2DLissajous, _data_FX_MODE_2DLISSAJOUS); - addEffect(FX_MODE_2DPOLARLIGHTS, &mode_2DPolarLights, _data_FX_MODE_2DPOLARLIGHTS); - addEffect(FX_MODE_2DTARTAN, &mode_2Dtartan, _data_FX_MODE_2DTARTAN); - addEffect(FX_MODE_2DGAMEOFLIFE, &mode_2Dgameoflife, _data_FX_MODE_2DGAMEOFLIFE); - addEffect(FX_MODE_2DJULIA, &mode_2DJulia, _data_FX_MODE_2DJULIA); - addEffect(FX_MODE_2DCOLOREDBURSTS, &mode_2DColoredBursts, _data_FX_MODE_2DCOLOREDBURSTS); - addEffect(FX_MODE_2DSUNRADIATION, &mode_2DSunradiation, _data_FX_MODE_2DSUNRADIATION); - addEffect(FX_MODE_2DNOISE, &mode_2Dnoise, _data_FX_MODE_2DNOISE); - addEffect(FX_MODE_2DFIRENOISE, &mode_2Dfirenoise, _data_FX_MODE_2DFIRENOISE); - addEffect(FX_MODE_2DSQUAREDSWIRL, &mode_2Dsquaredswirl, _data_FX_MODE_2DSQUAREDSWIRL); - addEffect(FX_MODE_2DDNA, &mode_2Ddna, _data_FX_MODE_2DDNA); - addEffect(FX_MODE_2DMATRIX, &mode_2Dmatrix, _data_FX_MODE_2DMATRIX); - addEffect(FX_MODE_2DMETABALLS, &mode_2Dmetaballs, _data_FX_MODE_2DMETABALLS); - addEffect(FX_MODE_2DPULSER, &mode_2DPulser, _data_FX_MODE_2DPULSER); - addEffect(FX_MODE_2DDRIFT, &mode_2DDrift, _data_FX_MODE_2DDRIFT); - // --- 2D audio effects --- - addEffect(FX_MODE_2DWAVERLY, &mode_2DWaverly, _data_FX_MODE_2DWAVERLY); - addEffect(FX_MODE_2DSWIRL, &mode_2DSwirl, _data_FX_MODE_2DSWIRL); - addEffect(FX_MODE_2DAKEMI, &mode_2DAkemi, _data_FX_MODE_2DAKEMI); - addEffect(FX_MODE_2DGEQ, &mode_2DGEQ, _data_FX_MODE_2DGEQ); - addEffect(FX_MODE_2DFUNKYPLANK, &mode_2DFunkyPlank, _data_FX_MODE_2DFUNKYPLANK); -#endif // WLED_DISABLE_2D - // --- 1D audio effects --- + addEffect(FX_MODE_PIXELS, &mode_pixels, _data_FX_MODE_PIXELS); addEffect(FX_MODE_PIXELWAVE, &mode_pixelwave, _data_FX_MODE_PIXELWAVE); addEffect(FX_MODE_JUGGLES, &mode_juggles, _data_FX_MODE_JUGGLES); addEffect(FX_MODE_MATRIPIX, &mode_matripix, _data_FX_MODE_MATRIPIX); @@ -7502,20 +7466,76 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_PUDDLES, &mode_puddles, _data_FX_MODE_PUDDLES); addEffect(FX_MODE_MIDNOISE, &mode_midnoise, _data_FX_MODE_MIDNOISE); addEffect(FX_MODE_NOISEMETER, &mode_noisemeter, _data_FX_MODE_NOISEMETER); - addEffect(FX_MODE_NOISEFIRE, &mode_noisefire, _data_FX_MODE_NOISEFIRE); - addEffect(FX_MODE_PUDDLEPEAK, &mode_puddlepeak, _data_FX_MODE_PUDDLEPEAK); - addEffect(FX_MODE_RIPPLEPEAK, &mode_ripplepeak, _data_FX_MODE_RIPPLEPEAK); - addEffect(FX_MODE_GRAVCENTER, &mode_gravcenter, _data_FX_MODE_GRAVCENTER); - addEffect(FX_MODE_GRAVCENTRIC, &mode_gravcentric, _data_FX_MODE_GRAVCENTRIC); - addEffect(FX_MODE_PIXELS, &mode_pixels, _data_FX_MODE_PIXELS); addEffect(FX_MODE_FREQWAVE, &mode_freqwave, _data_FX_MODE_FREQWAVE); addEffect(FX_MODE_FREQMATRIX, &mode_freqmatrix, _data_FX_MODE_FREQMATRIX); + addEffect(FX_MODE_WATERFALL, &mode_waterfall, _data_FX_MODE_WATERFALL); addEffect(FX_MODE_FREQPIXELS, &mode_freqpixels, _data_FX_MODE_FREQPIXELS); + + addEffect(FX_MODE_NOISEFIRE, &mode_noisefire, _data_FX_MODE_NOISEFIRE); + addEffect(FX_MODE_PUDDLEPEAK, &mode_puddlepeak, _data_FX_MODE_PUDDLEPEAK); addEffect(FX_MODE_NOISEMOVE, &mode_noisemove, _data_FX_MODE_NOISEMOVE); + + addEffect(FX_MODE_PERLINMOVE, &mode_perlinmove, _data_FX_MODE_PERLINMOVE); + addEffect(FX_MODE_RIPPLEPEAK, &mode_ripplepeak, _data_FX_MODE_RIPPLEPEAK); + addEffect(FX_MODE_FREQMAP, &mode_freqmap, _data_FX_MODE_FREQMAP); + addEffect(FX_MODE_GRAVCENTER, &mode_gravcenter, _data_FX_MODE_GRAVCENTER); + addEffect(FX_MODE_GRAVCENTRIC, &mode_gravcentric, _data_FX_MODE_GRAVCENTRIC); addEffect(FX_MODE_GRAVFREQ, &mode_gravfreq, _data_FX_MODE_GRAVFREQ); addEffect(FX_MODE_DJLIGHT, &mode_DJLight, _data_FX_MODE_DJLIGHT); + addEffect(FX_MODE_BLURZ, &mode_blurz, _data_FX_MODE_BLURZ); + + addEffect(FX_MODE_FLOWSTRIPE, &mode_FlowStripe, _data_FX_MODE_FLOWSTRIPE); + + addEffect(FX_MODE_WAVESINS, &mode_wavesins, _data_FX_MODE_WAVESINS); addEffect(FX_MODE_ROCKTAVES, &mode_rocktaves, _data_FX_MODE_ROCKTAVES); + + // --- 2D effects --- +#ifndef WLED_DISABLE_2D + addEffect(FX_MODE_2DSPACESHIPS, &mode_2Dspaceships, _data_FX_MODE_2DSPACESHIPS); + addEffect(FX_MODE_2DCRAZYBEES, &mode_2Dcrazybees, _data_FX_MODE_2DCRAZYBEES); + addEffect(FX_MODE_2DGHOSTRIDER, &mode_2Dghostrider, _data_FX_MODE_2DGHOSTRIDER); + addEffect(FX_MODE_2DBLOBS, &mode_2Dfloatingblobs, _data_FX_MODE_2DBLOBS); + addEffect(FX_MODE_2DSCROLLTEXT, &mode_2Dscrollingtext, _data_FX_MODE_2DSCROLLTEXT); + addEffect(FX_MODE_2DDRIFTROSE, &mode_2Ddriftrose, _data_FX_MODE_2DDRIFTROSE); + + addEffect(FX_MODE_2DGEQ, &mode_2DGEQ, _data_FX_MODE_2DGEQ); // audio + + addEffect(FX_MODE_2DNOISE, &mode_2Dnoise, _data_FX_MODE_2DNOISE); + + addEffect(FX_MODE_2DFIRENOISE, &mode_2Dfirenoise, _data_FX_MODE_2DFIRENOISE); + addEffect(FX_MODE_2DSQUAREDSWIRL, &mode_2Dsquaredswirl, _data_FX_MODE_2DSQUAREDSWIRL); + + //non audio + addEffect(FX_MODE_2DDNA, &mode_2Ddna, _data_FX_MODE_2DDNA); + addEffect(FX_MODE_2DMATRIX, &mode_2Dmatrix, _data_FX_MODE_2DMATRIX); + addEffect(FX_MODE_2DMETABALLS, &mode_2Dmetaballs, _data_FX_MODE_2DMETABALLS); + addEffect(FX_MODE_2DFUNKYPLANK, &mode_2DFunkyPlank, _data_FX_MODE_2DFUNKYPLANK); // audio + + addEffect(FX_MODE_2DPULSER, &mode_2DPulser, _data_FX_MODE_2DPULSER); + + addEffect(FX_MODE_2DDRIFT, &mode_2DDrift, _data_FX_MODE_2DDRIFT); + addEffect(FX_MODE_2DWAVERLY, &mode_2DWaverly, _data_FX_MODE_2DWAVERLY); // audio + addEffect(FX_MODE_2DSUNRADIATION, &mode_2DSunradiation, _data_FX_MODE_2DSUNRADIATION); + addEffect(FX_MODE_2DCOLOREDBURSTS, &mode_2DColoredBursts, _data_FX_MODE_2DCOLOREDBURSTS); + addEffect(FX_MODE_2DJULIA, &mode_2DJulia, _data_FX_MODE_2DJULIA); + + addEffect(FX_MODE_2DGAMEOFLIFE, &mode_2Dgameoflife, _data_FX_MODE_2DGAMEOFLIFE); + addEffect(FX_MODE_2DTARTAN, &mode_2Dtartan, _data_FX_MODE_2DTARTAN); + addEffect(FX_MODE_2DPOLARLIGHTS, &mode_2DPolarLights, _data_FX_MODE_2DPOLARLIGHTS); + addEffect(FX_MODE_2DSWIRL, &mode_2DSwirl, _data_FX_MODE_2DSWIRL); // audio + addEffect(FX_MODE_2DLISSAJOUS, &mode_2DLissajous, _data_FX_MODE_2DLISSAJOUS); + addEffect(FX_MODE_2DFRIZZLES, &mode_2DFrizzles, _data_FX_MODE_2DFRIZZLES); + addEffect(FX_MODE_2DPLASMABALL, &mode_2DPlasmaball, _data_FX_MODE_2DPLASMABALL); + + addEffect(FX_MODE_2DHIPHOTIC, &mode_2DHiphotic, _data_FX_MODE_2DHIPHOTIC); + addEffect(FX_MODE_2DSINDOTS, &mode_2DSindots, _data_FX_MODE_2DSINDOTS); + addEffect(FX_MODE_2DDNASPIRAL, &mode_2DDNASpiral, _data_FX_MODE_2DDNASPIRAL); + addEffect(FX_MODE_2DBLACKHOLE, &mode_2DBlackHole, _data_FX_MODE_2DBLACKHOLE); + + addEffect(FX_MODE_2DAKEMI, &mode_2DAkemi, _data_FX_MODE_2DAKEMI); // audio +#endif // WLED_DISABLE_2D + } diff --git a/wled00/FX.h b/wled00/FX.h index 38dc1228..14ac7dd4 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -243,12 +243,6 @@ #define FX_MODE_TV_SIMULATOR 116 #define FX_MODE_DYNAMIC_SMOOTH 117 -//WLED SR READ THIS!: -//these id's should never change as they are saved in api commands of presets and used in sync -//118 to 127 was reserved for future AC effects in SR 0.13 and partly filled in 0.14 -//numbering reflects the order in which they were added -//there are still gaps which can be filled by future effects - // new 0.14 2D effects #define FX_MODE_2DSPACESHIPS 118 //gap fill #define FX_MODE_2DCRAZYBEES 119 //gap fill @@ -299,9 +293,9 @@ #define FX_MODE_2DSUNRADIATION 166 #define FX_MODE_2DCOLOREDBURSTS 167 #define FX_MODE_2DJULIA 168 -#define FX_MODE_2DPOOLNOISE 169 //have been removed in WLED SR in the past because of low mem but should be added back -#define FX_MODE_2DTWISTER 170 //have been removed in WLED SR in the past because of low mem but should be added back -#define FX_MODE_2DCAELEMENTATY 171 //have been removed in WLED SR in the past because of low mem but should be added back +// #define FX_MODE_2DPOOLNOISE 169 //have been removed in WLED SR in the past because of low mem but should be added back +// #define FX_MODE_2DTWISTER 170 //have been removed in WLED SR in the past because of low mem but should be added back +// #define FX_MODE_2DCAELEMENTATY 171 //have been removed in WLED SR in the past because of low mem but should be added back #define FX_MODE_2DGAMEOFLIFE 172 #define FX_MODE_2DTARTAN 173 #define FX_MODE_2DPOLARLIGHTS 174 @@ -482,13 +476,13 @@ typedef struct Segment { Segment(Segment &&orig) noexcept; // move constructor ~Segment() { - #ifdef WLED_DEBUG - Serial.print(F("Destroying segment:")); - if (name) Serial.printf(" %s (%p)", name, name); - if (data) Serial.printf(" %d (%p)", (int)_dataLen, data); - if (leds) Serial.printf(" [%u]", length()*sizeof(CRGB)); - Serial.println(); - #endif + //#ifdef WLED_DEBUG + //Serial.print(F("Destroying segment:")); + //if (name) Serial.printf(" %s (%p)", name, name); + //if (data) Serial.printf(" %d (%p)", (int)_dataLen, data); + //if (leds) Serial.printf(" [%u]", length()*sizeof(CRGB)); + //Serial.println(); + //#endif if (!Segment::_globalLeds && leds) free(leds); if (name) delete[] name; if (_t) delete _t; diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index d3f2a87d..e4933c77 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -78,7 +78,7 @@ CRGB *Segment::_globalLeds = nullptr; // copy constructor Segment::Segment(const Segment &orig) { - DEBUG_PRINTLN(F("-- Copy segment constructor --")); + //DEBUG_PRINTLN(F("-- Copy segment constructor --")); memcpy(this, &orig, sizeof(Segment)); name = nullptr; data = nullptr; @@ -94,7 +94,7 @@ Segment::Segment(const Segment &orig) { // move constructor Segment::Segment(Segment &&orig) noexcept { - DEBUG_PRINTLN(F("-- Move segment constructor --")); + //DEBUG_PRINTLN(F("-- Move segment constructor --")); memcpy(this, &orig, sizeof(Segment)); orig.name = nullptr; orig.data = nullptr; @@ -106,7 +106,7 @@ Segment::Segment(Segment &&orig) noexcept { // copy assignment Segment& Segment::operator= (const Segment &orig) { - DEBUG_PRINTLN(F("-- Copying segment --")); + //DEBUG_PRINTLN(F("-- Copying segment --")); if (this != &orig) { // clean destination if (name) delete[] name; @@ -133,7 +133,7 @@ Segment& Segment::operator= (const Segment &orig) { // move assignment Segment& Segment::operator= (Segment &&orig) noexcept { - DEBUG_PRINTLN(F("-- Moving segment --")); + //DEBUG_PRINTLN(F("-- Moving segment --")); if (this != &orig) { if (name) delete[] name; // free old name deallocateData(); // free old runtime data @@ -330,11 +330,7 @@ uint8_t Segment::currentBri(uint8_t briNew, bool useCct) { } uint8_t Segment::currentMode(uint8_t newMode) { - if (transitional && _t) { - return _t->_modeP; - } else { - return newMode; - } + return (progress()>32767U) ? newMode : _t->_modeP; // change effect in the middle of transition } uint32_t Segment::currentColor(uint8_t slot, uint32_t colorNew) { @@ -373,6 +369,7 @@ bool Segment::setColor(uint8_t slot, uint32_t c) { //returns true if changed if (slot >= NUM_COLORS || c == colors[slot]) return false; if (fadeTransition) startTransition(strip.getTransition()); // start transition prior to change colors[slot] = c; + stateChanged = true; // send UDP/WS broadcast return true; } @@ -385,12 +382,14 @@ void Segment::setCCT(uint16_t k) { if (cct == k) return; if (fadeTransition) startTransition(strip.getTransition()); // start transition prior to change cct = k; + stateChanged = true; // send UDP/WS broadcast } void Segment::setOpacity(uint8_t o) { if (opacity == o) return; if (fadeTransition) startTransition(strip.getTransition()); // start transition prior to change opacity = o; + stateChanged = true; // send UDP/WS broadcast } void Segment::setOption(uint8_t n, bool val) { @@ -398,6 +397,7 @@ void Segment::setOption(uint8_t n, bool val) { if (fadeTransition && n == SEG_OPTION_ON && val != prevOn) startTransition(strip.getTransition()); // start transition prior to change if (val) options |= 0x01 << n; else options &= ~(0x01 << n); + if (!(n == SEG_OPTION_SELECTED || n == SEG_OPTION_RESET || n == SEG_OPTION_TRANSITIONAL)) stateChanged = true; // send UDP/WS broadcast } void Segment::setMode(uint8_t fx, bool loadDefaults) { @@ -429,6 +429,7 @@ void Segment::setMode(uint8_t fx, bool loadDefaults) { } } } + stateChanged = true; // send UDP/WS broadcast } } } @@ -440,6 +441,7 @@ void Segment::setPalette(uint8_t pal) { palette = pal; } } + stateChanged = true; // send UDP/WS broadcast } // 2D matrix @@ -920,11 +922,10 @@ uint8_t Segment::differs(Segment& b) const { if (startY != b.startY) d |= SEG_DIFFERS_BOUNDS; if (stopY != b.stopY) d |= SEG_DIFFERS_BOUNDS; - //bit pattern: msb first: [transposed mirrorY reverseY] transitional (tbd) paused needspixelstate mirrored on reverse selected - if ((options & 0b1111111110011110) != (b.options & 0b1111111110011110)) d |= SEG_DIFFERS_OPT; - if ((options & 0x01) != (b.options & 0x01)) d |= SEG_DIFFERS_SEL; - - for (uint8_t i = 0; i < NUM_COLORS; i++) if (colors[i] != b.colors[i]) d |= SEG_DIFFERS_COL; + //bit pattern: (msb first) sound:3, mapping:3, transposed, mirrorY, reverseY, [transitional, reset,] paused, mirrored, on, reverse, [selected] + if ((options & 0b1111111110011110U) != (b.options & 0b1111111110011110U)) d |= SEG_DIFFERS_OPT; + if ((options & 0x0001U) != (b.options & 0x0001U)) d |= SEG_DIFFERS_SEL; + for (uint8_t i = 0; i < NUM_COLORS; i++) if (colors[i] != b.colors[i]) d |= SEG_DIFFERS_COL; return d; } @@ -1117,8 +1118,8 @@ uint8_t Segment::get_random_wheel_index(uint8_t pos) { uint32_t Segment::color_from_palette(uint16_t i, bool mapping, bool wrap, uint8_t mcol, uint8_t pbri) { // default palette or no RGB support on segment - if ((palette == 0 && mcol < NUM_COLORS) || !(_capabilities & 0x01)) { - uint32_t color = (transitional && _t) ? _t->_colorT[mcol] : colors[mcol]; + if ((palette == 0 && mcol < NUM_COLORS) || !_isRGB) { + uint32_t color = currentColor(mcol, colors[mcol]); color = gamma32(color); if (pbri == 255) return color; return RGBW32(scale8_video(R(color),pbri), scale8_video(G(color),pbri), scale8_video(B(color),pbri), scale8_video(W(color),pbri)); @@ -1835,7 +1836,7 @@ int16_t Bus::_cct = -1; uint8_t Bus::_cctBlend = 0; uint8_t Bus::_gAWM = 255; -const char JSON_mode_names[] PROGMEM = R"=====(["Mode names have moved"])====="; +const char JSON_mode_names[] PROGMEM = R"=====(["FX names moved"])====="; const char JSON_palette_names[] PROGMEM = R"=====([ "Default","* Random Cycle","* Color 1","* Colors 1&2","* Color Gradient","* Colors Only","Party","Cloud","Lava","Ocean", "Forest","Rainbow","Rainbow Bands","Sunset","Rivendell","Breeze","Red & Blue","Yellowout","Analogous","Splash", diff --git a/wled00/colors.cpp b/wled00/colors.cpp index 0b8c7811..0387a925 100644 --- a/wled00/colors.cpp +++ b/wled00/colors.cpp @@ -344,6 +344,7 @@ uint8_t gamma8_cal(uint8_t b, float gamma) return (int)(powf((float)b / 255.0f, gamma) * 255.0f + 0.5f); } +// re-calculates & fills gamma table void calcGammaTable(float gamma) { for (uint16_t i = 0; i < 256; i++) { @@ -351,11 +352,13 @@ void calcGammaTable(float gamma) } } +// used for individual channel or brightness gamma correction uint8_t gamma8(uint8_t b) { return gammaT[b]; } +// used for color gamma correction uint32_t gamma32(uint32_t color) { if (!gammaCorrectCol) return color; diff --git a/wled00/const.h b/wled00/const.h index 33e671ab..afa53e07 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -96,10 +96,11 @@ #define USERMOD_ID_ANALOG_CLOCK 33 //Usermod "Analog_Clock.h" #define USERMOD_ID_PING_PONG_CLOCK 34 //Usermod "usermod_v2_ping_pong_clock.h" #define USERMOD_ID_ADS1115 35 //Usermod "usermod_ads1115.h" +#define USERMOD_ID_SD_CARD 37 //Usermod "usermod_sd_card.h" //WLEDMM -#define USERMOD_ID_CUSTOMEFFECTS 36 //Usermod "usermod_v2_customeffects.h" -#define USERMOD_ID_WEATHER 37 //Usermod "usermod_v2_weather.h" -#define USERMOD_ID_GAMES 38 //Usermod "usermod_v2_games.h" +#define USERMOD_ID_CUSTOMEFFECTS 38 //Usermod "usermod_v2_customeffects.h" +#define USERMOD_ID_WEATHER 39 //Usermod "usermod_v2_weather.h" +#define USERMOD_ID_GAMES 40 //Usermod "usermod_v2_games.h" //Access point behavior #define AP_BEHAVIOR_BOOT_NO_CONN 0 //Open AP when no connection after boot @@ -255,13 +256,13 @@ #define SEG_OPTION_TRANSPOSED 9 //Segment differs return byte -#define SEG_DIFFERS_BRI 0x01 -#define SEG_DIFFERS_OPT 0x02 -#define SEG_DIFFERS_COL 0x04 -#define SEG_DIFFERS_FX 0x08 -#define SEG_DIFFERS_BOUNDS 0x10 -#define SEG_DIFFERS_GSO 0x20 -#define SEG_DIFFERS_SEL 0x80 +#define SEG_DIFFERS_BRI 0x01 // opacity +#define SEG_DIFFERS_OPT 0x02 // all segment options except: selected, reset & transitional +#define SEG_DIFFERS_COL 0x04 // colors +#define SEG_DIFFERS_FX 0x08 // effect/mode parameters +#define SEG_DIFFERS_BOUNDS 0x10 // segment start/stop ounds +#define SEG_DIFFERS_GSO 0x20 // grouping, spacing & offset +#define SEG_DIFFERS_SEL 0x80 // selected //Playlist option byte #define PL_OPTION_SHUFFLE 0x01 diff --git a/wled00/data/index.js b/wled00/data/index.js index 3e81b3d4..8e76ae90 100644 --- a/wled00/data/index.js +++ b/wled00/data/index.js @@ -522,7 +522,7 @@ function loadFXData(callback = null) fxdata = json||[]; // add default value for Solid fxdata.shift() - fxdata.unshift("@;!;0"); + fxdata.unshift(";!;0"); }) .catch((e)=>{ fxdata = []; @@ -658,7 +658,7 @@ function populateInfo(i) } var vcn = "Kuuhaku"; if (i.ver.startsWith("0.14.")) vcn = "Hoshi"; - if (i.ver.includes("-bl")) vcn = "Supāku"; +// if (i.ver.includes("-bl")) vcn = "Supāku"; if (i.cn) vcn = i.cn; //WLEDMM: add total heap and total PSRAM, and build number, add bin name @@ -667,6 +667,7 @@ function populateInfo(i) cn += `v${i.ver}  "${vcn}"

(WLEDMM_${i.ver}_${i.rel}.bin)

build ${i.vid}

${urows} ${urows===""?'':''} +${i.opt&0x100?inforow("Debug",""):''} ${inforow("Build",i.vid)} ${inforow("Signal strength",i.wifi.signal +"% ("+ i.wifi.rssi, " dBm)")} ${inforow("Uptime",getRuntimeStr(i.uptime))} @@ -861,7 +862,7 @@ function populateEffects() if (ef.name.indexOf("RSVD") < 0) { if (Array.isArray(fxdata) && fxdata.length>id) { if (fxdata[id].length==0) fd = ";;!;1d" - else fd = fxdata[id].substr(1); + else fd = fxdata[id]; let eP = (fd == '')?[]:fd.split(";"); // effect parameters let p = (eP.length<3 || eP[2]==='')?[]:eP[2].split(","); // palette data if (p.length>0 && (p[0] !== "" && !isNumeric(p[0]))) nm += "🎨"; // effects using palette @@ -1390,38 +1391,30 @@ function readState(s,command=false) function setEffectParameters(idx) { if (!(Array.isArray(fxdata) && fxdata.length>idx)) return; - var controlDefined = (fxdata[idx].substr(0,1) == "@"); - var effectPar = fxdata[idx].substr(1); + var controlDefined = fxdata[idx].length; + var effectPar = fxdata[idx]; var effectPars = (effectPar == '')?[]:effectPar.split(";"); var slOnOff = (effectPars.length==0 || effectPars[0]=='')?[]:effectPars[0].split(","); var coOnOff = (effectPars.length<2 || effectPars[1]=='')?[]:effectPars[1].split(","); var paOnOff = (effectPars.length<3 || effectPars[2]=='')?[]:effectPars[2].split(","); // set html slider items on/off - //var nSliders = Math.min(7,Math.floor(gId("sliders").children.length)); // div for each slider + filter + options let nSliders = 5; - var sldCnt = 0; for (let i=0; ii && slOnOff[i] != "")) { - //if (slOnOff.length>i && slOnOff[i].indexOf("=")>0) { - // // embeded default values - // var dPos = slOnOff[i].indexOf("="); - // slOnOff[i] = slOnOff[i].substring(0,dPos); - //} if (slOnOff.length>i && slOnOff[i]!="!") label.innerHTML = slOnOff[i]; else if (i==0) label.innerHTML = "Effect speed"; else if (i==1) label.innerHTML = "Effect intensity"; else label.innerHTML = "Custom" + (i-1); - sldCnt++; slider.classList.remove("hide"); } else { slider.classList.add("hide"); } } - if (slOnOff.length>5) { + if (slOnOff.length>5) { // up to 3 checkboxes gId('fxopt').classList.remove('fade'); for (let i = 0; i<3; i++) { if (5+i0*/) { // if no controls then all buttons should be shown for color 1..3 + } else if (!controlDefined) { // if no controls then all buttons should be shown for color 1..3 btn.style.display = "inline"; btn.innerHTML = `${i+1}`; hide = false; @@ -1492,13 +1485,16 @@ function setEffectParameters(idx) if (paOnOff.length>0 && paOnOff[0] != "!") pall.innerHTML = paOnOff[0]; else pall.innerHTML = ' Color palette'; } else { - // disable palett list + // disable palette list pall.innerHTML = ' Color palette not used'; palw.style.display = "none"; } // not all color selectors shown, hide palettes created from color selectors for (let e of (gId('pallist').querySelectorAll('.lstI')||[])) { - if (cslCnt < 3 && e.querySelector('.lstIname').innerText.indexOf("* C")>=0) e.classList.add('hide'); else e.classList.remove('hide'); + let fltr = "* C"; + if (cslCnt==1 && csel==0) fltr = "* Colors"; + else if (cslCnt==2) fltr = "* Colors Only"; + if (cslCnt < 3 && e.querySelector('.lstIname').innerText.indexOf(fltr)>=0) e.classList.add('hide'); else e.classList.remove('hide'); } } diff --git a/wled00/data/settings_2D.htm b/wled00/data/settings_2D.htm index 236bf03a..94246a85 100644 --- a/wled00/data/settings_2D.htm +++ b/wled00/data/settings_2D.htm @@ -70,7 +70,7 @@ function addPanel(i=0) { let p = gId("panels"); if (p.children.length >= maxPanels) return; - let b = `
${i===0?"":'
'}Panel ${i}
1st LED:
`;
Serpentine: -
+
A matrix is made of 1 or more physical LED panels of the same dimensions.
Panels should be arranged from top-left to bottom-right order, starting with lower panel number on the left (or top if transposed).
Each panel can have different LED orientation and/or starting point and/or layout.

-
+

LED panel layout

diff --git a/wled00/data/settings_leds.htm b/wled00/data/settings_leds.htm index b65dd559..64421454 100644 --- a/wled00/data/settings_leds.htm +++ b/wled00/data/settings_leds.htm @@ -323,7 +323,7 @@ if (n==1) { // npm run build has trouble minimizing spaces inside string var cn = `
-
+
${i+1}:   Length:
Color Order: @@ -595,7 +595,7 @@ Length: LED outputs:
-
+

LED Memory Usage: 0 / ? B
@@ -604,19 +604,19 @@ Length: 800 LEDs per output for the best experience!
-
+
Make a segment for each output:
Custom bus start indices:
Use global LED buffer:
-
+
Color Order Override:
-
+

-
+
Touch threshold:
@@ -637,7 +637,7 @@ Length: JSON file:
IR info
Relay GPIO: Invert  ✕
-
+

Defaults

Turn LEDs on after power up/reset:
Default brightness: (0-255)

@@ -683,7 +683,7 @@ Length: None (not recommended)
Target refresh rate: FPS -
+
Config template:

diff --git a/wled00/data/settings_sync.htm b/wled00/data/settings_sync.htm index c275f080..eea0f607 100644 --- a/wled00/data/settings_sync.htm +++ b/wled00/data/settings_sync.htm @@ -7,22 +7,8 @@ Sync Settings