FastLED 3.9.15
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
77 );
78
81
82 // IChannelDriver interface implementation
83
88 bool canHandle(const ChannelDataPtr& data) const override;
89
93 void enqueue(ChannelDataPtr channelData) override;
94
97 void show() override;
98
102 DriverState poll() override;
103
106 fl::string getName() const override { return mName; }
107
110 Capabilities getCapabilities() const override {
111 return Capabilities(false, true); // SPI only
112 }
113
116 int getPriority() const;
117
118private:
120 template<typename T, typename... Args>
122
124 SpiChannelEngineAdapter(const char* name);
125
137
142
146 int selectControllerForClockPin(int clockPin);
147
152 bool canControllerHandleClockPin(const ControllerInfo& ctrl, int clockPin) const;
153
159 bool initializeControllerIfNeeded(ControllerInfo& ctrl, int clockPin, int dataPin);
160
166
173 );
174
179
183
186
187 // Non-copyable, non-movable
192};
193
194} // namespace fl
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.
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
Definition shared_ptr.h:414
Base definition for an LED controller.
Definition crgb.hpp:179
corkscrew_args args
Definition old.h:149
#define FL_NOEXCEPT
Driver capabilities.
Definition driver.h:151
Driver state with optional error message.
Definition driver.h:165
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.