X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=firmware%2Fpattern.c;h=3354c6f5e5d59b8a46e4c5991d736ab70e6e4a55;hb=8865db8363413d05d188b50b0a10928cf119f68d;hp=03a7517b43f0c4e01e38b6c151834629a5a48fee;hpb=72c8810f9c8c1c8717364174b8792b1f0c988353;p=bike-lights.git diff --git a/firmware/pattern.c b/firmware/pattern.c index 03a7517..3354c6f 100644 --- a/firmware/pattern.c +++ b/firmware/pattern.c @@ -6,78 +6,82 @@ static unsigned char led_counters[N_LEDS]; static pattern_t *led_patterns[N_LEDS]; +static unsigned char fibonacci[8] = { + 0, 1, 2, 3, 5, 8, 13, 21, +}; + static 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 }, + { 1, D_5 }, + { 0, D_5 }, + { 1, D_3 }, + { 0, D_3 }, + { 1, D_2 }, + { 0, D_2 }, + { 1, D_1 }, + { 0, D_1 }, + { 1, D_1 }, + { 0, D_1 }, + { 1, D_1 }, + { 0, D_1 }, + { 1, D_1 }, + { 0, D_1 }, + { 1, D_8 }, + { 0, D_8 }, PATTERN_END }; static pattern_t pattern_num[] = { - { 0, 0x5 }, - { 1, 0x1 }, /* 10 */ - { 0, 0x5 }, - { 1, 0x1 }, /* 9 */ - { 0, 0x5 }, - { 1, 0x1 }, /* 8 */ - { 0, 0x5 }, - { 1, 0x1 }, /* 7 */ - { 0, 0x5 }, - { 1, 0x1 }, /* 6 */ - { 0, 0x5 }, - { 1, 0x1 }, /* 5 */ - { 0, 0x5 }, - { 1, 0x1 }, /* 4 */ - { 0, 0x5 }, - { 1, 0x1 }, /* 3 */ - { 0, 0x5 }, - { 1, 0x1 }, /* 2 */ - { 0, 0x5 }, - { 1, 0x1 }, /* 1 */ - { 0, 0x1E }, + { 0, D_5 }, + { 1, D_1 }, /* 10 */ + { 0, D_5 }, + { 1, D_1 }, /* 9 */ + { 0, D_5 }, + { 1, D_1 }, /* 8 */ + { 0, D_5 }, + { 1, D_1 }, /* 7 */ + { 0, D_5 }, + { 1, D_1 }, /* 6 */ + { 0, D_5 }, + { 1, D_1 }, /* 5 */ + { 0, D_5 }, + { 1, D_1 }, /* 4 */ + { 0, D_5 }, + { 1, D_1 }, /* 3 */ + { 0, D_5 }, + { 1, D_1 }, /* 2 */ + { 0, D_5 }, + { 1, D_1 }, /* 1 */ + { 0, D_13 }, PATTERN_END }; static pattern_t pattern_invnum[] = { - { 1, 0x5 }, - { 0, 0x1 }, /* 10 */ - { 1, 0x5 }, - { 0, 0x1 }, /* 9 */ - { 1, 0x5 }, - { 0, 0x1 }, /* 8 */ - { 1, 0x5 }, - { 0, 0x1 }, /* 7 */ - { 1, 0x5 }, - { 0, 0x1 }, /* 6 */ - { 1, 0x5 }, - { 0, 0x1 }, /* 5 */ - { 1, 0x5 }, - { 0, 0x1 }, /* 4 */ - { 1, 0x5 }, - { 0, 0x1 }, /* 3 */ - { 1, 0x5 }, - { 0, 0x1 }, /* 2 */ - { 1, 0x5 }, - { 0, 0x1 }, /* 1 */ - { 1, 0x1E }, + { 1, D_5 }, + { 0, D_1 }, /* 10 */ + { 1, D_5 }, + { 0, D_1 }, /* 9 */ + { 1, D_5 }, + { 0, D_1 }, /* 8 */ + { 1, D_5 }, + { 0, D_1 }, /* 7 */ + { 1, D_5 }, + { 0, D_1 }, /* 6 */ + { 1, D_5 }, + { 0, D_1 }, /* 5 */ + { 1, D_5 }, + { 0, D_1 }, /* 4 */ + { 1, D_5 }, + { 0, D_1 }, /* 3 */ + { 1, D_5 }, + { 0, D_1 }, /* 2 */ + { 1, D_5 }, + { 0, D_1 }, /* 1 */ + { 1, D_13 }, PATTERN_END }; pattern_t off_pattern[] = { - { 0, 0x1E }, + { 0, D_1 }, PATTERN_END }; @@ -97,7 +101,8 @@ void led_set_pattern(unsigned char n, pattern_t *pattern) led_patterns[n] = pattern; - led_counters[n] = pattern->duration; + led_counters[n] = fibonacci[pattern->duration_fib]; + led_set_mode(n, pattern->mode); } @@ -113,8 +118,8 @@ void init_pattern() pattern_t *number_pattern(unsigned char num, unsigned char inv) { - if (num >= 9) - num = 9; + if (num >= 10) + num = 10; if (inv) { return pattern_invnum @@ -148,25 +153,52 @@ void pattern_reload() 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); + if (p->duration_fib == 0) { // END + /* Keep the last state, wait for others */ + pattern_finished(i); + continue; } led_set_pattern(i, p); } - if (led_counters[i] < PATTERN_FOREVER) - led_counters[i]--; } }