]> www.fi.muni.cz Git - bike-lights.git/blobdiff - firmware/pattern.c
patterns: fibonacci-scaled step duration
[bike-lights.git] / firmware / pattern.c
index 77f026ac9cec9ac9686913ff698e01d4fbafc5b0..3354c6f5e5d59b8a46e4c5991d736ab70e6e4a55 100644 (file)
@@ -6,80 +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, 0x7 },
-       { 0, 0x7 },
+       { 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, 0x7 },
-       { 0, 0x7 },
+       { 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, 0x7 },
-       { 1, 0x7 },
+       { 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, 0x1 },
+       { 0, D_1 },
        PATTERN_END
 };
 
@@ -99,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);
 }
 
@@ -188,7 +191,7 @@ void patterns_next_tick()
                if (--led_counters[i] == 0) {
                        pattern_t *p = led_patterns[i];
                        p++;
-                       if (p->duration == 0) { // END
+                       if (p->duration_fib == 0) { // END
                                /* Keep the last state, wait for others */
                                pattern_finished(i);
                                continue;