This commit is contained in:
Michael Miller
2021-01-14 22:38:05 -08:00
committed by GitHub
parent de32dd9cc8
commit 3910763e57
4 changed files with 359 additions and 0 deletions

View File

@@ -26,7 +26,10 @@ NeoRbgFeature KEYWORD1
NeoWrgbTm1814Feature KEYWORD1 NeoWrgbTm1814Feature KEYWORD1
DotStarBgrFeature KEYWORD1 DotStarBgrFeature KEYWORD1
DotStarLbgrFeature KEYWORD1 DotStarLbgrFeature KEYWORD1
Lpd6803GrbFeature KEYWORD1
Lpd6803BrgFeature KEYWORD1
Lpd8806GrbFeature KEYWORD1 Lpd8806GrbFeature KEYWORD1
Lpd8806BrgFeature KEYWORD1
P9813BgrFeature KEYWORD1 P9813BgrFeature KEYWORD1
SevenSegmentFeature KEYWORD1 SevenSegmentFeature KEYWORD1
Neo800KbpsMethod KEYWORD1 Neo800KbpsMethod KEYWORD1
@@ -375,6 +378,11 @@ NeoWs2801SpiMethod KEYWORD1
NeoWs2801Spi20MhzMethod KEYWORD1 NeoWs2801Spi20MhzMethod KEYWORD1
NeoWs2801Spi10MhzMethod KEYWORD1 NeoWs2801Spi10MhzMethod KEYWORD1
NeoWs2801Spi2MhzMethod KEYWORD1 NeoWs2801Spi2MhzMethod KEYWORD1
Lpd6803SpiMethod KEYWORD1
Lpd6803Method KEYWORD1
Lpd6803Spi20MhzMethod KEYWORD1
Lpd6803Spi10MhzMethod KEYWORD1
Lpd6803Spi2MhzMethod KEYWORD1
Lpd8806Method KEYWORD1 Lpd8806Method KEYWORD1
Lpd8806SpiMethod KEYWORD1 Lpd8806SpiMethod KEYWORD1
Lpd8806Spi20MhzMethod KEYWORD1 Lpd8806Spi20MhzMethod KEYWORD1

View File

@@ -65,6 +65,7 @@ License along with NeoPixel. If not, see
#include "internal/NeoTm1814ColorFeatures.h" #include "internal/NeoTm1814ColorFeatures.h"
#include "internal/DotStarColorFeatures.h" #include "internal/DotStarColorFeatures.h"
#include "internal/Lpd8806ColorFeatures.h" #include "internal/Lpd8806ColorFeatures.h"
#include "internal/Lpd6803ColorFeatures.h"
#include "internal/P9813ColorFeatures.h" #include "internal/P9813ColorFeatures.h"
#include "internal/NeoSegmentFeatures.h" #include "internal/NeoSegmentFeatures.h"
@@ -86,6 +87,7 @@ License along with NeoPixel. If not, see
#include "internal/DotStarGenericMethod.h" #include "internal/DotStarGenericMethod.h"
#include "internal/Lpd8806GenericMethod.h" #include "internal/Lpd8806GenericMethod.h"
#include "internal/Lpd6803GenericMethod.h"
#include "internal/Ws2801GenericMethod.h" #include "internal/Ws2801GenericMethod.h"
#include "internal/P9813GenericMethod.h" #include "internal/P9813GenericMethod.h"

View File

