54#include "platforms/shared/spi_hw_base.h"
76 const char* adapterName
88 bool canHandle(
const ChannelDataPtr& data)
const override;
93 void enqueue(ChannelDataPtr channelData)
override;
120 template<
typename T,
typename... Args>
IChannelDriver() FL_NOEXCEPT=default
int getPriority() const
Get maximum priority among all controllers.
SpiChannelEngineAdapter(const SpiChannelEngineAdapter &) FL_NOEXCEPT=delete
SpiChannelEngineAdapter(const char *name)
Private constructor - use create() factory method.
Capabilities getCapabilities() const override
Get driver capabilities (SPI protocols only)
fl::string mName
Engine name for debugging.
SpiChannelEngineAdapter(SpiChannelEngineAdapter &&) FL_NOEXCEPT=delete
SpiChannelEngineAdapter & operator=(const SpiChannelEngineAdapter &) FL_NOEXCEPT=delete
~SpiChannelEngineAdapter() FL_NOEXCEPT override
Destructor.
fl::vector< ControllerInfo > mControllers
All managed controllers.
fl::string getName() const override
Get adapter name for debugging.
void show() override
Trigger transmission of enqueued data.
fl::vector< ClockPinGroup > groupByClockPin(fl::span< const ChannelDataPtr > channels)
Group channels by clock pin for efficient transmission.
DriverState poll() override
Query driver state and perform maintenance.
void enqueue(ChannelDataPtr channelData) override
Enqueue channel data for transmission.
bool initializeControllerIfNeeded(ControllerInfo &ctrl, int clockPin, int dataPin)
Initialize controller if needed for this clock pin.
fl::vector< ChannelDataPtr > mEnqueuedChannels
Channels waiting for show()
int selectControllerForClockPin(int clockPin)
Select best controller for a given clock pin.
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)
Create unified adapter managing multiple controllers.
bool transmitBatch(fl::span< const ChannelDataPtr > channels)
Transmit a batch of channels (all same clock pin)
bool canControllerHandleClockPin(const ControllerInfo &ctrl, int clockPin) const
Check if controller can handle this clock pin.
fl::vector< ClockPinAssignment > mClockPinAssignments
Clock pin → controller mapping.
fl::vector< ChannelDataPtr > mTransmittingChannels
Channels currently transmitting.
bool canHandle(const ChannelDataPtr &data) const override
Check if adapter can handle channel data.
fl::vector< ChannelDataPtr > channels
size_t controllerIndex
Index into mControllers.
Group data structure for channels with same clock pin.
Channel transmission data - lightweight DTO for driver transmission.
shared_ptr< T > make_shared(Args &&... args) FL_NOEXCEPT
Base definition for an LED controller.
Driver state with optional error message.
ControllerInfo(fl::shared_ptr< SpiHwBase > ctrl, int prio, const char *n)
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.