]> www.fi.muni.cz Git - bike-lights.git/blob - firmware/control.c
logic for setting brightness
[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 slow_pattern[] = {
32         { PWM_PAT(1, 0, 0), D_1 },
33         { PWM_PAT(0, 0, 1), D_1 },
34         { PWM_PAT(0, 0, 0), D_13 },
35         PATTERN_END
36 };
37
38 static pattern_t fast_pattern[] = {
39         { PWM_PAT(2, 0, 0), D_1 },
40         { PWM_PAT(0, 0, 2), D_1 },
41         { PWM_PAT(2, 0, 0), D_1 },
42         { PWM_PAT(0, 0, 2), D_1 },
43         { PWM_PAT(0, 0, 0), D_8 },
44         { PWM_PAT(1, 0, 0), D_1 },
45         { PWM_PAT(0, 0, 1), D_1 },
46         { PWM_PAT(1, 0, 0), D_1 },
47         { PWM_PAT(0, 0, 1), D_1 },
48         { PWM_PAT(0, 0, 0), D_8 },
49         PATTERN_END
50 };
51
52 static pattern_t night_pattern[] = {
53         { PWM_PAT(2, 0, 2), D_3 },
54         { PWM_PAT(3, 0, 0), D_8 },
55         { PWM_PAT(2, 0, 2), D_1 },
56         { PWM_PAT(3, 0, 0), D_2 },
57         { PWM_PAT(2, 0, 2), D_1 },
58         { PWM_PAT(3, 0, 0), D_8 },
59         PATTERN_END
60 };
61
62 pattern_t on_pattern[] = {
63         { 1, D_8 },
64         PATTERN_END
65 };
66
67 // #define TEST_PATTERN 1
68 #ifdef TEST_PATTERN
69 pattern_t test_pattern[] = {
70         { PWM_PAT(1, 0, 0), D_13 },
71         { PWM_PAT(2, 0, 0), D_13 },
72         { PWM_PAT(0, 0, 1), D_13 },
73         { PWM_PAT(0, 0, 2), D_13 },
74         PATTERN_END
75 };
76 #endif
77
78 volatile unsigned char braking;
79 static unsigned char dim_mode, towbar_mode;
80
81 void init_control()
82 {
83         dim_mode = 0;
84         towbar_mode = 0;
85         braking = 0;
86
87         pwmled_select_brightness();
88 }
89
90 void brake_on()
91 {
92         braking = 1;
93         gpio_set(0, 1);
94         led_set_pattern(N_STATUS_LED, status_led_pattern_select());
95         pwmleds_update_mode();
96 }
97
98 void brake_off()
99 {
100         braking = 0;
101         gpio_set(0, 0);
102         led_set_pattern(N_STATUS_LED, status_led_pattern_select());
103         pwmleds_update_mode();
104 }
105
106 void toggle_dim_mode()
107 {
108         dim_mode = !dim_mode;
109         pwmled_select_brightness();
110         pattern_reload();
111 }
112
113 void set_panic_mode()
114 {
115         led_set_pattern(0, panic_pattern);
116         led_set_pattern(N_ILLUM_LED, panic_pattern);
117 }
118
119 pattern_t *pwmled_pattern_select()
120 {
121 #ifdef TEST_PATTERN
122         return tmp_pattern;
123 #endif
124         if (battery_critical)
125                 return slow_pattern;
126
127         switch (ambient_zone) {
128         case 0: return night_pattern;
129         case 1:
130         case 2:
131         case 3:
132         default:
133                 return dim_mode ? slow_pattern : fast_pattern;
134         }
135 }
136
137 pattern_t *status_led_pattern_select()
138 {
139         if (braking)
140                 return on_pattern;
141
142         if (buttons_setup_in_progress())
143                 return buttons_setup_status0_pattern_select();
144
145         // FIXME: do something sane
146         return number_pattern(battery_gauge(), 0);
147 }
148
149 pattern_t *illumination_led_pattern_select()
150 {
151         if (battery_critical)
152                 return NULL;
153
154         switch (ambient_zone) {
155         case 0: return dim_mode
156                 ? number_pattern(1, 1)
157                 : on_pattern;
158         case 1: return dim_mode
159                 ? number_pattern(2, 1)
160                 : number_pattern(3, 1);
161         case 2: return dim_mode
162                 ? number_pattern(1, 0)
163                 : number_pattern(2, 0);
164         case 3:
165         default: return dim_mode
166                 ? number_pattern(3, 0)
167                 : number_pattern(4, 0);
168         }
169 }
170
171 pattern_t *laser_pattern_select()
172 {
173         if (!dim_mode && ambient_zone <= 1)
174                 return number_pattern(2, 1);
175         else
176                 return NULL;
177 }
178
179 void pwmled_select_brightness()
180 {
181         uint16_t brightness = PWMLED_BRIGHTNESS(0, 2, 1, 0, 2); // default
182
183         if (battery_critical) {
184                 brightness = PWMLED_BRIGHTNESS(0, 0, 0, 0, 0);
185         } else if (ambient_zone < 2) {
186                 if (dim_mode)
187                         brightness = PWMLED_BRIGHTNESS(0, 1, 0, 0, 1);
188                 else
189                         brightness = PWMLED_BRIGHTNESS(0, 2, 1, 0, 2);
190         } else if (ambient_zone == 2) {
191                 brightness = PWMLED_BRIGHTNESS(1, 3, 2, 1, 3);
192         } else if (ambient_zone == 3) {
193                 brightness = PWMLED_BRIGHTNESS(2, 4, 2, 2, 4);
194         }
195
196         pwmled_set_brightness(brightness);
197 }