]> www.fi.muni.cz Git - bike-lights.git/blob - firmware/control.c
braking is handled behind the patterns inside pattern.c
[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 volatile unsigned char braking;
68 static unsigned char dim_mode, towbar_mode;
69
70 void init_control()
71 {
72         dim_mode = 0;
73         towbar_mode = 0;
74         braking = 0;
75 }
76
77 void brake_on()
78 {
79         braking = 1;
80         gpio_set(0, 1);
81         led_set_pattern(N_STATUS_LED, status_led_pattern_select());
82         pwmleds_update_mode();
83 }
84
85 void brake_off()
86 {
87         braking = 0;
88         gpio_set(0, 0);
89         led_set_pattern(N_STATUS_LED, status_led_pattern_select());
90         pwmleds_update_mode();
91 }
92
93 void toggle_dim_mode()
94 {
95         dim_mode = !dim_mode;
96         pattern_reload();
97 }
98
99 void set_panic_mode()
100 {
101         led_set_pattern(0, panic_pattern);
102         led_set_pattern(N_ILLUM_LED, panic_pattern);
103 }
104
105 pattern_t *pwmled_pattern_select()
106 {
107         if (battery_critical)
108                 return slow_pattern;
109
110         switch (ambient_zone) {
111         case 0: return night_pattern;
112         case 1:
113         case 2:
114         case 3:
115         default:
116                 return dim_mode ? slow_pattern : fast_pattern;
117         }
118 }
119
120 pattern_t *status_led_pattern_select()
121 {
122         if (braking)
123                 return on_pattern;
124
125         if (buttons_setup_in_progress())
126                 return buttons_setup_status0_pattern_select();
127
128         // FIXME: do something sane
129         return number_pattern(battery_gauge(), 0);
130 }
131
132 pattern_t *illumination_led_pattern_select()
133 {
134         if (battery_critical)
135                 return NULL;
136
137         switch (ambient_zone) {
138         case 0: return dim_mode
139                 ? number_pattern(1, 1)
140                 : on_pattern;
141         case 1: return dim_mode
142                 ? number_pattern(2, 1)
143                 : number_pattern(3, 1);
144         case 2: return dim_mode
145                 ? number_pattern(1, 0)
146                 : number_pattern(2, 0);
147         case 3:
148         default: return dim_mode
149                 ? number_pattern(3, 0)
150                 : number_pattern(4, 0);
151         }
152 }
153
154 pattern_t *laser_pattern_select()
155 {
156         if (!dim_mode && ambient_zone <= 1)
157                 return number_pattern(2, 1);
158         else
159                 return NULL;
160 }