FastLED 3.10.8
Loading...
Searching...
No Matches
spi_channel_adapter.h
Go to the documentation of this file.
1
43
44#pragma once
45
46#include "fl/stl/noexcept.h"
47
48#include "fl/channels/driver.h"
49#include "fl/channels/data.h"
50#include "fl/stl/vector.h"
51#include "fl/stl/shared_ptr.h"
52#include "fl/stl/string.h"
53// IWYU pragma: begin_keep
54#include "platforms/shared/spi_hw_base.h" // ok platform headers - required for SpiHwBase interface
55// IWYU pragma: end_keep
56
57namespace fl {
58
65public:
74 fl::vector<int> priorities,
76 const char* adapterName
78
81
82 // IChannelDriver interface implementation
83
88 bool canHandle(const ChannelDataPtr& data) const FL_NO_EXCEPT override;
89
93 void enqueue(ChannelDataPtr channelData) FL_NO_EXCEPT override;
94
97 void show() FL_NO_EXCEPT override;
98
102 DriverState poll() FL_NO_EXCEPT override;
103
106 fl::string getName() const FL_NO_EXCEPT override { return mName; }
107
111 return Capabilities(false, true); // SPI only
112 }
113
116 int getPriority() const FL_NO_EXCEPT;
117
118private:
120 template<typename T, typename... Args>
121 friend fl::shared_ptr<T> fl::adl_barrier::make_shared(Args&&... args) FL_NO_EXCEPT; // see fl/stl/adl_barrier.h
122
124 SpiChannelEngineAdapter(const char* name) FL_NO_EXCEPT;
125
137
143
147 int selectControllerForClockPin(int clockPin, Esp32SpiBus requestedBus) FL_NO_EXCEPT;
148
153 bool canControllerHandleClockPin(const ControllerInfo& ctrl, int clockPin) const FL_NO_EXCEPT;
154
160 bool initializeControllerIfNeeded(ControllerInfo& ctrl, int clockPin, int dataPin) FL_NO_EXCEPT;
161
168
175 ) FL_NO_EXCEPT;
176
181
185
188
189 // Non-copyable, non-movable
194};
195
196} // namespace fl
CLEDController * controller
IChannelDriver() FL_NO_EXCEPT=default
bool transmitBatch(fl::span< const ChannelDataPtr > channels) FL_NO_EXCEPT
Transmit a batch of channels (all same clock pin)
fl::vector< ClockPinGroup > groupByClockPin(fl::span< const ChannelDataPtr > channels) FL_NO_EXCEPT
Group channels by clock pin for efficient transmission.
SpiChannelEngineAdapter(SpiChannelEngineAdapter &&) FL_NO_EXCEPT=delete
SpiChannelEngineAdapter(const SpiChannelEngineAdapter &) FL_NO_EXCEPT=delete
void enqueue(ChannelDataPtr channelData) FL_NO_EXCEPT override
Enqueue channel data for transmission.
fl::string mName
Engine name for debugging.
int getPriority() const FL_NO_EXCEPT
Get maximum priority among all controllers.
void show() FL_NO_EXCEPT override
Trigger transmission of enqueued data.
bool canHandle(const ChannelDataPtr &data) const FL_NO_EXCEPT override
Check if adapter can handle channel data.
fl::string getName() const FL_NO_EXCEPT override
Get adapter name for debugging.
fl::vector< ControllerInfo > mControllers
All managed controllers.
static fl::shared_ptr< SpiChannelEngineAdapter > create(fl::vector< fl::shared_ptr< SpiHwBase > > hwControllers, fl::vector< int > priorities, fl::vector< const char * > names, const char *adapterName) FL_NO_EXCEPT
Create unified adapter managing multiple controllers.
SpiChannelEngineAdapter & operator=(const SpiChannelEngineAdapter &) FL_NO_EXCEPT=delete
int selectControllerForClockPin(int clockPin, Esp32SpiBus requestedBus) FL_NO_EXCEPT
Select best controller for a given clock pin.
SpiChannelEngineAdapter(const char *name) FL_NO_EXCEPT
Private constructor - use create() factory method.
bool initializeControllerIfNeeded(ControllerInfo &ctrl, int clockPin, int dataPin) FL_NO_EXCEPT
Initialize controller if needed for this clock pin.
bool canControllerHandleClockPin(const ControllerInfo &ctrl, int clockPin) const FL_NO_EXCEPT
Check if controller can handle this clock pin.
DriverState poll() FL_NO_EXCEPT override
Query driver state and perform maintenance.
~SpiChannelEngineAdapter() FL_NO_EXCEPT override
Destructor.
friend fl::shared_ptr< T > fl::adl_barrier::make_shared(Args &&... args) FL_NO_EXCEPT
Friend declaration for make_shared to access private constructor.
fl::vector< ChannelDataPtr > mEnqueuedChannels
Channels waiting for show()
Capabilities getCapabilities() const FL_NO_EXCEPT override
Get driver capabilities (SPI protocols only)
fl::vector< ClockPinAssignment > mClockPinAssignments
Clock pin → controller mapping.
fl::vector< ChannelDataPtr > mTransmittingChannels
Channels currently transmitting.
Group data structure for channels with same clock pin.
Channel transmission data - lightweight DTO for driver transmission.
Esp32SpiBus
ESP-IDF SPI host selection for an individual clocked LED controller.
Definition spi_bus.h:18
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
Base definition for an LED controller.
Definition crgb.hpp:179
corkscrew_args args
Definition old.h:149
Driver capabilities.
Definition driver.h:154
Driver state with optional error message.
Definition driver.h:168
ControllerInfo(fl::shared_ptr< SpiHwBase > ctrl, int prio, const char *n) FL_NO_EXCEPT
fl::shared_ptr< SpiHwBase > controller
Hardware instance.
int priority
Controller priority (higher = preferred)
fl::vector< int > assignedClockPins
Clock pins assigned to this controller.
fl::string name
Name (e.g., "SPI2", "SPI3", "I2S0")
bool isInitialized
Whether begin() has been called.
Information about a registered SPI hardware controller.