FastLED 3.10.6
Loading...
Searching...
No Matches

◆ selectDriverForChannel()

fl::shared_ptr< IChannelDriver > fl::ChannelManager::selectDriverForChannel ( const ChannelDataPtr & data,
const fl::string & affinity )

Select best driver for channel data (used by Channel::showPixels)

Parameters
dataChannel data to route (chipset configuration)
affinityEngine affinity name (empty = no affinity, dynamic selection)
Returns
Shared pointer to selected driver, or nullptr if none compatible
Note
Iterates drivers by priority (already sorted descending) and returns first that canHandle()
This is called lazily in Channel::showPixels() if no driver is bound

Definition at line 408 of file manager.cpp.hpp.

408 {
409 if (!data) {
410 FL_ERROR("ChannelManager::selectDriverForChannel() - Null channel data");
411 return fl::shared_ptr<IChannelDriver>();
412 }
413
414 // If affinity is specified, look up by name. Misses fall through to
415 // priority dispatch below — per-frame logging is intentionally silent
416 // here because `Channel::showPixels` now emits a one-shot, actionable
417 // FL_ERROR with the enableDrivers<...>() / enableAllDrivers() hint
418 // (#2455). Use `findDriverByName` (silent) rather than `getDriverByName`
419 // (logs on miss) so the silent fall-through actually IS silent.
420 do {
421 if (affinity.empty()) {
422 break;
423 }
424 auto driver = findDriverByName(affinity);
425 if (!driver) {
426 break; // diagnostic emitted at the channel layer
427 }
428 if (!driver->canHandle(data)) {
429 FL_WARN_ONCE("ChannelManager: Affinity driver '" << affinity << "' cannot handle channel data (chipset/bus mismatch). Falling back to AUTO/priority dispatch.");
430 break;
431 }
432 return driver;
433 } while (false);
434
435
436 // No affinity: iterate drivers by priority (already sorted descending)
437 for (const auto& entry : mDrivers) {
438 if (!entry.enabled) continue;
439 if (entry.driver->canHandle(data)) {
440 return entry.driver; // Return shared_ptr
441 }
442 }
443
444 FL_ERROR("ChannelManager: No compatible driver found for channel data");
445 return fl::shared_ptr<IChannelDriver>();
446}
fl::shared_ptr< IChannelDriver > findDriverByName(const fl::string &name) const FL_NO_EXCEPT
Silent counterpart to getDriverByName().
fl::vector< EngineEntry > mDrivers
Shared drivers sorted by priority descending (higher values first)
Definition manager.h:321
bool empty() const FL_NO_EXCEPT
#define FL_WARN_ONCE(...)
Definition log.h:442
#define FL_ERROR(...)
Definition log.h:372

References fl::basic_string::empty(), findDriverByName(), FL_ERROR, FL_WARN_ONCE, and mDrivers.

Referenced by fl::SlimSpiBridgeController< CHIPSET, RGB_ORDER, B, B_WHICH >::resolveDriver(), and fl::Channel::resolveDynamicDriver().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: