Merge remote-tracking branch 'origin/ac_main' into mdev

This commit is contained in:
Ewoud
2022-11-15 12:47:32 +01:00
30 changed files with 3841 additions and 3545 deletions

4
.gitpod.Dockerfile vendored
View File

@@ -1,5 +1,3 @@
FROM gitpod/workspace-full FROM gitpod/workspace-full
USER gitpod
RUN pip3 install -U platformio USER gitpod

View File

@@ -1,12 +1,11 @@
tasks: tasks:
- command: platformio run - command: pip3 install -U platformio && platformio run
image: image:
file: .gitpod.Dockerfile file: .gitpod.Dockerfile
vscode: vscode:
extensions: extensions:
- ms-vscode.cpptools@0.26.3:u3GsZ5PK12Ddr79vh4TWgQ== - Atishay-Jain.All-Autocomplete
- eamodio.gitlens@10.2.1:e0IYyp0efFqVsrZwsIe8CA== - esbenp.prettier-vscode
- Atishay-Jain.All-Autocomplete@0.0.23:fbZNfSpnd8XkAHGfAPS2rA== - shardulm94.trailing-spaces
- 2gua.rainbow-brackets@0.0.6:Tbu8dTz0i+/bgcKQTQ5b8g==

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "wled", "name": "wled",
"version": "0.14.0.2.2", "version": "0.14.0.3.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "wled", "name": "wled",
"version": "0.14.0.2.2", "version": "0.14.0.3.0",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"clean-css": "^4.2.3", "clean-css": "^4.2.3",

View File

@@ -1,6 +1,6 @@
{ {
"name": "wled", "name": "wled",
"version": "0.14.0.2.2", "version": "0.14.0.3.0",
"description": "Tools for WLED project", "description": "Tools for WLED project",
"main": "tools/cdata.js", "main": "tools/cdata.js",
"directories": { "directories": {

View File

@@ -44,6 +44,8 @@ private:
// configuration (available in API and stored in flash) // configuration (available in API and stored in flash)
bool enabled = false; bool enabled = false;
Segment mainSegment; Segment mainSegment;
bool hourMarksEnabled = true;
uint32_t hourMarkColor = 0xFF0000;
uint32_t hourColor = 0x0000FF; uint32_t hourColor = 0x0000FF;
uint32_t minuteColor = 0x00FF00; uint32_t minuteColor = 0x00FF00;
bool secondsEnabled = true; bool secondsEnabled = true;
@@ -87,10 +89,9 @@ private:
} }
bool hexStringToColor(String const& s, uint32_t& c, uint32_t def) { 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); unsigned long long r = strtoull(s.c_str(), &ep, 16);
if (*ep == 0 && errno != ERANGE) { if (*ep == 0) {
c = r; c = r;
return true; return true;
} else { } else {
@@ -162,11 +163,18 @@ public:
lastOverlayDraw = millis(); lastOverlayDraw = millis();
auto time = toki.getTime(); auto time = toki.getTime();
auto localSec = tz ? tz->toLocal(time.sec) : time.sec; double secondP = second(localTime) / 60.0;
double secondP = second(localSec) / 60.0; double minuteP = minute(localTime) / 60.0;
double minuteP = minute(localSec) / 60.0; double hourP = (hour(localTime) % 12) / 12.0 + minuteP / 12.0;
double hourP = (hour(localSec) % 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) { if (secondsEnabled) {
int16_t secondLed = adjustToSegment(secondP, secondsSegment); int16_t secondLed = adjustToSegment(secondP, secondsSegment);
@@ -200,6 +208,8 @@ public:
top["First LED (Main Ring)"] = mainSegment.firstLed; top["First LED (Main Ring)"] = mainSegment.firstLed;
top["Last LED (Main Ring)"] = mainSegment.lastLed; top["Last LED (Main Ring)"] = mainSegment.lastLed;
top["Center/12h LED (Main Ring)"] = mainSegment.centerLed; 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["Hour Color (RRGGBB)"] = colorToHexString(hourColor);
top["Minute Color (RRGGBB)"] = colorToHexString(minuteColor); top["Minute Color (RRGGBB)"] = colorToHexString(minuteColor);
top["Show Seconds"] = secondsEnabled; top["Show Seconds"] = secondsEnabled;
@@ -221,6 +231,8 @@ public:
configComplete &= getJsonValue(top["First LED (Main Ring)"], mainSegment.firstLed, 0); configComplete &= getJsonValue(top["First LED (Main Ring)"], mainSegment.firstLed, 0);
configComplete &= getJsonValue(top["Last LED (Main Ring)"], mainSegment.lastLed, 59); configComplete &= getJsonValue(top["Last LED (Main Ring)"], mainSegment.lastLed, 59);
configComplete &= getJsonValue(top["Center/12h LED (Main Ring)"], mainSegment.centerLed, 0); 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["Hour Color (RRGGBB)"], color, "0000FF") && hexStringToColor(color, hourColor, 0x0000FF);
configComplete &= getJsonValue(top["Minute Color (RRGGBB)"], color, "00FF00") && hexStringToColor(color, minuteColor, 0x00FF00); configComplete &= getJsonValue(top["Minute Color (RRGGBB)"], color, "00FF00") && hexStringToColor(color, minuteColor, 0x00FF00);
configComplete &= getJsonValue(top["Show Seconds"], secondsEnabled, true); configComplete &= getJsonValue(top["Show Seconds"], secondsEnabled, true);

View File

@@ -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`<sup>☨</sup> (Peripheral-Out-Ctrl-In) / `MISO` (deprecated) | 36 |
| `pinPico` | GPIO that is connected to SD's `PICO`<sup>☨</sup> (Peripheral-In-Ctrl-Out) / `MOSI` (deprecated) | 14 |
| `sdEnable` | Enable to read data from the SD-card | true |
<sup>☨</sup><sub>Following new naming convention of [OSHWA](https://www.oshwa.org/a-resolution-to-redefine-spi-signal-names/)</sub>
## 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) {...}
```

View File

@@ -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

View File

@@ -120,7 +120,7 @@ uint16_t blink(uint32_t color1, uint32_t color2, bool strobe, bool do_palette) {
uint16_t mode_blink(void) { uint16_t mode_blink(void) {
return blink(SEGCOLOR(0), SEGCOLOR(1), false, true); 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) { uint16_t mode_blink_rainbow(void) {
return blink(SEGMENT.color_wheel(SEGENV.call & 0xFF), SEGCOLOR(1), false, false); 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) { uint16_t mode_strobe(void) {
return blink(SEGCOLOR(0), SEGCOLOR(1), true, true); 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) { uint16_t mode_strobe_rainbow(void) {
return blink(SEGMENT.color_wheel(SEGENV.call & 0xFF), SEGCOLOR(1), true, false); 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) { uint16_t mode_color_wipe(void) {
return color_wipe(false, false); 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) { uint16_t mode_color_sweep(void) {
return color_wipe(true, false); 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) { uint16_t mode_color_wipe_random(void) {
return color_wipe(false, true); 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; 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; 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) { uint16_t mode_theater_chase(void) {
return running(SEGCOLOR(0), SEGCOLOR(1), true); 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) { uint16_t mode_running_lights(void) {
return running_base(false); 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) { uint16_t mode_saw(void) {
return running_base(true); 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; 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) { uint16_t mode_dissolve(void) {
return dissolve(SEGCOLOR(0)); 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) { uint16_t mode_dissolve_random(void) {
return dissolve(SEGMENT.color_wheel(random8())); 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)); SEGMENT.setPixelColor(SEGENV.aux0, SEGCOLOR(0));
return FRAMETIME; 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; 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; 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; 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); 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); 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); 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; 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; 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; 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) { uint16_t mode_running_color(void) {
return running(SEGCOLOR(0), SEGCOLOR(1)); 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){ uint16_t mode_larson_scanner(void){
return larson_scanner(false); 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){ uint16_t mode_dual_larson_scanner(void){
return larson_scanner(true); 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; 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 //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(); 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; SEGENV.step = it;
return FRAMETIME; 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) { uint16_t mode_gradient(void) {
return gradient_base(false); 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) { uint16_t mode_loading(void) {
return gradient_base(true); 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 //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)); // SEGMENT.fill(SEGCOLOR(1));
// return police_base(RED, BLUE); // 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 //Police Lights with custom colors
@@ -1621,7 +1621,7 @@ uint16_t mode_tricolor_wipe(void)
return FRAMETIME; 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; SEGENV.aux0 = sHue16;
return FRAMETIME; 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 //eight colored dots, weaving in and out of sync with each other
@@ -1911,7 +1911,7 @@ uint16_t mode_juggle(void){
} }
return FRAMETIME; 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() uint16_t mode_palette()
@@ -1931,7 +1931,7 @@ uint16_t mode_palette()
} }
return FRAMETIME; 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 // WLED limitation: Analog Clock overlay will NOT work when Fire2012 is active
@@ -2087,7 +2087,7 @@ uint16_t mode_bpm()
} }
return FRAMETIME; 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() uint16_t mode_fillnoise8()
@@ -2269,7 +2269,7 @@ uint16_t mode_lake() {
} }
return FRAMETIME; 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 // meteor effect
@@ -2306,7 +2306,7 @@ uint16_t mode_meteor() {
return FRAMETIME; 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 // smooth meteor effect
@@ -2345,7 +2345,7 @@ uint16_t mode_meteor_smooth() {
SEGENV.step += SEGMENT.speed +1; SEGENV.step += SEGMENT.speed +1;
return FRAMETIME; 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 //Railway Crossing / Christmas Fairy lights
@@ -2684,7 +2684,7 @@ uint16_t mode_halloween_eyes()
return FRAMETIME; 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 //Speed slider sets amount of LEDs lit, intensity sets unlit
@@ -2706,7 +2706,7 @@ uint16_t mode_static_pattern()
return FRAMETIME; 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() uint16_t mode_tri_static_pattern()
@@ -2767,7 +2767,7 @@ uint16_t mode_spots()
{ {
return spots_base((255 - SEGMENT.speed) << 8); 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 //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); uint16_t tr = (t >> 1) + (t >> 2);
return spots_base(tr); 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 //each needs 12 bytes
@@ -3087,14 +3087,14 @@ uint16_t mode_candle()
{ {
return candle(false); 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() uint16_t mode_candle_multi()
{ {
return candle(true); 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; return FRAMETIME;
} }
#undef STARBURST_MAX_FRAG #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; return FRAMETIME;
} }
#undef MAX_SPARKS #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; 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; 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; 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" // "Pacifica"
@@ -3784,7 +3784,7 @@ uint16_t mode_solid_glitter()
return FRAMETIME; 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; 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; 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. // 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; 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 //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) return FRAMETIME_FIXED * (128-(SEGMENT.speed>>1)); // update only when appropriate time passes (in 42 FPS slots)
} // mode_2Dgameoflife() } // 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; return FRAMETIME;
} // mode_2Dmatrix() } // 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; return FRAMETIME;
} // mode_2Dsquaredswirl() } // 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; return FRAMETIME;
} }
#undef MAX_BLOBS #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; return FRAMETIME;
} // mode_ripplepeak() } // 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 #ifndef WLED_DISABLE_2D
@@ -6578,7 +6578,7 @@ uint16_t mode_puddlepeak(void) { // Puddlepeak. By Andrew Tuline.
return FRAMETIME; return FRAMETIME;
} // mode_puddlepeak() } // 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; return FRAMETIME;
} // mode_waterfall() } // 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 #ifndef WLED_DISABLE_2D
@@ -7140,7 +7140,7 @@ uint16_t mode_2DGEQ(void) { // By Will Tatam. Code reduction by Ewoud Wijma.
return FRAMETIME; return FRAMETIME;
} // mode_2DGEQ() } // 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 // now replace all pre-allocated effects
// --- 1D non-audio effects --- // --- 1D non-audio effects ---
addEffect(FX_MODE_BLINK, &mode_blink, _data_FX_MODE_BLINK); 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, &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_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); 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_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, &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_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_SAW, &mode_saw, _data_FX_MODE_SAW);
addEffect(FX_MODE_TWINKLE, &mode_twinkle, _data_FX_MODE_TWINKLE); addEffect(FX_MODE_TWINKLE, &mode_twinkle, _data_FX_MODE_TWINKLE);
addEffect(FX_MODE_DISSOLVE, &mode_dissolve, _data_FX_MODE_DISSOLVE); 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_FIRE_FLICKER, &mode_fire_flicker, _data_FX_MODE_FIRE_FLICKER);
addEffect(FX_MODE_GRADIENT, &mode_gradient, _data_FX_MODE_GRADIENT); addEffect(FX_MODE_GRADIENT, &mode_gradient, _data_FX_MODE_GRADIENT);
addEffect(FX_MODE_LOADING, &mode_loading, _data_FX_MODE_LOADING); 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_FAIRY, &mode_fairy, _data_FX_MODE_FAIRY);
addEffect(FX_MODE_TWO_DOTS, &mode_two_dots, _data_FX_MODE_TWO_DOTS); 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_FAIRYTWINKLE, &mode_fairytwinkle, _data_FX_MODE_FAIRYTWINKLE);
addEffect(FX_MODE_RUNNING_DUAL, &mode_running_dual, _data_FX_MODE_RUNNING_DUAL); 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_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_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_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_LIGHTNING, &mode_lightning, _data_FX_MODE_LIGHTNING);
addEffect(FX_MODE_ICU, &mode_icu, _data_FX_MODE_ICU); 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_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_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_RANDOM_CHASE, &mode_random_chase, _data_FX_MODE_RANDOM_CHASE);
addEffect(FX_MODE_OSCILLATE, &mode_oscillate, _data_FX_MODE_OSCILLATE); 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_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_JUGGLE, &mode_juggle, _data_FX_MODE_JUGGLE);
addEffect(FX_MODE_PALETTE, &mode_palette, _data_FX_MODE_PALETTE); 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_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_FILLNOISE8, &mode_fillnoise8, _data_FX_MODE_FILLNOISE8);
addEffect(FX_MODE_NOISE16_1, &mode_noise16_1, _data_FX_MODE_NOISE16_1); 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); 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_CHUNCHUN, &mode_chunchun, _data_FX_MODE_CHUNCHUN);
addEffect(FX_MODE_DANCING_SHADOWS, &mode_dancing_shadows, _data_FX_MODE_DANCING_SHADOWS); 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_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_BLENDS, &mode_blends, _data_FX_MODE_BLENDS);
addEffect(FX_MODE_TV_SIMULATOR, &mode_tv_simulator, _data_FX_MODE_TV_SIMULATOR); 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); 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 --- // --- 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_PIXELWAVE, &mode_pixelwave, _data_FX_MODE_PIXELWAVE);
addEffect(FX_MODE_JUGGLES, &mode_juggles, _data_FX_MODE_JUGGLES); addEffect(FX_MODE_JUGGLES, &mode_juggles, _data_FX_MODE_JUGGLES);
addEffect(FX_MODE_MATRIPIX, &mode_matripix, _data_FX_MODE_MATRIPIX); 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_PUDDLES, &mode_puddles, _data_FX_MODE_PUDDLES);
addEffect(FX_MODE_MIDNOISE, &mode_midnoise, _data_FX_MODE_MIDNOISE); addEffect(FX_MODE_MIDNOISE, &mode_midnoise, _data_FX_MODE_MIDNOISE);
addEffect(FX_MODE_NOISEMETER, &mode_noisemeter, _data_FX_MODE_NOISEMETER); 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_FREQWAVE, &mode_freqwave, _data_FX_MODE_FREQWAVE);
addEffect(FX_MODE_FREQMATRIX, &mode_freqmatrix, _data_FX_MODE_FREQMATRIX); addEffect(FX_MODE_FREQMATRIX, &mode_freqmatrix, _data_FX_MODE_FREQMATRIX);
addEffect(FX_MODE_WATERFALL, &mode_waterfall, _data_FX_MODE_WATERFALL); addEffect(FX_MODE_WATERFALL, &mode_waterfall, _data_FX_MODE_WATERFALL);
addEffect(FX_MODE_FREQPIXELS, &mode_freqpixels, _data_FX_MODE_FREQPIXELS); 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_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_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_GRAVFREQ, &mode_gravfreq, _data_FX_MODE_GRAVFREQ);
addEffect(FX_MODE_DJLIGHT, &mode_DJLight, _data_FX_MODE_DJLIGHT); addEffect(FX_MODE_DJLIGHT, &mode_DJLight, _data_FX_MODE_DJLIGHT);
addEffect(FX_MODE_BLURZ, &mode_blurz, _data_FX_MODE_BLURZ); 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); 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
} }

