#include "lights.h" typedef struct { unsigned char mode: 3; unsigned char duration: 5; } pattern_t; static unsigned char led_counters[N_LEDS]; static pattern_t *led_patterns[N_LEDS]; #define PATTERN_END { 0, 0 } pattern_t off_pattern[] = { { 0, 5 }, PATTERN_END }; pattern_t blink_pattern[] = { { 1, 5 }, { 0, 5 }, PATTERN_END }; void pattern_init() { unsigned char i; for (i = 0; i < N_LEDS; i++) { led_counters[i] = 0; led_patterns[i] = off_pattern; } } void patterns_next_tick() { unsigned char i; for (i = 0; i < N_LEDS; i++) { if (led_counters[i] == 0) { led_patterns[i]++; if (led_patterns[i]->duration == 0) { // END led_patterns[i] = pattern_select(i); } led_counters[i] = led_patterns[i]->duration; if (led_patterns[i]->mode == 0) { led_off(i); } else { led_set_level(i, led_patterns[i]->mode - 1); } } led_counters[i]--; } }