forked from Makuna/NeoPixelBus
Show only when we have changes
Keep track of a dirty flag and only do the time consuming communications if there has been a change
This commit is contained in:
@@ -36,8 +36,8 @@ NeoPixelBus::NeoPixelBus(uint16_t n, uint8_t p, uint8_t t) :
|
|||||||
_sizePixels(n * 3),
|
_sizePixels(n * 3),
|
||||||
_pin(p),
|
_pin(p),
|
||||||
_animationLastTick(0),
|
_animationLastTick(0),
|
||||||
_activeAnimations(0)
|
_activeAnimations(0),
|
||||||
,_flagsPixels(t)
|
_flagsPixels(t)
|
||||||
{
|
{
|
||||||
setPin(p);
|
setPin(p);
|
||||||
|
|
||||||
@@ -69,12 +69,16 @@ void NeoPixelBus::Begin(void)
|
|||||||
{
|
{
|
||||||
pinMode(_pin, OUTPUT);
|
pinMode(_pin, OUTPUT);
|
||||||
digitalWrite(_pin, LOW);
|
digitalWrite(_pin, LOW);
|
||||||
|
|
||||||
|
Dirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NeoPixelBus::Show(void)
|
void NeoPixelBus::Show(void)
|
||||||
{
|
{
|
||||||
if (!_pixels)
|
if (!_pixels)
|
||||||
return;
|
return;
|
||||||
|
if (!IsDirty())
|
||||||
|
return;
|
||||||
|
|
||||||
// Data latch = 50+ microsecond pause in the output stream. Rather than
|
// Data latch = 50+ microsecond pause in the output stream. Rather than
|
||||||
// put a delay at the end of the function, the ending time is noted and
|
// put a delay at the end of the function, the ending time is noted and
|
||||||
@@ -849,6 +853,7 @@ void NeoPixelBus::Show(void)
|
|||||||
#endif // end Architecture select
|
#endif // end Architecture select
|
||||||
|
|
||||||
interrupts();
|
interrupts();
|
||||||
|
ResetDirty();
|
||||||
_endTime = micros(); // Save EOD time for latch on next call
|
_endTime = micros(); // Save EOD time for latch on next call
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -892,6 +897,8 @@ void NeoPixelBus::UpdatePixelColor(
|
|||||||
uint8_t g,
|
uint8_t g,
|
||||||
uint8_t b)
|
uint8_t b)
|
||||||
{
|
{
|
||||||
|
Dirty();
|
||||||
|
|
||||||
uint8_t *p = &_pixels[n * 3];
|
uint8_t *p = &_pixels[n * 3];
|
||||||
if ((_flagsPixels & NEO_COLMASK) == NEO_GRB)
|
if ((_flagsPixels & NEO_COLMASK) == NEO_GRB)
|
||||||
{
|
{
|
||||||
|
@@ -35,26 +35,40 @@ License along with NeoPixel. If not, see
|
|||||||
#define NEO_KHZ400 0x00 // 400 KHz datastream
|
#define NEO_KHZ400 0x00 // 400 KHz datastream
|
||||||
#define NEO_KHZ800 0x02 // 800 KHz datastream
|
#define NEO_KHZ800 0x02 // 800 KHz datastream
|
||||||
#define NEO_SPDMASK 0x02
|
#define NEO_SPDMASK 0x02
|
||||||
|
#define NEO_DIRTY 0x80 // a change was made it _pixels that requires a show
|
||||||
|
|
||||||
// v1 NeoPixels aren't handled by default, include the following define before the
|
// v1 NeoPixels aren't handled by default, include the following define before the
|
||||||
// NeoPixelBus library include to support the slower bus speeds
|
// NeoPixelBus library include to support the slower bus speeds
|
||||||
// #define INCLUDE_NEO_KHZ400_SUPPORT
|
// #define INCLUDE_NEO_KHZ400_SUPPORT
|
||||||
|
|
||||||
class NeoPixelBus
|
class NeoPixelBus
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// Constructor: number of LEDs, pin number, LED type
|
// Constructor: number of LEDs, pin number, LED type
|
||||||
NeoPixelBus(uint16_t n, uint8_t p = 6, uint8_t t = NEO_GRB | NEO_KHZ800);
|
NeoPixelBus(uint16_t n, uint8_t p = 6, uint8_t t = NEO_GRB | NEO_KHZ800);
|
||||||
~NeoPixelBus();
|
~NeoPixelBus();
|
||||||
|
|
||||||
void Begin(void);
|
void Begin();
|
||||||
void Show(void);
|
void Show();
|
||||||
|
|
||||||
|
bool IsDirty()
|
||||||
|
{
|
||||||
|
return (_flagsPixels & NEO_DIRTY);
|
||||||
|
};
|
||||||
|
void Dirty()
|
||||||
|
{
|
||||||
|
_flagsPixels |= NEO_DIRTY;
|
||||||
|
};
|
||||||
|
void ResetDirty()
|
||||||
|
{
|
||||||
|
_flagsPixels &= ~NEO_DIRTY;
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t* Pixels() const
|
uint8_t* Pixels() const
|
||||||
{
|
{
|
||||||
return _pixels;
|
return _pixels;
|
||||||
};
|
};
|
||||||
uint16_t PixelCount(void) const
|
uint16_t PixelCount() const
|
||||||
{
|
{
|
||||||
return _countPixels;
|
return _countPixels;
|
||||||
};
|
};
|
||||||
@@ -86,8 +100,8 @@ private:
|
|||||||
|
|
||||||
const uint16_t _countPixels; // Number of RGB LEDs in strip
|
const uint16_t _countPixels; // Number of RGB LEDs in strip
|
||||||
const uint16_t _sizePixels; // Size of '_pixels' buffer below
|
const uint16_t _sizePixels; // Size of '_pixels' buffer below
|
||||||
const uint8_t _flagsPixels; // Pixel flags (400 vs 800 KHz, RGB vs GRB color)
|
|
||||||
|
uint8_t _flagsPixels; // Pixel flags (400 vs 800 KHz, RGB vs GRB color)
|
||||||
uint8_t _pin; // Output pin number
|
uint8_t _pin; // Output pin number
|
||||||
uint8_t* _pixels; // Holds LED color values (3 bytes each)
|
uint8_t* _pixels; // Holds LED color values (3 bytes each)
|
||||||
uint32_t _endTime; // Latch timing reference
|
uint32_t _endTime; // Latch timing reference
|
||||||
|
Reference in New Issue
Block a user