2 #include <stdlib.h> // for NULL
6 static pattern_t panic_pattern[] = {
7 { 3, D_1 }, // FIXME: will be 4, but let's be safe while testing
32 static pattern_t brake_pattern [] = {
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 },
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 },
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 },
69 pattern_t on_pattern[] = {
74 static unsigned char dim_mode, towbar_mode, braking;
87 led_set_pattern(N_STATUS_LED, status_led_pattern_select());
88 led_set_pattern(0, pwmled_pattern_select());
95 led_set_pattern(N_STATUS_LED, status_led_pattern_select());
96 led_set_pattern(0, pwmled_pattern_select());
99 void toggle_dim_mode()
101 dim_mode = !dim_mode;
105 void set_panic_mode()
107 led_set_pattern(0, panic_pattern);
108 led_set_pattern(N_ILLUM_LED, panic_pattern);
111 pattern_t *pwmled_pattern_select()
113 if (battery_critical)
120 return brake_pattern;
122 switch (ambient_zone) {
123 case 0: return night_pattern;
128 return dim_mode ? slow_pattern : fast_pattern;
132 pattern_t *status_led_pattern_select()
137 if (buttons_setup_in_progress())
138 return buttons_setup_status0_pattern_select();
140 // FIXME: do something sane
141 return number_pattern(battery_gauge(), 0);
144 pattern_t *illumination_led_pattern_select()
146 if (battery_critical)
149 switch (ambient_zone) {
150 case 0: return dim_mode
151 ? number_pattern(1, 1)
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);
160 default: return dim_mode
161 ? number_pattern(3, 0)
162 : number_pattern(4, 0);
166 pattern_t *laser_pattern_select()
168 if (!dim_mode && ambient_zone <= 1)
169 return number_pattern(2, 1);