led_set_pattern(i, pattern_select(i));
}
+static void inline pattern_finished(unsigned char n)
+{
+ unsigned char i;
+
+ led_patterns[n] = NULL;
+
+ if (n < N_PWMLEDS) {
+ for (i = 0; i < N_PWMLEDS; i++)
+ if (led_patterns[i])
+ return;
+
+ /* all pwmleds finished; restart them */
+ for (i = 0; i < N_PWMLEDS; i++)
+ led_set_pattern(i, pattern_select(i));
+ } else if (n == 3) {
+ if (!led_patterns[4])
+ led_set_pattern(4, pattern_select(4));
+ } else if (n == 4) {
+ if (!led_patterns[3])
+ led_set_pattern(3, pattern_select(3));
+ } else {
+ led_set_pattern(n, pattern_select(n));
+ }
+}
+
void patterns_next_tick()
{
unsigned char i;
for (i = 0; i < N_LEDS; i++) {
- if (!led_patterns[i])
+ if (!led_patterns[i]) {
+ pattern_finished(i);
continue;
+ }
- if (led_counters[i] == 0) {
+ if (--led_counters[i] == 0) {
pattern_t *p = led_patterns[i];
p++;
if (p->duration == 0) { // END
- p = pattern_select(i);
+ /* Keep the last state, wait for others */
+ pattern_finished(i);
+ continue;
}
led_set_pattern(i, p);
}
- led_counters[i]--;
}
}