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"
88#include "platforms/chipsets_specialized_ws2812.h"
90#if defined(ARDUINO) && (defined(SoftwareSerial_h) || defined(__SoftwareSerial_h))
92#include <SoftwareSerial.h>
106#if defined(ARDUINO) && (defined(SoftwareSerial_h) || defined(__SoftwareSerial_h))
114template<fl::u8 DATA_PIN, EOrder RGB_ORDER = RGB>
124 virtual void init() {
132 while(pixels.
has(1)) {
196 CONTROLLER::MASK_VALUE> {
209 ControllerBaseT::show(data, nLeds,
brightness);
215 static const int LANES = CONTROLLER::LANES_VALUE;
216 static const fl::u32
MASK = CONTROLLER::MASK_VALUE;
250 while (pixels.has(1)) {
251 pixels.stepDithering();
252 pixels.loadAndScaleRGBW(
rgbw, data, data + 1, data + 2, data + 3);
254 pixels.advanceData();
298 for (fl::u32 i = 0; i < new_size; i++) {
332#ifdef FL_CLOCKLESS_CONTROLLER_DEFINED
360#if !defined(CLOCKLESS_FREQUENCY)
361 #define CLOCKLESS_FREQUENCY F_CPU
379#define FL_NANOSECONDS_TO_CLOCK_CYCLES(_NS) (((_NS * ((CLOCKLESS_FREQUENCY / 1000000L)) + 999)) / 1000)
402template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
403class GE8822Controller800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_GE8822_800KHZ, RGB_ORDER, 4, false> {};
407template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
408class GW6205Controller400Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_GW6205_400KHZ, RGB_ORDER, 4, false> {};
412template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
413class GW6205Controller800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_GW6205_800KHZ, RGB_ORDER> {};
417template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
418class UCS1903Controller400Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_UCS1903_400KHZ, RGB_ORDER> {};
422template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
423class UCS1903BController800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_UCS1903B_800KHZ, RGB_ORDER> {};
427template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
428class UCS1904Controller800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_UCS1904_800KHZ, RGB_ORDER> {};
432template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
433class UCS2903Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_UCS2903, RGB_ORDER> {};
438 template<
int DATA_PIN,
typename TIMING, EOrder RGB_ORDER>
439 class ClocklessControllerWrapper :
public fl::ClocklessControllerImpl<DATA_PIN, TIMING, RGB_ORDER> {};
444template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
449template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
454template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
459template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
460class TM1809Controller800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_TM1809_800KHZ, RGB_ORDER> {};
464template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
465class TM1908Controller
466 :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_TM1908,
468 fl::TIMING_TM1908::RESET> {};
473template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
474class WS2811Controller800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_WS2811_800KHZ_LEGACY, RGB_ORDER> {};
478template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
479class WS2813Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_WS2813, RGB_ORDER> {};
484template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
485class WS2814Controller
486 :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_WS2814,
488 fl::TIMING_WS2814::RESET> {
489 using Base = fl::ClocklessControllerImpl<
505template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
506class WS2818Controller
507 :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_WS2818,
509 fl::TIMING_WS2818::RESET> {};
515#if !FASTLED_WS2812_HAS_SPECIAL_DRIVER
516template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
517class WS2812Controller800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_WS2812_800KHZ, RGB_ORDER> {};
525template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
526class OSTW2020C1EController
527 :
public fl::ClocklessControllerImpl<DATA_PIN,
528 fl::TIMING_WS2812_800KHZ,
529 RGB_ORDER, 0, false, 300> {};
534template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
535class WS2812BMiniV3Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_WS2812B_MINI_V3, RGB_ORDER> {};
540template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
541class WS2812BV5Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_WS2812B_V5, RGB_ORDER> {};
546template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
547class WS2811Controller400Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_WS2811_400KHZ, RGB_ORDER> {};
551template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
552class WS2815Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_WS2815, RGB_ORDER> {};
556template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
557class DP1903Controller800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_DP1903_800KHZ, RGB_ORDER> {};
561template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
562class DP1903Controller400Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_DP1903_400KHZ, RGB_ORDER> {};
566template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
567class TM1803Controller400Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_TM1803_400KHZ, RGB_ORDER> {};
575template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
576class TM1829Controller800Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_TM1829_800KHZ, RGB_ORDER, 0, true, 500> {};
581template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
582class TM1829Controller1600Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_TM1829_1600KHZ, RGB_ORDER, 0, true, 500> {};
586template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
587class LPD1886Controller1250Khz :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_LPD1886_1250KHZ, RGB_ORDER> {};
591template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
592class LPD1886Controller1250Khz_8bit :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_LPD1886_1250KHZ, RGB_ORDER> {};
597template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
598class SK6822Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_SK6822, RGB_ORDER> {};
602template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
603class SK6812Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_SK6812, RGB_ORDER> {};
608template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
609class LC8816EController
610 :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_LC8816E,
612 fl::TIMING_LC8816E::RESET> {
613 using Base = fl::ClocklessControllerImpl<
629template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
630class SM16703Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_SM16703, RGB_ORDER> {};
634template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
635class GS1903Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_GS1903, RGB_ORDER> {};
639template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
640class PL9823Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_PL9823, RGB_ORDER> {};
645template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
646class UCS1912Controller :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_UCS1912, RGB_ORDER> {};
652template <
int DATA_PIN, EOrder RGB_ORDER = RGB>
653class SM16824EController :
public fl::ClocklessControllerImpl<DATA_PIN, fl::TIMING_SM16824E, RGB_ORDER> {};
662template <
int DATA_PIN, EOrder RGB_ORDER = GRB>
663class WS2816Controller
665 WS2812Controller800Khz<DATA_PIN, RGB>::LANES_VALUE,
666 WS2812Controller800Khz<DATA_PIN, RGB>::MASK_VALUE> {
676 typedef WS2812Controller800Khz<DATA_PIN, RGB> ControllerBaseT;
679 void *callBeginShowLeds(
int size)
FL_NO_EXCEPT {
return ControllerBaseT::beginShowLeds(size); }
681 ControllerBaseT::show(data, nLeds,
brightness);
683 void callEndShowLeds(
void *data)
FL_NO_EXCEPT { ControllerBaseT::endShowLeds(data); }
686 static const int LANES = ControllerT::LANES_VALUE;
687 static const fl::u32 MASK = ControllerT::MASK_VALUE;
690 ~WS2816Controller() {
691 mController.
setLeds(
nullptr, 0);
695 mController.setEnabled(
true);
696 void *
result = mController.callBeginShowLeds(2 * size);
697 mController.setEnabled(
false);
702 mController.setEnabled(
true);
703 mController.callEndShowLeds(data);
704 mController.setEnabled(
false);
709 ensureBuffer(pixels.size());
721 mController.setCorrection(
CRGB(255, 255, 255));
722 mController.setTemperature(
CRGB(255, 255, 255));
726 mController.setEnabled(
true);
727 mController.callShow(mData.get(), 2 * pixels.size(), 255);
728 mController.setEnabled(
false);
734 mController.setEnabled(
false);
738 int size_16bit = 2 * size_8bit;
739 if (mController.size() != size_16bit) {
743 mController.setLeds(mData.get(), size_16bit);
747 fl::unique_ptr<CRGB[]> mData;
765#if defined(FL_IS_SILABS)
767#include "platforms/arm/mgm240/clockless_ezws2812_gpio.h"
780template<fl::u8 DATA_PIN, EOrder RGB_ORDER = GRB>
781using EZWS2812_GPIO = fl::ClocklessController_ezWS2812_GPIO_Auto<DATA_PIN, RGB_ORDER>;
783#ifdef FASTLED_USES_EZWS2812_SPI
785#include "platforms/arm/mgm240/clockless_ezws2812_spi.h"
805template<EOrder RGB_ORDER = GRB>
806using EZWS2812_SPI = fl::ClocklessController_ezWS2812_SPI<RGB_ORDER>;
fl::UISlider brightness("Brightness", BRIGHTNESS, 0, 255)
WS2812< DATA_PIN, RGB > ControllerT
void mark() FL_NO_EXCEPT
Reset the timestamp that marks the start of the wait period.
void wait() FL_NO_EXCEPT
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...
CPixelLEDController(RegistrationMode mode) FL_NO_EXCEPT
virtual void showPixels(PixelController< RGB_ORDER, LANES, MASK > &pixels) FL_NO_EXCEPT=0
Send the LED data to the strip.
Template extension of the CLEDController class.
CLEDController & setRgbw(const Rgbw &arg=RgbwDefault::value()) FL_NO_EXCEPT
VIRTUAL_IF_NOT_AVR void * beginShowLeds(int size) FL_NO_EXCEPT
VIRTUAL_IF_NOT_AVR int size() const FL_NO_EXCEPT
How many LEDs does this controller manage?
CLEDController & setLeds(CRGB *data, int nLeds) FL_NO_EXCEPT
Set the default array of LEDs to be used by this controller.
VIRTUAL_IF_NOT_AVR void endShowLeds(void *data) FL_NO_EXCEPT
Rgbw getRgbw() const FL_NO_EXCEPT
virtual void init() FL_NO_EXCEPT=0
Initialize the LED controller.
#define VIRTUAL_IF_NOT_AVR
#define FL_DISABLE_WARNING_PUSH
#define FL_DISABLE_WARNING_POP
#define OVERRIDE_IF_NOT_AVR
#define FL_DISABLE_WARNING_SUBOBJECT_LINKAGE
#define DISABLE_DITHER
Disable dithering.
Defines color channel ordering enumerations.
Declares functions for five-bit gamma correction.
virtual void showPixels(PixelController< RGB_ORDER, LANES, MASK > &pixels) FL_NO_EXCEPT override
Main rendering function that converts RGB to RGBW and shows pixels.
fl::i32 mNumRGBLeds
Number of RGB LEDs in the original array.
~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 * callBeginShowLeds(int size) FL_NO_EXCEPT
VIRTUAL_IF_NOT_AVR void endShowLeds(void *data) FL_NO_EXCEPT OVERRIDE_IF_NOT_AVR
VIRTUAL_IF_NOT_AVR void * beginShowLeds(int size) FL_NO_EXCEPT OVERRIDE_IF_NOT_AVR
ControllerT mController
The underlying RGB controller instance.
fl::unique_ptr< CRGB[]> mRGBWPixels
Internal buffer for packed RGBW data.
void ensureBuffer(fl::i32 num_leds) FL_NO_EXCEPT
Ensures the internal RGBW buffer is large enough for the LED count.
RGBWEmulatedController(const Rgbw &rgbw=RgbwDefault()) FL_NO_EXCEPT
Constructor with optional RGBW configuration.
fl::i32 mNumRGBWLeds
Number of RGBW pixels the buffer can hold.
void init() FL_NO_EXCEPT override
Initialize the controller and disable the base controller.
static const fl::u32 MASK
void callShow(CRGB *data, int nLeds, fl::u8 brightness) FL_NO_EXCEPT
void callEndShowLeds(void *data) FL_NO_EXCEPT
CONTROLLER ControllerBaseT
Centralized LED chipset timing definitions with nanosecond precision.
MY9221 12-channel LED driver controller.
constexpr remove_reference< T >::type && move(T &&t) FL_NO_EXCEPT
fl::enable_if<!fl::is_array< T >::value, unique_ptr< T > >::type make_unique(Args &&... args) FL_NO_EXCEPT
void encodeWS2816(InputIterator first, InputIterator last, OutputIterator out) FL_NO_EXCEPT
Encode 16-bit RGB pixel data into dual 8-bit RGB format for WS2816.
UCS7604ControllerT< DATA_PIN, RGB_ORDER, fl::UCS7604Mode::UCS7604_MODE_16BIT_800KHZ, fl::TIMING_UCS7604_800KHZ, CLOCKLESS_CONTROLLER > UCS7604Controller16bitT
void init(Context &ctx, int w, int h) FL_NO_EXCEPT
pair< detail::ScaledPixelIteratorRGB16, detail::ScaledPixelIteratorRGB16 > makeScaledPixelRangeRGB16(PixelIterator *pixels) FL_NO_EXCEPT
Create 16-bit RGB input iterator range from PixelIterator.
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_NO_EXCEPT
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.
Portable compile-time assertion wrapper.
FASTLED_FORCE_INLINE bool has(int n) FL_NO_EXCEPT
Do we have n pixels left to process?
FASTLED_FORCE_INLINE void stepDithering() FL_NO_EXCEPT
Step the dithering forward - creates triangular wave that toggles between pixels.
FASTLED_FORCE_INLINE fl::u8 loadAndScale1(int lane, fl::u8 scale) FL_NO_EXCEPT
non-template alias of loadAndScale<1>()
FASTLED_FORCE_INLINE void advanceData() FL_NO_EXCEPT
Advance the data pointer forward, adjust position counter.
FASTLED_FORCE_INLINE fl::u8 loadAndScale0(int lane, fl::u8 scale) FL_NO_EXCEPT
non-template alias of loadAndScale<0>()
FASTLED_FORCE_INLINE fl::u8 loadAndScale2(int lane, fl::u8 scale) FL_NO_EXCEPT
non-template alias of loadAndScale<2>()
static u32 size_as_rgb(u32 num_of_rgbw_pixels) FL_NO_EXCEPT
static Rgbw value() FL_NO_EXCEPT
static Rgbw value() FL_NO_EXCEPT
UCS7604 LED chipset controller implementation for FastLED.
WS2816 encoder - converts 16-bit RGB pixels to dual 8-bit RGB format.