X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=firmware%2Fpattern.c;h=77f026ac9cec9ac9686913ff698e01d4fbafc5b0;hb=4728997cb5f6eff94c8a9d9e253d1675b7516987;hp=a8ab5bb585634e96e1aed0be1660dcafdda6d551;hpb=08488e2d2076602e799b90a36eb5ad9dd379d3f9;p=bike-lights.git diff --git a/firmware/pattern.c b/firmware/pattern.c index a8ab5bb..77f026a 100644 --- a/firmware/pattern.c +++ b/firmware/pattern.c @@ -21,8 +21,8 @@ static pattern_t boot_pattern[] = { { 0, 0x1 }, { 1, 0x1 }, { 0, 0x1 }, - { 1, 0x10 }, - { 0, 0x10 }, + { 1, 0x7 }, + { 0, 0x7 }, PATTERN_END }; @@ -47,7 +47,8 @@ static pattern_t pattern_num[] = { { 1, 0x1 }, /* 2 */ { 0, 0x5 }, { 1, 0x1 }, /* 1 */ - { 0, 0x1E }, + { 0, 0x7 }, + { 0, 0x7 }, PATTERN_END }; @@ -72,12 +73,13 @@ static pattern_t pattern_invnum[] = { { 0, 0x1 }, /* 2 */ { 1, 0x5 }, { 0, 0x1 }, /* 1 */ - { 1, 0x1E }, + { 1, 0x7 }, + { 1, 0x7 }, PATTERN_END }; pattern_t off_pattern[] = { - { 0, 0x1E }, + { 0, 0x1 }, PATTERN_END }; @@ -148,24 +150,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); + /* Keep the last state, wait for others */ + pattern_finished(i); + continue; } led_set_pattern(i, p); } - led_counters[i]--; } }