]> www.fi.muni.cz Git - bike-lights.git/blob - firmware/control.c
Common patterns rewrite
[bike-lights.git] / firmware / control.c
1 #include <inttypes.h>
2 #include <stdlib.h> // for NULL
3
4 #include "lights.h"
5
6 static pattern_t panic_pattern[] = {
7         { 3, D_1 }, // FIXME: will be 4, but let's be safe while testing
8         { 0, D_1 },
9         { 3, D_1 },
10         { 0, D_1 },
11         { 3, D_1 },
12         { 0, D_1 },
13         { 3, D_1 },
14         { 0, D_1 },
15         { 3, D_1 },
16         { 0, D_1 },
17         { 3, D_1 },
18         { 0, D_1 },
19         { 3, D_1 },
20         { 0, D_1 },
21         { 3, D_1 },
22         { 0, D_1 },
23         { 3, D_1 },
24         { 0, D_1 },
25         { 3, D_1 },
26         { 0, D_1 },
27         { 3, D_1 },
28         { 0, D_1 },
29         PATTERN_END
30 };
31
32 static pattern_t brake_pattern [] = {
33         { 4, D_2 },
34         { 3, D_8 },
35         PATTERN_END
36 };
37
38 static pattern_t slow_pattern[] = {
39         { PWM_PAT(1, 0, 0), D_1 },
40         { PWM_PAT(0, 0, 1), D_1 },
41         { PWM_PAT(0, 0, 0), D_13 },
42         PATTERN_END
43 };
44
45 static pattern_t fast_pattern[] = {
46         { PWM_PAT(2, 0, 0), D_1 },
47         { PWM_PAT(0, 0, 2), D_1 },
48         { PWM_PAT(2, 0, 0), D_1 },
49         { PWM_PAT(0, 0, 2), D_1 },
50         { PWM_PAT(0, 0, 0), D_8 },
51         { PWM_PAT(1, 0, 0), D_1 },
52         { PWM_PAT(0, 0, 1), D_1 },
53         { PWM_PAT(1, 0, 0), D_1 },
54         { PWM_PAT(0, 0, 1), D_1 },
55         { PWM_PAT(0, 0, 0), D_8 },
56         PATTERN_END
57 };
58
59 static pattern_t night_pattern[] = {
60         { PWM_PAT(2, 0, 2), D_3 },
61         { PWM_PAT(3, 0, 0), D_8 },
62         { PWM_PAT(2, 0, 2), D_1 },
63         { PWM_PAT(3, 0, 0), D_2 },
64         { PWM_PAT(2, 0, 2), D_1 },
65         { PWM_PAT(3, 0, 0), D_8 },
66         PATTERN_END
67 };
68
69 pattern_t on_pattern[] = {
70         { 1, D_8 },
71         PATTERN_END
72 };
73
74 static unsigned char dim_mode, towbar_mode, braking;
75
76 void init_control()
77 {
78         dim_mode = 0;
79         towbar_mode = 0;
80         braking = 0;
81 }
82
83 void brake_on()
84 {
85         braking = 1;
86         gpio_set(0, 1);
87         led_set_pattern(N_STATUS_LED, status_led_pattern_select());
88         led_set_pattern(0, pwmled_pattern_select());
89 }
90
91 void brake_off()
92 {
93         braking = 0;
94         gpio_set(0, 0);
95         led_set_pattern(N_STATUS_LED, status_led_pattern_select());
96         led_set_pattern(0, pwmled_pattern_select());
97 }
98
99 void toggle_dim_mode()
100 {
101         dim_mode = !dim_mode;
102         pattern_reload();
103 }
104
105 void set_panic_mode()
106 {
107         led_set_pattern(0, panic_pattern);
108         led_set_pattern(N_ILLUM_LED, panic_pattern);
109 }
110
111 pattern_t *pwmled_pattern_select()
112 {
113         if (battery_critical)
114                 return slow_pattern;
115
116         if (towbar_mode)
117                 return NULL;
118
119         if (braking)
120                 return brake_pattern;
121
122         switch (ambient_zone) {
123         case 0: return night_pattern;
124         case 1:
125         case 2:
126         case 3:
127         default:
128                 return dim_mode ? slow_pattern : fast_pattern;
129         }
130 }
131
132 pattern_t *status_led_pattern_select()
133 {
134         if (braking)
135                 return on_pattern;
136
137         if (buttons_setup_in_progress())
138                 return buttons_setup_status0_pattern_select();
139
140         // FIXME: do something sane
141         return number_pattern(battery_gauge(), 0);
142 }
143
144 pattern_t *illumination_led_pattern_select()
145 {
146         if (battery_critical)
147                 return NULL;
148
149         switch (ambient_zone) {
150         case 0: return dim_mode
151                 ? number_pattern(1, 1)
152                 : on_pattern;
153         case 1: return dim_mode
154                 ? number_pattern(2, 1)
155                 : number_pattern(3, 1);
156         case 2: return dim_mode
157                 ? number_pattern(1, 0)
158                 : number_pattern(2, 0);
159         case 3:
160         default: return dim_mode
161                 ? number_pattern(3, 0)
162                 : number_pattern(4, 0);
163         }
164 }
165
166 pattern_t *laser_pattern_select()
167 {
168         if (!dim_mode && ambient_zone <= 1)
169                 return number_pattern(2, 1);
170         else
171                 return NULL;
172 }