3#ifndef __INC_CHIPSETS_H
4#define __INC_CHIPSETS_H
18#include "platforms/is_platform.h"
27#include "platforms/avr/led_timing_legacy_avr.h"
32#include "platforms/clockless.h"
39#include "platforms/shared/spi_pixel_writer.h"
44#include "platforms/spi_output_template.h"
87#include "platforms/chipsets_specialized_ws2812.h"
89#if defined(ARDUINO) && (defined(SoftwareSerial_h) || defined(__SoftwareSerial_h))
91#include <SoftwareSerial.h>
105#if defined(ARDUINO) && (defined(SoftwareSerial_h) || defined(__SoftwareSerial_h))
113template<fl::u8 DATA_PIN, EOrder RGB_ORDER = RGB>
123 virtual void init() {
131 while(pixels.
has(1)) {
195 CONTROLLER::MASK_VALUE> {
208 ControllerBaseT::show(data, nLeds,
brightness);
214 static const int LANES = CONTROLLER::LANES_VALUE;
215 static const fl::u32
MASK = CONTROLLER::MASK_VALUE;
249 while (pixels.
has(1)) {
297 for (fl::u32 i = 0; i < new_size; i++) {
330#ifdef FL_CLOCKLESS_CONTROLLER_DEFINED
358#if !defined(CLOCKLESS_FREQUENCY)
359 #define CLOCKLESS_FREQUENCY F_CPU
377#define FL_NANOSECONDS_TO_CLOCK_CYCLES(_NS) (((_NS * ((CLOCKLESS_FREQUENCY / 1000000L)) + 999)) / 1000)
400template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
401class GE8822Controller800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_GE8822_800KHZ, RGB_ORDER, 4, false> {};
405template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
406class GW6205Controller400Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_GW6205_400KHZ, RGB_ORDER, 4, false> {};
410template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
411class GW6205Controller800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_GW6205_800KHZ, RGB_ORDER> {};
415template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
416class UCS1903Controller400Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_UCS1903_400KHZ, RGB_ORDER> {};
420template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
421class UCS1903BController800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_UCS1903B_800KHZ, RGB_ORDER> {};
425template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
426class UCS1904Controller800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_UCS1904_800KHZ, RGB_ORDER> {};
430template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
431class UCS2903Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_UCS2903, RGB_ORDER> {};
436 template<
int DATA_PIN,
typename TIMING, EOrder RGB_ORDER>
437 class ClocklessControllerWrapper :
public fl::ClocklessControllerImpl<DATA_PIN, TIMING, RGB_ORDER> {};
442template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
447template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
452template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
457template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
458class TM1809Controller800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_TM1809_800KHZ, RGB_ORDER> {};
463template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
464class WS2811Controller800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_WS2811_800KHZ_LEGACY, RGB_ORDER> {};
468template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
469class WS2813Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_WS2813, RGB_ORDER> {};
475#if !FASTLED_WS2812_HAS_SPECIAL_DRIVER
476template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
477class WS2812Controller800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_WS2812_800KHZ, RGB_ORDER> {};
483template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
484class WS2812BMiniV3Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_WS2812B_MINI_V3, RGB_ORDER> {};
489template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
490class WS2812BV5Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_WS2812B_V5, RGB_ORDER> {};
495template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
496class WS2811Controller400Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_WS2811_400KHZ, RGB_ORDER> {};
500template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
501class WS2815Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_WS2815, RGB_ORDER> {};
505template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
506class DP1903Controller800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_DP1903_800KHZ, RGB_ORDER> {};
510template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
511class DP1903Controller400Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_DP1903_400KHZ, RGB_ORDER> {};
515template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
516class TM1803Controller400Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_TM1803_400KHZ, RGB_ORDER> {};
520template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
521class TM1829Controller800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_TM1829_800KHZ, RGB_ORDER> {};
525template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
526class TM1829Controller1600Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_TM1829_1600KHZ, RGB_ORDER> {};
530template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
531class LPD1886Controller1250Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_LPD1886_1250KHZ, RGB_ORDER> {};
535template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
536class LPD1886Controller1250Khz_8bit :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_LPD1886_1250KHZ, RGB_ORDER> {};
541template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
542class SK6822Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_SK6822, RGB_ORDER> {};
546template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
547class SK6812Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_SK6812, RGB_ORDER> {};
551template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
552class SM16703Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_SM16703, RGB_ORDER> {};
556template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
557class PL9823Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_PL9823, RGB_ORDER> {};
562template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
563class UCS1912Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_UCS1912, RGB_ORDER> {};
569template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
570class SM16824EController :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_SM16824E, RGB_ORDER> {};
579template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
580class WS2816Controller
582 WS2812Controller800Khz<DATA_PIN, RGB>::LANES_VALUE,
583 WS2812Controller800Khz<DATA_PIN, RGB>::MASK_VALUE> {
593 typedef WS2812Controller800Khz<DATA_PIN, RGB> ControllerBaseT;
596 void *callBeginShowLeds(
int size) {
return ControllerBaseT::beginShowLeds(size); }
598 ControllerBaseT::show(data, nLeds,
brightness);
600 void callEndShowLeds(
void *data) { ControllerBaseT::endShowLeds(data); }
603 static const int LANES = ControllerT::LANES_VALUE;
604 static const fl::u32 MASK = ControllerT::MASK_VALUE;
606 WS2816Controller() {}
607 ~WS2816Controller() {
608 mController.setLeds(
nullptr, 0);
612 mController.setEnabled(
true);
613 void *
result = mController.callBeginShowLeds(2 * size);
614 mController.setEnabled(
false);
619 mController.setEnabled(
true);
620 mController.callEndShowLeds(data);
621 mController.setEnabled(
false);
624 virtual void showPixels(PixelController<RGB_ORDER, LANES, MASK> &pixels)
override {
626 ensureBuffer(pixels.
size());
629 fl::PixelIterator pixel_iter = pixels.
as_iterator(fl::Rgbw());
638 mController.setCorrection(
CRGB(255, 255, 255));
639 mController.setTemperature(
CRGB(255, 255, 255));
643 mController.setEnabled(
true);
644 mController.callShow(mData.get(), 2 * pixels.
size(), 255);
645 mController.setEnabled(
false);
649 void init()
override {
651 mController.setEnabled(
false);
654 void ensureBuffer(
int size_8bit) {
655 int size_16bit = 2 * size_8bit;
656 if (mController.size() != size_16bit) {
660 mController.setLeds(mData.get(), size_16bit);
664 fl::unique_ptr<CRGB[]> mData;
682#if defined(FL_IS_SILABS)
684#include "platforms/arm/mgm240/clockless_ezws2812_gpio.h"
697template<fl::u8 DATA_PIN, EOrder RGB_ORDER = GRB>
698using EZWS2812_GPIO = fl::ClocklessController_ezWS2812_GPIO_Auto<DATA_PIN, RGB_ORDER>;
700#ifdef FASTLED_USES_EZWS2812_SPI
702#include "platforms/arm/mgm240/clockless_ezws2812_spi.h"
721template<EOrder RGB_ORDER = GRB>
722using EZWS2812_SPI = fl::ClocklessController_ezWS2812_SPI<RGB_ORDER>;
fl::UISlider brightness("Brightness", BRIGHTNESS, 0, 255)
WS2812< DATA_PIN, RGB > ControllerT
void mark()
Reset the timestamp that marks the start of the wait period.
void wait()
Blocking delay until WAIT time since mark() has passed.
Class to ensure that a minimum amount of time has kicked since the last time run - and delay if not e...
virtual void showPixels(PixelController< RGB_ORDER, LANES, MASK > &pixels)=0
Send the LED data to the strip.
CPixelLEDController(RegistrationMode mode)
Template extension of the CLEDController class.
virtual void * beginShowLeds(int size) FL_NOEXCEPT
CLEDController & setRgbw(const Rgbw &arg=RgbwDefault::value()) FL_NOEXCEPT
virtual void endShowLeds(void *data) FL_NOEXCEPT
virtual void init() FL_NOEXCEPT=0
Initialize the LED controller.
Rgbw getRgbw() const FL_NOEXCEPT
virtual int size() const FL_NOEXCEPT
How many LEDs does this controller manage?
#define DISABLE_DITHER
Disable dithering.
Defines color channel ordering enumerations.
Declares functions for five-bit gamma correction.
fl::i32 mNumRGBLeds
Number of RGB LEDs in the original array.
void ensureBuffer(fl::i32 num_leds)
Ensures the internal RGBW buffer is large enough for the LED count.
~RGBWEmulatedController()=default
Destructor - cleans up the internal RGBW buffer.
FL_STATIC_ASSERT(RGB==CONTROLLER::RGB_ORDER_VALUE, "The delegated controller MUST NOT do reordering")
void callEndShowLeds(void *data)
virtual void * beginShowLeds(int size) override
ControllerT mController
The underlying RGB controller instance.
fl::unique_ptr< CRGB[]> mRGBWPixels
Internal buffer for packed RGBW data.
void init() override
Initialize the controller and disable the base controller.
virtual void endShowLeds(void *data) override
fl::i32 mNumRGBWLeds
Number of RGBW pixels the buffer can hold.
static const fl::u32 MASK
virtual void showPixels(PixelController< RGB_ORDER, LANES, MASK > &pixels) override
Main rendering function that converts RGB to RGBW and shows pixels.
void callShow(CRGB *data, int nLeds, fl::u8 brightness)
RGBWEmulatedController(const Rgbw &rgbw=RgbwDefault())
Constructor with optional RGBW configuration.
void * callBeginShowLeds(int size)
CONTROLLER ControllerBaseT
Centralized LED chipset timing definitions with nanosecond precision.
pair< detail::ScaledPixelIteratorRGB16, detail::ScaledPixelIteratorRGB16 > makeScaledPixelRangeRGB16(PixelIterator *pixels) FL_NOEXCEPT
Create 16-bit RGB input iterator range from PixelIterator.
constexpr remove_reference< T >::type && move(T &&t) FL_NOEXCEPT
void encodeWS2816(InputIterator first, InputIterator last, OutputIterator out)
Encode 16-bit RGB pixel data into dual 8-bit RGB format for WS2816.
fl::enable_if<!fl::is_array< T >::value, unique_ptr< T > >::type make_unique(Args &&... args) FL_NOEXCEPT
UCS7604ControllerT< DATA_PIN, RGB_ORDER, fl::UCS7604Mode::UCS7604_MODE_16BIT_800KHZ, fl::TIMING_UCS7604_800KHZ, CLOCKLESS_CONTROLLER > UCS7604Controller16bitT
expected< T, E > result
Alias for expected (Rust-style naming)
UCS7604ControllerT< DATA_PIN, RGB_ORDER, fl::UCS7604Mode::UCS7604_MODE_8BIT_800KHZ, fl::TIMING_UCS7604_800KHZ, CLOCKLESS_CONTROLLER > UCS7604Controller8bitT
To * bit_cast_ptr(void *storage) FL_NOEXCEPT
UCS7604ControllerT< DATA_PIN, RGB_ORDER, fl::UCS7604Mode::UCS7604_MODE_16BIT_1600KHZ, fl::TIMING_UCS7604_1600KHZ, CLOCKLESS_CONTROLLER > UCS7604Controller16bit1600T
Includes defintions for RGB and HSV pixels.
#define FL_DISABLE_WARNING_PUSH
#define FL_DISABLE_WARNING_POP
#define FL_DISABLE_WARNING_SUBOBJECT_LINKAGE
Portable compile-time assertion wrapper.
FASTLED_FORCE_INLINE int size() const
Get the length of the LED strip.
FASTLED_FORCE_INLINE void loadAndScaleRGBW(Rgbw rgbw, fl::u8 *b0_out, fl::u8 *b1_out, fl::u8 *b2_out, fl::u8 *b3_out)
FASTLED_FORCE_INLINE fl::u8 loadAndScale0(int lane, fl::u8 scale)
non-template alias of loadAndScale<0>()
FASTLED_FORCE_INLINE void advanceData()
Advance the data pointer forward, adjust position counter.
FASTLED_FORCE_INLINE fl::u8 loadAndScale1(int lane, fl::u8 scale)
non-template alias of loadAndScale<1>()
FASTLED_FORCE_INLINE bool has(int n)
Do we have n pixels left to process?
FASTLED_FORCE_INLINE void stepDithering()
Step the dithering forward - creates triangular wave that toggles between pixels.
FASTLED_FORCE_INLINE fl::u8 loadAndScale2(int lane, fl::u8 scale)
non-template alias of loadAndScale<2>()
FASTLED_FORCE_INLINE fl::PixelIterator as_iterator(const Rgbw &rgbw)
static u32 size_as_rgb(u32 num_of_rgbw_pixels) FL_NOEXCEPT
UCS7604 LED chipset controller implementation for FastLED.
WS2816 encoder - converts 16-bit RGB pixels to dual 8-bit RGB format.