diff --git a/src/NeoPixelBus.h b/src/NeoPixelBus.h index 597c288..990405e 100644 --- a/src/NeoPixelBus.h +++ b/src/NeoPixelBus.h @@ -378,6 +378,12 @@ public: T_COLOR_FEATURE::applySettings(_method.getData(), settings); Dirty(); }; + + void SetMethodSettings(const typename T_METHOD::SettingsObject& settings) + { + _method.applySettings(settings); + Dirty(); + }; uint32_t CalcTotalMilliAmpere(const typename T_COLOR_FEATURE::ColorObject::SettingsObject& settings) { diff --git a/src/internal/DotStarGenericMethod.h b/src/internal/DotStarGenericMethod.h index 1804c32..0896267 100644 --- a/src/internal/DotStarGenericMethod.h +++ b/src/internal/DotStarGenericMethod.h @@ -37,6 +37,8 @@ License along with NeoPixel. If not, see template class DotStarMethodBase { public: + typedef typename T_TWOWIRE::SettingsObject SettingsObject; + DotStarMethodBase(uint8_t pinClock, uint8_t pinData, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : _sizeData(pixelCount * elementSize + settingsSize), _sizeEndFrame((pixelCount + 15) / 16), // 16 = div 2 (bit for every two pixels) div 8 (bits to bytes) @@ -112,6 +114,11 @@ public: return _sizeData; }; + void applySettings(const SettingsObject& settings) + { + _wire.applySettings(settings); + } + private: const size_t _sizeData; // Size of '_data' buffer below const size_t _sizeEndFrame; @@ -131,6 +138,8 @@ typedef DotStarMethodBase> DotStarSpi2MhzMethod; typedef DotStarMethodBase> DotStarSpi1MhzMethod; typedef DotStarMethodBase> DotStarSpi500KhzMethod; +typedef DotStarMethodBase> DotStarSpiHzMethod; + typedef DotStarSpi10MhzMethod DotStarSpiMethod; #endif diff --git a/src/internal/Lpd6803GenericMethod.h b/src/internal/Lpd6803GenericMethod.h index 8db4d33..18ddd19 100644 --- a/src/internal/Lpd6803GenericMethod.h +++ b/src/internal/Lpd6803GenericMethod.h @@ -37,6 +37,8 @@ License along with NeoPixel. If not, see template class Lpd6803MethodBase { public: + typedef typename T_TWOWIRE::SettingsObject SettingsObject; + Lpd6803MethodBase(uint8_t pinClock, uint8_t pinData, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : _sizeData(pixelCount * elementSize + settingsSize), _sizeFrame((pixelCount + 7) / 8), // bit for every pixel at least @@ -108,6 +110,11 @@ public: return _sizeData; }; + void applySettings(const SettingsObject& settings) + { + _wire.applySettings(settings); + } + private: const size_t _sizeData; // Size of '_data' buffer below const size_t _sizeFrame; diff --git a/src/internal/Lpd8806GenericMethod.h b/src/internal/Lpd8806GenericMethod.h index a3b07cc..82ff657 100644 --- a/src/internal/Lpd8806GenericMethod.h +++ b/src/internal/Lpd8806GenericMethod.h @@ -37,6 +37,8 @@ License along with NeoPixel. If not, see template class Lpd8806MethodBase { public: + typedef typename T_TWOWIRE::SettingsObject SettingsObject; + Lpd8806MethodBase(uint8_t pinClock, uint8_t pinData, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : _sizeData(pixelCount * elementSize + settingsSize), _sizeFrame((pixelCount + 31) / 32), @@ -108,6 +110,11 @@ public: return _sizeData; }; + void applySettings(const SettingsObject& settings) + { + _wire.applySettings(settings); + } + private: const size_t _sizeData; // Size of '_data' buffer below const size_t _sizeFrame; diff --git a/src/internal/NeoArmMethod.h b/src/internal/NeoArmMethod.h index 048d5ee..4331d92 100644 --- a/src/internal/NeoArmMethod.h +++ b/src/internal/NeoArmMethod.h @@ -35,6 +35,8 @@ License along with NeoPixel. If not, see template class NeoArmMethodBase { public: + typedef NeoNoSettings SettingsObject; + NeoArmMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : _sizeData(pixelCount * elementSize + settingsSize), _pin(pin) @@ -99,6 +101,10 @@ public: return _sizeData; }; + void applySettings(const SettingsObject& settings) + { + } + private: const size_t _sizeData; // Size of '_data' buffer below diff --git a/src/internal/NeoAvrMethod.h b/src/internal/NeoAvrMethod.h index aa5b0a8..c3e2b66 100644 --- a/src/internal/NeoAvrMethod.h +++ b/src/internal/NeoAvrMethod.h @@ -118,6 +118,8 @@ public: template class NeoAvrMethodBase { public: + typedef NeoNoSettings SettingsObject; + NeoAvrMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : _sizeData(pixelCount * elementSize + settingsSize), _pin(pin), @@ -189,6 +191,10 @@ public: return _sizeData; }; + void applySettings(const SettingsObject& settings) + { + } + private: const size_t _sizeData; // size of _data below const uint8_t _pin; // output pin number diff --git a/src/internal/NeoEsp32I2sMethod.h b/src/internal/NeoEsp32I2sMethod.h index 2024c78..55a5fc1 100644 --- a/src/internal/NeoEsp32I2sMethod.h +++ b/src/internal/NeoEsp32I2sMethod.h @@ -128,6 +128,8 @@ public: template class NeoEsp32I2sMethodBase { public: + typedef NeoNoSettings SettingsObject; + NeoEsp32I2sMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : _sizeData(pixelCount * elementSize + settingsSize), _pin(pin) @@ -198,6 +200,10 @@ public: return _sizeData; } + void applySettings(const SettingsObject& settings) + { + } + private: const size_t _sizeData; // Size of '_data' buffer const uint8_t _pin; // output pin number diff --git a/src/internal/NeoEsp32RmtMethod.cpp b/src/internal/NeoEsp32RmtMethod.cpp index 4bea928..c7817cb 100644 --- a/src/internal/NeoEsp32RmtMethod.cpp +++ b/src/internal/NeoEsp32RmtMethod.cpp @@ -27,6 +27,8 @@ License along with NeoPixel. If not, see . -------------------------------------------------------------------------*/ +#include +#include "NeoSettings.h" #include "NeoBusChannel.h" #include "NeoEsp32RmtMethod.h" diff --git a/src/internal/NeoEsp32RmtMethod.h b/src/internal/NeoEsp32RmtMethod.h index 484f41c..4053a54 100644 --- a/src/internal/NeoEsp32RmtMethod.h +++ b/src/internal/NeoEsp32RmtMethod.h @@ -403,6 +403,8 @@ public: template class NeoEsp32RmtMethodBase { public: + typedef NeoNoSettings SettingsObject; + NeoEsp32RmtMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : _sizeData(pixelCount * elementSize + settingsSize), _pin(pin) @@ -492,6 +494,10 @@ public: return _sizeData; } + void applySettings(const SettingsObject& settings) + { + } + private: const size_t _sizeData; // Size of '_data*' buffers const uint8_t _pin; // output pin number diff --git a/src/internal/NeoEsp8266DmaMethod.h b/src/internal/NeoEsp8266DmaMethod.h index 4a25f61..7f1e427 100644 --- a/src/internal/NeoEsp8266DmaMethod.h +++ b/src/internal/NeoEsp8266DmaMethod.h @@ -217,6 +217,8 @@ const uint8_t c_I2sPin = 3; // due to I2S hardware, the pin used is restricted t template class NeoEsp8266DmaMethodBase { public: + typedef NeoNoSettings SettingsObject; + NeoEsp8266DmaMethodBase(uint16_t pixelCount, size_t elementSize, size_t settingsSize) : _sizeData(pixelCount * elementSize + settingsSize) { @@ -413,6 +415,10 @@ public: return _sizeData; } + void applySettings(const SettingsObject& settings) + { + } + private: static NeoEsp8266DmaMethodBase* s_this; // for the ISR diff --git a/src/internal/NeoEsp8266UartMethod.cpp b/src/internal/NeoEsp8266UartMethod.cpp index dab9a57..5b6c4ad 100644 --- a/src/internal/NeoEsp8266UartMethod.cpp +++ b/src/internal/NeoEsp8266UartMethod.cpp @@ -25,6 +25,9 @@ License along with NeoPixel. If not, see -------------------------------------------------------------------------*/ #ifdef ARDUINO_ARCH_ESP8266 + +#include +#include "NeoSettings.h" #include "NeoEsp8266UartMethod.h" #include extern "C" diff --git a/src/internal/NeoEsp8266UartMethod.h b/src/internal/NeoEsp8266UartMethod.h index c7d45b2..e474c99 100644 --- a/src/internal/NeoEsp8266UartMethod.h +++ b/src/internal/NeoEsp8266UartMethod.h @@ -347,6 +347,8 @@ template class NeoEsp8266UartMethodBase: public T_BASE { public: + typedef NeoNoSettings SettingsObject; + NeoEsp8266UartMethodBase(uint16_t pixelCount, size_t elementSize, size_t settingsSize) : T_BASE(pixelCount, elementSize, settingsSize) { @@ -398,6 +400,10 @@ public: return this->_sizeData; }; + void applySettings(const SettingsObject& settings) + { + } + private: uint32_t getPixelTime() const { diff --git a/src/internal/NeoEspBitBangMethod.h b/src/internal/NeoEspBitBangMethod.h index b0b9753..ed42703 100644 --- a/src/internal/NeoEspBitBangMethod.h +++ b/src/internal/NeoEspBitBangMethod.h @@ -278,6 +278,8 @@ public: template class NeoEspBitBangMethodBase { public: + typedef NeoNoSettings SettingsObject; + NeoEspBitBangMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : _sizeData(pixelCount * elementSize + settingsSize), _pin(pin) @@ -354,6 +356,10 @@ public: return _sizeData; }; + void applySettings(const SettingsObject& settings) + { + } + private: const size_t _sizeData; // Size of '_data' buffer below const uint8_t _pin; // output pin number diff --git a/src/internal/NeoNrf52xMethod.h b/src/internal/NeoNrf52xMethod.h index 975bc10..cb9ef71 100644 --- a/src/internal/NeoNrf52xMethod.h +++ b/src/internal/NeoNrf52xMethod.h @@ -260,6 +260,8 @@ protected: template class NeoNrf52xMethodBase { public: + typedef NeoNoSettings SettingsObject; + NeoNrf52xMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : _sizeData(pixelCount * elementSize + settingsSize), _pin(pin) @@ -334,6 +336,10 @@ public: return _sizeData; }; + void applySettings(const SettingsObject& settings) + { + } + private: const size_t _sizeData; // Size of '_data' buffer below const uint8_t _pin; // output pin number diff --git a/src/internal/P9813GenericMethod.h b/src/internal/P9813GenericMethod.h index f72c317..eda3d06 100644 --- a/src/internal/P9813GenericMethod.h +++ b/src/internal/P9813GenericMethod.h @@ -37,6 +37,8 @@ License along with NeoPixel. If not, see template class P9813MethodBase { public: + typedef typename T_TWOWIRE::SettingsObject SettingsObject; + P9813MethodBase(uint8_t pinClock, uint8_t pinData, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : _sizeData(pixelCount * elementSize + settingsSize), _sizeEndFrame((pixelCount + 15) / 16), // 16 = div 2 (bit for every two pixels) div 8 (bits to bytes) @@ -104,6 +106,11 @@ public: return _sizeData; }; + void applySettings(const SettingsObject& settings) + { + _wire.applySettings(settings); + } + private: const size_t _sizeData; // Size of '_data' buffer below const size_t _sizeEndFrame; diff --git a/src/internal/TwoWireBitBangImple.h b/src/internal/TwoWireBitBangImple.h index 4a784ae..eede5f9 100644 --- a/src/internal/TwoWireBitBangImple.h +++ b/src/internal/TwoWireBitBangImple.h @@ -30,6 +30,8 @@ License along with NeoPixel. If not, see class TwoWireBitBangImple { public: + typedef NeoNoSettings SettingsObject; + TwoWireBitBangImple(uint8_t pinClock, uint8_t pinData) : _pinClock(pinClock), _pinData(pinData) @@ -86,6 +88,10 @@ public: } } + void applySettings(const SettingsObject& settings) + { + } + private: const uint8_t _pinClock; // output pin number for clock line const uint8_t _pinData; // output pin number for data line diff --git a/src/internal/TwoWireBitBangImpleAvr.h b/src/internal/TwoWireBitBangImpleAvr.h index 8c0be74..5b475ac 100644 --- a/src/internal/TwoWireBitBangImpleAvr.h +++ b/src/internal/TwoWireBitBangImpleAvr.h @@ -30,6 +30,8 @@ License along with NeoPixel. If not, see class TwoWireBitBangImple { public: + typedef NeoNoSettings SettingsObject; + TwoWireBitBangImple(uint8_t pinClock, uint8_t pinData) : _pinClock(pinClock), _pinData(pinData) @@ -101,6 +103,10 @@ public: } } + void applySettings(const SettingsObject& settings) + { + } + private: const uint8_t _pinClock; // output pin number for clock line const uint8_t _pinData; // output pin number for data line diff --git a/src/internal/TwoWireSpiImple.h b/src/internal/TwoWireSpiImple.h index ce07ee7..abea45b 100644 --- a/src/internal/TwoWireSpiImple.h +++ b/src/internal/TwoWireSpiImple.h @@ -31,42 +31,101 @@ License along with NeoPixel. If not, see class SpiSpeed40Mhz { public: + typedef NeoNoSettings SettingsObject; + SpiSpeed40Mhz() {}; + + static void applySettings(const SettingsObject& settings) {} + static const uint32_t Clock = 40000000L; }; class SpiSpeed20Mhz { public: + typedef NeoNoSettings SettingsObject; + SpiSpeed20Mhz() {}; + + static void applySettings(const SettingsObject& settings) {} + static const uint32_t Clock = 20000000L; }; class SpiSpeed10Mhz { public: + typedef NeoNoSettings SettingsObject; + SpiSpeed10Mhz() {}; + + static void applySettings(const SettingsObject& settings) {} + static const uint32_t Clock = 10000000L; }; class SpiSpeed2Mhz { public: + typedef NeoNoSettings SettingsObject; + SpiSpeed2Mhz() {}; + + static void applySettings(const SettingsObject& settings) {} + static const uint32_t Clock = 2000000L; }; class SpiSpeed1Mhz { public: + typedef NeoNoSettings SettingsObject; + SpiSpeed1Mhz() {}; + + static void applySettings(const SettingsObject& settings) {} + static const uint32_t Clock = 1000000L; }; class SpiSpeed500Khz { public: + typedef NeoNoSettings SettingsObject; + SpiSpeed500Khz() {}; + + static void applySettings(const SettingsObject& settings) {} + static const uint32_t Clock = 500000L; }; +class NeoSpiSettings +{ +public: + NeoSpiSettings(uint32_t clock) : + Clock(clock) + { + } + uint32_t Clock; +}; + +class SpiSpeedHz +{ +public: + typedef NeoSpiSettings SettingsObject; + + SpiSpeedHz() : + Clock(10000000) + {}; + + void applySettings(const SettingsObject& settings) + { + Clock = settings.Clock; + } + + uint32_t Clock; +}; + template class TwoWireSpiImple { public: + typedef typename T_SPISPEED::SettingsObject SettingsObject; + TwoWireSpiImple(uint8_t, uint8_t) // clock and data pins ignored for hardware SPI { } @@ -91,7 +150,7 @@ public: void beginTransaction() { - SPI.beginTransaction(SPISettings(T_SPISPEED::Clock, MSBFIRST, SPI_MODE0)); + SPI.beginTransaction(SPISettings(_speed.Clock, MSBFIRST, SPI_MODE0)); } void endTransaction() @@ -123,5 +182,11 @@ public: #endif } + void applySettings(const SettingsObject& settings) + { + _speed.applySettings(settings); + } + private: + T_SPISPEED _speed; }; \ No newline at end of file diff --git a/src/internal/Ws2801GenericMethod.h b/src/internal/Ws2801GenericMethod.h index b3b3ea1..853f66d 100644 --- a/src/internal/Ws2801GenericMethod.h +++ b/src/internal/Ws2801GenericMethod.h @@ -37,6 +37,8 @@ License along with NeoPixel. If not, see template class Ws2801MethodBase { public: + typedef typename T_TWOWIRE::SettingsObject SettingsObject; + Ws2801MethodBase(uint8_t pinClock, uint8_t pinData, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : _sizeData(pixelCount * elementSize + settingsSize), _wire(pinClock, pinData) @@ -110,6 +112,11 @@ public: return _sizeData; }; + void applySettings(const SettingsObject& settings) + { + _wire.applySettings(settings); + } + private: const size_t _sizeData; // Size of '_data' buffer below