Merge branch 'dev' into mdev
This commit is contained in:
@@ -265,6 +265,7 @@ board_build.ldscript = ${common.ldscript_4m1m}
|
|||||||
build_unflags = ${common.build_unflags}
|
build_unflags = ${common.build_unflags}
|
||||||
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266
|
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266
|
||||||
lib_deps = ${esp8266.lib_deps}
|
lib_deps = ${esp8266.lib_deps}
|
||||||
|
monitor_filters = esp8266_exception_decoder
|
||||||
|
|
||||||
[env:esp8266_2m]
|
[env:esp8266_2m]
|
||||||
board = esp_wroom_02
|
board = esp_wroom_02
|
||||||
|
|||||||
@@ -3470,9 +3470,9 @@ static const char _data_FX_MODE_DRIP[] PROGMEM = "Drip@Gravity,# of drips;!,!;!;
|
|||||||
typedef struct Tetris {
|
typedef struct Tetris {
|
||||||
float pos;
|
float pos;
|
||||||
float speed;
|
float speed;
|
||||||
uint32_t col;
|
uint8_t col; // color index
|
||||||
uint16_t aux0; // 2D-fication of SEGENV.aux0 (brick size)
|
uint16_t brick; // brick size in pixels
|
||||||
uint16_t aux1; // 2D-fication of SEGENV.aux1 (stack size)
|
uint16_t stack; // stack size in pixels
|
||||||
uint32_t step; // 2D-fication of SEGENV.step (state)
|
uint32_t step; // 2D-fication of SEGENV.step (state)
|
||||||
} tetris;
|
} tetris;
|
||||||
|
|
||||||
@@ -3491,7 +3491,7 @@ uint16_t mode_tetrix(void) {
|
|||||||
static void runStrip(size_t stripNr, Tetris *drop) {
|
static void runStrip(size_t stripNr, Tetris *drop) {
|
||||||
// initialize dropping on first call or segment full
|
// initialize dropping on first call or segment full
|
||||||
if (SEGENV.call == 0) {
|
if (SEGENV.call == 0) {
|
||||||
drop->aux1 = 0; // reset brick stack size
|
drop->stack = 0; // reset brick stack size
|
||||||
drop->step = 0;
|
drop->step = 0;
|
||||||
//for (int i=0; i<SEGLEN; i++) SEGMENT.setPixelColor(i | int((stripNr+1)<<16), SEGCOLOR(1)); // will fill virtual strip only
|
//for (int i=0; i<SEGLEN; i++) SEGMENT.setPixelColor(i | int((stripNr+1)<<16), SEGCOLOR(1)); // will fill virtual strip only
|
||||||
}
|
}
|
||||||
@@ -3504,9 +3504,9 @@ uint16_t mode_tetrix(void) {
|
|||||||
speed = map(speed, 1, 255, 5000, 250); // time taken for full (SEGLEN) drop
|
speed = map(speed, 1, 255, 5000, 250); // time taken for full (SEGLEN) drop
|
||||||
drop->speed = float(SEGLEN * FRAMETIME) / float(speed); // set speed
|
drop->speed = float(SEGLEN * FRAMETIME) / float(speed); // set speed
|
||||||
drop->pos = SEGLEN; // start at end of segment (no need to subtract 1)
|
drop->pos = SEGLEN; // start at end of segment (no need to subtract 1)
|
||||||
drop->col = SEGMENT.color_from_palette(random8(0,15)<<4,false,false,0); // limit color choices so there is enough HUE gap
|
drop->col = random8(0,15)<<4; // limit color choices so there is enough HUE gap
|
||||||
drop->step = 1; // drop state (0 init, 1 forming, 2 falling)
|
drop->step = 1; // drop state (0 init, 1 forming, 2 falling)
|
||||||
drop->aux0 = (SEGMENT.intensity ? (SEGMENT.intensity>>5)+1 : random8(1,5)) * (1+(SEGLEN>>6)); // size of brick
|
drop->brick = (SEGMENT.intensity ? (SEGMENT.intensity>>5)+1 : random8(1,5)) * (1+(SEGLEN>>6)); // size of brick
|
||||||
}
|
}
|
||||||
|
|
||||||
if (drop->step == 1) { // forming
|
if (drop->step == 1) { // forming
|
||||||
@@ -3516,24 +3516,27 @@ uint16_t mode_tetrix(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (drop->step == 2) { // falling
|
if (drop->step == 2) { // falling
|
||||||
if (drop->pos > drop->aux1) { // fall until top of stack
|
if (drop->pos > drop->stack) { // fall until top of stack
|
||||||
drop->pos -= drop->speed; // may add gravity as: speed += gravity
|
drop->pos -= drop->speed; // may add gravity as: speed += gravity
|
||||||
if (uint16_t(drop->pos) < drop->aux1) drop->pos = drop->aux1;
|
if (uint16_t(drop->pos) < drop->stack) drop->pos = drop->stack;
|
||||||
for (int i=int(drop->pos); i<SEGLEN; i++) SEGMENT.setPixelColor(i | int((stripNr+1)<<16), i<int(drop->pos)+drop->aux0 ? drop->col : SEGCOLOR(1));
|
for (int i=int(drop->pos); i<SEGLEN; i++) {
|
||||||
|
uint32_t col = i<int(drop->pos)+drop->brick ? SEGMENT.color_from_palette(drop->col, false, false, 0) : SEGCOLOR(1);
|
||||||
|
SEGMENT.setPixelColor(i | int((stripNr+1)<<16), col);
|
||||||
|
}
|
||||||
} else { // we hit bottom
|
} else { // we hit bottom
|
||||||
drop->step = 0; // proceed with next brick, go back to init
|
drop->step = 0; // proceed with next brick, go back to init
|
||||||
drop->aux1 += drop->aux0; // increase the stack size
|
drop->stack += drop->brick; // increase the stack size
|
||||||
if (drop->aux1 >= SEGLEN) drop->step = millis() + 2000; // fade out stack
|
if (drop->stack >= SEGLEN) drop->step = millis() + 2000; // fade out stack
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (drop->step > 2) {
|
if (drop->step > 2) { // fade strip
|
||||||
drop->aux0 = 0; // reset brick size (no more growing)
|
drop->brick = 0; // reset brick size (no more growing)
|
||||||
if (drop->step > millis()) {
|
if (drop->step > millis()) {
|
||||||
// allow fading of virtual strip
|
// allow fading of virtual strip
|
||||||
for (int i=0; i<SEGLEN; i++) SEGMENT.blendPixelColor(i | int((stripNr+1)<<16), SEGCOLOR(1), 25); // 10% blend
|
for (int i=0; i<SEGLEN; i++) SEGMENT.blendPixelColor(i | int((stripNr+1)<<16), SEGCOLOR(1), 25); // 10% blend with Bg color
|
||||||
} else {
|
} else {
|
||||||
drop->aux1 = 0; // reset brick stack size
|
drop->stack = 0; // reset brick stack size
|
||||||
drop->step = 0; // proceed with next brick
|
drop->step = 0; // proceed with next brick
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
45
wled00/FX.h
45
wled00/FX.h
@@ -357,26 +357,21 @@ typedef struct Segment {
|
|||||||
union {
|
union {
|
||||||
uint16_t options; //bit pattern: msb first: [transposed mirrorY reverseY] transitional (tbd) paused needspixelstate mirrored on reverse selected
|
uint16_t options; //bit pattern: msb first: [transposed mirrorY reverseY] transitional (tbd) paused needspixelstate mirrored on reverse selected
|
||||||
struct {
|
struct {
|
||||||
bool selected : 1; // 0 : selected
|
bool selected : 1; // 0 : selected
|
||||||
bool reverse : 1; // 1 : reversed
|
bool reverse : 1; // 1 : reversed
|
||||||
bool on : 1; // 2 : is On
|
bool on : 1; // 2 : is On
|
||||||
bool mirror : 1; // 3 : mirrored
|
bool mirror : 1; // 3 : mirrored
|
||||||
bool pxs : 1; // 4 : indicates that the effect does not use FRAMETIME or needs getPixelColor (?)
|
bool freeze : 1; // 4 : paused/frozen
|
||||||
bool freeze : 1; // 5 : paused/frozen
|
bool reset : 1; // 5 : indicates that Segment runtime requires reset
|
||||||
bool reset : 1; // 6 : indicates that Segment runtime requires reset
|
bool transitional: 1; // 6 : transitional (there is transition occuring)
|
||||||
bool transitional: 1; // 7 : transitional (there is transition occuring)
|
bool reverse_y : 1; // 7 : reversed Y (2D)
|
||||||
bool reverse_y : 1; // 8 : reversed Y (2D)
|
bool mirror_y : 1; // 8 : mirrored Y (2D)
|
||||||
bool mirror_y : 1; // 9 : mirrored Y (2D)
|
bool transpose : 1; // 9 : transposed (2D, swapped X & Y)
|
||||||
bool transpose : 1; // 10 : transposed (2D, swapped X & Y)
|
uint8_t map1D2D : 3; // 10-12 : mapping for 1D effect on 2D (0-use as strip, 1-expand vertically, 2-circular/arc, 3-rectangular/corner, ...)
|
||||||
uint8_t map1D2D : 3; // 11-13 : mapping for 1D effect on 2D (0-use as strip, 1-expand vertically, 2-circular/arc, 3-rectangular/corner, ...)
|
uint8_t soundSim : 3; // 13-15 : 0-7 sound simulation types
|
||||||
uint8_t soundSim : 2; // 14-15 : 0-3 sound simulation types
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
uint8_t grouping, spacing;
|
uint8_t grouping, spacing;
|
||||||
//struct {
|
|
||||||
// uint8_t grouping : 4; // maximum 15 pixels in a group
|
|
||||||
// uint8_t spacing : 4; // maximum 15 pixels per gap
|
|
||||||
//};
|
|
||||||
uint8_t opacity;
|
uint8_t opacity;
|
||||||
uint32_t colors[NUM_COLORS];
|
uint32_t colors[NUM_COLORS];
|
||||||
uint8_t cct; //0==1900K, 255==10091K
|
uint8_t cct; //0==1900K, 255==10091K
|
||||||
@@ -418,17 +413,20 @@ typedef struct Segment {
|
|||||||
// transition data, valid only if transitional==true, holds values during transition
|
// transition data, valid only if transitional==true, holds values during transition
|
||||||
struct Transition {
|
struct Transition {
|
||||||
uint32_t _colorT[NUM_COLORS];
|
uint32_t _colorT[NUM_COLORS];
|
||||||
uint8_t _briT; // temporary brightness
|
uint8_t _briT; // temporary brightness
|
||||||
uint8_t _cctT; // temporary CCT
|
uint8_t _cctT; // temporary CCT
|
||||||
CRGBPalette16 _palT; // temporary palette
|
CRGBPalette16 _palT; // temporary palette
|
||||||
uint8_t _modeP; // previous mode/effect
|
uint8_t _modeP; // previous mode/effect
|
||||||
|
//uint16_t _aux0, _aux1; // previous mode/effect runtime data
|
||||||
|
//uint32_t _step, _call; // previous mode/effect runtime data
|
||||||
|
//byte *_data; // previous mode/effect runtime data
|
||||||
uint32_t _start;
|
uint32_t _start;
|
||||||
uint16_t _dur;
|
uint16_t _dur;
|
||||||
Transition(uint16_t dur=750) : _briT(255), _cctT(127), _palT(CRGBPalette16(CRGB::Black)), _modeP(FX_MODE_STATIC), _start(millis()), _dur(dur) {}
|
Transition(uint16_t dur=750) : _briT(255), _cctT(127), _palT(CRGBPalette16(CRGB::Black)), _modeP(FX_MODE_STATIC), _start(millis()), _dur(dur) {}
|
||||||
Transition(uint16_t d, uint8_t b, uint8_t c, const uint32_t *o) : _briT(b), _cctT(c), _palT(CRGBPalette16(CRGB::Black)), _modeP(FX_MODE_STATIC), _start(millis()), _dur(d) {
|
Transition(uint16_t d, uint8_t b, uint8_t c, const uint32_t *o) : _briT(b), _cctT(c), _palT(CRGBPalette16(CRGB::Black)), _modeP(FX_MODE_STATIC), _start(millis()), _dur(d) {
|
||||||
for (size_t i=0; i<NUM_COLORS; i++) _colorT[i] = o[i];
|
for (size_t i=0; i<NUM_COLORS; i++) _colorT[i] = o[i];
|
||||||
}
|
}
|
||||||
} *_t; // this struct will bootloop ESP
|
} *_t;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -530,8 +528,7 @@ typedef struct Segment {
|
|||||||
* Safe to call from interrupts and network requests.
|
* Safe to call from interrupts and network requests.
|
||||||
*/
|
*/
|
||||||
inline void markForReset(void) { reset = true; } // setOption(SEG_OPTION_RESET, true)
|
inline void markForReset(void) { reset = true; } // setOption(SEG_OPTION_RESET, true)
|
||||||
//inline void setUpLeds() { if (!leds) leds = (CRGB*)malloc(sizeof(CRGB)*length()); }
|
void setUpLeds(void); // set up leds[] array for loseless getPixelColor()
|
||||||
void setUpLeds(void);
|
|
||||||
|
|
||||||
// transition functions
|
// transition functions
|
||||||
void startTransition(uint16_t dur); // transition has to start before actual segment values change
|
void startTransition(uint16_t dur); // transition has to start before actual segment values change
|
||||||
|
|||||||
@@ -297,8 +297,8 @@ void Segment::startTransition(uint16_t dur) {
|
|||||||
|
|
||||||
if (!_t) _t = new Transition(dur); // no previous transition running
|
if (!_t) _t = new Transition(dur); // no previous transition running
|
||||||
if (!_t) return; // failed to allocate data
|
if (!_t) return; // failed to allocate data
|
||||||
_t->_briT = _briT;
|
_t->_briT = _briT;
|
||||||
_t->_cctT = _cctT;
|
_t->_cctT = _cctT;
|
||||||
_t->_palT = _palT;
|
_t->_palT = _palT;
|
||||||
_t->_modeP = _modeP;
|
_t->_modeP = _modeP;
|
||||||
for (size_t i=0; i<NUM_COLORS; i++) _t->_colorT[i] = _colorT[i];
|
for (size_t i=0; i<NUM_COLORS; i++) _t->_colorT[i] = _colorT[i];
|
||||||
@@ -625,7 +625,7 @@ uint8_t Segment::differs(Segment& b) const {
|
|||||||
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: [transposed mirrorY reverseY] transitional (tbd) paused needspixelstate mirrored on reverse selected
|
||||||
if ((options & 0b1111111100101110) != (b.options & 0b1111111100101110)) d |= SEG_DIFFERS_OPT;
|
if ((options & 0b1111111110011110) != (b.options & 0b1111111110011110)) d |= SEG_DIFFERS_OPT;
|
||||||
if ((options & 0x01) != (b.options & 0x01)) d |= SEG_DIFFERS_SEL;
|
if ((options & 0x01) != (b.options & 0x01)) d |= SEG_DIFFERS_SEL;
|
||||||
|
|
||||||
for (uint8_t i = 0; i < NUM_COLORS; i++) if (colors[i] != b.colors[i]) d |= SEG_DIFFERS_COL;
|
for (uint8_t i = 0; i < NUM_COLORS; i++) if (colors[i] != b.colors[i]) d |= SEG_DIFFERS_COL;
|
||||||
|
|||||||
@@ -228,13 +228,12 @@
|
|||||||
#define SEG_OPTION_REVERSED 1
|
#define SEG_OPTION_REVERSED 1
|
||||||
#define SEG_OPTION_ON 2
|
#define SEG_OPTION_ON 2
|
||||||
#define SEG_OPTION_MIRROR 3 //Indicates that the effect will be mirrored within the segment
|
#define SEG_OPTION_MIRROR 3 //Indicates that the effect will be mirrored within the segment
|
||||||
#define SEG_OPTION_NONUNITY 4 //Indicates that the effect does not use FRAMETIME or needs getPixelColor
|
#define SEG_OPTION_FREEZE 4 //Segment contents will not be refreshed
|
||||||
#define SEG_OPTION_FREEZE 5 //Segment contents will not be refreshed
|
#define SEG_OPTION_RESET 5 //Segment runtime requires reset
|
||||||
#define SEG_OPTION_RESET 6 //Segment runtime requires reset
|
#define SEG_OPTION_TRANSITIONAL 6
|
||||||
#define SEG_OPTION_TRANSITIONAL 7
|
#define SEG_OPTION_REVERSED_Y 7
|
||||||
#define SEG_OPTION_REVERSED_Y 8
|
#define SEG_OPTION_MIRROR_Y 8
|
||||||
#define SEG_OPTION_MIRROR_Y 9
|
#define SEG_OPTION_TRANSPOSED 9
|
||||||
#define SEG_OPTION_TRANSPOSED 10
|
|
||||||
|
|
||||||
//Segment differs return byte
|
//Segment differs return byte
|
||||||
#define SEG_DIFFERS_BRI 0x01
|
#define SEG_DIFFERS_BRI 0x01
|
||||||
|
|||||||
@@ -653,8 +653,8 @@ function populateInfo(i)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
var vcn = "Kuuhaku";
|
var vcn = "Kuuhaku";
|
||||||
if (i.ver.startsWith("0.13.")) vcn = "Toki";
|
if (i.ver.startsWith("0.14.")) vcn = "Hoshi";
|
||||||
if (i.ver.includes("-bl")) vcn = "Ryujin";
|
if (i.ver.includes("-bl")) vcn = "Supāku";
|
||||||
if (i.cn) vcn = i.cn;
|
if (i.cn) vcn = i.cn;
|
||||||
|
|
||||||
cn += `v${i.ver} "${vcn}"<br><br><table>
|
cn += `v${i.ver} "${vcn}"<br><br><table>
|
||||||
@@ -714,7 +714,7 @@ function populateSegments(s)
|
|||||||
}
|
}
|
||||||
let map2D = `<div id="seg${i}map2D" data-map="map2D" class="lbl-s hide">Expand 1D FX<br>
|
let map2D = `<div id="seg${i}map2D" data-map="map2D" class="lbl-s hide">Expand 1D FX<br>
|
||||||
<div class="sel-p"><select class="sel-p" id="seg${i}mp12" onchange="setMp12(${i})">
|
<div class="sel-p"><select class="sel-p" id="seg${i}mp12" onchange="setMp12(${i})">
|
||||||
<option value="0" ${inst.mp12==0?' selected':''}>Pxels</option>
|
<option value="0" ${inst.mp12==0?' selected':''}>Pixels</option>
|
||||||
<option value="1" ${inst.mp12==1?' selected':''}>Bar</option>
|
<option value="1" ${inst.mp12==1?' selected':''}>Bar</option>
|
||||||
<option value="2" ${inst.mp12==2?' selected':''}>Arc</option>
|
<option value="2" ${inst.mp12==2?' selected':''}>Arc</option>
|
||||||
<option value="3" ${inst.mp12==3?' selected':''}>Corner</option>
|
<option value="3" ${inst.mp12==3?' selected':''}>Corner</option>
|
||||||
|
|||||||
@@ -505,8 +505,8 @@ function populateInfo(i)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
var vcn = "Kuuhaku";
|
var vcn = "Kuuhaku";
|
||||||
if (i.ver.startsWith("0.13.")) vcn = "Toki";
|
if (i.ver.startsWith("0.14.")) vcn = "Hoshi";
|
||||||
if (i.ver.includes("-bl")) vcn = "Ryujin";
|
if (i.ver.includes("-bl")) vcn = "Supāku";
|
||||||
if (i.cn) vcn = i.cn;
|
if (i.cn) vcn = i.cn;
|
||||||
|
|
||||||
cn += `v${i.ver} "${vcn}"<br><br><table>
|
cn += `v${i.ver} "${vcn}"<br><br><table>
|
||||||
|
|||||||
2240
wled00/html_simple.h
2240
wled00/html_simple.h
File diff suppressed because it is too large
Load Diff
3880
wled00/html_ui.h
3880
wled00/html_ui.h
File diff suppressed because it is too large
Load Diff
117
wled00/json.cpp
117
wled00/json.cpp
@@ -79,13 +79,13 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
|||||||
uint16_t grp = elem["grp"] | seg.grouping;
|
uint16_t grp = elem["grp"] | seg.grouping;
|
||||||
uint16_t spc = elem[F("spc")] | seg.spacing;
|
uint16_t spc = elem[F("spc")] | seg.spacing;
|
||||||
uint16_t of = seg.offset;
|
uint16_t of = seg.offset;
|
||||||
uint8_t soundSim = elem[F("ssim")] | seg.soundSim;
|
uint8_t soundSim = elem["ssim"] | seg.soundSim;
|
||||||
uint8_t map1D2D = elem[F("mp12")] | seg.map1D2D;
|
uint8_t map1D2D = elem["mp12"] | seg.map1D2D;
|
||||||
|
|
||||||
if ((spc>0 && spc!=seg.spacing) || seg.map1D2D!=map1D2D) seg.fill(BLACK); // clear spacing gaps
|
if ((spc>0 && spc!=seg.spacing) || seg.map1D2D!=map1D2D) seg.fill(BLACK); // clear spacing gaps
|
||||||
|
|
||||||
seg.map1D2D = map1D2D & 0x07;
|
seg.map1D2D = constrain(map1D2D, 0, 7);
|
||||||
seg.soundSim = soundSim & 0x03;
|
seg.soundSim = constrain(soundSim, 0, 7);
|
||||||
|
|
||||||
uint16_t len = 1;
|
uint16_t len = 1;
|
||||||
if (stop > start) len = stop - start;
|
if (stop > start) len = stop - start;
|
||||||
@@ -168,12 +168,12 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
seg.selected = elem["sel"] | seg.selected;
|
seg.selected = elem["sel"] | seg.selected;
|
||||||
seg.reverse = elem["rev"] | seg.reverse;
|
seg.reverse = elem["rev"] | seg.reverse;
|
||||||
seg.mirror = elem[F("mi")] | seg.mirror;
|
seg.mirror = elem["mi"] | seg.mirror;
|
||||||
#ifndef WLED_DISABLE_2D
|
#ifndef WLED_DISABLE_2D
|
||||||
seg.reverse_y = elem[F("rY")] | seg.reverse_y;
|
seg.reverse_y = elem["rY"] | seg.reverse_y;
|
||||||
seg.mirror_y = elem[F("mY")] | seg.mirror_y;
|
seg.mirror_y = elem["mY"] | seg.mirror_y;
|
||||||
seg.transpose = elem[F("tp")] | seg.transpose;
|
seg.transpose = elem[F("tp")] | seg.transpose;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -191,17 +191,17 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
|||||||
if (elem[F("fxdef")])
|
if (elem[F("fxdef")])
|
||||||
{
|
{
|
||||||
int16_t sOpt;
|
int16_t sOpt;
|
||||||
sOpt = extractModeDefaults(fx, SET_F("sx")); if (sOpt >= 0) seg.speed = sOpt;
|
sOpt = extractModeDefaults(fx, "sx"); if (sOpt >= 0) seg.speed = sOpt;
|
||||||
sOpt = extractModeDefaults(fx, SET_F("ix")); if (sOpt >= 0) seg.intensity = sOpt;
|
sOpt = extractModeDefaults(fx, "ix"); if (sOpt >= 0) seg.intensity = sOpt;
|
||||||
sOpt = extractModeDefaults(fx, SET_F("c1")); if (sOpt >= 0) seg.custom1 = sOpt;
|
sOpt = extractModeDefaults(fx, "c1"); if (sOpt >= 0) seg.custom1 = sOpt;
|
||||||
sOpt = extractModeDefaults(fx, SET_F("c2")); if (sOpt >= 0) seg.custom2 = sOpt;
|
sOpt = extractModeDefaults(fx, "c2"); if (sOpt >= 0) seg.custom2 = sOpt;
|
||||||
sOpt = extractModeDefaults(fx, SET_F("c3")); if (sOpt >= 0) seg.custom3 = sOpt;
|
sOpt = extractModeDefaults(fx, "c3"); if (sOpt >= 0) seg.custom3 = sOpt;
|
||||||
sOpt = extractModeDefaults(fx, SET_F("mp12")); if (sOpt >= 0) seg.map1D2D = sOpt & 0x07;
|
sOpt = extractModeDefaults(fx, "mp12"); if (sOpt >= 0) seg.map1D2D = constrain(sOpt, 0, 7);
|
||||||
sOpt = extractModeDefaults(fx, SET_F("ssim")); if (sOpt >= 0) seg.soundSim = sOpt & 0x03;
|
sOpt = extractModeDefaults(fx, "ssim"); if (sOpt >= 0) seg.soundSim = constrain(sOpt, 0, 7);
|
||||||
sOpt = extractModeDefaults(fx, "rev"); if (sOpt >= 0) seg.reverse = (bool)sOpt;
|
sOpt = extractModeDefaults(fx, "rev"); if (sOpt >= 0) seg.reverse = (bool)sOpt;
|
||||||
sOpt = extractModeDefaults(fx, SET_F("mi")); if (sOpt >= 0) seg.mirror = (bool)sOpt; // NOTE: setting this option is a risky business
|
sOpt = extractModeDefaults(fx, "mi"); if (sOpt >= 0) seg.mirror = (bool)sOpt; // NOTE: setting this option is a risky business
|
||||||
sOpt = extractModeDefaults(fx, SET_F("rY")); if (sOpt >= 0) seg.reverse_y = (bool)sOpt;
|
sOpt = extractModeDefaults(fx, "rY"); if (sOpt >= 0) seg.reverse_y = (bool)sOpt;
|
||||||
sOpt = extractModeDefaults(fx, SET_F("mY")); if (sOpt >= 0) seg.mirror_y = (bool)sOpt; // NOTE: setting this option is a risky business
|
sOpt = extractModeDefaults(fx, "mY"); if (sOpt >= 0) seg.mirror_y = (bool)sOpt; // NOTE: setting this option is a risky business
|
||||||
sOpt = extractModeDefaults(fx, "pal");
|
sOpt = extractModeDefaults(fx, "pal");
|
||||||
if (sOpt >= 0 && sOpt < strip.getPaletteCount() + strip.customPalettes.size()) {
|
if (sOpt >= 0 && sOpt < strip.getPaletteCount() + strip.customPalettes.size()) {
|
||||||
if (sOpt != seg.palette) {
|
if (sOpt != seg.palette) {
|
||||||
@@ -212,8 +212,8 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//getVal also supports inc/decrementing and random
|
//getVal also supports inc/decrementing and random
|
||||||
getVal(elem[F("sx")], &seg.speed);
|
getVal(elem["sx"], &seg.speed);
|
||||||
getVal(elem[F("ix")], &seg.intensity);
|
getVal(elem["ix"], &seg.intensity);
|
||||||
uint8_t pal = seg.palette;
|
uint8_t pal = seg.palette;
|
||||||
if (getVal(elem["pal"], &pal, 1, strip.getPaletteCount())) {
|
if (getVal(elem["pal"], &pal, 1, strip.getPaletteCount())) {
|
||||||
if (pal != seg.palette) {
|
if (pal != seg.palette) {
|
||||||
@@ -221,15 +221,15 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
|||||||
seg.palette = pal;
|
seg.palette = pal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
getVal(elem[F("c1")], &seg.custom1);
|
getVal(elem["c1"], &seg.custom1);
|
||||||
getVal(elem[F("c2")], &seg.custom2);
|
getVal(elem["c2"], &seg.custom2);
|
||||||
uint8_t cust3 = seg.custom3;
|
uint8_t cust3 = seg.custom3;
|
||||||
getVal(elem[F("c3")], &cust3); // we can't pass reference to bifield
|
getVal(elem["c3"], &cust3); // we can't pass reference to bifield
|
||||||
seg.custom3 = cust3;
|
seg.custom3 = constrain(cust3, 0, 31);
|
||||||
|
|
||||||
seg.check1 = elem[F("o1")] | seg.check1;
|
seg.check1 = elem["o1"] | seg.check1;
|
||||||
seg.check2 = elem[F("o2")] | seg.check2;
|
seg.check2 = elem["o2"] | seg.check2;
|
||||||
seg.check3 = elem[F("o3")] | seg.check3;
|
seg.check3 = elem["o3"] | seg.check3;
|
||||||
|
|
||||||
JsonArray iarr = elem[F("i")]; //set individual LEDs
|
JsonArray iarr = elem[F("i")]; //set individual LEDs
|
||||||
if (!iarr.isNull()) {
|
if (!iarr.isNull()) {
|
||||||
@@ -502,26 +502,26 @@ void serializeSegment(JsonObject& root, Segment& seg, byte id, bool forPreset, b
|
|||||||
strcat(colstr, "]");
|
strcat(colstr, "]");
|
||||||
root["col"] = serialized(colstr);
|
root["col"] = serialized(colstr);
|
||||||
|
|
||||||
root["fx"] = seg.mode;
|
root["fx"] = seg.mode;
|
||||||
root[F("sx")] = seg.speed;
|
root["sx"] = seg.speed;
|
||||||
root[F("ix")] = seg.intensity;
|
root["ix"] = seg.intensity;
|
||||||
root["pal"] = seg.palette;
|
root["pal"] = seg.palette;
|
||||||
root[F("c1")] = seg.custom1;
|
root["c1"] = seg.custom1;
|
||||||
root[F("c2")] = seg.custom2;
|
root["c2"] = seg.custom2;
|
||||||
root[F("c3")] = seg.custom3;
|
root["c3"] = seg.custom3;
|
||||||
root[F("sel")] = seg.isSelected();
|
root["sel"] = seg.isSelected();
|
||||||
root["rev"] = seg.reverse;
|
root["rev"] = seg.reverse;
|
||||||
root[F("mi")] = seg.mirror;
|
root["mi"] = seg.mirror;
|
||||||
if (strip.isMatrix) {
|
if (strip.isMatrix) {
|
||||||
root[F("rY")] = seg.reverse_y;
|
root["rY"] = seg.reverse_y;
|
||||||
root[F("mY")] = seg.mirror_y;
|
root["mY"] = seg.mirror_y;
|
||||||
root[F("tp")] = seg.transpose;
|
root[F("tp")] = seg.transpose;
|
||||||
}
|
}
|
||||||
root[F("o1")] = seg.check1;
|
root["o1"] = seg.check1;
|
||||||
root[F("o2")] = seg.check2;
|
root["o2"] = seg.check2;
|
||||||
root[F("o3")] = seg.check3;
|
root["o3"] = seg.check3;
|
||||||
root[F("ssim")] = seg.soundSim;
|
root["ssim"] = seg.soundSim;
|
||||||
root[F("mp12")] = seg.map1D2D;
|
root["mp12"] = seg.map1D2D;
|
||||||
}
|
}
|
||||||
|
|
||||||
void serializeState(JsonObject root, bool forPreset, bool includeBri, bool segmentBounds)
|
void serializeState(JsonObject root, bool forPreset, bool includeBri, bool segmentBounds)
|
||||||
@@ -926,12 +926,13 @@ void serializeNodes(JsonObject root)
|
|||||||
|
|
||||||
void serializeModeData(JsonArray fxdata)
|
void serializeModeData(JsonArray fxdata)
|
||||||
{
|
{
|
||||||
|
char lineBuffer[128];
|
||||||
for (size_t i = 0; i < strip.getModeCount(); i++) {
|
for (size_t i = 0; i < strip.getModeCount(); i++) {
|
||||||
String lineBuffer = FPSTR(strip.getModeData(i));
|
strncpy_P(lineBuffer, strip.getModeData(i), 127);
|
||||||
if (lineBuffer.length() > 0) {
|
if (lineBuffer[0] != 0) {
|
||||||
uint8_t endPos = lineBuffer.indexOf('@');
|
char* dataPtr = strchr(lineBuffer,'@');
|
||||||
if (endPos>0) fxdata.add(lineBuffer.substring(endPos));
|
if (dataPtr) fxdata.add(dataPtr);
|
||||||
else fxdata.add("");
|
else fxdata.add("");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -939,12 +940,13 @@ void serializeModeData(JsonArray fxdata)
|
|||||||
// deserializes mode names string into JsonArray
|
// deserializes mode names string into JsonArray
|
||||||
// also removes WLED-SR extensions (@...) from deserialised names
|
// also removes WLED-SR extensions (@...) from deserialised names
|
||||||
void serializeModeNames(JsonArray arr) {
|
void serializeModeNames(JsonArray arr) {
|
||||||
|
char lineBuffer[128];
|
||||||
for (size_t i = 0; i < strip.getModeCount(); i++) {
|
for (size_t i = 0; i < strip.getModeCount(); i++) {
|
||||||
String lineBuffer = FPSTR(strip.getModeData(i));
|
strncpy_P(lineBuffer, strip.getModeData(i), 127);
|
||||||
if (lineBuffer.length() > 0) {
|
if (lineBuffer[0] != 0) {
|
||||||
uint8_t endPos = lineBuffer.indexOf('@');
|
char* dataPtr = strchr(lineBuffer,'@');
|
||||||
if (endPos>0) arr.add(lineBuffer.substring(0, endPos));
|
if (dataPtr) *dataPtr = 0; // terminate mode data after name
|
||||||
else arr.add(lineBuffer);
|
arr.add(lineBuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -975,7 +977,6 @@ void serveJson(AsyncWebServerRequest* request)
|
|||||||
request->send(response);
|
request->send(response);
|
||||||
releaseJSONBufferLock();
|
releaseJSONBufferLock();
|
||||||
} else {
|
} else {
|
||||||
//request->send_P(200, "application/json", JSON_mode_names);
|
|
||||||
request->send(503, "application/json", F("{\"error\":3}"));
|
request->send(503, "application/json", F("{\"error\":3}"));
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@@ -1019,11 +1020,11 @@ void serveJson(AsyncWebServerRequest* request)
|
|||||||
serializeInfo(info);
|
serializeInfo(info);
|
||||||
if (subJson != 3)
|
if (subJson != 3)
|
||||||
{
|
{
|
||||||
//lDoc[F("effects")] = serialized((const __FlashStringHelper*)JSON_mode_names);
|
|
||||||
JsonArray effects = lDoc.createNestedArray(F("effects"));
|
JsonArray effects = lDoc.createNestedArray(F("effects"));
|
||||||
serializeModeNames(effects); // remove WLED-SR extensions from effect names
|
serializeModeNames(effects); // remove WLED-SR extensions from effect names
|
||||||
lDoc[F("palettes")] = serialized((const __FlashStringHelper*)JSON_palette_names);
|
lDoc[F("palettes")] = serialized((const __FlashStringHelper*)JSON_palette_names);
|
||||||
}
|
}
|
||||||
|
//lDoc["m"] = lDoc.memoryUsage(); // JSON buffer usage, for remote debugging
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_PRINTF("JSON buffer size: %u for request: %d\n", lDoc.memoryUsage(), subJson);
|
DEBUG_PRINTF("JSON buffer size: %u for request: %d\n", lDoc.memoryUsage(), subJson);
|
||||||
|
|||||||
@@ -665,6 +665,9 @@ void sendSysInfoUDP()
|
|||||||
#define DDP_FLAGS1_STORAGE 0x08
|
#define DDP_FLAGS1_STORAGE 0x08
|
||||||
#define DDP_FLAGS1_TIME 0x10
|
#define DDP_FLAGS1_TIME 0x10
|
||||||
|
|
||||||
|
#define DDP_TYPE_RGB24 0x0A
|
||||||
|
#define DDP_TYPE_RGBW32 0x1A // proposal, this is still not an official part of the DDP spec
|
||||||
|
|
||||||
#define DDP_ID_DISPLAY 1
|
#define DDP_ID_DISPLAY 1
|
||||||
#define DDP_ID_CONFIG 250
|
#define DDP_ID_CONFIG 250
|
||||||
#define DDP_ID_STATUS 251
|
#define DDP_ID_STATUS 251
|
||||||
@@ -724,7 +727,7 @@ uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8
|
|||||||
// write the header
|
// write the header
|
||||||
/*0*/ddpUdp.write(flags);
|
/*0*/ddpUdp.write(flags);
|
||||||
/*1*/ddpUdp.write(sequenceNumber++ & 0x0F); // sequence may be unnecessary unless we are sending twice (as requested in Sync settings)
|
/*1*/ddpUdp.write(sequenceNumber++ & 0x0F); // sequence may be unnecessary unless we are sending twice (as requested in Sync settings)
|
||||||
/*2*/ddpUdp.write(0);
|
/*2*/ddpUdp.write(0); // data type, this is not fully defined by the DDP spec and thus left at "undefined" which is assumed to be 24-bit RGB
|
||||||
/*3*/ddpUdp.write(DDP_ID_DISPLAY);
|
/*3*/ddpUdp.write(DDP_ID_DISPLAY);
|
||||||
// data offset in bytes, 32-bit number, MSB first
|
// data offset in bytes, 32-bit number, MSB first
|
||||||
/*4*/ddpUdp.write(0xFF & (channel >> 24));
|
/*4*/ddpUdp.write(0xFF & (channel >> 24));
|
||||||
|
|||||||
@@ -355,17 +355,22 @@ uint8_t extractModeSlider(uint8_t mode, uint8_t slider, char *dest, uint8_t maxL
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// extracts mode parameter defaults from last section of mode data (e.g. "Juggle@!,Trail;!,!,;!;sx=16,ix=240,1d")
|
||||||
int16_t extractModeDefaults(uint8_t mode, const char *segVar)
|
int16_t extractModeDefaults(uint8_t mode, const char *segVar)
|
||||||
{
|
{
|
||||||
if (mode < strip.getModeCount()) {
|
if (mode < strip.getModeCount()) {
|
||||||
String lineBuffer = FPSTR(strip.getModeData(mode));
|
char lineBuffer[128] = "";
|
||||||
if (lineBuffer.length() > 0) {
|
strncpy_P(lineBuffer, strip.getModeData(mode), 127);
|
||||||
int16_t start = lineBuffer.lastIndexOf(';');
|
lineBuffer[127] = '\0'; // terminate string
|
||||||
if (start<0) return -1;
|
if (lineBuffer[0] != 0) {
|
||||||
|
char* startPtr = strrchr(lineBuffer, ';'); // last ";" in FX data
|
||||||
|
if (!startPtr) return -1;
|
||||||
|
|
||||||
int16_t stop = lineBuffer.indexOf(segVar, start+1);
|
char* stopPtr = strstr(startPtr, segVar);
|
||||||
if (stop<0) return -1;
|
if (!stopPtr) return -1;
|
||||||
return atoi(lineBuffer.substring(stop+strlen(segVar)+1).c_str());
|
|
||||||
|
stopPtr += strlen(segVar) +1; // skip "="
|
||||||
|
return atoi(stopPtr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// version code in format yymmddb (b = daily build)
|
// version code in format yymmddb (b = daily build)
|
||||||
#define VERSION 2208301
|
#define VERSION 2208310
|
||||||
|
|
||||||
//uncomment this if you have a "my_config.h" file you'd like to use
|
//uncomment this if you have a "my_config.h" file you'd like to use
|
||||||
//#define WLED_USE_MY_CONFIG
|
//#define WLED_USE_MY_CONFIG
|
||||||
@@ -222,7 +222,7 @@ using PSRAMDynamicJsonDocument = BasicJsonDocument<PSRAM_Allocator>;
|
|||||||
|
|
||||||
// Global Variable definitions
|
// Global Variable definitions
|
||||||
WLED_GLOBAL char versionString[] _INIT(TOSTRING(WLED_VERSION));
|
WLED_GLOBAL char versionString[] _INIT(TOSTRING(WLED_VERSION));
|
||||||
#define WLED_CODENAME "Toki"
|
#define WLED_CODENAME "Hoshi"
|
||||||
|
|
||||||
// AP and OTA default passwords (for maximum security change them!)
|
// AP and OTA default passwords (for maximum security change them!)
|
||||||
WLED_GLOBAL char apPass[65] _INIT(DEFAULT_AP_PASS);
|
WLED_GLOBAL char apPass[65] _INIT(DEFAULT_AP_PASS);
|
||||||
|
|||||||
@@ -414,10 +414,10 @@ void deEEP() {
|
|||||||
for (byte j = 0; j < numChannels; j++) colX.add(EEPROM.read(memloc + j));
|
for (byte j = 0; j < numChannels; j++) colX.add(EEPROM.read(memloc + j));
|
||||||
}
|
}
|
||||||
|
|
||||||
segObj["fx"] = EEPROM.read(i+10);
|
segObj["fx"] = EEPROM.read(i+10);
|
||||||
segObj[F("sx")] = EEPROM.read(i+11);
|
segObj["sx"] = EEPROM.read(i+11);
|
||||||
segObj[F("ix")] = EEPROM.read(i+16);
|
segObj["ix"] = EEPROM.read(i+16);
|
||||||
segObj["pal"] = EEPROM.read(i+17);
|
segObj["pal"] = EEPROM.read(i+17);
|
||||||
} else {
|
} else {
|
||||||
Segment* seg = strip.getSegments();
|
Segment* seg = strip.getSegments();
|
||||||
memcpy(seg, EEPROM.getDataPtr() +i+2, 240);
|
memcpy(seg, EEPROM.getDataPtr() +i+2, 240);
|
||||||
|
|||||||
Reference in New Issue
Block a user