setPixelSegment() optimization
This commit is contained in:
parent
e17203ca1b
commit
be8a9ae73b
@ -657,7 +657,6 @@ class WS2812FX {
|
||||
setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0),
|
||||
show(void),
|
||||
setTargetFps(uint8_t fps),
|
||||
setPixelSegment(uint8_t n),
|
||||
deserializeMap(uint8_t n=0);
|
||||
|
||||
bool
|
||||
@ -688,6 +687,7 @@ class WS2812FX {
|
||||
//getFirstSelectedSegment(void),
|
||||
getMainSegmentId(void),
|
||||
getTargetFps(void),
|
||||
setPixelSegment(uint8_t n),
|
||||
gamma8(uint8_t),
|
||||
gamma8_cal(uint8_t, float),
|
||||
sin_gap(uint16_t),
|
||||
|
@ -716,36 +716,16 @@ bool WS2812FX::checkSegmentAlignment() {
|
||||
}
|
||||
|
||||
//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)",
|
||||
//Note: If called in an interrupt (e.g. JSON API), original segment must be restored,
|
||||
//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)
|
||||
uint8_t WS2812FX::setPixelSegment(uint8_t n)
|
||||
{
|
||||
uint8_t prevSegId = _segment_index;
|
||||
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;
|
||||
_virtualSegmentLength = SEGMENT.virtualLength();
|
||||
} else {
|
||||
_virtualSegmentLength = 0;
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
if (_ps_set) {
|
||||
_segment_index = _segment_index_prev;
|
||||
_virtualSegmentLength = _virtualSegmentLength_prev;
|
||||
_ps_set = false;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return prevSegId;
|
||||
}
|
||||
|
||||
void WS2812FX::setRange(uint16_t i, uint16_t i2, uint32_t col)
|
||||
|
@ -189,7 +189,7 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
||||
|
||||
JsonArray iarr = elem[F("i")]; //set individual LEDs
|
||||
if (!iarr.isNull()) {
|
||||
strip.setPixelSegment(id);
|
||||
uint8_t oldSegId = strip.setPixelSegment(id);
|
||||
|
||||
//freeze and init to black
|
||||
if (!seg.getOption(SEG_OPTION_FREEZE)) {
|
||||
@ -235,7 +235,7 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
||||
set = 0;
|
||||
}
|
||||
}
|
||||
strip.setPixelSegment(255);
|
||||
strip.setPixelSegment(oldSegId);
|
||||
strip.trigger();
|
||||
} else if (!elem["frz"] && iarr.isNull()) { //return to regular effect
|
||||
seg.setOption(SEG_OPTION_FREEZE, false);
|
||||
|
Loading…
Reference in New Issue
Block a user