@@ -0,0 +1,219 @@
/*-------------------------------------------------------------------------
Lpd6803ColorFeatures provides feature classes to describe color order and
color depth for NeoPixelBus template class when used with DotStar like chips
Written by Michael C. Miller.
I invest time and resources providing this open source code,
please support me by dontating (see https://github.com/Makuna/NeoPixelBus)
-------------------------------------------------------------------------
This file is part of the Makuna/NeoPixelBus library.
NeoPixelBus is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
NeoPixelBus is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with NeoPixel. If not, see
<http://www.gnu.org/licenses/>.
-------------------------------------------------------------------------*/
#pragma once
class Lpd68033ElementsNoSettings
{
public:
typedef NeoNoSettings SettingsObject;
static const size_t SettingsSize = 0;
static void applySettings(uint8_t*, const SettingsObject&)
{
}
static uint8_t* pixels(uint8_t* pData)
{
return pData;
}
static const uint8_t* pixels(const uint8_t* pData)
{
return pData;
}
};
class Lpd68033Elements : public Lpd68033ElementsNoSettings
{
public:
static const size_t PixelSize = 2; // 1 bit + 555 encoded elements
static uint8_t* getPixelAddress(uint8_t* pPixels, uint16_t indexPixel)
{
return pPixels + indexPixel * PixelSize;
}
static const uint8_t* getPixelAddress(const uint8_t* pPixels, uint16_t indexPixel)
{
return pPixels + indexPixel * PixelSize;
}
static void replicatePixel(uint8_t* pPixelDest, const uint8_t* pPixelSrc, uint16_t count)
{
uint8_t* pEnd = pPixelDest + (count * PixelSize);
while (pPixelDest < pEnd)
{
*pPixelDest++ = pPixelSrc[0];
*pPixelDest++ = pPixelSrc[1];
}
}
static void movePixelsInc(uint8_t* pPixelDest, const uint8_t* pPixelSrc, uint16_t count)
{
uint8_t* pEnd = pPixelDest + (count * PixelSize);
while (pPixelDest < pEnd)
{
*pPixelDest++ = *pPixelSrc++;
*pPixelDest++ = *pPixelSrc++;
}
}
static void movePixelsInc_P(uint8_t* pPixelDest, PGM_VOID_P pPixelSrc, uint16_t count)
{
uint8_t* pEnd = pPixelDest + (count * PixelSize);
const uint8_t* pSrc = (const uint8_t*)pPixelSrc;
while (pPixelDest < pEnd)
{
*pPixelDest++ = pgm_read_byte(pSrc++);
*pPixelDest++ = pgm_read_byte(pSrc++);
}
}
static void movePixelsDec(uint8_t* pPixelDest, const uint8_t* pPixelSrc, uint16_t count)
{
uint8_t* pDestBack = pPixelDest + (count * PixelSize);
const uint8_t* pSrcBack = pPixelSrc + (count * PixelSize);
while (pDestBack > pPixelDest)
{
*--pDestBack = *--pSrcBack;
*--pDestBack = *--pSrcBack;
}
}
typedef RgbColor ColorObject;
};
class Lpd6803BrgFeature : public Lpd68033Elements
{
public:
static void applyPixelColor(uint8_t* pPixels, uint16_t indexPixel, ColorObject color)
{
uint16_t* p = reinterpret_cast<uint16_t*>( getPixelAddress(pPixels, indexPixel) );
*p = encodePixel(color);
}
static ColorObject retrievePixelColor(const uint8_t* pPixels, uint16_t indexPixel)
{
ColorObject color;
const uint16_t* p = reinterpret_cast<const uint16_t*>( getPixelAddress(pPixels, indexPixel) );
return decodePixel(*p);
}
static ColorObject retrievePixelColor_P(PGM_VOID_P pPixels, uint16_t indexPixel)
{
ColorObject color;
const uint8_t* p = getPixelAddress((const uint8_t*)pPixels, indexPixel);
uint16_t color555 = pgm_read_word(p);
return decodePixel(color555);
}
protected:
static uint16_t encodePixel(ColorObject color)
{
uint16_t color555 = color.B >> 3;
color555 <<= 5;
color555 |= color.R >> 3;
color555 <<= 5;
color555 |= color.G >> 3;
color555 |= 0x8000;
return color555;
}
static ColorObject decodePixel(uint16_t color555)
{
ColorObject color;
color555 &= 0x7fff;
color.B = (color555 >> 10) & 0x1f;
color.R = (color555 >> 5) & 0x1f;
color.G = (color555) & 0x1f;
return color;
}
};
class Lpd6803GrbFeature : public Lpd68033Elements
{
public:
static void applyPixelColor(uint8_t* pPixels, uint16_t indexPixel, ColorObject color)
{
uint16_t* p = reinterpret_cast<uint16_t*>(getPixelAddress(pPixels, indexPixel));
*p = encodePixel(color);
}
static ColorObject retrievePixelColor(const uint8_t* pPixels, uint16_t indexPixel)
{
ColorObject color;
const uint16_t* p = reinterpret_cast<const uint16_t*>(getPixelAddress(pPixels, indexPixel));
return decodePixel(*p);
}
static ColorObject retrievePixelColor_P(PGM_VOID_P pPixels, uint16_t indexPixel)
{
ColorObject color;
const uint8_t* p = getPixelAddress((const uint8_t*)pPixels, indexPixel);
uint16_t color555 = pgm_read_word(p);
return decodePixel(color555);
}
protected:
static uint16_t encodePixel(ColorObject color)
{
uint16_t color555 = color.G >> 3;
color555 <<= 5;
color555 |= color.R >> 3;
color555 <<= 5;
color555 |= color.B >> 3;
color555 |= 0x8000;
return color555;
}
static ColorObject decodePixel(uint16_t color555)
{
ColorObject color;
color555 &= 0x7fff;
color.G = (color555 >> 10) & 0x1f;
color.R = (color555 >> 5) & 0x1f;
color.B = (color555) & 0x1f;
return color;
}
};

