#include #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, 0x4 }, { 0, 0x8 }, PATTERN_END }; pattern_t boot_pattern[] = { { 1, 0x6 }, { 0, 0x6 }, { 1, 0x3 }, { 0, 0x3 }, { 1, 0x2 }, { 0, 0x2 }, { 1, 0x1 }, { 0, 0x1 }, { 1, 0x1 }, { 0, 0x1 }, { 1, 0x1 }, { 0, 0x1 }, { 1, 0x1 }, { 0, 0x1 }, { 1, 0x10 }, { 0, 0x10 }, PATTERN_END }; pattern_t pattern_num[] = { { 1, 0x1 }, { 0, 0x4 }, { 1, 0x1 }, { 0, 0x4 }, { 1, 0x1 }, { 0, 0x4 }, { 1, 0x1 }, { 0, 0x4 }, { 1, 0x1 }, { 0, 0x4 }, { 1, 0x1 }, { 0, 0x4 }, { 1, 0x1 }, { 0, 0x4 }, { 1, 0x1 }, { 0, 0x4 }, { 1, 0x1 }, { 0, 0x1F }, PATTERN_END }; void pattern_init() { unsigned char i; for (i = 0; i < N_LEDS; i++) { led_counters[i] = 0; led_patterns[i] = off_pattern; } led_patterns[N_PWMLEDS] = boot_pattern; led_counters[N_PWMLEDS] = boot_pattern->duration; gpio_set(GPIO_LED2, 1); } static inline pattern_t *pattern_select(unsigned char n) { return pattern_num + sizeof(pattern_num)/sizeof(pattern_t) - 1 - 2*(1+ambient_zone);; } static void inline led_off(unsigned char n) { if (n == N_PWMLEDS) { gpio_set(GPIO_LED2, 0); } } static void inline led_set_level(unsigned char n, unsigned char level) { if (n == N_PWMLEDS) { gpio_set(GPIO_LED2, 1); } } 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]--; } }