Various fixes

Fixed ESP32 crash on Colortwinkles brightness change
Fixed setting picker to black resetting hue and saturation
Fixed auto white mode not saved to config
This commit is contained in:
cschwinne 2021-12-03 20:36:37 +01:00
parent cadda12371
commit 46ec504743
6 changed files with 846 additions and 811 deletions

View File

@ -2,6 +2,12 @@
### Builds after release 0.12.0 ### Builds after release 0.12.0
#### Build 2112030
- Fixed ESP32 crash on Colortwinkles brightness change
- Fixed setting picker to black resetting hue and saturation
- Fixed auto white mode not saved to config
#### Build 2111300 #### Build 2111300
- Added CCT and white balance correction support (PR #2285) - Added CCT and white balance correction support (PR #2285)

View File

@ -444,14 +444,14 @@ void WS2812FX::setBrightness(uint8_t b) {
if (gammaCorrectBri) b = gamma8(b); if (gammaCorrectBri) b = gamma8(b);
if (_brightness == b) return; if (_brightness == b) return;
_brightness = b; _brightness = b;
_segment_index = 0;
if (_brightness == 0) { //unfreeze all segments on power off if (_brightness == 0) { //unfreeze all segments on power off
for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++)
{ {
_segments[i].setOption(SEG_OPTION_FREEZE, false); _segments[i].setOption(SEG_OPTION_FREEZE, false);
} }
} }
if (SEGENV.next_time > millis() + 22 && millis() - _lastShow > MIN_SHOW_DELAY) show();//apply brightness change immediately if no refresh soon unsigned long t = millis();
if (_segment_runtimes[0].next_time > t + 22 && t - _lastShow > MIN_SHOW_DELAY) show(); //apply brightness change immediately if no refresh soon
} }
uint8_t WS2812FX::getMode(void) { uint8_t WS2812FX::getMode(void) {
@ -703,14 +703,35 @@ bool WS2812FX::checkSegmentAlignment() {
} }
//After this function is called, setPixelColor() will use that segment (offsets, grouping, ... will apply) //After this function is called, setPixelColor() will use that segment (offsets, grouping, ... will apply)
//Note: If called in an interrupt (e.g. JSON API), it must be reset with "setPixelColor(255)",
//otherwise it can lead to a crash on ESP32 because _segment_index is modified while in use by the main thread
#ifdef ARDUINO_ARCH_ESP32
uint8_t _segment_index_prev = 0;
uint16_t _virtualSegmentLength_prev = 0;
bool _ps_set = false;
#endif
void WS2812FX::setPixelSegment(uint8_t n) void WS2812FX::setPixelSegment(uint8_t n)
{ {
if (n < MAX_NUM_SEGMENTS) { if (n < MAX_NUM_SEGMENTS) {
#ifdef ARDUINO_ARCH_ESP32
if (!_ps_set) {
_segment_index_prev = _segment_index;
_virtualSegmentLength_prev = _virtualSegmentLength;
_ps_set = true;
}
#endif
_segment_index = n; _segment_index = n;
_virtualSegmentLength = SEGMENT.length(); _virtualSegmentLength = SEGMENT.virtualLength();
} else { } else {
_segment_index = 0; _virtualSegmentLength = 0;
_virtualSegmentLength = 0; #ifdef ARDUINO_ARCH_ESP32
if (_ps_set) {
_segment_index = _segment_index_prev;
_virtualSegmentLength = _virtualSegmentLength_prev;
_ps_set = false;
}
#endif
} }
} }
@ -737,13 +758,13 @@ void WS2812FX::setTransition(uint16_t t)
void WS2812FX::setTransitionMode(bool t) void WS2812FX::setTransitionMode(bool t)
{ {
unsigned long waitMax = millis() + 20; //refresh after 20 ms if transition enabled unsigned long waitMax = millis() + 20; //refresh after 20 ms if transition enabled
for (uint16_t i = 0; i < MAX_NUM_SEGMENTS; i++) for (uint16_t i = 0; i < MAX_NUM_SEGMENTS; i++)
{ {
_segment_index = i; _segments[i].setOption(SEG_OPTION_TRANSITIONAL, t);
SEGMENT.setOption(SEG_OPTION_TRANSITIONAL, t);
if (t && SEGMENT.mode == FX_MODE_STATIC && SEGENV.next_time > waitMax) SEGENV.next_time = waitMax; if (t && _segments[i].mode == FX_MODE_STATIC && _segment_runtimes[i].next_time > waitMax)
_segment_runtimes[i].next_time = waitMax;
} }
} }

View File

@ -527,6 +527,7 @@ void serializeConfig() {
hw_led["cct"] = correctWB; hw_led["cct"] = correctWB;
hw_led[F("cr")] = cctFromRgb; hw_led[F("cr")] = cctFromRgb;
hw_led[F("cb")] = strip.cctBlending; hw_led[F("cb")] = strip.cctBlending;
hw_led[F("rgbwm")] = Bus::getAutoWhiteMode();
JsonArray hw_led_ins = hw_led.createNestedArray("ins"); JsonArray hw_led_ins = hw_led.createNestedArray("ins");
@ -546,7 +547,6 @@ void serializeConfig() {
ins["type"] = bus->getType() & 0x7F; ins["type"] = bus->getType() & 0x7F;
ins["ref"] = bus->isOffRefreshRequired(); ins["ref"] = bus->isOffRefreshRequired();
ins[F("rgbw")] = bus->isRgbw(); ins[F("rgbw")] = bus->isRgbw();
ins[F("rgbwm")] = bus->getAutoWhiteMode();
} }
// button(s) // button(s)

View File

@ -1703,14 +1703,15 @@ function selectSlot(b) {
cd[csel].style.border="5px solid white"; cd[csel].style.border="5px solid white";
cd[csel].style.margin="2px"; cd[csel].style.margin="2px";
cd[csel].style.width="50px"; cd[csel].style.width="50px";
cpick.color.set(cd[csel].style.backgroundColor); setPicker(cd[csel].style.backgroundColor);
//force slider update on initial load (picker "color:change" not fired if black) //force slider update on initial load (picker "color:change" not fired if black)
if (cd[csel].style.backgroundColor == 'rgb(0, 0, 0)') updatePSliders(); if (cpick.color.value == 0) updatePSliders();
d.getElementById('sliderW').value = whites[csel]; d.getElementById('sliderW').value = whites[csel];
updateTrail(d.getElementById('sliderW')); updateTrail(d.getElementById('sliderW'));
redrawPalPrev(); redrawPalPrev();
} }
//set the color from a hex string. Used by quick color selectors
var lasth = 0; var lasth = 0;
function pC(col) function pC(col)
{ {
@ -1723,7 +1724,7 @@ function pC(col)
} while (Math.abs(col.h - lasth) < 50); } while (Math.abs(col.h - lasth) < 50);
lasth = col.h; lasth = col.h;
} }
cpick.color.set(col); setPicker(col);
setColor(0); setColor(0);
} }
@ -1768,14 +1769,20 @@ function fromHex()
var str = d.getElementById('hexc').value; var str = d.getElementById('hexc').value;
whites[csel] = parseInt(str.substring(6), 16); whites[csel] = parseInt(str.substring(6), 16);
try { try {
cpick.color.set("#" + str.substring(0,6)); setPicker("#" + str.substring(0,6));
} catch (e) { } catch (e) {
cpick.color.set("#ffaa00"); setPicker("#ffaa00");
} }
if (isNaN(whites[csel])) whites[csel] = 0; if (isNaN(whites[csel])) whites[csel] = 0;
setColor(2); setColor(2);
} }
function setPicker(rgb) {
var c = new iro.Color(rgb);
if (c.value > 0) cpick.color.set(c);
else cpick.color.setChannel('hsv', 'v', 0);
}
function fromV() function fromV()
{ {
cpick.color.setChannel('hsv', 'v', d.getElementById('sliderV').value); cpick.color.setChannel('hsv', 'v', d.getElementById('sliderV').value);
@ -1791,13 +1798,13 @@ function fromRgb()
var r = d.getElementById('sliderR').value; var r = d.getElementById('sliderR').value;
var g = d.getElementById('sliderG').value; var g = d.getElementById('sliderG').value;
var b = d.getElementById('sliderB').value; var b = d.getElementById('sliderB').value;
cpick.color.set(`rgb(${r},${g},${b})`); setPicker(`rgb(${r},${g},${b})`);
} }
//sr 0: from RGB sliders, 1: from picker, 2: from hex //sr 0: from RGB sliders, 1: from picker, 2: from hex
function setColor(sr) { function setColor(sr) {
var cd = d.getElementById('csl').children; var cd = d.getElementById('csl').children;
if (sr == 1 && cd[csel].style.backgroundColor == 'rgb(0, 0, 0)') cpick.color.setChannel('hsv', 'v', 100); if (sr == 1 && cd[csel].style.backgroundColor == "rgb(0, 0, 0)") cpick.color.setChannel('hsv', 'v', 100);
cd[csel].style.backgroundColor = cpick.color.rgbString; cd[csel].style.backgroundColor = cpick.color.rgbString;
if (sr != 2) whites[csel] = parseInt(d.getElementById('sliderW').value); if (sr != 2) whites[csel] = parseInt(d.getElementById('sliderW').value);
var col = cpick.color.rgb; var col = cpick.color.rgb;

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@
*/ */
// version code in format yymmddb (b = daily build) // version code in format yymmddb (b = daily build)
#define VERSION 2112010 #define VERSION 2112030
//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