On FL_IS_STUB: register a one-shot async task that drives autoresearch.
On all other platforms (ESP32, etc.), this is a no-op.
64 {
65#ifdef FL_IS_STUB
66
68 if (!
state ||
state->drivers_available.empty()) {
69 FL_ERROR(
"[STUB CLIENT] No drivers discovered — autoresearch cannot run");
70 exit(1);
71 }
72
73 FL_PRINT(
"\n[STUB CLIENT] ============================================");
74 FL_PRINT(
"[STUB CLIENT] Simulated host client — running autoresearch");
75 FL_PRINT(
"[STUB CLIENT] Drivers: " <<
state->drivers_available.size());
76 FL_PRINT(
"[STUB CLIENT] ============================================");
77
78
81
82
84 const int num_leds = 10;
85
86
89 timing_cfg.timing,
92
93 int grand_total = 0, grand_passed = 0;
94
95 for (fl::size di = 0; di <
state->drivers_available.size(); di++) {
96 const auto& drv =
state->drivers_available[di];
97
98
99
100
101
102
103 if (drv.name == "BIT_BANG") {
104 FL_PRINT(
"\n[STUB CLIENT] Driver: " << drv.name.c_str() <<
" (skipped — no loopback in host stub)");
105 continue;
106 }
107
108 FL_PRINT(
"\n[STUB CLIENT] Driver: " << drv.name.c_str());
109
111 FL_ERROR(
"[STUB CLIENT] Failed to activate driver: " << drv.name.c_str());
112 grand_total++;
113 continue;
114 }
115
116
117 fl::AutoResearchConfig vcfg(
118 timing_cfg.timing,
119 timing_cfg.name,
120 fl::span<fl::ChannelConfig>(&stub_tx_cfg, 1),
121 drv.name.c_str(),
124 num_leds,
126
127 int driver_total = 0, driver_passed = 0;
130
131 FL_PRINT(
"[STUB CLIENT] " << drv.name.c_str()
132 << ": " << driver_passed << "/" << driver_total << " passed");
133
134 grand_total += driver_total;
135 grand_passed += driver_passed;
136 }
137
138 FL_PRINT(
"\n[STUB CLIENT] ============================================");
139 FL_PRINT(
"[STUB CLIENT] TOTAL: " << grand_passed <<
"/" << grand_total);
140
141 if (grand_total == 0) {
142 FL_ERROR(
"[STUB CLIENT] No tests ran — exiting 1");
144 } else if (grand_passed == grand_total) {
145 FL_PRINT(
"[STUB CLIENT] ALL TESTS PASSED ✓ — exiting 0");
147 } else {
148 FL_ERROR(
"[STUB CLIENT] " << (grand_total - grand_passed)
149 << " TESTS FAILED — exiting 1");
151 }
152 });
153#endif
154}
bool autoResearchSetExclusiveDriverByName(const char *name)
AutoResearch-style helper: set an exclusive driver by name.
void autoResearchChipsetTiming(fl::AutoResearchConfig &config, int &total, int &passed, uint32_t &out_show_duration_ms, fl::vector< fl::RunResult > *out_results=nullptr, int num_runs_per_pattern=1)
Handle & then(function< void()> on_then) FL_NO_EXCEPT
Sets the callback invoked when the task runs successfully.
StubAutorunLedState & stubAutorunLedState()
Handle every_ms(int interval_ms) FL_NO_EXCEPT
Creates a task that runs at a fixed millisecond interval.
constexpr ChipsetTimingConfig makeTimingConfig() FL_NO_EXCEPT
Convert compile-time CHIPSET type to runtime timing config.
FASTLED_FORCE_INLINE void exit(int code)
No-op exit function for embedded systems In embedded environments, calling exit is typically not mean...
@ RMT
RMT-based receiver (ESP32)
Configuration for a single LED channel.
Chipset timing configuration with name for testing.
#define FL_TRACE
A macro to capture the current source file, line number, and time.