2 #include <stdlib.h> // for NULL
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 },
31 static pattern_t brake_pattern [] = {
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 },
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 },
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 },
68 pattern_t on_pattern[] = {
73 static unsigned char dim_mode, towbar_mode, braking;
86 led_set_pattern(N_STATUS_LED, status_led_pattern_select());
87 led_set_pattern(0, pwmled_pattern_select());
94 led_set_pattern(N_STATUS_LED, status_led_pattern_select());
95 led_set_pattern(0, pwmled_pattern_select());
98 void toggle_dim_mode()
100 dim_mode = !dim_mode;
104 void set_panic_mode()
106 led_set_pattern(0, panic_pattern);
107 led_set_pattern(N_ILLUM_LED, panic_pattern);
110 pattern_t *pwmled_pattern_select()
112 if (battery_critical)
119 return brake_pattern;
121 switch (ambient_zone) {
122 case 0: return night_pattern;
127 return dim_mode ? slow_pattern : fast_pattern;
131 pattern_t *status_led_pattern_select()
136 if (buttons_setup_in_progress())
137 return buttons_setup_status0_pattern_select();
139 // FIXME: do something sane
140 return number_pattern(battery_gauge(), 0);
143 pattern_t *illumination_led_pattern_select()
145 if (battery_critical)
148 switch (ambient_zone) {
149 case 0: return dim_mode
150 ? number_pattern(1, 1)
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);
159 default: return dim_mode
160 ? number_pattern(3, 0)
161 : number_pattern(4, 0);
165 pattern_t *laser_pattern_select()
167 if (!dim_mode && ambient_zone <= 1)
168 return number_pattern(2, 1);