Spi dynamic speed (#432)

This commit is contained in:
Michael Miller
2021-02-16 10:23:02 -08:00
committed by GitHub
parent b76a42bb5a
commit 816de24962
19 changed files with 174 additions and 1 deletions

View File

@@ -378,6 +378,12 @@ public:
T_COLOR_FEATURE::applySettings(_method.getData(), settings); T_COLOR_FEATURE::applySettings(_method.getData(), settings);
Dirty(); Dirty();
}; };
void SetMethodSettings(const typename T_METHOD::SettingsObject& settings)
{
_method.applySettings(settings);
Dirty();
};
uint32_t CalcTotalMilliAmpere(const typename T_COLOR_FEATURE::ColorObject::SettingsObject& settings) uint32_t CalcTotalMilliAmpere(const typename T_COLOR_FEATURE::ColorObject::SettingsObject& settings)
{ {

View File

@@ -37,6 +37,8 @@ License along with NeoPixel. If not, see
template<typename T_TWOWIRE> class DotStarMethodBase template<typename T_TWOWIRE> class DotStarMethodBase
{ {
public: public:
typedef typename T_TWOWIRE::SettingsObject SettingsObject;
DotStarMethodBase(uint8_t pinClock, uint8_t pinData, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : DotStarMethodBase(uint8_t pinClock, uint8_t pinData, uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
_sizeData(pixelCount * elementSize + settingsSize), _sizeData(pixelCount * elementSize + settingsSize),
_sizeEndFrame((pixelCount + 15) / 16), // 16 = div 2 (bit for every two pixels) div 8 (bits to bytes) _sizeEndFrame((pixelCount + 15) / 16), // 16 = div 2 (bit for every two pixels) div 8 (bits to bytes)
@@ -112,6 +114,11 @@ public:
return _sizeData; return _sizeData;
}; };
void applySettings(const SettingsObject& settings)
{
_wire.applySettings(settings);
}
private: private:
const size_t _sizeData; // Size of '_data' buffer below const size_t _sizeData; // Size of '_data' buffer below
const size_t _sizeEndFrame; const size_t _sizeEndFrame;
@@ -131,6 +138,8 @@ typedef DotStarMethodBase<TwoWireSpiImple<SpiSpeed2Mhz>> DotStarSpi2MhzMethod;
typedef DotStarMethodBase<TwoWireSpiImple<SpiSpeed1Mhz>> DotStarSpi1MhzMethod; typedef DotStarMethodBase<TwoWireSpiImple<SpiSpeed1Mhz>> DotStarSpi1MhzMethod;
typedef DotStarMethodBase<TwoWireSpiImple<SpiSpeed500Khz>> DotStarSpi500KhzMethod; typedef DotStarMethodBase<TwoWireSpiImple<SpiSpeed500Khz>> DotStarSpi500KhzMethod;
typedef DotStarMethodBase<TwoWireSpiImple<SpiSpeedHz>> DotStarSpiHzMethod;
typedef DotStarSpi10MhzMethod DotStarSpiMethod; typedef DotStarSpi10MhzMethod DotStarSpiMethod;
#endif #endif

View File

@@ -37,6 +37,8 @@ License along with NeoPixel. If not, see
template<typename T_TWOWIRE> class Lpd6803MethodBase template<typename T_TWOWIRE> class Lpd6803MethodBase
{ {
public: public:
typedef typename T_TWOWIRE::SettingsObject SettingsObject;
Lpd6803MethodBase(uint8_t pinClock, uint8_t pinData, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : Lpd6803MethodBase(uint8_t pinClock, uint8_t pinData, uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
_sizeData(pixelCount * elementSize + settingsSize), _sizeData(pixelCount * elementSize + settingsSize),
_sizeFrame((pixelCount + 7) / 8), // bit for every pixel at least _sizeFrame((pixelCount + 7) / 8), // bit for every pixel at least
@@ -108,6 +110,11 @@ public:
return _sizeData; return _sizeData;
}; };
void applySettings(const SettingsObject& settings)
{
_wire.applySettings(settings);
}
private: private:
const size_t _sizeData; // Size of '_data' buffer below const size_t _sizeData; // Size of '_data' buffer below
const size_t _sizeFrame; const size_t _sizeFrame;

View File

@@ -37,6 +37,8 @@ License along with NeoPixel. If not, see
template<typename T_TWOWIRE> class Lpd8806MethodBase template<typename T_TWOWIRE> class Lpd8806MethodBase
{ {
public: public:
typedef typename T_TWOWIRE::SettingsObject SettingsObject;
Lpd8806MethodBase(uint8_t pinClock, uint8_t pinData, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : Lpd8806MethodBase(uint8_t pinClock, uint8_t pinData, uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
_sizeData(pixelCount * elementSize + settingsSize), _sizeData(pixelCount * elementSize + settingsSize),
_sizeFrame((pixelCount + 31) / 32), _sizeFrame((pixelCount + 31) / 32),
@@ -108,6 +110,11 @@ public:
return _sizeData; return _sizeData;
}; };
void applySettings(const SettingsObject& settings)
{
_wire.applySettings(settings);
}
private: private:
const size_t _sizeData; // Size of '_data' buffer below const size_t _sizeData; // Size of '_data' buffer below
const size_t _sizeFrame; const size_t _sizeFrame;

View File

@@ -35,6 +35,8 @@ License along with NeoPixel. If not, see
template<typename T_SPEED> class NeoArmMethodBase template<typename T_SPEED> class NeoArmMethodBase
{ {
public: public:
typedef NeoNoSettings SettingsObject;
NeoArmMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : NeoArmMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
_sizeData(pixelCount * elementSize + settingsSize), _sizeData(pixelCount * elementSize + settingsSize),
_pin(pin) _pin(pin)
@@ -99,6 +101,10 @@ public:
return _sizeData; return _sizeData;
}; };
void applySettings(const SettingsObject& settings)
{
}
private: private:
const size_t _sizeData; // Size of '_data' buffer below const size_t _sizeData; // Size of '_data' buffer below

View File

@@ -118,6 +118,8 @@ public:
template<typename T_SPEED> class NeoAvrMethodBase template<typename T_SPEED> class NeoAvrMethodBase
{ {
public: public:
typedef NeoNoSettings SettingsObject;
NeoAvrMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : NeoAvrMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
_sizeData(pixelCount * elementSize + settingsSize), _sizeData(pixelCount * elementSize + settingsSize),
_pin(pin), _pin(pin),
@@ -189,6 +191,10 @@ public:
return _sizeData; return _sizeData;
}; };
void applySettings(const SettingsObject& settings)
{
}
private: private:
const size_t _sizeData; // size of _data below const size_t _sizeData; // size of _data below
const uint8_t _pin; // output pin number const uint8_t _pin; // output pin number

View File

@@ -128,6 +128,8 @@ public:
template<typename T_SPEED, typename T_BUS, typename T_INVERT> class NeoEsp32I2sMethodBase template<typename T_SPEED, typename T_BUS, typename T_INVERT> class NeoEsp32I2sMethodBase
{ {
public: public:
typedef NeoNoSettings SettingsObject;
NeoEsp32I2sMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : NeoEsp32I2sMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
_sizeData(pixelCount * elementSize + settingsSize), _sizeData(pixelCount * elementSize + settingsSize),
_pin(pin) _pin(pin)
@@ -198,6 +200,10 @@ public:
return _sizeData; return _sizeData;
} }
void applySettings(const SettingsObject& settings)
{
}
private: private:
const size_t _sizeData; // Size of '_data' buffer const size_t _sizeData; // Size of '_data' buffer
const uint8_t _pin; // output pin number const uint8_t _pin; // output pin number

View File

@@ -27,6 +27,8 @@ License along with NeoPixel. If not, see
<http://www.gnu.org/licenses/>. <http://www.gnu.org/licenses/>.
-------------------------------------------------------------------------*/ -------------------------------------------------------------------------*/
#include <Arduino.h>
#include "NeoSettings.h"
#include "NeoBusChannel.h" #include "NeoBusChannel.h"
#include "NeoEsp32RmtMethod.h" #include "NeoEsp32RmtMethod.h"

View File

@@ -403,6 +403,8 @@ public:
template<typename T_SPEED, typename T_CHANNEL> class NeoEsp32RmtMethodBase template<typename T_SPEED, typename T_CHANNEL> class NeoEsp32RmtMethodBase
{ {
public: public:
typedef NeoNoSettings SettingsObject;
NeoEsp32RmtMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : NeoEsp32RmtMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
_sizeData(pixelCount * elementSize + settingsSize), _sizeData(pixelCount * elementSize + settingsSize),
_pin(pin) _pin(pin)
@@ -492,6 +494,10 @@ public:
return _sizeData; return _sizeData;
} }
void applySettings(const SettingsObject& settings)
{
}
private: private:
const size_t _sizeData; // Size of '_data*' buffers const size_t _sizeData; // Size of '_data*' buffers
const uint8_t _pin; // output pin number const uint8_t _pin; // output pin number

View File

@@ -217,6 +217,8 @@ const uint8_t c_I2sPin = 3; // due to I2S hardware, the pin used is restricted t
template<typename T_SPEED> class NeoEsp8266DmaMethodBase template<typename T_SPEED> class NeoEsp8266DmaMethodBase
{ {
public: public:
typedef NeoNoSettings SettingsObject;
NeoEsp8266DmaMethodBase(uint16_t pixelCount, size_t elementSize, size_t settingsSize) : NeoEsp8266DmaMethodBase(uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
_sizeData(pixelCount * elementSize + settingsSize) _sizeData(pixelCount * elementSize + settingsSize)
{ {
@@ -413,6 +415,10 @@ public:
return _sizeData; return _sizeData;
} }
void applySettings(const SettingsObject& settings)
{
}
private: private:
static NeoEsp8266DmaMethodBase* s_this; // for the ISR static NeoEsp8266DmaMethodBase* s_this; // for the ISR

View File

@@ -25,6 +25,9 @@ License along with NeoPixel. If not, see
-------------------------------------------------------------------------*/ -------------------------------------------------------------------------*/
#ifdef ARDUINO_ARCH_ESP8266 #ifdef ARDUINO_ARCH_ESP8266
#include <Arduino.h>
#include "NeoSettings.h"
#include "NeoEsp8266UartMethod.h" #include "NeoEsp8266UartMethod.h"
#include <utility> #include <utility>
extern "C" extern "C"

View File

@@ -347,6 +347,8 @@ template<typename T_SPEED, typename T_BASE, typename T_INVERT>
class NeoEsp8266UartMethodBase: public T_BASE class NeoEsp8266UartMethodBase: public T_BASE
{ {
public: public:
typedef NeoNoSettings SettingsObject;
NeoEsp8266UartMethodBase(uint16_t pixelCount, size_t elementSize, size_t settingsSize) NeoEsp8266UartMethodBase(uint16_t pixelCount, size_t elementSize, size_t settingsSize)
: T_BASE(pixelCount, elementSize, settingsSize) : T_BASE(pixelCount, elementSize, settingsSize)
{ {
@@ -398,6 +400,10 @@ public:
return this->_sizeData; return this->_sizeData;
}; };
void applySettings(const SettingsObject& settings)
{
}
private: private:
uint32_t getPixelTime() const uint32_t getPixelTime() const
{ {

View File

@@ -278,6 +278,8 @@ public:
template<typename T_SPEED, typename T_PINSET> class NeoEspBitBangMethodBase template<typename T_SPEED, typename T_PINSET> class NeoEspBitBangMethodBase
{ {
public: public:
typedef NeoNoSettings SettingsObject;
NeoEspBitBangMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : NeoEspBitBangMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
_sizeData(pixelCount * elementSize + settingsSize), _sizeData(pixelCount * elementSize + settingsSize),
_pin(pin) _pin(pin)
@@ -354,6 +356,10 @@ public:
return _sizeData; return _sizeData;
}; };
void applySettings(const SettingsObject& settings)
{
}
private: private:
const size_t _sizeData; // Size of '_data' buffer below const size_t _sizeData; // Size of '_data' buffer below
const uint8_t _pin; // output pin number const uint8_t _pin; // output pin number

View File

@@ -260,6 +260,8 @@ protected:
template<typename T_SPEED, typename T_BUS> class NeoNrf52xMethodBase template<typename T_SPEED, typename T_BUS> class NeoNrf52xMethodBase
{ {
public: public:
typedef NeoNoSettings SettingsObject;
NeoNrf52xMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : NeoNrf52xMethodBase(uint8_t pin, uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
_sizeData(pixelCount * elementSize + settingsSize), _sizeData(pixelCount * elementSize + settingsSize),
_pin(pin) _pin(pin)
@@ -334,6 +336,10 @@ public:
return _sizeData; return _sizeData;
}; };
void applySettings(const SettingsObject& settings)
{
}
private: private:
const size_t _sizeData; // Size of '_data' buffer below const size_t _sizeData; // Size of '_data' buffer below
const uint8_t _pin; // output pin number const uint8_t _pin; // output pin number

View File

@@ -37,6 +37,8 @@ License along with NeoPixel. If not, see
template<typename T_TWOWIRE> class P9813MethodBase template<typename T_TWOWIRE> class P9813MethodBase
{ {
public: public:
typedef typename T_TWOWIRE::SettingsObject SettingsObject;
P9813MethodBase(uint8_t pinClock, uint8_t pinData, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : P9813MethodBase(uint8_t pinClock, uint8_t pinData, uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
_sizeData(pixelCount * elementSize + settingsSize), _sizeData(pixelCount * elementSize + settingsSize),
_sizeEndFrame((pixelCount + 15) / 16), // 16 = div 2 (bit for every two pixels) div 8 (bits to bytes) _sizeEndFrame((pixelCount + 15) / 16), // 16 = div 2 (bit for every two pixels) div 8 (bits to bytes)
@@ -104,6 +106,11 @@ public:
return _sizeData; return _sizeData;
}; };
void applySettings(const SettingsObject& settings)
{
_wire.applySettings(settings);
}
private: private:
const size_t _sizeData; // Size of '_data' buffer below const size_t _sizeData; // Size of '_data' buffer below
const size_t _sizeEndFrame; const size_t _sizeEndFrame;

View File

@@ -30,6 +30,8 @@ License along with NeoPixel. If not, see
class TwoWireBitBangImple class TwoWireBitBangImple
{ {
public: public:
typedef NeoNoSettings SettingsObject;
TwoWireBitBangImple(uint8_t pinClock, uint8_t pinData) : TwoWireBitBangImple(uint8_t pinClock, uint8_t pinData) :
_pinClock(pinClock), _pinClock(pinClock),
_pinData(pinData) _pinData(pinData)
@@ -86,6 +88,10 @@ public:
} }
} }
void applySettings(const SettingsObject& settings)
{
}
private: private:
const uint8_t _pinClock; // output pin number for clock line const uint8_t _pinClock; // output pin number for clock line
const uint8_t _pinData; // output pin number for data line const uint8_t _pinData; // output pin number for data line

View File

@@ -30,6 +30,8 @@ License along with NeoPixel. If not, see
class TwoWireBitBangImple class TwoWireBitBangImple
{ {
public: public:
typedef NeoNoSettings SettingsObject;
TwoWireBitBangImple(uint8_t pinClock, uint8_t pinData) : TwoWireBitBangImple(uint8_t pinClock, uint8_t pinData) :
_pinClock(pinClock), _pinClock(pinClock),
_pinData(pinData) _pinData(pinData)
@@ -101,6 +103,10 @@ public:
} }
} }
void applySettings(const SettingsObject& settings)
{
}
private: private:
const uint8_t _pinClock; // output pin number for clock line const uint8_t _pinClock; // output pin number for clock line
const uint8_t _pinData; // output pin number for data line const uint8_t _pinData; // output pin number for data line

View File

@@ -31,42 +31,101 @@ License along with NeoPixel. If not, see
class SpiSpeed40Mhz class SpiSpeed40Mhz
{ {
public: public:
typedef NeoNoSettings SettingsObject;
SpiSpeed40Mhz() {};
static void applySettings(const SettingsObject& settings) {}
static const uint32_t Clock = 40000000L; static const uint32_t Clock = 40000000L;
}; };
class SpiSpeed20Mhz class SpiSpeed20Mhz
{ {
public: public:
typedef NeoNoSettings SettingsObject;
SpiSpeed20Mhz() {};
static void applySettings(const SettingsObject& settings) {}
static const uint32_t Clock = 20000000L; static const uint32_t Clock = 20000000L;
}; };
class SpiSpeed10Mhz class SpiSpeed10Mhz
{ {
public: public:
typedef NeoNoSettings SettingsObject;
SpiSpeed10Mhz() {};
static void applySettings(const SettingsObject& settings) {}
static const uint32_t Clock = 10000000L; static const uint32_t Clock = 10000000L;
}; };
class SpiSpeed2Mhz class SpiSpeed2Mhz
{ {
public: public:
typedef NeoNoSettings SettingsObject;
SpiSpeed2Mhz() {};
static void applySettings(const SettingsObject& settings) {}
static const uint32_t Clock = 2000000L; static const uint32_t Clock = 2000000L;
}; };
class SpiSpeed1Mhz class SpiSpeed1Mhz
{ {
public: public:
typedef NeoNoSettings SettingsObject;
SpiSpeed1Mhz() {};
static void applySettings(const SettingsObject& settings) {}
static const uint32_t Clock = 1000000L; static const uint32_t Clock = 1000000L;
}; };
class SpiSpeed500Khz class SpiSpeed500Khz
{ {
public: public:
typedef NeoNoSettings SettingsObject;
SpiSpeed500Khz() {};
static void applySettings(const SettingsObject& settings) {}
static const uint32_t Clock = 500000L; 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<typename T_SPISPEED> class TwoWireSpiImple template<typename T_SPISPEED> class TwoWireSpiImple
{ {
public: public:
typedef typename T_SPISPEED::SettingsObject SettingsObject;
TwoWireSpiImple(uint8_t, uint8_t) // clock and data pins ignored for hardware SPI TwoWireSpiImple(uint8_t, uint8_t) // clock and data pins ignored for hardware SPI
{ {
} }
@@ -91,7 +150,7 @@ public:
void beginTransaction() void beginTransaction()
{ {
SPI.beginTransaction(SPISettings(T_SPISPEED::Clock, MSBFIRST, SPI_MODE0)); SPI.beginTransaction(SPISettings(_speed.Clock, MSBFIRST, SPI_MODE0));
} }
void endTransaction() void endTransaction()
@@ -123,5 +182,11 @@ public:
#endif #endif
} }
void applySettings(const SettingsObject& settings)
{
_speed.applySettings(settings);
}
private: private:
T_SPISPEED _speed;
}; };

View File

@@ -37,6 +37,8 @@ License along with NeoPixel. If not, see
template<typename T_TWOWIRE> class Ws2801MethodBase template<typename T_TWOWIRE> class Ws2801MethodBase
{ {
public: public:
typedef typename T_TWOWIRE::SettingsObject SettingsObject;
Ws2801MethodBase(uint8_t pinClock, uint8_t pinData, uint16_t pixelCount, size_t elementSize, size_t settingsSize) : Ws2801MethodBase(uint8_t pinClock, uint8_t pinData, uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
_sizeData(pixelCount * elementSize + settingsSize), _sizeData(pixelCount * elementSize + settingsSize),
_wire(pinClock, pinData) _wire(pinClock, pinData)
@@ -110,6 +112,11 @@ public:
return _sizeData; return _sizeData;
}; };
void applySettings(const SettingsObject& settings)
{
_wire.applySettings(settings);
}
private: private:
const size_t _sizeData; // Size of '_data' buffer below const size_t _sizeData; // Size of '_data' buffer below