]> www.fi.muni.cz Git - bike-lights.git/blob - pattern.c
ambient light sensor
[bike-lights.git] / pattern.c
1 #include "lights.h"
2
3 typedef struct {
4         unsigned char mode: 3;
5         unsigned char duration: 5;
6 } pattern_t;
7
8 static unsigned char led_counters[N_LEDS];
9 static pattern_t *led_patterns[N_LEDS];
10
11 #define PATTERN_END { 0, 0 }
12 pattern_t off_pattern[] = {
13         { 0, 5 },
14         PATTERN_END
15 };
16
17 pattern_t blink_pattern[] = {
18         { 1, 5 },
19         { 0, 5 },
20         PATTERN_END
21 };
22
23 void pattern_init()
24 {
25         unsigned char i;
26
27         for (i = 0; i < N_LEDS; i++) {
28                 led_counters[i] = 0;
29                 led_patterns[i] = off_pattern;
30         }
31 }
32
33 void patterns_next_tick()
34 {
35         unsigned char i;
36
37         for (i = 0; i < N_LEDS; i++) {
38                 if (led_counters[i] == 0) {
39                         led_patterns[i]++;
40                         if (led_patterns[i]->duration == 0) { // END
41                                 led_patterns[i] = pattern_select(i);
42                         }
43                         led_counters[i] = led_patterns[i]->duration;
44                         if (led_patterns[i]->mode == 0) {
45                                 led_off(i);
46                         } else {
47                                 led_set_level(i, led_patterns[i]->mode - 1);
48                         }
49                 }
50
51                 led_counters[i]--;
52         }
53 }
54