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);
Dirty();
};
void SetMethodSettings(const typename T_METHOD::SettingsObject& settings)
{
_method.applySettings(settings);
Dirty();
};
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
{
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<TwoWireSpiImple<SpiSpeed2Mhz>> DotStarSpi2MhzMethod;
typedef DotStarMethodBase<TwoWireSpiImple<SpiSpeed1Mhz>> DotStarSpi1MhzMethod;
typedef DotStarMethodBase<TwoWireSpiImple<SpiSpeed500Khz>> DotStarSpi500KhzMethod;
typedef DotStarMethodBase<TwoWireSpiImple<SpiSpeedHz>> DotStarSpiHzMethod;
typedef DotStarSpi10MhzMethod DotStarSpiMethod;
#endif

View File

@@ -37,6 +37,8 @@ License along with NeoPixel. If not, see
template<typename T_TWOWIRE> 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;

View File

@@ -37,6 +37,8 @@ License along with NeoPixel. If not, see
template<typename T_TWOWIRE> 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;

View File

@@ -35,6 +35,8 @@ License along with NeoPixel. If not, see
template<typename T_SPEED> 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

View File

@@ -118,6 +118,8 @@ public:
template<typename T_SPEED> 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

View File

@@ -128,6 +128,8 @@ public:
template<typename T_SPEED, typename T_BUS, typename T_INVERT> 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

View File

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

View File

@@ -403,6 +403,8 @@ public:
template<typename T_SPEED, typename T_CHANNEL> 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

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
{
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

View File

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

View File

@@ -347,6 +347,8 @@ template<typename T_SPEED, typename T_BASE, typename T_INVERT>
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
{

View File

@@ -278,6 +278,8 @@ public:
template<typename T_SPEED, typename T_PINSET> 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

View File

@@ -260,6 +260,8 @@ protected:
template<typename T_SPEED, typename T_BUS> 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

View File

@@ -37,6 +37,8 @@ License along with NeoPixel. If not, see
template<typename T_TWOWIRE> 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;

View File

@@ -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

View File

@@ -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

View File

@@ -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<typename T_SPISPEED> 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;
};

View File

@@ -37,6 +37,8 @@ License along with NeoPixel. If not, see
template<typename T_TWOWIRE> 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