91 if (iterations < 1) iterations = 1;
93 if (num_leds < 2) num_leds = 2;
95 r.num_leds = num_leds;
98 for (
int i = 0; i < num_leds; ++i) {
106 if (!probe.
valid()) {
118#if defined(ARDUINO_ARCH_ESP32)
119 r.cpu_mhz = getCpuFrequencyMhz();
123 FastLED.setMaxRefreshRate(800);
126 constexpr uint32_t kFastLedUpdateMs = 5;
130 ms_delay_post.
start(0);
131 ms_fast_led.
start(kFastLedUpdateMs);
133 int i_post_fade = 255;
134 uint32_t i_iteration_time = millis();
137 r.show_min_us = 0xFFFFFFFFu;
139 auto timedShow = [&]() {
144 r.show_total_us += dt;
145 if (dt < r.show_min_us) r.show_min_us = dt;
146 if (dt > r.show_max_us) r.show_max_us = dt;
152 ms_fast_led.
start(kFastLedUpdateMs);
156 const int i_ring_start = 0;
157 const int i_ring_end = num_leds - 1;
158 const int i_ring_divisor = 7;
163 uint32_t last_wdt_feed_ms = millis();
164 constexpr uint32_t kWdtFeedIntervalMs = 1000;
165 auto maybeFeedWatchdog = [&]() {
167 if (now - last_wdt_feed_ms >= kWdtFeedIntervalMs) {
169 last_wdt_feed_ms = now;
175 while (completed < iterations) {
177 const int i_ring_counter =
178 ((255 - i_post_fade) / i_ring_divisor) + i_ring_start;
180 if (i_ring_counter <= i_ring_end) {
183 if (i_ring_counter - 1 >= i_ring_start &&
184 i_ring_counter - 1 <= i_ring_end) {
190 if (i_post_fade == 0) {
192 r.iter_ms[completed] = now - i_iteration_time;
194 i_iteration_time = now;
195 ms_delay_post.
stop();
197 for (
int i = i_ring_start; i <= i_ring_end; i++) {
205 last_wdt_feed_ms = millis();
207 ms_delay_post.
start(225);
210 ms_delay_post.
start(5);
217 r.iterations = completed;
218 if (r.show_count == 0) {