X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=pattern.c;h=fb74ae0204426579429c39a59af78d97ef9f34f4;hb=404cf862f8c6bb413580dce16d0a0bdab1037525;hp=0245c3b679cb8e08080b67c1f08f38193cf9b02c;hpb=dbbcaf6e61197990ec21a702102c81deb66f2110;p=bike-lights.git diff --git a/pattern.c b/pattern.c index 0245c3b..fb74ae0 100644 --- a/pattern.c +++ b/pattern.c @@ -12,7 +12,7 @@ static pattern_t *led_patterns[N_LEDS]; #define PATTERN_END { 0, 0 } pattern_t off_pattern[] = { - { 0, 5 }, + { 0, 0x1F }, PATTERN_END }; @@ -22,28 +22,83 @@ pattern_t blink_pattern[] = { PATTERN_END }; -pattern_t pattern_num[] = { +pattern_t mode1_pattern[] = { + { 3, 0x1 }, + { 0, 0x1 }, + { 3, 0x1 }, + { 0, 0x8 }, { 1, 0x1 }, - { 0, 0x4 }, + { 0, 0x1 }, { 1, 0x1 }, - { 0, 0x4 }, + { 0, 0x8 }, + PATTERN_END +}; + +pattern_t boot_pattern[] = { + { 1, 0x6 }, + { 0, 0x6 }, + { 1, 0x3 }, + { 0, 0x3 }, + { 1, 0x2 }, + { 0, 0x2 }, { 1, 0x1 }, - { 0, 0x4 }, + { 0, 0x1 }, { 1, 0x1 }, - { 0, 0x4 }, + { 0, 0x1 }, { 1, 0x1 }, - { 0, 0x4 }, + { 0, 0x1 }, { 1, 0x1 }, + { 0, 0x1 }, + { 1, 0x10 }, + { 0, 0x10 }, + PATTERN_END +}; + +pattern_t pattern_num[] = { + { 1, 0x1 }, /* 10 */ { 0, 0x4 }, - { 1, 0x1 }, + { 1, 0x1 }, /* 9 */ { 0, 0x4 }, - { 1, 0x1 }, + { 1, 0x1 }, /* 8 */ { 0, 0x4 }, - { 1, 0x1 }, + { 1, 0x1 }, /* 7 */ + { 0, 0x4 }, + { 1, 0x1 }, /* 6 */ + { 0, 0x4 }, + { 1, 0x1 }, /* 5 */ + { 0, 0x4 }, + { 1, 0x1 }, /* 4 */ + { 0, 0x4 }, + { 1, 0x1 }, /* 3 */ + { 0, 0x4 }, + { 1, 0x1 }, /* 2 */ + { 0, 0x4 }, + { 1, 0x1 }, /* 1 */ { 0, 0x1F }, PATTERN_END }; +static unsigned char test_running; + +static void led_set_mode(unsigned char n, unsigned char mode) +{ + if (n < N_PWMLEDS) { + pwmled_set_mode(n, mode); + } else if (n < N_LEDS) { + gpio_set(n - N_PWMLEDS, mode); + } +} + +void led_set_pattern(unsigned char n, pattern_t *pattern) +{ + if (!pattern) + pattern = off_pattern; + + led_patterns[n] = pattern; + led_counters[n] = pattern->duration; + led_set_mode(n, pattern->mode); +} + void pattern_init() { unsigned char i; @@ -52,27 +107,29 @@ void pattern_init() led_counters[i] = 0; led_patterns[i] = off_pattern; } + led_set_pattern(N_PWMLEDS+1, boot_pattern); + test_running = 0; } -static inline pattern_t *pattern_select(unsigned char n) +static pattern_t *number_pattern(unsigned char num) { - log_byte(ambient_zone); + if (num >= 9) + num = 9; + return pattern_num + sizeof(pattern_num)/sizeof(pattern_t) - - 1 - 2*(1+ambient_zone);; + - 1 - 2*num; } -static void inline led_off(unsigned char n) +static inline pattern_t *pattern_select(unsigned char n) { - if (n == N_PWMLEDS) { - gpio_set(GPIO_LED2, 0); - } -} + if (n < N_PWMLEDS && !pwmled_enabled(n)) + return off_pattern; // Don't mess with non-enabled LEDs -static void inline led_set_level(unsigned char n, unsigned char level) -{ - if (n == N_PWMLEDS) { - gpio_set(GPIO_LED2, 1); + if (n == 2) { + return mode1_pattern; } + // return number_pattern(1+ambient_zone); + return off_pattern; } void patterns_next_tick() @@ -81,19 +138,19 @@ void patterns_next_tick() 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); + pattern_t *p = led_patterns[i]; + p++; + if (p->duration == 0) { // END + p = pattern_select(i); } + led_set_pattern(i, p); } led_counters[i]--; } } +void led_set_status(unsigned char status) +{ + led_set_pattern(N_PWMLEDS+1, number_pattern(status)); +}