Merge pull request #1465 from pbolduc/bug/1431
Fixes an issue where switching effects causes crash
This commit is contained in:
commit
455a17cdb2
24
wled00/FX.h
24
wled00/FX.h
@ -317,9 +317,31 @@ class WS2812FX {
|
|||||||
WS2812FX::_usedSegmentData -= _dataLen;
|
WS2812FX::_usedSegmentData -= _dataLen;
|
||||||
_dataLen = 0;
|
_dataLen = 0;
|
||||||
}
|
}
|
||||||
void reset(){next_time = 0; step = 0; call = 0; aux0 = 0; aux1 = 0; deallocateData();}
|
|
||||||
|
/**
|
||||||
|
* If reset of this segment was request, clears runtime
|
||||||
|
* settings of this segment.
|
||||||
|
* Must not be called while an effect mode function is running
|
||||||
|
* because it could access the data buffer and this method
|
||||||
|
* may free that data buffer.
|
||||||
|
*/
|
||||||
|
void resetIfRequired() {
|
||||||
|
if (_requiresReset) {
|
||||||
|
next_time = 0; step = 0; call = 0; aux0 = 0; aux1 = 0;
|
||||||
|
deallocateData();
|
||||||
|
_requiresReset = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flags that before the next effect is calculated,
|
||||||
|
* the internal segment state should be reset.
|
||||||
|
* Call resetIfRequired before calling the next effect function.
|
||||||
|
*/
|
||||||
|
void reset() { _requiresReset = true; }
|
||||||
private:
|
private:
|
||||||
uint16_t _dataLen = 0;
|
uint16_t _dataLen = 0;
|
||||||
|
bool _requiresReset = false;
|
||||||
} segment_runtime;
|
} segment_runtime;
|
||||||
|
|
||||||
WS2812FX() {
|
WS2812FX() {
|
||||||
|
@ -76,6 +76,11 @@ void WS2812FX::service() {
|
|||||||
for(uint8_t i=0; i < MAX_NUM_SEGMENTS; i++)
|
for(uint8_t i=0; i < MAX_NUM_SEGMENTS; i++)
|
||||||
{
|
{
|
||||||
_segment_index = i;
|
_segment_index = i;
|
||||||
|
|
||||||
|
// reset the segment runtime data if needed, called before isActive to ensure deleted
|
||||||
|
// segment's buffers are cleared
|
||||||
|
SEGENV.resetIfRequired();
|
||||||
|
|
||||||
if (SEGMENT.isActive())
|
if (SEGMENT.isActive())
|
||||||
{
|
{
|
||||||
if(nowUp > SEGENV.next_time || _triggered || (doShow && SEGMENT.mode == 0)) //last is temporary
|
if(nowUp > SEGENV.next_time || _triggered || (doShow && SEGMENT.mode == 0)) //last is temporary
|
||||||
|
Loading…
Reference in New Issue
Block a user