10#include "platforms/shared/spi_pixel_writer.h"
35 fl::u32 START_FRAME = 0x00000000,
36 fl::u32 END_FRAME = 0xFF000000
39 typedef fl::SPIOutput<DATA_PIN, CLOCK_PIN, SPI_SPEED>
SPI;
43 mSPI.writeWord(START_FRAME >> 16);
44 mSPI.writeWord(START_FRAME & 0xFFFF);
47 int nDWords = (nLeds/32);
61#ifdef FASTLED_SPI_BYTE_ONLY
67 fl::u16 b = 0xE000 | (
brightness << 8) | (fl::u16)b0;
76#ifdef FASTLED_SPI_BYTE_ONLY
80 mSPI.writeWord(fl::u16(b1) << 8 | b2);
87 virtual void init()
override {
94 switch (GAMMA_CORRECTION_MODE) {
111#if FASTLED_HD_COLOR_MIXING
113 pixels.loadRGBScaleAndBrightness(out_s0, out_s1, out_s2, &
brightness);
115 static fl::u16 map(fl::u16
x, fl::u16 in_min, fl::u16 in_max, fl::u16 out_min, fl::u16 out_max) {
116 const fl::u16 run = in_max - in_min;
117 const fl::u16 rise = out_max - out_min;
118 const fl::u16 delta =
x - in_min;
119 return (delta * rise) / run + out_min;
123 fl::u16 bri = Math::map(
brightness, 0, 255, 0, 31);
128 *out_brightness =
static_cast<fl::u8>(bri);
133#if FASTLED_USE_GLOBAL_BRIGHTNESS == 1
135 const fl::u16 maxBrightness = 0x1F;
137 fl::u8 max_s01 = (s0 > s1) ? s0 : s1;
138 fl::u8 max_component = (max_s01 > s2) ? max_s01 : s2;
139 fl::u16
brightness = ((((fl::u16)max_component + 1) * maxBrightness - 1) >> 8) + 1;
156 fl::u8 s0, s1, s2, global_brightness;
159 while (pixels.
has(1)) {
162 writeLed(global_brightness, c0, c1, c2);
168 mSPI.endTransaction();
171 mSPI.finalizeTransmission();
175 static constexpr fl::u16 kBatchSize = 8;
176 const fl::u16 n =
static_cast<fl::u16
>(pixels.
size());
179 fl::u8 scale_r, scale_g, scale_b, global_brightness;
180 #if FASTLED_HD_COLOR_MIXING
181 pixels.loadRGBScaleAndBrightness(&scale_r, &scale_g, &scale_b, &global_brightness);
184 global_brightness = 255;
186 const CRGB colors_scale(scale_r, scale_g, scale_b);
197 fl::u16 remaining = n;
198 while (remaining > 0) {
199 const fl::u16 batch = (remaining < kBatchSize) ? remaining : kBatchSize;
200 CRGB input_buf[kBatchSize];
204 for (fl::u16 i = 0; i < batch; ++i) {
206 input_buf[i] =
CRGB(raw[0], raw[1], raw[2]);
214 for (fl::u16 i = 0; i < batch; ++i) {
216 writeLed(gamma_buf[i].brightness_5bit,
217 rgb.raw[b0_index], rgb.raw[b1_index], rgb.raw[b2_index]);
224 mSPI.endTransaction();
225 mSPI.finalizeTransmission();
242 static const fl::u8 frame[] = {
266 return 4 + (num_leds * 4) + (4 * ((num_leds / 32) + 1));
291 fl::FiveBitGammaCorrectionMode::kFiveBitGammaCorrectionMode_BitShift,
293 fl::u32(0x00000000)> {
315 fl::FiveBitGammaCorrectionMode::kFiveBitGammaCorrectionMode_Null,
337 fl::FiveBitGammaCorrectionMode::kFiveBitGammaCorrectionMode_BitShift,
355 fl::FiveBitGammaCorrectionMode::kFiveBitGammaCorrectionMode_Null,
fl::UISlider brightness("Brightness", BRIGHTNESS, 0, 255)
void showPixelsGammaBitShift(PixelController< RGB_ORDER > &pixels)
virtual void init() override
Initialize the LED controller.
static constexpr size_t calculateBytes(size_t num_leds)
Calculate total byte count for APA102 protocol Used for quad-SPI buffer pre-allocation.
static constexpr size_t getPaddingLEDFrameSize()
Get size of padding LED frame in bytes.
virtual void showPixels(PixelController< RGB_ORDER > &pixels) override
Send the LED data to the strip.
static fl::span< const fl::u8 > getPaddingLEDFrame()
Get padding LED frame for synchronized latching in quad-SPI Returns a black LED frame to prepend to s...
void showPixelsDefault(PixelController< RGB_ORDER > &pixels)
FASTLED_FORCE_INLINE void writeLed(fl::u8 brightness, fl::u8 b0, fl::u8 b1, fl::u8 b2)
fl::SPIOutput< DATA_PIN, CLOCK_PIN, SPI_SPEED > SPI
static void getGlobalBrightnessAndScalingFactors(PixelController< RGB_ORDER > &pixels, fl::u8 *out_s0, fl::u8 *out_s1, fl::u8 *out_s2, fl::u8 *out_brightness)
APA102Controller() FL_NOEXCEPT
FASTLED_FORCE_INLINE void write2Bytes(fl::u8 b1, fl::u8 b2)
void endBoundary(int nLeds)
static constexpr fl::u8 getPaddingByte()
Get the protocol-safe padding byte for APA102 Used for quad-SPI lane padding when strips have differe...
APA102ControllerHD() FL_NOEXCEPT=default
CPixelLEDController(RegistrationMode mode)
HD107 is just the APA102 with a default 40Mhz clock rate.
HD107HD is just the APA102HD with a default 40Mhz clock rate.
defines the templated version of the CLEDController class
Serial peripheral interface (SPI) definitions per platform.
Declares functions for five-bit gamma correction.
FiveBitGammaCorrectionMode
@ kFiveBitGammaCorrectionMode_Null
@ kFiveBitGammaCorrectionMode_BitShift
FL_OPTIMIZE_FUNCTION void five_bit_hd_gamma_bitshift(fl::span< const CRGB > colors, CRGB colors_scale, u8 global_brightness, fl::span< CRGB > out_colors, fl::span< u8 > out_power_5bit)
Base definition for an LED controller.
#define FASTLED_FORCE_INLINE
FASTLED_FORCE_INLINE int size() const
Get the length of the LED strip.
FASTLED_FORCE_INLINE void loadAndScaleRGB(fl::u8 *b0_out, fl::u8 *b1_out, fl::u8 *b2_out)
const fl::u8 * getRawPixelData() const
Get read-only access to the current pixel data Used by encoders to access raw RGB values for HD proce...
FASTLED_FORCE_INLINE void advanceData()
Advance the data pointer forward, adjust position counter.
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.