diff --git a/src/NeoPixelBus.h b/src/NeoPixelBus.h index 5e30714..61167d7 100644 --- a/src/NeoPixelBus.h +++ b/src/NeoPixelBus.h @@ -330,6 +330,15 @@ public: void SetPixelSettings(const typename T_COLOR_FEATURE::SettingsObject& settings) { T_COLOR_FEATURE::applySettings(_method.getData(), _method.getDataSize(), settings); + if (_method.SwapBuffers()) + { + // some methods have two internal buffers + // so need to swap so settings are stored in both copies + // + T_COLOR_FEATURE::applySettings(_method.getData(), _method.getDataSize(), settings); + // swap back to minimize inconsistencies + _method.SwapBuffers(); + } Dirty(); }; diff --git a/src/internal/methods/DotStarEsp32DmaSpiMethod.h b/src/internal/methods/DotStarEsp32DmaSpiMethod.h index 5ab5a77..f44e3cc 100644 --- a/src/internal/methods/DotStarEsp32DmaSpiMethod.h +++ b/src/internal/methods/DotStarEsp32DmaSpiMethod.h @@ -188,6 +188,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data + _sizeStartFrame; diff --git a/src/internal/methods/DotStarGenericMethod.h b/src/internal/methods/DotStarGenericMethod.h index 615d9ef..3f2f1c3 100644 --- a/src/internal/methods/DotStarGenericMethod.h +++ b/src/internal/methods/DotStarGenericMethod.h @@ -110,6 +110,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/Hd108GenericMethod.h b/src/internal/methods/Hd108GenericMethod.h index a1df987..6b9cbe5 100644 --- a/src/internal/methods/Hd108GenericMethod.h +++ b/src/internal/methods/Hd108GenericMethod.h @@ -101,6 +101,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/Lpd6803GenericMethod.h b/src/internal/methods/Lpd6803GenericMethod.h index 2e95e7e..a57dcee 100644 --- a/src/internal/methods/Lpd6803GenericMethod.h +++ b/src/internal/methods/Lpd6803GenericMethod.h @@ -106,6 +106,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/Lpd8806GenericMethod.h b/src/internal/methods/Lpd8806GenericMethod.h index b28e575..757ed93 100644 --- a/src/internal/methods/Lpd8806GenericMethod.h +++ b/src/internal/methods/Lpd8806GenericMethod.h @@ -106,6 +106,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/Mbi6033GenericMethod.h b/src/internal/methods/Mbi6033GenericMethod.h index eaddbca..5f66729 100644 --- a/src/internal/methods/Mbi6033GenericMethod.h +++ b/src/internal/methods/Mbi6033GenericMethod.h @@ -129,6 +129,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/NeoArmMethod.h b/src/internal/methods/NeoArmMethod.h index dba4000..3b0b7e8 100644 --- a/src/internal/methods/NeoArmMethod.h +++ b/src/internal/methods/NeoArmMethod.h @@ -97,6 +97,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/NeoAvrMethod.h b/src/internal/methods/NeoAvrMethod.h index fe8468a..53d471c 100644 --- a/src/internal/methods/NeoAvrMethod.h +++ b/src/internal/methods/NeoAvrMethod.h @@ -244,6 +244,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/NeoEsp32I2sMethod.h b/src/internal/methods/NeoEsp32I2sMethod.h index f8d7e78..85aae16 100644 --- a/src/internal/methods/NeoEsp32I2sMethod.h +++ b/src/internal/methods/NeoEsp32I2sMethod.h @@ -282,6 +282,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/NeoEsp32I2sXMethod.h b/src/internal/methods/NeoEsp32I2sXMethod.h index fd628fa..ecc304a 100644 --- a/src/internal/methods/NeoEsp32I2sXMethod.h +++ b/src/internal/methods/NeoEsp32I2sXMethod.h @@ -841,6 +841,11 @@ public: return true; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/NeoEsp32LcdXMethod.h b/src/internal/methods/NeoEsp32LcdXMethod.h index b868b85..e6e98ac 100644 --- a/src/internal/methods/NeoEsp32LcdXMethod.h +++ b/src/internal/methods/NeoEsp32LcdXMethod.h @@ -654,6 +654,11 @@ public: return true; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/NeoEsp32RmtMethod.h b/src/internal/methods/NeoEsp32RmtMethod.h index 8e6fdbf..208b1ac 100644 --- a/src/internal/methods/NeoEsp32RmtMethod.h +++ b/src/internal/methods/NeoEsp32RmtMethod.h @@ -651,6 +651,12 @@ public: return false; } + bool SwapBuffers() + { + std::swap(_dataSending, _dataEditing); + return true; + } + uint8_t* getData() const { return _dataEditing; diff --git a/src/internal/methods/NeoEsp8266DmaMethod.h b/src/internal/methods/NeoEsp8266DmaMethod.h index d372e1e..766426d 100644 --- a/src/internal/methods/NeoEsp8266DmaMethod.h +++ b/src/internal/methods/NeoEsp8266DmaMethod.h @@ -271,6 +271,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/NeoEsp8266I2sDmx512Method.h b/src/internal/methods/NeoEsp8266I2sDmx512Method.h index a98e34d..9dc717d 100644 --- a/src/internal/methods/NeoEsp8266I2sDmx512Method.h +++ b/src/internal/methods/NeoEsp8266I2sDmx512Method.h @@ -213,6 +213,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data + T_SPEED::HeaderSize; diff --git a/src/internal/methods/NeoEsp8266UartMethod.h b/src/internal/methods/NeoEsp8266UartMethod.h index be3e7a3..48cd3ca 100644 --- a/src/internal/methods/NeoEsp8266UartMethod.h +++ b/src/internal/methods/NeoEsp8266UartMethod.h @@ -205,6 +205,11 @@ protected: ptr = const_cast(T_UARTCONTEXT::FillUartFifo(T_UARTFEATURE::Index, ptr, end)); } } + + bool SwapUartBuffers() + { + return false; + } }; // this template method class is used to glue uart feature and context for @@ -274,6 +279,12 @@ protected: std::swap(_dataSending, _data); } + bool SwapUartBuffers() + { + std::swap(_dataSending, _data); + return true; + } + private: T_UARTCONTEXT _context; @@ -420,6 +431,11 @@ public: return false; } + bool SwapBuffers() + { + return this->SwapUartBuffers(); + } + uint8_t* getData() const { return this->_data; diff --git a/src/internal/methods/NeoEspBitBangMethod.h b/src/internal/methods/NeoEspBitBangMethod.h index 6a70e65..c875891 100644 --- a/src/internal/methods/NeoEspBitBangMethod.h +++ b/src/internal/methods/NeoEspBitBangMethod.h @@ -262,6 +262,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/NeoNrf52xMethod.h b/src/internal/methods/NeoNrf52xMethod.h index 82a6ca4..d4f8bcc 100644 --- a/src/internal/methods/NeoNrf52xMethod.h +++ b/src/internal/methods/NeoNrf52xMethod.h @@ -429,6 +429,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/P9813GenericMethod.h b/src/internal/methods/P9813GenericMethod.h index b014e1e..43f454c 100644 --- a/src/internal/methods/P9813GenericMethod.h +++ b/src/internal/methods/P9813GenericMethod.h @@ -102,6 +102,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/PixieStreamMethod.h b/src/internal/methods/PixieStreamMethod.h index 3dd5368..8ad9b43 100644 --- a/src/internal/methods/PixieStreamMethod.h +++ b/src/internal/methods/PixieStreamMethod.h @@ -86,6 +86,11 @@ public: return true; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/Rp2040/NeoRp2040x4Method.h b/src/internal/methods/Rp2040/NeoRp2040x4Method.h index a8ee727..8ba02fe 100644 --- a/src/internal/methods/Rp2040/NeoRp2040x4Method.h +++ b/src/internal/methods/Rp2040/NeoRp2040x4Method.h @@ -271,6 +271,12 @@ Serial.println(); return false; } + bool SwapBuffers() + { + std::swap(_dataSending, _dataEditing); + return true; + } + uint8_t* getData() const { return _dataEditing; diff --git a/src/internal/methods/Sm16716GenericMethod.h b/src/internal/methods/Sm16716GenericMethod.h index 065fb9c..6fa97fd 100644 --- a/src/internal/methods/Sm16716GenericMethod.h +++ b/src/internal/methods/Sm16716GenericMethod.h @@ -109,6 +109,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/Tlc5947GenericMethod.h b/src/internal/methods/Tlc5947GenericMethod.h index 60aee68..caa713b 100644 --- a/src/internal/methods/Tlc5947GenericMethod.h +++ b/src/internal/methods/Tlc5947GenericMethod.h @@ -170,6 +170,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/Tlc59711GenericMethod.h b/src/internal/methods/Tlc59711GenericMethod.h index 43f9525..68bde4b 100644 --- a/src/internal/methods/Tlc59711GenericMethod.h +++ b/src/internal/methods/Tlc59711GenericMethod.h @@ -157,6 +157,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data; diff --git a/src/internal/methods/Ws2801GenericMethod.h b/src/internal/methods/Ws2801GenericMethod.h index ccb69a2..965fa60 100644 --- a/src/internal/methods/Ws2801GenericMethod.h +++ b/src/internal/methods/Ws2801GenericMethod.h @@ -108,6 +108,11 @@ public: return false; } + bool SwapBuffers() + { + return false; + } + uint8_t* getData() const { return _data;