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