FastLED 3.9.15
Loading...
Searching...
No Matches
manager.h
Go to the documentation of this file.
1
22
23#pragma once
24
25#include "fl/channels/driver.h"
26#include "fl/channels/data.h"
27#include "fl/channels/bus.h"
30#include "fl/stl/vector.h"
31#include "fl/stl/shared_ptr.h"
32#include "fl/stl/noexcept.h"
33#include "platforms/channel_poll_signal.h"
34
35namespace fl {
36
43
51public:
56
59
62
75 void addDriver(int priority, fl::shared_ptr<IChannelDriver> driver) FL_NOEXCEPT;
76
83
89
96 void setDriverEnabled(const char* name, bool enabled) FL_NOEXCEPT;
97
118 template<fl::Bus B>
120
129
149 bool setExclusiveDriverByName(const char* name) FL_NOEXCEPT;
150
158 bool setDriverPriority(const fl::string& name, int priority) FL_NOEXCEPT;
159
163 bool isDriverEnabled(const char* name) const FL_NOEXCEPT;
164
175
183
190
193 fl::size getDriverCount() const FL_NOEXCEPT;
194
201
207 fl::shared_ptr<IChannelDriver> getDriverByName(const fl::string& name) const FL_NOEXCEPT;
208
215 fl::shared_ptr<IChannelDriver> findDriverByName(const fl::string& name) const FL_NOEXCEPT;
216
223 fl::shared_ptr<IChannelDriver> selectDriverForChannel(const ChannelDataPtr& data, const fl::string& affinity) FL_NOEXCEPT;
224
229 IChannelDriver::DriverState poll() FL_NOEXCEPT;
230
234 bool waitForReady(u32 timeoutMs = 1000) FL_NOEXCEPT;
235 bool waitForReadyOrDraining(u32 timeoutMs = 1000) FL_NOEXCEPT;
236
239 void onBeginFrame() FL_NOEXCEPT override;
240
243 void onEndFrame() FL_NOEXCEPT override;
244
247 void reset() FL_NOEXCEPT;
248
249private:
255 template<typename Condition>
256 bool waitForCondition(Condition condition, u32 timeoutMs = 1000) FL_NOEXCEPT;
257
259 bool waitForPollNeededSignal(u32 timeoutMs) FL_NOEXCEPT;
260 u32 pollNeededWaitSliceMs(u32 startTime, u32 timeoutMs) const FL_NOEXCEPT;
261 static void notifyPollNeededThunk(void* context) FL_NOEXCEPT;
262
263private:
265 struct EngineEntry {
269 bool enabled;
270
273 bool operator<(const EngineEntry& other) const FL_NOEXCEPT {
274 return priority > other.priority; // Sort descending: higher values first
275 }
276 };
277
283 IChannelDriver* selectDriver(const ChannelDataPtr& data = nullptr) FL_NOEXCEPT;
284
288
292
297
300
302 platforms::ChannelPollSignal mPollNeededSignal;
303
304 // Non-copyable, non-movable
306 ChannelManager& operator=(const ChannelManager&) FL_NOEXCEPT = delete;
309};
310
315
316// Inline template definition for ChannelManager::setExclusiveDriver<B>().
317// Defined here so the ODR-use of `BusTraits<B>::instancePtr()` happens in the
318// caller's TU, which links the driver translation unit. The caller must have
319// the per-driver `bus_traits.h` (which provides `BusTraits<B>::instancePtr`)
320// visible at the call site.
321template<fl::Bus B>
323 // Priority above any platform default — see `bus_priorities.h` for the
324 // default-priority constants (highest there is ~10 for native LCD/I2S SPI).
325 constexpr int kExclusivePriority = 10000;
326 addDriver(kExclusivePriority, fl::BusTraits<B>::instancePtr());
327}
328
329} // namespace fl
Compile-time identifier for an LED channel transmission bus.
Per-driver traits keyed on fl::Bus.
bool isDriverEnabled(const char *name) const FL_NOEXCEPT
Check if a driver is enabled by name.
void setDriverEnabled(const char *name, bool enabled) FL_NOEXCEPT
Enable or disable a driver by name at runtime.
bool removeDriver(fl::shared_ptr< IChannelDriver > driver) FL_NOEXCEPT
Remove a driver from the manager.
fl::shared_ptr< IChannelDriver > selectDriverForChannel(const ChannelDataPtr &data, const fl::string &affinity) FL_NOEXCEPT
Select best driver for channel data (used by Channel::showPixels)
const fl::string & exclusiveDriverName() const FL_NOEXCEPT
Get the currently-active exclusive-driver selection (if any).
Definition manager.h:189
void setExclusiveDriver() FL_NOEXCEPT
Register a single driver at a priority above the platform default and disable all others (compile-tim...
Definition manager.h:322
bool waitForPollNeededSignal(u32 timeoutMs) FL_NOEXCEPT
~ChannelManager() FL_NOEXCEPT override
Destructor - cleanup shared drivers (automatic via shared_ptr)
void reset() FL_NOEXCEPT
Reset bus manager state, clearing all enqueued and transmitting channels.
fl::shared_ptr< IChannelDriver > getDriverByName(const fl::string &name) const FL_NOEXCEPT
Get driver by name for affinity binding.
u32 pollNeededWaitSliceMs(u32 startTime, u32 timeoutMs) const FL_NOEXCEPT
IChannelDriver::PollNeededCallback mPollNeededCallback
Shared callback installed on drivers that can signal poll-needed events.
Definition manager.h:299
static void notifyPollNeededThunk(void *context) FL_NOEXCEPT
fl::shared_ptr< IChannelDriver > findDriverByName(const fl::string &name) const FL_NOEXCEPT
Silent counterpart to getDriverByName().
bool setDriverPriority(const fl::string &name, int priority) FL_NOEXCEPT
Change the priority of a registered driver.
fl::span< const DriverInfo > getDriverInfos() const FL_NOEXCEPT
Get full state of all registered drivers.
fl::size getDriverCount() const FL_NOEXCEPT
Get count of registered drivers (including unnamed ones)
void addDriver(int priority, fl::shared_ptr< IChannelDriver > driver) FL_NOEXCEPT
Add a driver with priority (higher priority = preferred)
bool waitForReady(u32 timeoutMs=1000) FL_NOEXCEPT
Wait for all drivers to become READY.
platforms::ChannelPollSignal mPollNeededSignal
Platform wait primitive owned by the manager.
Definition manager.h:302
void clearAllDrivers() FL_NOEXCEPT
Remove all drivers from the manager.
IChannelDriver::DriverState poll() FL_NOEXCEPT
Poll all registered drivers and return aggregate state.
fl::vector< DriverInfo > mCachedDriverInfo
Cached driver info for getDriverInfos() to avoid allocations.
Definition manager.h:291
DriverStatus
Registration status of a driver by name (silent lookup)
Definition manager.h:170
@ NOT_REGISTERED
No driver with that name is registered.
Definition manager.h:171
@ STATUS_ENABLED
Driver is registered and enabled.
Definition manager.h:173
@ STATUS_DISABLED
Driver is registered but disabled.
Definition manager.h:172
void onEndFrame() FL_NOEXCEPT override
Trigger transmission of batched channel data.
bool waitForReadyOrDraining(u32 timeoutMs=1000) FL_NOEXCEPT
fl::vector< EngineEntry > mDrivers
Shared drivers sorted by priority descending (higher values first)
Definition manager.h:287
bool waitForCondition(Condition condition, u32 timeoutMs=1000) FL_NOEXCEPT
Wait until a condition is met, with check-pump-delay logic.
fl::string mExclusiveDriver
Exclusive driver name (empty if no exclusive mode)
Definition manager.h:296
void onBeginFrame() FL_NOEXCEPT override
Poll drivers before frame starts to clear previous frame state.
ChannelManager() FL_NOEXCEPT
Constructor.
bool setExclusiveDriverByName(const char *name) FL_NOEXCEPT
Enable only one driver exclusively (disables all others) — by-name escape hatch.
IChannelDriver * selectDriver(const ChannelDataPtr &data=nullptr) FL_NOEXCEPT
Select driver for current operation.
void notifyPollNeeded() FL_NOEXCEPT
static ChannelManager & instance() FL_NOEXCEPT
Get the global singleton instance.
DriverStatus driverStatus(const fl::string &name) const FL_NOEXCEPT
Look up a driver's registration status without logging on miss.
Minimal interface for LED channel transmission drivers.
Definition driver.h:49
Channel transmission data - lightweight DTO for driver transmission.
FL_DISABLE_WARNING_PUSH unsigned char * B
Bus
Driver identifier for compile-time bus selection.
Definition bus.h:60
ChannelManager & channelManager()
Get the global ChannelManager singleton instance.
Base definition for an LED controller.
Definition crgb.hpp:179
fl::string name
Driver name (empty for unnamed drivers)
Definition manager.h:39
bool enabled
Whether driver is currently enabled.
Definition manager.h:41
int priority
Driver priority (higher = preferred)
Definition manager.h:40
Driver state information for channel manager.
Definition manager.h:38
Primary template — intentionally undefined.
Definition bus_traits.h:30
#define FL_NOEXCEPT
bool operator<(const EngineEntry &other) const FL_NOEXCEPT
Sort by priority descending (higher numbers first)
Definition manager.h:273
fl::string name
Engine name for runtime identification (e.g., "RMT", "SPI")
Definition manager.h:268
bool enabled
Runtime enable/disable flag.
Definition manager.h:269
int priority
Definition manager.h:266
fl::shared_ptr< IChannelDriver > driver
Definition manager.h:267
Engine registry entry (priority + shared pointer + runtime control)
Definition manager.h:265