View File

@@ -0,0 +1,130 @@
/*-------------------------------------------------------------------------
NeoPixel library helper functions for LPD6803 using general Pins
Written by Michael C. Miller.
I invest time and resources providing this open source code,
please support me by dontating (see https://github.com/Makuna/NeoPixelBus)
-------------------------------------------------------------------------
This file is part of the Makuna/NeoPixelBus library.
NeoPixelBus is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
NeoPixelBus is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with NeoPixel. If not, see
<http://www.gnu.org/licenses/>.
-------------------------------------------------------------------------*/
#pragma once
// must also check for arm due to Teensy incorrectly having ARDUINO_ARCH_AVR set
#if defined(ARDUINO_ARCH_AVR) && !defined(__arm__)
#include "TwoWireBitBangImpleAvr.h"
#else
#include "TwoWireBitBangImple.h"
#endif
template<typename T_TWOWIRE> class Lpd6803MethodBase
{
public:
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
_wire(pinClock, pinData)
{
_data = static_cast<uint8_t*>(malloc(_sizeData));
memset(_data, 0, _sizeData);
}
#if !defined(__AVR_ATtiny85__) && !defined(ARDUINO_attiny)
Lpd6803MethodBase(uint16_t pixelCount, size_t elementSize, size_t settingsSize) :
Lpd6803MethodBase(SCK, MOSI, pixelCount, elementSize, settingsSize)
{
}
#endif
~Lpd6803MethodBase()
{
free(_data);
}
bool IsReadyToUpdate() const
{
return true; // dot stars don't have a required delay
}
#if defined(ARDUINO_ARCH_ESP32)
void Initialize(int8_t sck, int8_t miso, int8_t mosi, int8_t ss)
{
_wire.begin(sck, miso, mosi, ss);
}
#endif
void Initialize()
{
_wire.begin();
}
void Update(bool)
{
const uint8_t startFrame[4] = { 0x00 };
_wire.beginTransaction();
// start frame
_wire.transmitBytes(startFrame, sizeof(startFrame));
// data
_wire.transmitBytes(_data, _sizeData);
// end frame
// one bit for every pixel with no less than 1 byte
for (size_t frameByte = 0; frameByte < _sizeFrame; frameByte++)
{
_wire.transmitByte(0x00);
}
_wire.endTransaction();
}
uint8_t* getData() const
{
return _data;
};
size_t getDataSize() const
{
return _sizeData;
};
private:
const size_t _sizeData; // Size of '_data' buffer below
const size_t _sizeFrame;
T_TWOWIRE _wire;
uint8_t* _data; // Holds LED color values
};
typedef Lpd6803MethodBase<TwoWireBitBangImple> Lpd6803Method;
#if !defined(__AVR_ATtiny85__) && !defined(ARDUINO_attiny)
#include "TwoWireSpiImple.h"
typedef Lpd6803MethodBase<TwoWireSpiImple<SpiSpeed20Mhz>> Lpd6803Spi20MhzMethod;
typedef Lpd6803MethodBase<TwoWireSpiImple<SpiSpeed10Mhz>> Lpd6803Spi10MhzMethod;
typedef Lpd6803MethodBase<TwoWireSpiImple<SpiSpeed2Mhz>> Lpd6803Spi2MhzMethod;
typedef Lpd6803Spi10MhzMethod Lpd6803SpiMethod;
#endif