View File

@@ -243,12 +243,6 @@
#define FX_MODE_TV_SIMULATOR 116 #define FX_MODE_TV_SIMULATOR 116
#define FX_MODE_DYNAMIC_SMOOTH 117 #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 // new 0.14 2D effects
#define FX_MODE_2DSPACESHIPS 118 //gap fill #define FX_MODE_2DSPACESHIPS 118 //gap fill
#define FX_MODE_2DCRAZYBEES 119 //gap fill #define FX_MODE_2DCRAZYBEES 119 //gap fill
@@ -299,9 +293,9 @@
#define FX_MODE_2DSUNRADIATION 166 #define FX_MODE_2DSUNRADIATION 166
#define FX_MODE_2DCOLOREDBURSTS 167 #define FX_MODE_2DCOLOREDBURSTS 167
#define FX_MODE_2DJULIA 168 #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_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_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_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_2DGAMEOFLIFE 172
#define FX_MODE_2DTARTAN 173 #define FX_MODE_2DTARTAN 173
#define FX_MODE_2DPOLARLIGHTS 174 #define FX_MODE_2DPOLARLIGHTS 174
@@ -482,13 +476,13 @@ typedef struct Segment {
Segment(Segment &&orig) noexcept; // move constructor Segment(Segment &&orig) noexcept; // move constructor
~Segment() { ~Segment() {
#ifdef WLED_DEBUG //#ifdef WLED_DEBUG
Serial.print(F("Destroying segment:")); //Serial.print(F("Destroying segment:"));
if (name) Serial.printf(" %s (%p)", name, name); //if (name) Serial.printf(" %s (%p)", name, name);
if (data) Serial.printf(" %d (%p)", (int)_dataLen, data); //if (data) Serial.printf(" %d (%p)", (int)_dataLen, data);
if (leds) Serial.printf(" [%u]", length()*sizeof(CRGB)); //if (leds) Serial.printf(" [%u]", length()*sizeof(CRGB));
Serial.println(); //Serial.println();
#endif //#endif
if (!Segment::_globalLeds && leds) free(leds); if (!Segment::_globalLeds && leds) free(leds);
if (name) delete[] name; if (name) delete[] name;
if (_t) delete _t; if (_t) delete _t;

View File

@@ -78,7 +78,7 @@ CRGB *Segment::_globalLeds = nullptr;
// copy constructor // copy constructor
Segment::Segment(const Segment &orig) { Segment::Segment(const Segment &orig) {
DEBUG_PRINTLN(F("-- Copy segment constructor --")); //DEBUG_PRINTLN(F("-- Copy segment constructor --"));
memcpy(this, &orig, sizeof(Segment)); memcpy(this, &orig, sizeof(Segment));
name = nullptr; name = nullptr;
data = nullptr; data = nullptr;
@@ -94,7 +94,7 @@ Segment::Segment(const Segment &orig) {
// move constructor // move constructor
Segment::Segment(Segment &&orig) noexcept { Segment::Segment(Segment &&orig) noexcept {
DEBUG_PRINTLN(F("-- Move segment constructor --")); //DEBUG_PRINTLN(F("-- Move segment constructor --"));
memcpy(this, &orig, sizeof(Segment)); memcpy(this, &orig, sizeof(Segment));
orig.name = nullptr; orig.name = nullptr;
orig.data = nullptr; orig.data = nullptr;
@@ -106,7 +106,7 @@ Segment::Segment(Segment &&orig) noexcept {
// copy assignment // copy assignment
Segment& Segment::operator= (const Segment &orig) { Segment& Segment::operator= (const Segment &orig) {
DEBUG_PRINTLN(F("-- Copying segment --")); //DEBUG_PRINTLN(F("-- Copying segment --"));
if (this != &orig) { if (this != &orig) {
// clean destination // clean destination
if (name) delete[] name; if (name) delete[] name;
@@ -133,7 +133,7 @@ Segment& Segment::operator= (const Segment &orig) {
// move assignment // move assignment
Segment& Segment::operator= (Segment &&orig) noexcept { Segment& Segment::operator= (Segment &&orig) noexcept {
DEBUG_PRINTLN(F("-- Moving segment --")); //DEBUG_PRINTLN(F("-- Moving segment --"));
if (this != &orig) { if (this != &orig) {
if (name) delete[] name; // free old name if (name) delete[] name; // free old name
deallocateData(); // free old runtime data 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) { uint8_t Segment::currentMode(uint8_t newMode) {
if (transitional && _t) { return (progress()>32767U) ? newMode : _t->_modeP; // change effect in the middle of transition
return _t->_modeP;
} else {
return newMode;
}
} }
uint32_t Segment::currentColor(uint8_t slot, uint32_t colorNew) { 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 (slot >= NUM_COLORS || c == colors[slot]) return false;
if (fadeTransition) startTransition(strip.getTransition()); // start transition prior to change if (fadeTransition) startTransition(strip.getTransition()); // start transition prior to change
colors[slot] = c; colors[slot] = c;
stateChanged = true; // send UDP/WS broadcast
return true; return true;
} }
@@ -385,12 +382,14 @@ void Segment::setCCT(uint16_t k) {
if (cct == k) return; if (cct == k) return;
if (fadeTransition) startTransition(strip.getTransition()); // start transition prior to change if (fadeTransition) startTransition(strip.getTransition()); // start transition prior to change
cct = k; cct = k;
stateChanged = true; // send UDP/WS broadcast
} }
void Segment::setOpacity(uint8_t o) { void Segment::setOpacity(uint8_t o) {
if (opacity == o) return; if (opacity == o) return;
if (fadeTransition) startTransition(strip.getTransition()); // start transition prior to change if (fadeTransition) startTransition(strip.getTransition()); // start transition prior to change
opacity = o; opacity = o;
stateChanged = true; // send UDP/WS broadcast
} }
void Segment::setOption(uint8_t n, bool val) { 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 (fadeTransition && n == SEG_OPTION_ON && val != prevOn) startTransition(strip.getTransition()); // start transition prior to change
if (val) options |= 0x01 << n; if (val) options |= 0x01 << n;
else 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) { 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; palette = pal;
} }
} }
stateChanged = true; // send UDP/WS broadcast
} }
// 2D matrix // 2D matrix
@@ -920,11 +922,10 @@ uint8_t Segment::differs(Segment& b) const {
if (startY != b.startY) d |= SEG_DIFFERS_BOUNDS; if (startY != b.startY) d |= SEG_DIFFERS_BOUNDS;
if (stopY != b.stopY) 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 //bit pattern: (msb first) sound:3, mapping:3, transposed, mirrorY, reverseY, [transitional, reset,] paused, mirrored, on, reverse, [selected]
if ((options & 0b1111111110011110) != (b.options & 0b1111111110011110)) d |= SEG_DIFFERS_OPT; if ((options & 0b1111111110011110U) != (b.options & 0b1111111110011110U)) d |= SEG_DIFFERS_OPT;
if ((options & 0x01) != (b.options & 0x01)) d |= SEG_DIFFERS_SEL; 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;
for (uint8_t i = 0; i < NUM_COLORS; i++) if (colors[i] != b.colors[i]) d |= SEG_DIFFERS_COL;
return d; 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) 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 // default palette or no RGB support on segment
if ((palette == 0 && mcol < NUM_COLORS) || !(_capabilities & 0x01)) { if ((palette == 0 && mcol < NUM_COLORS) || !_isRGB) {
uint32_t color = (transitional && _t) ? _t->_colorT[mcol] : colors[mcol]; uint32_t color = currentColor(mcol, colors[mcol]);
color = gamma32(color); color = gamma32(color);
if (pbri == 255) return 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)); 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::_cctBlend = 0;
uint8_t Bus::_gAWM = 255; 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"=====([ const char JSON_palette_names[] PROGMEM = R"=====([
"Default","* Random Cycle","* Color 1","* Colors 1&2","* Color Gradient","* Colors Only","Party","Cloud","Lava","Ocean", "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", "Forest","Rainbow","Rainbow Bands","Sunset","Rivendell","Breeze","Red & Blue","Yellowout","Analogous","Splash",

View File

@@ -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); return (int)(powf((float)b / 255.0f, gamma) * 255.0f + 0.5f);
} }
// re-calculates & fills gamma table
void calcGammaTable(float gamma) void calcGammaTable(float gamma)
{ {
for (uint16_t i = 0; i < 256; i++) { 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) uint8_t gamma8(uint8_t b)
{ {
return gammaT[b]; return gammaT[b];
} }
// used for color gamma correction
uint32_t gamma32(uint32_t color) uint32_t gamma32(uint32_t color)
{ {
if (!gammaCorrectCol) return color; if (!gammaCorrectCol) return color;

View File

@@ -96,10 +96,11 @@
#define USERMOD_ID_ANALOG_CLOCK 33 //Usermod "Analog_Clock.h" #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_PING_PONG_CLOCK 34 //Usermod "usermod_v2_ping_pong_clock.h"
#define USERMOD_ID_ADS1115 35 //Usermod "usermod_ads1115.h" #define USERMOD_ID_ADS1115 35 //Usermod "usermod_ads1115.h"
#define USERMOD_ID_SD_CARD 37 //Usermod "usermod_sd_card.h"
//WLEDMM //WLEDMM
#define USERMOD_ID_CUSTOMEFFECTS 36 //Usermod "usermod_v2_customeffects.h" #define USERMOD_ID_CUSTOMEFFECTS 38 //Usermod "usermod_v2_customeffects.h"
#define USERMOD_ID_WEATHER 37 //Usermod "usermod_v2_weather.h" #define USERMOD_ID_WEATHER 39 //Usermod "usermod_v2_weather.h"
#define USERMOD_ID_GAMES 38 //Usermod "usermod_v2_games.h" #define USERMOD_ID_GAMES 40 //Usermod "usermod_v2_games.h"
//Access point behavior //Access point behavior
#define AP_BEHAVIOR_BOOT_NO_CONN 0 //Open AP when no connection after boot #define AP_BEHAVIOR_BOOT_NO_CONN 0 //Open AP when no connection after boot
@@ -255,13 +256,13 @@
#define SEG_OPTION_TRANSPOSED 9 #define SEG_OPTION_TRANSPOSED 9
//Segment differs return byte //Segment differs return byte
#define SEG_DIFFERS_BRI 0x01 #define SEG_DIFFERS_BRI 0x01 // opacity
#define SEG_DIFFERS_OPT 0x02 #define SEG_DIFFERS_OPT 0x02 // all segment options except: selected, reset & transitional
#define SEG_DIFFERS_COL 0x04 #define SEG_DIFFERS_COL 0x04 // colors
#define SEG_DIFFERS_FX 0x08 #define SEG_DIFFERS_FX 0x08 // effect/mode parameters
#define SEG_DIFFERS_BOUNDS 0x10 #define SEG_DIFFERS_BOUNDS 0x10 // segment start/stop ounds
#define SEG_DIFFERS_GSO 0x20 #define SEG_DIFFERS_GSO 0x20 // grouping, spacing & offset
#define SEG_DIFFERS_SEL 0x80 #define SEG_DIFFERS_SEL 0x80 // selected
//Playlist option byte //Playlist option byte
#define PL_OPTION_SHUFFLE 0x01 #define PL_OPTION_SHUFFLE 0x01

View File

@@ -522,7 +522,7 @@ function loadFXData(callback = null)
fxdata = json||[]; fxdata = json||[];
// add default value for Solid // add default value for Solid
fxdata.shift() fxdata.shift()
fxdata.unshift("@;!;0"); fxdata.unshift(";!;0");
}) })
.catch((e)=>{ .catch((e)=>{
fxdata = []; fxdata = [];
@@ -658,7 +658,7 @@ function populateInfo(i)
} }
var vcn = "Kuuhaku"; var vcn = "Kuuhaku";
if (i.ver.startsWith("0.14.")) vcn = "Hoshi"; 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; if (i.cn) vcn = i.cn;
//WLEDMM: add total heap and total PSRAM, and build number, add bin name //WLEDMM: add total heap and total PSRAM, and build number, add bin name
@@ -667,6 +667,7 @@ function populateInfo(i)
cn += `v${i.ver} &nbsp;<i>"${vcn}"</i><p>(WLEDMM_${i.ver}_${i.rel}.bin)</p><p><em>build ${i.vid}</em></p><table> cn += `v${i.ver} &nbsp;<i>"${vcn}"</i><p>(WLEDMM_${i.ver}_${i.rel}.bin)</p><p><em>build ${i.vid}</em></p><table>
${urows} ${urows}
${urows===""?'':'<tr><td colspan=2><hr style="height:1px;border-width:0;color:gray;background-color:gray"></td></tr>'} ${urows===""?'':'<tr><td colspan=2><hr style="height:1px;border-width:0;color:gray;background-color:gray"></td></tr>'}
${i.opt&0x100?inforow("Debug","<button class=\"btn btn-xs\" onclick=\"requestJson({'debug':"+(i.opt&0x0080?"false":"true")+"});\"><i class=\"icons "+(i.opt&0x0080?"on":"off")+"\">&#xe08f;</i></button>"):''}
${inforow("Build",i.vid)} ${inforow("Build",i.vid)}
${inforow("Signal strength",i.wifi.signal +"% ("+ i.wifi.rssi, " dBm)")} ${inforow("Signal strength",i.wifi.signal +"% ("+ i.wifi.rssi, " dBm)")}
${inforow("Uptime",getRuntimeStr(i.uptime))} ${inforow("Uptime",getRuntimeStr(i.uptime))}
@@ -861,7 +862,7 @@ function populateEffects()
if (ef.name.indexOf("RSVD") < 0) { if (ef.name.indexOf("RSVD") < 0) {
if (Array.isArray(fxdata) && fxdata.length>id) { if (Array.isArray(fxdata) && fxdata.length>id) {
if (fxdata[id].length==0) fd = ";;!;1d" 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 eP = (fd == '')?[]:fd.split(";"); // effect parameters
let p = (eP.length<3 || eP[2]==='')?[]:eP[2].split(","); // palette data let p = (eP.length<3 || eP[2]==='')?[]:eP[2].split(","); // palette data
if (p.length>0 && (p[0] !== "" && !isNumeric(p[0]))) nm += "&#x1F3A8;"; // effects using palette if (p.length>0 && (p[0] !== "" && !isNumeric(p[0]))) nm += "&#x1F3A8;"; // effects using palette
@@ -1390,38 +1391,30 @@ function readState(s,command=false)
function setEffectParameters(idx) function setEffectParameters(idx)
{ {
if (!(Array.isArray(fxdata) && fxdata.length>idx)) return; if (!(Array.isArray(fxdata) && fxdata.length>idx)) return;
var controlDefined = (fxdata[idx].substr(0,1) == "@"); var controlDefined = fxdata[idx].length;
var effectPar = fxdata[idx].substr(1); var effectPar = fxdata[idx];
var effectPars = (effectPar == '')?[]:effectPar.split(";"); var effectPars = (effectPar == '')?[]:effectPar.split(";");
var slOnOff = (effectPars.length==0 || effectPars[0]=='')?[]:effectPars[0].split(","); var slOnOff = (effectPars.length==0 || effectPars[0]=='')?[]:effectPars[0].split(",");
var coOnOff = (effectPars.length<2 || effectPars[1]=='')?[]:effectPars[1].split(","); var coOnOff = (effectPars.length<2 || effectPars[1]=='')?[]:effectPars[1].split(",");
var paOnOff = (effectPars.length<3 || effectPars[2]=='')?[]:effectPars[2].split(","); var paOnOff = (effectPars.length<3 || effectPars[2]=='')?[]:effectPars[2].split(",");
// set html slider items on/off // 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; let nSliders = 5;
var sldCnt = 0;
for (let i=0; i<nSliders; i++) { for (let i=0; i<nSliders; i++) {
var slider = gId("slider" + i); var slider = gId("slider" + i);
var label = gId("sliderLabel" + i); var label = gId("sliderLabel" + i);
// if (not controlDefined and for AC speed or intensity and for SR alle sliders) or slider has a value // if (not controlDefined and for AC speed or intensity and for SR all sliders) or slider has a value
if ((!controlDefined && i < ((idx<128)?2:nSliders)) || (slOnOff.length>i && slOnOff[i] != "")) { if ((!controlDefined && i < ((idx<128)?2:nSliders)) || (slOnOff.length>i && 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]; if (slOnOff.length>i && slOnOff[i]!="!") label.innerHTML = slOnOff[i];
else if (i==0) label.innerHTML = "Effect speed"; else if (i==0) label.innerHTML = "Effect speed";
else if (i==1) label.innerHTML = "Effect intensity"; else if (i==1) label.innerHTML = "Effect intensity";
else label.innerHTML = "Custom" + (i-1); else label.innerHTML = "Custom" + (i-1);
sldCnt++;
slider.classList.remove("hide"); slider.classList.remove("hide");
} else { } else {
slider.classList.add("hide"); slider.classList.add("hide");
} }
} }
if (slOnOff.length>5) { if (slOnOff.length>5) { // up to 3 checkboxes
gId('fxopt').classList.remove('fade'); gId('fxopt').classList.remove('fade');
for (let i = 0; i<3; i++) { for (let i = 0; i<3; i++) {
if (5+i<slOnOff.length && slOnOff[5+i]!=='') { if (5+i<slOnOff.length && slOnOff[5+i]!=='') {
@@ -1465,7 +1458,7 @@ function setEffectParameters(idx)
hide = false; hide = false;
if (!cslCnt || oCsel==i) selectSlot(i); // select 1st displayed slot or old one if (!cslCnt || oCsel==i) selectSlot(i); // select 1st displayed slot or old one
cslCnt++; cslCnt++;
} else if (!controlDefined /*|| paOnOff.length>0*/) { // 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.style.display = "inline";
btn.innerHTML = `${i+1}`; btn.innerHTML = `${i+1}`;
hide = false; hide = false;
@@ -1492,13 +1485,16 @@ function setEffectParameters(idx)
if (paOnOff.length>0 && paOnOff[0] != "!") pall.innerHTML = paOnOff[0]; if (paOnOff.length>0 && paOnOff[0] != "!") pall.innerHTML = paOnOff[0];
else pall.innerHTML = '<i class="icons sel-icon" onclick="tglHex()">&#xe2b3;</i> Color palette'; else pall.innerHTML = '<i class="icons sel-icon" onclick="tglHex()">&#xe2b3;</i> Color palette';
} else { } else {
// disable palett list // disable palette list
pall.innerHTML = '<i class="icons sel-icon" onclick="tglHex()">&#xe2b3;</i> Color palette not used'; pall.innerHTML = '<i class="icons sel-icon" onclick="tglHex()">&#xe2b3;</i> Color palette not used';
palw.style.display = "none"; palw.style.display = "none";
} }
// not all color selectors shown, hide palettes created from color selectors // not all color selectors shown, hide palettes created from color selectors
for (let e of (gId('pallist').querySelectorAll('.lstI')||[])) { 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');
} }
} }

View File

@@ -70,7 +70,7 @@
function addPanel(i=0) { function addPanel(i=0) {
let p = gId("panels"); let p = gId("panels");
if (p.children.length >= maxPanels) return; if (p.children.length >= maxPanels) return;
let b = `<div id="pnl${i}">${i===0?"":'<hr style="width:260px">'}Panel ${i}<br>1<sup>st</sup> LED: <select name="P${i}B"> let b = `<div id="pnl${i}">${i===0?"":'<hr class="sml">'}Panel ${i}<br>1<sup>st</sup> LED: <select name="P${i}B">
<option value="0">Top</option> <option value="0">Top</option>
<option value="1">Bottom</option> <option value="1">Bottom</option>
</select><select name="P${i}R"> </select><select name="P${i}R">
@@ -134,11 +134,11 @@ Serpentine: <input type="checkbox" name="P${i}S"></div>`;
<option value="1">Vertical</option> <option value="1">Vertical</option>
</select><br> </select><br>
Serpentine: <input type="checkbox" name="PS"> Serpentine: <input type="checkbox" name="PS">
<hr style="width:260px"> <hr class="sml">
<i>A matrix is made of 1 or more physical LED panels of the same dimensions.<br> <i>A matrix is made of 1 or more physical LED panels of the same dimensions.<br>
Panels should be arranged from top-left to bottom-right order, starting with lower panel number on the left (or top if transposed).<br> Panels should be arranged from top-left to bottom-right order, starting with lower panel number on the left (or top if transposed).<br>
Each panel can have different LED orientation and/or starting point and/or layout.</i><br> Each panel can have different LED orientation and/or starting point and/or layout.</i><br>
<hr style="width:260px"> <hr class="sml">
<h3>LED panel layout</h3> <h3>LED panel layout</h3>
<div id="panels"> <div id="panels">
</div> </div>

View File

@@ -323,7 +323,7 @@
if (n==1) { if (n==1) {
// npm run build has trouble minimizing spaces inside string // npm run build has trouble minimizing spaces inside string
var cn = `<div class="iST"> var cn = `<div class="iST">
<hr style="width:260px"> <hr class="sml">
${i+1}: ${i+1}:
<select name="LT${i}" onchange="UI(true)"> <select name="LT${i}" onchange="UI(true)">
<option value="22" selected>WS281x</option> <option value="22" selected>WS281x</option>
@@ -389,7 +389,7 @@ ${i+1}:
if (i >= 10) return; if (i >= 10) return;
var b = `<div class="com_entry"> var b = `<div class="com_entry">
<hr style="width:260px"> <hr class="sml">
${i+1}: Start: <input type="number" name="XS${i}" id="xs${i}" class="l starts" min="0" max="65535" value="${start}" oninput="UI();" required="">&nbsp; ${i+1}: Start: <input type="number" name="XS${i}" id="xs${i}" class="l starts" min="0" max="65535" value="${start}" oninput="UI();" required="">&nbsp;
Length: <input type="number" name="XC${i}" id="xc${i}" class="l" min="1" max="65535" value="${len}" required="" oninput="UI()"> Length: <input type="number" name="XC${i}" id="xc${i}" class="l" min="1" max="65535" value="${len}" required="" oninput="UI()">
<div style="display:inline">Color Order: <div style="display:inline">Color Order:
@@ -595,7 +595,7 @@ Length: <input type="number" name="XC${i}" id="xc${i}" class="l" min="1" max="65
</div> </div>
<h3>Hardware setup</h3> <h3>Hardware setup</h3>
<div id="mLC">LED outputs:</div> <div id="mLC">LED outputs:</div>
<hr style="width:260px"> <hr class="sml">
<button type="button" id="+" onclick="addLEDs(1,false)">+</button> <button type="button" id="+" onclick="addLEDs(1,false)">+</button>
<button type="button" id="-" onclick="addLEDs(-1,false)">-</button><br> <button type="button" id="-" onclick="addLEDs(-1,false)">-</button><br>
LED Memory Usage: <span id="m0">0</span> / <span id="m1">?</span> B<br> LED Memory Usage: <span id="m0">0</span> / <span id="m1">?</span> B<br>
@@ -604,19 +604,19 @@ Length: <input type="number" name="XC${i}" id="xc${i}" class="l" min="1" max="65
&#9888; You might run into stability or lag issues.<br> &#9888; You might run into stability or lag issues.<br>
Use less than <span id="wreason">800 LEDs per output</span> for the best experience!<br> Use less than <span id="wreason">800 LEDs per output</span> for the best experience!<br>
</div> </div>
<hr style="width:260px"> <hr class="sml">
Make a segment for each output: <input type="checkbox" name="MS"><br> Make a segment for each output: <input type="checkbox" name="MS"><br>
Custom bus start indices: <input type="checkbox" onchange="tglSi(this.checked)" id="si"><br> Custom bus start indices: <input type="checkbox" onchange="tglSi(this.checked)" id="si"><br>
Use global LED buffer: <input type="checkbox" name="LD"><br> Use global LED buffer: <input type="checkbox" name="LD"><br>
<hr style="width:260px"> <hr class="sml">
<div id="color_order_mapping"> <div id="color_order_mapping">
Color Order Override: Color Order Override:
<div id="com_entries"></div> <div id="com_entries"></div>
<hr style="width:260px"> <hr class="sml">
<button type="button" id="com_add" onclick="addCOM()">+</button> <button type="button" id="com_add" onclick="addCOM()">+</button>
<button type="button" id="com_rem" onclick="remCOM()">-</button><br> <button type="button" id="com_rem" onclick="remCOM()">-</button><br>
</div> </div>
<hr style="width:260px"> <hr class="sml">
<div id="btns"></div> <div id="btns"></div>
Touch threshold: <input type="number" class="s" min="0" max="100" name="TT" required><br> Touch threshold: <input type="number" class="s" min="0" max="100" name="TT" required><br>
<div id="irOnOff2"> <div id="irOnOff2">
@@ -637,7 +637,7 @@ Length: <input type="number" name="XC${i}" id="xc${i}" class="l" min="1" max="65
<div id="json" style="display:none;">JSON file: <input type="file" name="data" accept=".json"><button type="button" class="sml" onclick="uploadFile('/ir.json')">Upload</button><br></div> <div id="json" style="display:none;">JSON file: <input type="file" name="data" accept=".json"><button type="button" class="sml" onclick="uploadFile('/ir.json')">Upload</button><br></div>
<a href="https://kno.wled.ge/interfaces/infrared/" target="_blank">IR info</a><br> <a href="https://kno.wled.ge/interfaces/infrared/" target="_blank">IR info</a><br>
Relay GPIO: <input type="number" min="-1" max="48" name="RL" onchange="UI()" class="xs"> Invert <input type="checkbox" name="RM"><span style="cursor: pointer;" onclick="off('RL')">&nbsp;&#x2715;</span><br> Relay GPIO: <input type="number" min="-1" max="48" name="RL" onchange="UI()" class="xs"> Invert <input type="checkbox" name="RM"><span style="cursor: pointer;" onclick="off('RL')">&nbsp;&#x2715;</span><br>
<hr style="width:260px"> <hr class="sml">
<h3>Defaults</h3> <h3>Defaults</h3>
Turn LEDs on after power up/reset: <input type="checkbox" name="BO"><br> Turn LEDs on after power up/reset: <input type="checkbox" name="BO"><br>
Default brightness: <input name="CA" type="number" class="m" min="0" max="255" required> (0-255)<br><br> Default brightness: <input name="CA" type="number" class="m" min="0" max="255" required> (0-255)<br><br>
@@ -683,7 +683,7 @@ Length: <input type="number" name="XC${i}" id="xc${i}" class="l" min="1" max="65
<option value="3">None (not recommended)</option> <option value="3">None (not recommended)</option>
</select><br> </select><br>
Target refresh rate: <input type="number" class="s" min="1" max="120" name="FR" required> FPS Target refresh rate: <input type="number" class="s" min="1" max="120" name="FR" required> FPS
<hr style="width:260px"> <hr class="sml">
<div id="cfg">Config template: <input type="file" name="data2" accept=".json"><button type="button" class="sml" onclick="loadCfg(d.Sf.data2)">Apply</button><br></div> <div id="cfg">Config template: <input type="file" name="data2" accept=".json"><button type="button" class="sml" onclick="loadCfg(d.Sf.data2)">Apply</button><br></div>
<hr> <hr>
<button type="button" onclick="B()">Back</button><button type="submit">Save</button> <button type="button" onclick="B()">Back</button><button type="submit">Save</button>

View File

@@ -7,22 +7,8 @@
<title>Sync Settings</title> <title>Sync Settings</title>
<script>var d=document; <script>var d=document;
var loc = false, locip; var loc = false, locip;
function gId(s) function gId(s){return d.getElementById(s);}
{ function toggle(el){gId(el).classList.toggle("hide"); gId('No'+el).classList.toggle("hide");}
return d.getElementById(s);
}
function hideNoDMX(){gId("dmxOnOff2").style.display="none";}
function hideALEXA(){gId("aleOnOff").style.display="none";}
function hideNoALEXA(){gId("aleOnOff2").style.display="none";}
function hideBLYNK(){gId("blyOnOff").style.display="none";}
function hideNoBLYNK(){gId("blyOnOff2").style.display="none";}
function hideMQTT(){gId("mqtOnOff").style.display="none";}
function hideNoMQTT(){gId("mqtOnOff2").style.display="none";}
function hideHUE(){gId("hueOnOff").style.display="none";}
function hideNoHUE(){gId("hueOnOff2").style.display="none";}
function hideNoLOX(){gId("loxOnOff2").style.display="none";}
function H(){window.open("https://kno.wled.ge/interfaces/udp-notifier/");} function H(){window.open("https://kno.wled.ge/interfaces/udp-notifier/");}
function B(){window.open("/settings","_self");} function B(){window.open("/settings","_self");}
function adj(){if (d.Sf.DI.value == 6454) {if (d.Sf.EU.value == 1) d.Sf.EU.value = 0;} function adj(){if (d.Sf.DI.value == 6454) {if (d.Sf.EU.value == 1) d.Sf.EU.value = 0;}
@@ -93,11 +79,11 @@
<h2>Sync setup</h2> <h2>Sync setup</h2>
<h3>WLED Broadcast</h3> <h3>WLED Broadcast</h3>
UDP Port: <input name="UP" type="number" min="1" max="65535" class="d5" required><br> UDP Port: <input name="UP" type="number" min="1" max="65535" class="d5" required><br>
2nd Port: <input name="U2" type="number" min="1" max="65535" class="d5" required><br><br> 2nd Port: <input name="U2" type="number" min="1" max="65535" class="d5" required><br>
<input name="GS" id="GS" type="number" style="display: none;"> <!-- hidden inputs for bitwise group checkboxes --> <h3>Sync grups</h3>
<input name="GS" id="GS" type="number" style="display: none;"><!-- hidden inputs for bitwise group checkboxes -->
<input name="GR" id="GR" type="number" style="display: none;"> <input name="GR" id="GR" type="number" style="display: none;">
<table style="margin: 0 auto;"> <table style="margin: 0 auto;">
<tr><td colspan="9" style="text-align:center">Sync groups</td></tr>
<tr> <tr>
<td></td> <td></td>
<td>1</td> <td>1</td>
@@ -141,9 +127,11 @@ Send Philips Hue change notifications: <input type="checkbox" name="SH"><br>
Send Macro notifications: <input type="checkbox" name="SM"><br> Send Macro notifications: <input type="checkbox" name="SM"><br>
UDP packet retransmissions: <input name="UR" type="number" min="0" max="30" class="d5" required><br><br> UDP packet retransmissions: <input name="UR" type="number" min="0" max="30" class="d5" required><br><br>
<i>Reboot required to apply changes. </i> <i>Reboot required to apply changes. </i>
<hr class="sml">
<h3>Instance List</h3> <h3>Instance List</h3>
Enable instance list: <input type="checkbox" name="NL"><br> Enable instance list: <input type="checkbox" name="NL"><br>
Make this instance discoverable: <input type="checkbox" name="NB"> Make this instance discoverable: <input type="checkbox" name="NB">
<hr class="sml">
<h3>Realtime</h3> <h3>Realtime</h3>
Receive UDP realtime: <input type="checkbox" name="RD"><br> Receive UDP realtime: <input type="checkbox" name="RD"><br>
Use main segment only: <input type="checkbox" name="MO"><br><br> Use main segment only: <input type="checkbox" name="MO"><br><br>
@@ -175,37 +163,38 @@ Timeout: <input name="ET" type="number" min="1" max="65000" required> ms<br>
Force max brightness: <input type="checkbox" name="FB"><br> Force max brightness: <input type="checkbox" name="FB"><br>
Disable realtime gamma correction: <input type="checkbox" name="RG"><br> Disable realtime gamma correction: <input type="checkbox" name="RG"><br>
Realtime LED offset: <input name="WO" type="number" min="-255" max="255" required> Realtime LED offset: <input name="WO" type="number" min="-255" max="255" required>
<div id="dmxOnOff2"> <hr class="sml">
<br><em style="color:darkorange">This firmware build does not include DMX output support. <br></em>
</div>
<h3>Alexa Voice Assistant</h3> <h3>Alexa Voice Assistant</h3>
<div id="aleOnOff2"> <div id="NoAlexa" class="hide">
<em style="color:darkorange">This firmware build does not include Alexa support. <br></em> <em style="color:#fa0;">This firmware build does not include Alexa support.<br></em><br>
</div> </div>
<div id="aleOnOff"> <div id="Alexa">
Emulate Alexa device: <input type="checkbox" name="AL"><br> Emulate Alexa device: <input type="checkbox" name="AL"><br>
Alexa invocation name: <input type="text" name="AI" maxlength="32"><br> Alexa invocation name: <input type="text" name="AI" maxlength="32"><br>
Also emulate devices to call the first <input name="AP" type="number" class="s" min="0" max="9" required> presets Also emulate devices to call the first <input name="AP" type="number" class="s" min="0" max="9" required> presets<br><br>
</div> </div>
<h3>Blynk</h3> <hr class="sml">
<div id="blyOnOff2"> <div style="color: #fa0;">&#9888; <b>Blynk, MQTT and Hue sync all connect to external hosts!<br>
<em style="color:darkorange">This firmware build does not include Blynk support. <br></em> This may impact the responsiveness of WLED.</b><br>
</div> </div>
<b>Blynk, MQTT and Hue sync all connect to external hosts!<br>
This may impact the responsiveness of the ESP8266.</b><br>
For best results, only use one of these services at a time.<br> For best results, only use one of these services at a time.<br>
(alternatively, connect a second ESP to them and use the UDP sync)<br><br> (alternatively, connect a second ESP to them and use the UDP sync)
<div id="blyOnOff"> <hr class="sml">
<h3>Blynk</h3>
<div id="NoBlynk" class="hide">
<em style="color:#fa0;">This firmware build does not include Blynk support.<br></em>
</div>
<div id="Blynk">
Host: <input type="text" name="BH" maxlength="32"> Host: <input type="text" name="BH" maxlength="32">
Port: <input name="BP" type="number" min="1" max="65535" value="80" class="d5"><br> Port: <input name="BP" type="number" min="1" max="65535" value="80" class="d5"><br>
Device Auth token: <input name="BK" maxlength="33"><br> Device Auth token: <input name="BK" maxlength="33"><br>
<i>Clear the token field to disable. </i><a href="https://kno.wled.ge/interfaces/blynk/" target="_blank">Setup info</a> <i>Clear the token field to disable. </i><a href="https://kno.wled.ge/interfaces/blynk/" target="_blank">Setup info</a>
</div> </div>
<h3>MQTT</h3> <h3>MQTT</h3>
<div id="mqtOnOff2"> <div id="NoMQTT" class="hide">
<em style="color:darkorange">This firmware build does not include MQTT support. <br></em> <em style="color:#fa0;">This firmware build does not include MQTT support.<br></em>
</div> </div>
<div id="mqtOnOff"> <div id="MQTT">
Enable MQTT: <input type="checkbox" name="MQ"><br> Enable MQTT: <input type="checkbox" name="MQ"><br>
Broker: <input type="text" name="MS" maxlength="32"> Broker: <input type="text" name="MS" maxlength="32">
Port: <input name="MQPORT" type="number" min="1" max="65535" class="d5"><br> Port: <input name="MQPORT" type="number" min="1" max="65535" class="d5"><br>
@@ -220,10 +209,10 @@ Publish on button press: <input type="checkbox" name="BM"><br>
<i>Reboot required to apply changes. </i><a href="https://kno.wled.ge/interfaces/mqtt/" target="_blank">MQTT info</a> <i>Reboot required to apply changes. </i><a href="https://kno.wled.ge/interfaces/mqtt/" target="_blank">MQTT info</a>
</div> </div>
<h3>Philips Hue</h3> <h3>Philips Hue</h3>
<div id="hueOnOff2"> <div id="NoHue" class="hide">
<em style="color:darkorange">This firmware build does not include Philips Hue support. <br></em> <em style="color:#fa0;">This firmware build does not include Philips Hue support.<br></em>
</div> </div>
<div id="hueOnOff"> <div id="Hue">
<i>You can find the bridge IP and the light number in the 'About' section of the hue app.</i><br> <i>You can find the bridge IP and the light number in the 'About' section of the hue app.</i><br>
Poll Hue light <input name="HL" type="number" min="1" max="99" > every <input name="HI" type="number" min="100" max="65000"> ms: <input type="checkbox" name="HP"><br> Poll Hue light <input name="HL" type="number" min="1" max="99" > every <input name="HI" type="number" min="100" max="65000"> ms: <input type="checkbox" name="HP"><br>
Then, receive <input type="checkbox" name="HO"> On/Off, <input type="checkbox" name="HB"> Brightness, and <input type="checkbox" name="HC"> Color<br> Then, receive <input type="checkbox" name="HO"> On/Off, <input type="checkbox" name="HB"> Brightness, and <input type="checkbox" name="HC"> Color<br>
@@ -236,8 +225,6 @@ Hue Bridge IP:<br>
(when first connecting)<br> (when first connecting)<br>
</div> </div>
Hue status: <span class="sip"> Disabled in this build </span> Hue status: <span class="sip"> Disabled in this build </span>
<div id="loxOnOff2">
<br><em style="color:darkorange">This firmware build does not include Loxone Lighting support. <br></em>
</div> </div>
<h3>Serial</h3> <h3>Serial</h3>
Baud rate: Baud rate:

View File

@@ -106,7 +106,7 @@
} }
function addField(k,f,o,a=false) { //key, field, (sub)object, isArray function addField(k,f,o,a=false) { //key, field, (sub)object, isArray
if (isO(o)) { if (isO(o)) {
urows += '<hr style="width:260px">'; urows += '<hr class="sml">';
for (const [s,v] of Object.entries(o)) { for (const [s,v] of Object.entries(o)) {
// possibility to nest objects (only 1 level) // possibility to nest objects (only 1 level)
if (f!=='unknown' && !k.includes(":")) addField(k+":"+f,s,v); if (f!=='unknown' && !k.includes(":")) addField(k+":"+f,s,v);
@@ -249,7 +249,7 @@
<i style="color: orange;">(only changable on ESP32, change requires reboot!)</i><br> <i style="color: orange;">(only changable on ESP32, change requires reboot!)</i><br>
SDA:<input type="number" min="-1" max="48" name="SDA" onchange="check(this,'if')" class="s" placeholder="SDA"> SDA:<input type="number" min="-1" max="48" name="SDA" onchange="check(this,'if')" class="s" placeholder="SDA">
SCL:<input type="number" min="-1" max="48" name="SCL" onchange="check(this,'if')" class="s" placeholder="SCL"> SCL:<input type="number" min="-1" max="48" name="SCL" onchange="check(this,'if')" class="s" placeholder="SCL">
<hr style="width:260px"> <hr class="sml">
Global SPI GPIOs (HW)<br> Global SPI GPIOs (HW)<br>
<i style="color: orange;">(only changable on ESP32, change requires reboot!)</i><br> <i style="color: orange;">(only changable on ESP32, change requires reboot!)</i><br>
MOSI:<input type="number" min="-1" max="48" name="MOSI" onchange="check(this,'if')" class="s" placeholder="MOSI"> MOSI:<input type="number" min="-1" max="48" name="MOSI" onchange="check(this,'if')" class="s" placeholder="MOSI">

View File

@@ -13,6 +13,9 @@ body {
hr { hr {
border-color: #666; border-color: #666;
} }
hr.sml {
width: 260px;
}
a, a:hover { a, a:hover {
color: #28f; color: #28f;
text-decoration: none; text-decoration: none;
@@ -52,6 +55,9 @@ button.sml {
position: absolute; position: absolute;
width: 60px; width: 60px;
} }
.hide {
display: none;
}
input { input {
background: #333; background: #333;
color: #fff; color: #fff;

View File

@@ -41,46 +41,46 @@ const char PAGE_dmxmap[] PROGMEM = R"=====()=====";
#endif #endif
// Autogenerated from wled00/data/update.htm, do not edit!! // Autogenerated from wled00/data/update.htm, do not edit!!
const uint16_t PAGE_update_length = 607; const uint16_t PAGE_update_length = 606;
const uint8_t PAGE_update[] PROGMEM = { const uint8_t PAGE_update[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x75, 0x53, 0xd1, 0x6e, 0xd3, 0x30, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x75, 0x53, 0xc1, 0x6e, 0xd4, 0x30,
0x14, 0x7d, 0xcf, 0x57, 0x78, 0x7e, 0x6a, 0x25, 0x66, 0x6f, 0x13, 0x2f, 0x8c, 0x24, 0x43, 0x65, 0x14, 0xbc, 0xe7, 0x2b, 0x8c, 0x4f, 0xbb, 0x12, 0xb5, 0x4b, 0xc5, 0x85, 0x92, 0xa4, 0x68, 0x69,
0x13, 0x42, 0x62, 0x5a, 0xa5, 0x6d, 0x20, 0x9e, 0x90, 0x13, 0xdf, 0x34, 0xa6, 0x8e, 0x9d, 0xd9, 0x85, 0x90, 0xa8, 0x5a, 0xa9, 0x2d, 0x88, 0x13, 0x72, 0xe2, 0x97, 0xc4, 0xac, 0x63, 0xa7, 0xf6,
0x37, 0xad, 0x22, 0xb4, 0x7f, 0xe7, 0xc6, 0x69, 0x07, 0xd2, 0xe0, 0x25, 0xaa, 0xe3, 0x73, 0x4f, 0xcb, 0xae, 0x22, 0xd4, 0x7f, 0xe7, 0xc5, 0xd9, 0x2d, 0x48, 0x85, 0x4b, 0xb4, 0x8e, 0xe7, 0xcd,
0xcf, 0x3d, 0xe7, 0x24, 0x3f, 0xb9, 0xbe, 0xfb, 0xf8, 0xf0, 0x7d, 0x7d, 0xc3, 0x5a, 0xec, 0x6c, 0xce, 0x9b, 0x99, 0xe4, 0xaf, 0x2e, 0x6f, 0x3e, 0xde, 0x7f, 0xbf, 0xbd, 0x62, 0x1d, 0xf6, 0xb6,
0x99, 0x1f, 0x9e, 0xa0, 0x74, 0x99, 0x77, 0x80, 0x8a, 0xd5, 0xde, 0x21, 0x38, 0x2c, 0xf8, 0xde, 0xcc, 0x0f, 0x4f, 0x50, 0xba, 0xcc, 0x7b, 0x40, 0xc5, 0x6a, 0xef, 0x10, 0x1c, 0x16, 0x7c, 0x6f,
0x68, 0x6c, 0x0b, 0x0d, 0x3b, 0x53, 0xc3, 0x69, 0x3a, 0x70, 0xe6, 0x54, 0x07, 0x05, 0xdf, 0x19, 0x34, 0x76, 0x85, 0x86, 0x9d, 0xa9, 0xe1, 0x24, 0x1d, 0x38, 0x73, 0xaa, 0x87, 0x82, 0xef, 0x0c,
0xd8, 0xf7, 0x3e, 0x20, 0x2f, 0xb3, 0x1c, 0x0d, 0x5a, 0x28, 0xbf, 0x7d, 0xb9, 0xb9, 0x66, 0x8f, 0xec, 0x07, 0x1f, 0x90, 0x97, 0x59, 0x8e, 0x06, 0x2d, 0x94, 0xdf, 0xbe, 0x5c, 0x5d, 0xb2, 0x87,
0xbd, 0x56, 0x08, 0xb9, 0x9c, 0x5f, 0xe5, 0xb1, 0x0e, 0xa6, 0xc7, 0x32, 0x6b, 0x06, 0x57, 0xa3, 0x41, 0x2b, 0x84, 0x5c, 0x2e, 0xaf, 0xf2, 0x58, 0x07, 0x33, 0x60, 0x99, 0x35, 0xa3, 0xab, 0xd1,
0xf1, 0x8e, 0xad, 0x16, 0xcb, 0x5f, 0x7b, 0xe3, 0xb4, 0xdf, 0x8b, 0xd6, 0x44, 0xf4, 0x61, 0x14, 0x78, 0xc7, 0x36, 0xab, 0xf5, 0xaf, 0xbd, 0x71, 0xda, 0xef, 0x45, 0x67, 0x22, 0xfa, 0x30, 0x89,
0x95, 0xaa, 0xb7, 0x8b, 0xe5, 0xf3, 0x0b, 0xe4, 0x91, 0x20, 0xda, 0xd7, 0x43, 0x47, 0x0a, 0xc4, 0x4a, 0xd5, 0xdb, 0xd5, 0xfa, 0xe9, 0x19, 0xf2, 0x40, 0x10, 0xed, 0xeb, 0xb1, 0x27, 0x05, 0xa2,
0x06, 0xf0, 0xc6, 0xc2, 0xf4, 0x73, 0x35, 0x7e, 0xd6, 0x0b, 0x3e, 0x34, 0x7c, 0x29, 0x22, 0x8e, 0x05, 0xbc, 0xb2, 0x30, 0xff, 0xdc, 0x4c, 0x9f, 0xf5, 0x8a, 0x8f, 0x0d, 0x5f, 0x8b, 0x88, 0x93,
0x16, 0x84, 0x36, 0xb1, 0xb7, 0x6a, 0x2c, 0xb8, 0xf3, 0x0e, 0xf8, 0x9b, 0xff, 0x8e, 0x74, 0x71, 0x05, 0xa1, 0x4d, 0x1c, 0xac, 0x9a, 0x0a, 0xee, 0xbc, 0x03, 0xfe, 0xfa, 0xbf, 0x23, 0x7d, 0x6c,
0xf3, 0x7a, 0xa6, 0xb2, 0xbe, 0xde, 0xf2, 0xe7, 0x2c, 0x97, 0x07, 0x89, 0x07, 0xa9, 0x2c, 0x86, 0x5f, 0xce, 0x54, 0xd6, 0xd7, 0x5b, 0xfe, 0x94, 0xe5, 0xf2, 0x20, 0xf1, 0x20, 0x95, 0xc5, 0x50,
0xba, 0xe0, 0x32, 0x02, 0xa2, 0x71, 0x9b, 0x28, 0xa3, 0xf8, 0x19, 0xaf, 0xfa, 0xe2, 0x1d, 0x2f, 0x17, 0x5c, 0x46, 0x40, 0x34, 0xae, 0x8d, 0x32, 0x8a, 0x9f, 0xf1, 0x62, 0x28, 0xde, 0xf1, 0xf2,
0xff, 0x42, 0x4e, 0x54, 0x65, 0xf6, 0xc1, 0x74, 0x93, 0x01, 0x6c, 0x08, 0x76, 0xc1, 0x67, 0xfa, 0x2f, 0xe4, 0x4c, 0x55, 0x66, 0x1f, 0x4c, 0x3f, 0x1b, 0xc0, 0xc6, 0x60, 0x57, 0x7c, 0xa1, 0xaf,
0x3a, 0x46, 0xbe, 0x7c, 0x4f, 0xc8, 0x84, 0xc8, 0xe5, 0x6c, 0x69, 0xe5, 0xf5, 0xc8, 0xbc, 0xb3, 0x63, 0xe4, 0xeb, 0xf7, 0x84, 0x4c, 0x88, 0x5c, 0x2e, 0x96, 0x56, 0x5e, 0x4f, 0xcc, 0x3b, 0xeb,
0x5e, 0xe9, 0x82, 0x7f, 0x02, 0xfc, 0xba, 0x58, 0x12, 0x5d, 0x7b, 0x51, 0x66, 0xb7, 0xde, 0xbb, 0x95, 0x2e, 0xf8, 0x27, 0xc0, 0xaf, 0xab, 0x35, 0xd1, 0x75, 0x67, 0x65, 0x76, 0xed, 0xbd, 0xbb,
0x5b, 0xaf, 0x59, 0xb2, 0xee, 0xde, 0x37, 0xb8, 0x57, 0x01, 0x5e, 0x3c, 0x24, 0x44, 0xde, 0xf8, 0xf6, 0x9a, 0x25, 0xeb, 0xee, 0x7c, 0x83, 0x7b, 0x15, 0xe0, 0xd9, 0x43, 0x42, 0xe4, 0x8d, 0x0f,
0xd0, 0x31, 0xca, 0xa4, 0xf5, 0x34, 0xbb, 0xbe, 0xbb, 0x7f, 0xe0, 0x4c, 0x25, 0x9b, 0x48, 0xe4, 0x3d, 0xa3, 0x4c, 0x3a, 0x4f, 0xb3, 0xb7, 0x37, 0x77, 0xf7, 0x9c, 0xa9, 0x64, 0x13, 0x89, 0x1c,
0x90, 0x70, 0x9c, 0x19, 0xba, 0x22, 0x5f, 0x58, 0x06, 0xe4, 0xe0, 0xd8, 0x53, 0x38, 0xdd, 0x60, 0x13, 0x8e, 0x33, 0x43, 0x57, 0xe4, 0x0b, 0xcb, 0x80, 0x1c, 0x9c, 0x06, 0x0a, 0xa7, 0x1f, 0x2d,
0xd1, 0xf4, 0x2a, 0xa0, 0x9c, 0xe6, 0x4f, 0x09, 0xa6, 0x38, 0x29, 0x88, 0x43, 0xd5, 0x19, 0x4a, 0x9a, 0x41, 0x05, 0x94, 0xf3, 0xfc, 0x09, 0xc1, 0x14, 0x27, 0x05, 0x71, 0xac, 0x7a, 0x43, 0xa9,
0xf5, 0x31, 0x09, 0x88, 0xbd, 0x72, 0xac, 0xb6, 0x2a, 0xc6, 0x82, 0x47, 0xd3, 0xf3, 0xf2, 0x4c, 0x3e, 0x24, 0x01, 0x71, 0x50, 0x8e, 0xd5, 0x56, 0xc5, 0x58, 0xf0, 0x68, 0x06, 0x5e, 0x9e, 0x8a,
0x9c, 0xbf, 0x15, 0x67, 0xe2, 0x42, 0x9c, 0xd3, 0x06, 0x74, 0x49, 0xc9, 0x56, 0xa1, 0xbc, 0xf6, 0x37, 0x6f, 0xc5, 0xa9, 0x38, 0x13, 0x67, 0xb4, 0x01, 0x5d, 0x52, 0xb2, 0x55, 0x28, 0x2f, 0xfd,
0xfb, 0x24, 0x9d, 0x61, 0x0b, 0xcc, 0xd2, 0x1f, 0x46, 0x64, 0x95, 0x71, 0x2a, 0x8c, 0x97, 0x2c, 0x3e, 0x49, 0x67, 0xd8, 0x01, 0xb3, 0xf4, 0x87, 0x11, 0x59, 0x65, 0x9c, 0x0a, 0xd3, 0x39, 0xcb,
0x57, 0x2c, 0x6b, 0x03, 0x34, 0x05, 0x6f, 0x11, 0xfb, 0x78, 0x29, 0xe5, 0xc6, 0x60, 0x3b, 0x54, 0x15, 0xcb, 0xba, 0x00, 0x4d, 0xc1, 0x3b, 0xc4, 0x21, 0x9e, 0x4b, 0xd9, 0x1a, 0xec, 0xc6, 0x4a,
0xa2, 0xf6, 0x9d, 0x3c, 0x2c, 0x37, 0x58, 0x88, 0x72, 0x5a, 0x50, 0x06, 0xb0, 0xa0, 0x22, 0x44, 0xd4, 0xbe, 0x97, 0x87, 0xe5, 0x46, 0x0b, 0x51, 0xce, 0x0b, 0xca, 0x00, 0x16, 0x54, 0x84, 0xc8,
0xce, 0x50, 0x05, 0x4a, 0xa9, 0xe0, 0x3f, 0x2a, 0xab, 0xdc, 0x96, 0xb4, 0x98, 0x6e, 0xc3, 0xb2, 0x19, 0xaa, 0x40, 0x29, 0x15, 0xfc, 0x47, 0x65, 0x95, 0xdb, 0x92, 0x16, 0xd3, 0xb7, 0x2c, 0x4b,
0x64, 0xfd, 0x91, 0x88, 0xde, 0x88, 0xd8, 0x1a, 0xb0, 0x3a, 0x0a, 0xe3, 0x0f, 0xbc, 0x47, 0x8a, 0xd6, 0x1f, 0x89, 0xe8, 0x8d, 0x88, 0x9d, 0x01, 0xab, 0xa3, 0x30, 0xfe, 0xc0, 0x7b, 0xa4, 0x78,
0x57, 0xdc, 0x22, 0xee, 0x36, 0x57, 0xc9, 0xf5, 0xa2, 0x21, 0x8d, 0xa7, 0xf1, 0x69, 0x20, 0x27, 0xc1, 0x2d, 0xe2, 0xae, 0xbd, 0x48, 0xae, 0x17, 0x0d, 0x69, 0x3c, 0x89, 0x8f, 0x23, 0x39, 0x39,
0xa7, 0x6e, 0x4a, 0x55, 0x4e, 0x5b, 0xe4, 0xc6, 0xf5, 0x03, 0xb2, 0xd9, 0x9e, 0xc6, 0x58, 0x38, 0x77, 0x53, 0xaa, 0x72, 0xde, 0x22, 0x37, 0x6e, 0x18, 0x91, 0x2d, 0xf6, 0x34, 0xc6, 0xc2, 0xb1,
0xf6, 0xf8, 0x68, 0x62, 0x80, 0xa7, 0xc1, 0x04, 0xd0, 0x33, 0xba, 0x1a, 0x10, 0xa9, 0x8a, 0x33, 0xc7, 0x47, 0x13, 0x03, 0x3c, 0x8e, 0x26, 0x80, 0x5e, 0xd0, 0xd5, 0x88, 0x48, 0x55, 0x5c, 0xe0,
0x7c, 0xb6, 0x8d, 0xc8, 0xe6, 0x60, 0x4e, 0x72, 0x39, 0x5f, 0xff, 0x03, 0x3a, 0x1f, 0x26, 0xaf, 0x8b, 0x6d, 0x44, 0xb6, 0x04, 0xf3, 0x2a, 0x97, 0xcb, 0xf5, 0x3f, 0xa0, 0xcb, 0x61, 0xf6, 0xba,
0x6b, 0x6b, 0xea, 0x6d, 0xc1, 0x57, 0x93, 0xd5, 0x2b, 0x6a, 0xf8, 0x9f, 0xa1, 0x94, 0x49, 0x99, 0xb6, 0xa6, 0xde, 0x16, 0x7c, 0x33, 0x5b, 0xbd, 0xa1, 0x86, 0xff, 0x19, 0x4a, 0x99, 0x94, 0xb9,
0x6b, 0xb3, 0xcb, 0x52, 0x74, 0x53, 0x3f, 0x89, 0xa6, 0x4c, 0xec, 0x54, 0x3a, 0x21, 0x04, 0x81, 0x36, 0xbb, 0x2c, 0x45, 0x37, 0xf7, 0x93, 0x68, 0xca, 0xc4, 0x4e, 0xa5, 0x13, 0x42, 0x10, 0x38,
0x13, 0xf9, 0x3a, 0x6d, 0xcb, 0xb4, 0x67, 0xce, 0x23, 0x65, 0xe5, 0xe9, 0xe0, 0x03, 0x69, 0x6d, 0x91, 0xdf, 0xa6, 0x6d, 0x99, 0xf6, 0xcc, 0x79, 0xa4, 0xac, 0x3c, 0x1d, 0x7c, 0x20, 0xad, 0x4d,
0x02, 0xc4, 0x36, 0x25, 0xd2, 0xab, 0x0d, 0xb0, 0xcb, 0x65, 0x2e, 0x89, 0x6f, 0x5a, 0x77, 0x2a, 0x80, 0xd8, 0xa5, 0x44, 0x06, 0xd5, 0x02, 0x3b, 0x5f, 0xe7, 0x92, 0xf8, 0xe6, 0x75, 0xe7, 0xb2,
0xdb, 0xd4, 0xbc, 0xe9, 0x93, 0xfe, 0x0d, 0xac, 0x45, 0xb0, 0xa5, 0xe8, 0x03, 0x00, 0x00 0xcd, 0xcd, 0x9b, 0x3f, 0xe9, 0xdf, 0x63, 0x59, 0x71, 0x12, 0xe8, 0x03, 0x00, 0x00
}; };

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -297,9 +297,8 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
} }
strip.trigger(); strip.trigger();
} }
// send UDP if not in preset and something changed that is not just selection // send UDP/WS if segment options changed (except selection; will also deselect current preset)
// send UDP if something changed that is not just selection or segment power/opacity if (seg.differs(prev) & 0x7F) stateChanged = true;
if ((seg.differs(prev) & 0x7E) && seg.on == prev.on) stateChanged = true;
} }
// deserializes WLED state (fileDoc points to doc object if called from web server) // deserializes WLED state (fileDoc points to doc object if called from web server)
@@ -308,6 +307,10 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId)
{ {
bool stateResponse = root[F("v")] | false; bool stateResponse = root[F("v")] | false;
#if defined(WLED_DEBUG) && defined(WLED_DEBUG_HOST)
netDebugEnabled = root[F("debug")] | netDebugEnabled;
#endif
bool onBefore = bri; bool onBefore = bri;
getVal(root["bri"], &bri); getVal(root["bri"], &bri);
@@ -456,6 +459,7 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId)
root.remove("v"); // may be added in UI call root.remove("v"); // may be added in UI call
root.remove("time"); // may be added in UI call root.remove("time"); // may be added in UI call
root.remove("ps"); root.remove("ps");
root.remove("on"); // some exetrnal calls add "on" to "ps" call
if (root.size() == 0) { if (root.size() == 0) {
unloadPlaylist(); // we need to unload playlist unloadPlaylist(); // we need to unload playlist
applyPreset(ps, callMode); // async load (only preset ID was specified) applyPreset(ps, callMode); // async load (only preset ID was specified)
@@ -847,9 +851,13 @@ void serializeInfo(JsonObject root)
usermods.addToJsonInfo(root); usermods.addToJsonInfo(root);
byte os = 0; uint16_t os = 0;
#ifdef WLED_DEBUG #ifdef WLED_DEBUG
os = 0x80; os = 0x80;
#ifdef WLED_DEBUG_HOST
os |= 0x0100;
if (!netDebugEnabled) os &= ~0x0080;
#endif
#endif #endif
#ifndef WLED_DISABLE_ALEXA #ifndef WLED_DISABLE_ALEXA
os += 0x40; os += 0x40;
@@ -1050,6 +1058,7 @@ void serializeNodes(JsonObject root)
} }
} }
// deserializes mode data string into JsonArray
void serializeModeData(JsonArray fxdata) void serializeModeData(JsonArray fxdata)
{ {
char lineBuffer[128]; char lineBuffer[128];
@@ -1057,14 +1066,14 @@ void serializeModeData(JsonArray fxdata)
strncpy_P(lineBuffer, strip.getModeData(i), 127); strncpy_P(lineBuffer, strip.getModeData(i), 127);
if (lineBuffer[0] != 0) { if (lineBuffer[0] != 0) {
char* dataPtr = strchr(lineBuffer,'@'); char* dataPtr = strchr(lineBuffer,'@');
if (dataPtr) fxdata.add(dataPtr); if (dataPtr) fxdata.add(dataPtr+1);
else fxdata.add(""); else fxdata.add("");
} }
} }
} }
// deserializes mode names string into JsonArray // deserializes mode names string into JsonArray
// also removes WLED-SR extensions (@...) from deserialised names // also removes effect data extensions (@...) from deserialised names
void serializeModeNames(JsonArray arr) { void serializeModeNames(JsonArray arr) {
char lineBuffer[128]; char lineBuffer[128];
for (size_t i = 0; i < strip.getModeCount(); i++) { for (size_t i = 0; i < strip.getModeCount(); i++) {

View File

@@ -2,10 +2,8 @@
#ifdef WLED_DEBUG_HOST #ifdef WLED_DEBUG_HOST
NetworkDebugPrinter NetDebug; size_t NetworkDebugPrinter::write(uint8_t c) {
if (!WLED_CONNECTED) return 0;
void NetworkDebugPrinter::print(const char *s, bool newline) {
if (!WLED_CONNECTED || !udpConnected || s == nullptr) return;
if (!debugPrintHostIP && !debugPrintHostIP.fromString(netDebugPrintHost)) { if (!debugPrintHostIP && !debugPrintHostIP.fromString(netDebugPrintHost)) {
#ifdef ESP8266 #ifdef ESP8266
@@ -19,57 +17,33 @@ void NetworkDebugPrinter::print(const char *s, bool newline) {
#endif #endif
} }
WiFiUDP debugUdp;
debugUdp.beginPacket(debugPrintHostIP, netDebugPrintPort); debugUdp.beginPacket(debugPrintHostIP, netDebugPrintPort);
debugUdp.write(reinterpret_cast<const uint8_t *>(s), strlen(s)); debugUdp.write(c);
if (newline) debugUdp.write('\n');
debugUdp.endPacket(); debugUdp.endPacket();
return 1;
} }
void NetworkDebugPrinter::print(const __FlashStringHelper* s, bool newline) { size_t NetworkDebugPrinter::write(const uint8_t *buf, size_t size) {
char buf[512]; if (!WLED_CONNECTED || buf == nullptr) return 0;
strncpy_P(buf, (PGM_P)s, 512);
print(buf, newline); if (!debugPrintHostIP && !debugPrintHostIP.fromString(netDebugPrintHost)) {
#ifdef ESP8266
WiFi.hostByName(netDebugPrintHost, debugPrintHostIP, 750);
#else
#ifdef WLED_USE_ETHERNET
ETH.hostByName(netDebugPrintHost, debugPrintHostIP);
#else
WiFi.hostByName(netDebugPrintHost, debugPrintHostIP);
#endif
#endif
}
debugUdp.beginPacket(debugPrintHostIP, netDebugPrintPort);
size = debugUdp.write(buf, size);
debugUdp.endPacket();
return size;
} }
void NetworkDebugPrinter::print(String s) { NetworkDebugPrinter NetDebug;
print(s.c_str());
}
void NetworkDebugPrinter::print(unsigned int n, bool newline) {
char s[10];
snprintf_P(s, sizeof(s), PSTR("%d"), n);
s[9] = '\0';
print(s, newline);
}
void NetworkDebugPrinter::println() {
print("", true);
}
void NetworkDebugPrinter::println(const char *s) {
print(s, true);
}
void NetworkDebugPrinter::println(const __FlashStringHelper* s) {
print(s, true);
}
void NetworkDebugPrinter::println(String s) {
print(s.c_str(), true);
}
void NetworkDebugPrinter::println(unsigned int n) {
print(n, true);
}
void NetworkDebugPrinter::printf(const char *fmt...) {
va_list args;
va_start(args, fmt);
char s[1024];
vsnprintf(s, sizeof(s), fmt, args);
va_end(args);
print(s);
}
#endif #endif

View File

@@ -4,20 +4,13 @@
#include <WString.h> #include <WString.h>
#include <WiFiUdp.h> #include <WiFiUdp.h>
class NetworkDebugPrinter { class NetworkDebugPrinter : public Print {
private: private:
WiFiUDP debugUdp; // needs to be here otherwise UDP messages get truncated upon destruction
IPAddress debugPrintHostIP; IPAddress debugPrintHostIP;
public: public:
void print(const char *s, bool newline = false); virtual size_t write(uint8_t c);
void print(const __FlashStringHelper* s, bool newline = false); virtual size_t write(const uint8_t *buf, size_t s);
void print(String s);
void print(unsigned int n, bool newline = false);
void println();
void println(const char *s);
void println(const __FlashStringHelper* s);
void println(String s);
void println(unsigned int n);
void printf(const char *fmt, ...);
}; };
extern NetworkDebugPrinter NetDebug; extern NetworkDebugPrinter NetDebug;

View File

@@ -133,16 +133,16 @@ int getSignalQuality(int rssi)
void WiFiEvent(WiFiEvent_t event) void WiFiEvent(WiFiEvent_t event)
{ {
#ifdef WLED_USE_ETHERNET #ifdef WLED_USE_ETHERNET
char hostname[25] = "wled-"; char hostname[25];
#endif #endif
switch (event) { switch (event) {
#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_ETHERNET) #if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_ETHERNET)
case SYSTEM_EVENT_ETH_START: case SYSTEM_EVENT_ETH_START:
DEBUG_PRINT(F("ETH Started")); DEBUG_PRINTLN(F("ETH Started"));
break; break;
case SYSTEM_EVENT_ETH_CONNECTED: case SYSTEM_EVENT_ETH_CONNECTED:
DEBUG_PRINT(F("ETH Connected")); DEBUG_PRINTLN(F("ETH Connected"));
if (!apActive) { if (!apActive) {
WiFi.disconnect(true); WiFi.disconnect(true);
} }
@@ -157,7 +157,7 @@ void WiFiEvent(WiFiEvent_t event)
showWelcomePage = false; showWelcomePage = false;
break; break;
case SYSTEM_EVENT_ETH_DISCONNECTED: case SYSTEM_EVENT_ETH_DISCONNECTED:
DEBUG_PRINT(F("ETH Disconnected")); DEBUG_PRINTLN(F("ETH Disconnected"));
// This doesn't really affect ethernet per se, // This doesn't really affect ethernet per se,
// as it's only configured once. Rather, it // as it's only configured once. Rather, it
// may be necessary to reconnect the WiFi when // may be necessary to reconnect the WiFi when

View File

@@ -57,7 +57,8 @@ enum struct PinOwner : uint8_t {
UM_QuinLEDAnPenta = USERMOD_ID_QUINLED_AN_PENTA, // 0x17 // Usermod "quinled-an-penta.h" UM_QuinLEDAnPenta = USERMOD_ID_QUINLED_AN_PENTA, // 0x17 // Usermod "quinled-an-penta.h"
UM_BME280 = USERMOD_ID_BME280, // 0x18 // Usermod "usermod_bme280.h -- Uses "standard" HW_I2C pins UM_BME280 = USERMOD_ID_BME280, // 0x18 // Usermod "usermod_bme280.h -- Uses "standard" HW_I2C pins
UM_BH1750 = USERMOD_ID_BH1750, // 0x19 // Usermod "usermod_bme280.h -- Uses "standard" HW_I2C pins UM_BH1750 = USERMOD_ID_BH1750, // 0x19 // Usermod "usermod_bme280.h -- Uses "standard" HW_I2C pins
UM_Audioreactive = USERMOD_ID_AUDIOREACTIVE // 0x1E // Usermod "audio_reactive.h" UM_Audioreactive = USERMOD_ID_AUDIOREACTIVE, // 0x1E // Usermod "audio_reactive.h"
UM_SdCard = USERMOD_ID_SD_CARD // 0x24 // Usermod "usermod_sd_card.h"
}; };
static_assert(0u == static_cast<uint8_t>(PinOwner::None), "PinOwner::None must be zero, so default array initialization works as expected"); static_assert(0u == static_cast<uint8_t>(PinOwner::None), "PinOwner::None must be zero, so default array initialization works as expected");

View File

@@ -697,13 +697,18 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
byte speedIn = selseg.speed; byte speedIn = selseg.speed;
byte intensityIn = selseg.intensity; byte intensityIn = selseg.intensity;
byte paletteIn = selseg.palette; byte paletteIn = selseg.palette;
byte custom1In = selseg.custom1;
uint16_t startI = selseg.start; byte custom2In = selseg.custom2;
uint16_t stopI = selseg.stop; byte custom3In = selseg.custom3;
uint16_t startY = selseg.startY; byte check1In = selseg.check1;
uint16_t stopY = selseg.stopY; byte check2In = selseg.check2;
uint8_t grpI = selseg.grouping; byte check3In = selseg.check3;
uint16_t spcI = selseg.spacing; uint16_t startI = selseg.start;
uint16_t stopI = selseg.stop;
uint16_t startY = selseg.startY;
uint16_t stopY = selseg.stopY;
uint8_t grpI = selseg.grouping;
uint16_t spcI = selseg.spacing;
pos = req.indexOf(F("&S=")); //segment start pos = req.indexOf(F("&S=")); //segment start
if (pos > 0) { if (pos > 0) {
startI = getNumVal(&req, pos); startI = getNumVal(&req, pos);
@@ -838,7 +843,6 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
colorFromDecOrHexString(tmpCol, (char*)req.substring(pos + 3).c_str()); colorFromDecOrHexString(tmpCol, (char*)req.substring(pos + 3).c_str());
uint32_t col2 = RGBW32(tmpCol[0], tmpCol[1], tmpCol[2], tmpCol[3]); uint32_t col2 = RGBW32(tmpCol[0], tmpCol[1], tmpCol[2], tmpCol[3]);
selseg.setColor(2, col2); // defined above (SS= or main) selseg.setColor(2, col2); // defined above (SS= or main)
stateChanged = true;
if (!singleSegment) strip.setColor(2, col2); // will set color to all active & selected segments if (!singleSegment) strip.setColor(2, col2); // will set color to all active & selected segments
} }
@@ -864,20 +868,19 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
// apply colors to selected segment, and all selected segments if applicable // apply colors to selected segment, and all selected segments if applicable
if (col0Changed) { if (col0Changed) {
stateChanged = true;
uint32_t colIn0 = RGBW32(colIn[0], colIn[1], colIn[2], colIn[3]); uint32_t colIn0 = RGBW32(colIn[0], colIn[1], colIn[2], colIn[3]);
selseg.setColor(0, colIn0); selseg.setColor(0, colIn0);
if (!singleSegment) strip.setColor(0, colIn0); // will set color to all active & selected segments if (!singleSegment) strip.setColor(0, colIn0); // will set color to all active & selected segments
} }
if (col1Changed) { if (col1Changed) {
stateChanged = true;
uint32_t colIn1 = RGBW32(colInSec[0], colInSec[1], colInSec[2], colInSec[3]); uint32_t colIn1 = RGBW32(colInSec[0], colInSec[1], colInSec[2], colInSec[3]);
selseg.setColor(1, colIn1); selseg.setColor(1, colIn1);
if (!singleSegment) strip.setColor(1, colIn1); // will set color to all active & selected segments if (!singleSegment) strip.setColor(1, colIn1); // will set color to all active & selected segments
} }
bool fxModeChanged = false, speedChanged = false, intensityChanged = false, paletteChanged = false; bool fxModeChanged = false, speedChanged = false, intensityChanged = false, paletteChanged = false;
bool custom1Changed = false, custom2Changed = false, custom3Changed = false, check1Changed = false, check2Changed = false, check3Changed = false;
// set effect parameters // set effect parameters
if (updateVal(req.c_str(), "FX=", &effectIn, 0, strip.getModeCount()-1)) { if (updateVal(req.c_str(), "FX=", &effectIn, 0, strip.getModeCount()-1)) {
if (request != nullptr) unloadPlaylist(); // unload playlist if changing FX using web request if (request != nullptr) unloadPlaylist(); // unload playlist if changing FX using web request
@@ -886,8 +889,14 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
speedChanged = updateVal(req.c_str(), "SX=", &speedIn); speedChanged = updateVal(req.c_str(), "SX=", &speedIn);
intensityChanged = updateVal(req.c_str(), "IX=", &intensityIn); intensityChanged = updateVal(req.c_str(), "IX=", &intensityIn);
paletteChanged = updateVal(req.c_str(), "FP=", &paletteIn, 0, strip.getPaletteCount()-1); paletteChanged = updateVal(req.c_str(), "FP=", &paletteIn, 0, strip.getPaletteCount()-1);
custom1Changed = updateVal(req.c_str(), "X1=", &custom1In);
stateChanged |= (fxModeChanged || speedChanged || intensityChanged || paletteChanged); custom2Changed = updateVal(req.c_str(), "X2=", &custom2In);
custom3Changed = updateVal(req.c_str(), "X3=", &custom3In);
check1Changed = updateVal(req.c_str(), "M1=", &check1In);
check2Changed = updateVal(req.c_str(), "M2=", &check2In);
check3Changed = updateVal(req.c_str(), "M3=", &check3In);
stateChanged |= (fxModeChanged || speedChanged || intensityChanged || paletteChanged || custom1Changed || custom2Changed || custom3Changed || check1Changed || check2Changed || check3Changed);
// apply to main and all selected segments to prevent #1618. // apply to main and all selected segments to prevent #1618.
for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) { for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) {
@@ -897,6 +906,12 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
if (speedChanged) seg.speed = speedIn; if (speedChanged) seg.speed = speedIn;
if (intensityChanged) seg.intensity = intensityIn; if (intensityChanged) seg.intensity = intensityIn;
if (paletteChanged) seg.setPalette(paletteIn); if (paletteChanged) seg.setPalette(paletteIn);
if (custom1Changed) seg.custom1 = custom1In;
if (custom2Changed) seg.custom2 = custom2In;
if (custom3Changed) seg.custom3 = custom3In;
if (check1Changed) seg.check1 = (bool)check1In;
if (check2Changed) seg.check2 = (bool)check2In;
if (check3Changed) seg.check3 = (bool)check3In;
} }
//set advanced overlay //set advanced overlay

View File

@@ -160,6 +160,18 @@
#include "../usermods/ADS1115_v2/usermod_ads1115.h" #include "../usermods/ADS1115_v2/usermod_ads1115.h"
#endif #endif
#if defined(WLED_USE_SD_MMC) || defined(WLED_USE_SD_SPI)
// This include of SD.h and SD_MMC.h must happen here, else they won't be
// resolved correctly (when included in mod's header only)
#ifdef WLED_USE_SD_MMC
#include "SD_MMC.h"
#elif defined(WLED_USE_SD_SPI)
#include "SD.h"
#include "SPI.h"
#endif
#include "../usermods/sd_card/usermod_sd_card.h"
#endif
//WLEDMM Custom Effects //WLEDMM Custom Effects
#ifdef USERMOD_CUSTOMEFFECTS #ifdef USERMOD_CUSTOMEFFECTS
#include "../usermods/customeffects/usermod_v2_customeffects.h" #include "../usermods/customeffects/usermod_v2_customeffects.h"
@@ -324,6 +336,10 @@ void registerUsermods()
usermods.add(new ADS1115Usermod()); usermods.add(new ADS1115Usermod());
#endif #endif
#ifdef SD_ADAPTER
usermods.add(new UsermodSdCard());
#endif
//WLEDMM Custom Effects //WLEDMM Custom Effects
#ifdef USERMOD_CUSTOMEFFECTS #ifdef USERMOD_CUSTOMEFFECTS
usermods.add(new CustomEffectsUserMod()); usermods.add(new CustomEffectsUserMod());

View File

@@ -678,6 +678,7 @@ WLED_GLOBAL volatile uint8_t jsonBufferLock _INIT(0);
// On the host side, use netcat to receive the log statements: nc -l 7868 -u // On the host side, use netcat to receive the log statements: nc -l 7868 -u
// use -D WLED_DEBUG_HOST='"192.168.xxx.xxx"' or FQDN within quotes // use -D WLED_DEBUG_HOST='"192.168.xxx.xxx"' or FQDN within quotes
#define DEBUGOUT NetDebug #define DEBUGOUT NetDebug
WLED_GLOBAL bool netDebugEnabled _INIT(true);
WLED_GLOBAL char netDebugPrintHost[33] _INIT(WLED_DEBUG_HOST); WLED_GLOBAL char netDebugPrintHost[33] _INIT(WLED_DEBUG_HOST);
#if defined(WLED_DEBUG_NET_PORT) #if defined(WLED_DEBUG_NET_PORT)
WLED_GLOBAL int netDebugPrintPort _INIT(WLED_DEBUG_PORT); WLED_GLOBAL int netDebugPrintPort _INIT(WLED_DEBUG_PORT);

View File

@@ -516,18 +516,15 @@ void getSettingsJS(byte subPage, char* dest)
sappends('s',SET_F("AI"),alexaInvocationName); sappends('s',SET_F("AI"),alexaInvocationName);
sappend('c',SET_F("SA"),notifyAlexa); sappend('c',SET_F("SA"),notifyAlexa);
sappend('v',SET_F("AP"),alexaNumPresets); sappend('v',SET_F("AP"),alexaNumPresets);
#ifndef WLED_DISABLE_ALEXA #ifdef WLED_DISABLE_ALEXA
oappend(SET_F("hideNoALEXA();")); // hide "not compiled in" message oappend(SET_F("toggle('Alexa');")); // hide Alexa settings
#else
oappend(SET_F("hideALEXA();")); // hide Alexa settings if not compiled in
#endif #endif
sappends('s',SET_F("BK"),(char*)((blynkEnabled)?SET_F("Hidden"):"")); sappends('s',SET_F("BK"),(char*)((blynkEnabled)?SET_F("Hidden"):""));
#ifndef WLED_DISABLE_BLYNK #ifndef WLED_DISABLE_BLYNK
sappends('s',SET_F("BH"),blynkHost); sappends('s',SET_F("BH"),blynkHost);
sappend('v',SET_F("BP"),blynkPort); sappend('v',SET_F("BP"),blynkPort);
oappend(SET_F("hideNoBLYNK();")); // hide "not compiled in" message
#else #else
oappend(SET_F("hideBLYNK();")); // hide BLYNK settings if not compiled in oappend(SET_F("toggle('Blynk');")); // hide BLYNK settings
#endif #endif
#ifdef WLED_ENABLE_MQTT #ifdef WLED_ENABLE_MQTT
@@ -544,9 +541,8 @@ void getSettingsJS(byte subPage, char* dest)
sappends('s',"MD",mqttDeviceTopic); sappends('s',"MD",mqttDeviceTopic);
sappends('s',SET_F("MG"),mqttGroupTopic); sappends('s',SET_F("MG"),mqttGroupTopic);
sappend('c',SET_F("BM"),buttonPublishMqtt); sappend('c',SET_F("BM"),buttonPublishMqtt);
oappend(SET_F("hideNoMQTT();")); // hide "not compiled in" message
#else #else
oappend(SET_F("hideMQTT();")); // hide MQTT settings if not compiled in oappend(SET_F("toggle('MQTT');")); // hide MQTT settings
#endif #endif
#ifndef WLED_DISABLE_HUESYNC #ifndef WLED_DISABLE_HUESYNC
@@ -574,9 +570,8 @@ void getSettingsJS(byte subPage, char* dest)
} }
sappends('m',SET_F("(\"sip\")[0]"),hueErrorString); sappends('m',SET_F("(\"sip\")[0]"),hueErrorString);
oappend(SET_F("hideNoHUE();")); // hide "not compiled in" message
#else #else
oappend(SET_F("hideHUE();")); // hide Hue Sync settings if not compiled in oappend(SET_F("toggle('Hue');")); // hide Hue Sync settings
#endif #endif
sappend('v',SET_F("BD"),serialBaud); sappend('v',SET_F("BD"),serialBaud);
@@ -725,17 +720,17 @@ void getSettingsJS(byte subPage, char* dest)
oappend(versionString); oappend(versionString);
oappend(SET_F("_")); oappend(SET_F("_"));
oappend(releaseString); oappend(releaseString);
oappend(SET_F(".bin")); oappend(SET_F(".bin<br>("));
#if defined(CONFIG_IDF_TARGET_ESP32C3) #if defined(CONFIG_IDF_TARGET_ESP32C3)
oappend(SET_F("<br>(ESP32-C3")); oappend(SET_F("ESP32-C3"));
#elif defined(CONFIG_IDF_TARGET_ESP32S3) #elif defined(CONFIG_IDF_TARGET_ESP32S3)
oappend(SET_F("<br>(ESP32-S3")); oappend(SET_F("ESP32-S3"));
#elif defined(CONFIG_IDF_TARGET_ESP32S2) #elif defined(CONFIG_IDF_TARGET_ESP32S2)
oappend(SET_F("<br>(ESP32-S2")); oappend(SET_F("ESP32-S2"));
#elif defined(ARDUINO_ARCH_ESP32) #elif defined(ARDUINO_ARCH_ESP32)
oappend(SET_F("<br>(ESP32")); oappend(ESP.getChipModel());
#else #else
oappend(SET_F("<br>(ESP8266")); oappend("esp8266");
#endif #endif
oappend(SET_F(" build ")); oappend(SET_F(" build "));
oappendi(VERSION); oappendi(VERSION);