8#include "platforms/shared/spi_bitbang/spi_isr_1.h"
9#include "platforms/shared/spi_bitbang/spi_isr_2.h"
10#include "platforms/shared/spi_bitbang/spi_isr_4.h"
11#include "platforms/shared/spi_bitbang/spi_isr_8.h"
12#include "platforms/shared/spi_bitbang/spi_isr_16.h"
13#include "platforms/shared/spi_bitbang/spi_isr_32.h"
14#include "platforms/shared/spi_bitbang/spi_block_1.h"
15#include "platforms/shared/spi_bitbang/spi_block_2.h"
16#include "platforms/shared/spi_bitbang/spi_block_4.h"
17#include "platforms/shared/spi_bitbang/spi_block_8.h"
18#include "platforms/shared/spi_bitbang/spi_block_16.h"
19#include "platforms/shared/spi_bitbang/spi_block_32.h"
68 static_cast<SpiIsr1*
>(
backend)->stopISR();
70 static_cast<SpiIsr2*
>(
backend)->stopISR();
72 static_cast<SpiIsr4*
>(
backend)->stopISR();
74 static_cast<SpiIsr8*
>(
backend)->stopISR();
76 static_cast<SpiIsr16*
>(
backend)->stopISR();
78 static_cast<SpiIsr32*
>(
backend)->stopISR();
102 size_t num_pins = gpio_pins.size();
105 for (
int byte_val = 0; byte_val < 256; byte_val++) {
110 for (
size_t bit_pos = 0; bit_pos < num_pins && bit_pos < 8; bit_pos++) {
111 u32 pin_mask = 1u << gpio_pins[bit_pos];
113 if (byte_val & (1 << bit_pos)) {
114 set_mask |= pin_mask;
116 clear_mask |= pin_mask;
121 for (
size_t pin_idx = 8; pin_idx < num_pins; pin_idx++) {
122 clear_mask |= (1u << gpio_pins[pin_idx]);
125 set_masks[byte_val] = set_mask;
126 clear_masks[byte_val] = clear_mask;
140 size_t num_pins = config.gpio_pins.size();
141 if (num_pins == 0 || num_pins > 32) {
142 FL_WARN(
"ParallelDevice: Invalid number of GPIO pins (" << num_pins <<
"), must be 1-32");
145 FL_DBG(
"ParallelDevice: Created with " << num_pins <<
" GPIO pins");
159 if (
pImpl->initialized) {
164 size_t num_pins =
pImpl->config.gpio_pins.size();
167 if (num_pins == 0 || num_pins > 32) {
172 u8 backend_width = 1;
173 if (num_pins > 16) backend_width = 32;
174 else if (num_pins > 8) backend_width = 16;
175 else if (num_pins > 4) backend_width = 8;
176 else if (num_pins > 2) backend_width = 4;
177 else if (num_pins > 1) backend_width = 2;
179 pImpl->backend_width = backend_width;
184 pImpl->is_isr_mode = use_isr;
188 u32 clear_masks[256];
189 buildDefaultLUT(
pImpl->config.gpio_pins, set_masks, clear_masks);
197 FL_DBG(
"ParallelDevice: Initializing ISR mode (width=" << ((
int)backend_width) <<
")");
201 return fl::task::Error(
"ISR mode not yet implemented for ParallelDevice");
205 FL_DBG(
"ParallelDevice: Initializing bit-bang mode (width=" << ((
int)backend_width) <<
")");
209 return fl::task::Error(
"Bit-bang mode not yet implemented for ParallelDevice");
212 pImpl->initialized =
true;
225 pImpl->releaseBackend();
227 FL_DBG(
"ParallelDevice: Shutdown complete");
237 "Device not initialized");
240 if (!data || size == 0) {
242 "Invalid data or size");
248 "ParallelDevice::write() not yet implemented");
274 if (!set_masks || !clear_masks) {
275 FL_WARN(
"ParallelDevice: Invalid LUT pointers");
281 FL_DBG(
"ParallelDevice: LUT configuration not yet implemented");
285 static const Config empty_config;
static expected failure(E err, const char *msg=nullptr) FL_NO_EXCEPT
Create error result.
bool isBusy() const FL_NO_EXCEPT
Check if transmission is in progress.
void configureLUT(const u32 *set_masks, const u32 *clear_masks) FL_NO_EXCEPT
Configure custom LUT (advanced)
bool isReady() const FL_NO_EXCEPT
Check if device is initialized.
void end() FL_NO_EXCEPT
Shutdown hardware and release resources.
fl::optional< fl::task::Error > begin() FL_NO_EXCEPT
Initialize hardware and setup LUT.
~ParallelDevice() FL_NO_EXCEPT
Destructor - releases hardware resources.
Result< Transaction > write(const u8 *data, size_t size) FL_NO_EXCEPT
Write data (single stream drives all pins via LUT)
const Config & getConfig() const FL_NO_EXCEPT
Get current configuration.
ParallelDevice(const Config &config) FL_NO_EXCEPT
Construct parallel device.
bool waitComplete(u32 timeout_ms=(fl::numeric_limits< u32 >::max)()) FL_NO_EXCEPT
Wait for pending transmission to complete.
fl::unique_ptr< Impl > pImpl
Shared implementation helpers for SPI device classes.
Centralized logging categories for FastLED hardware interfaces and subsystems.
fl::enable_if<!fl::is_array< T >::value, unique_ptr< T > >::type make_unique(Args &&... args) FL_NO_EXCEPT
void buildDefaultLUT(const fl::vector< u8 > &gpio_pins, u32 *set_masks, u32 *clear_masks) FL_NO_EXCEPT
Build default LUT for parallel GPIO mapping.
fl::result< T, SPIError > Result
u8 u8 fract8 blur_amount FL_NO_EXCEPT
constexpr nullopt_t nullopt
SpiParallelMode
Parallel device execution modes.
@ ISR_ASYNC
ISR-driven async mode.
@ AUTO
Auto-select best mode (default: ISR)
Base definition for an LED controller.
Parallel GPIO SPI device for 1-32 outputs driven from single data stream.
u32 timer_hz
Timer frequency for ISR mode.
SpiParallelMode mode
Execution mode (ISR vs bit-bang)
u8 clock_pin
Clock pin (SCK)
Configuration for parallel GPIO SPI.
void releaseBackend() FL_NO_EXCEPT
Impl(const Config &cfg) FL_NO_EXCEPT