]> www.fi.muni.cz Git - bike-lights.git/blobdiff - pattern.c
feedback loop with some testing code
[bike-lights.git] / pattern.c
index 8552240d304165b2dd0378f4b88ea6b2cc083a32..06911707d059b5a05def1268c280df4a7238665b 100644 (file)
--- a/pattern.c
+++ b/pattern.c
@@ -23,7 +23,11 @@ pattern_t blink_pattern[] = {
 };
 
 pattern_t mode1_pattern[] = {
-       { 1, 0x1F },
+       { 1, 0x1 },
+       { 0, 0x1 },
+       { 4, 0x1 },
+       { 0, 0x1 },
+       { 1, 0x1 },
        PATTERN_END
 };
 
@@ -71,6 +75,8 @@ pattern_t pattern_num[] = {
        PATTERN_END
 };
 
+static unsigned char test_running;
+
 void pattern_init()
 {
        unsigned char i;
@@ -82,19 +88,37 @@ void pattern_init()
        led_patterns[N_PWMLEDS] = boot_pattern;
        led_counters[N_PWMLEDS] = boot_pattern->duration;
        gpio_set(GPIO_LED2, 1);
+       test_running = 0;
 }
 
 static inline pattern_t *pattern_select(unsigned char n)
 {
+       if (n < N_PWMLEDS && !pwmled_enabled(n))
+               return off_pattern; // Don't mess with non-enabled LEDs
+
+       if (n == 2) {
+               if (test_running) {
+                       log_byte(0xF7);
+                       log_flush();
+                       return off_pattern;
+               } else {
+                       test_running = 1;
+                       log_byte(0xF6);
+                       return mode1_pattern;
+               }
+       }
        return pattern_num + sizeof(pattern_num)/sizeof(pattern_t)
-               - 1 - 2*(1+ambient_zone);;
+               - 1 - 2*(1+ambient_zone);
 }
 
-static void inline led_off(unsigned char n)
+static void led_set_mode(unsigned char n, unsigned char mode)
 {
-       if (n == N_PWMLEDS) {
-               gpio_set(GPIO_LED2, 0);
+       if (n < N_PWMLEDS) {
+               pwmled_set_mode(n, mode);
+       } else if (n == N_PWMLEDS) {
+               gpio_set(GPIO_LED2, mode);
        }
+       // TODO LED 1
 }
 
 static void inline led_set_level(unsigned char n, unsigned char level)
@@ -115,11 +139,7 @@ void patterns_next_tick()
                                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_set_mode(i, led_patterns[i]->mode);
                }
 
                led_counters[i]--;