2 #include <stdlib.h> // for NULL
6 static unsigned char led_counters[N_LEDS];
7 static pattern_t *led_patterns[N_LEDS];
9 static unsigned char fibonacci[8] = {
10 0, 1, 2, 3, 5, 8, 13, 21,
13 static pattern_t boot_pattern[] = {
33 static pattern_t pattern_num[] = {
58 static pattern_t pattern_invnum[] = {
83 pattern_t off_pattern[] = {
88 static void inline pwmleds_set_mode(unsigned char mode)
90 pwmled_set_mode(0, mode & 3);
91 pwmled_set_mode(1, (mode >> 2) & 1);
92 pwmled_set_mode(2, (mode >> 3) & 3);
95 void led_set_pattern(unsigned char n, pattern_t *pattern)
98 pattern = off_pattern;
100 led_patterns[n] = pattern;
102 led_counters[n] = fibonacci[pattern->duration_fib];
105 pwmleds_set_mode(pattern->mode);
106 } else if (n < N_LEDS) {
107 gpio_set(n - 1, pattern->mode);
115 for (i = 0; i < N_LEDS; i++)
116 led_set_pattern(i, NULL);
118 led_set_pattern(N_ILLUM_LED, boot_pattern);
121 pattern_t *number_pattern(unsigned char num, unsigned char inv)
127 return pattern_invnum
128 + sizeof(pattern_invnum)/sizeof(pattern_t)
132 + sizeof(pattern_num)/sizeof(pattern_t)
137 static pattern_t *pattern_select(unsigned char n)
140 case 0: return pwmled_pattern_select();
141 case N_STATUS_LED: return status_led_pattern_select();
142 case N_ILLUM_LED: return illumination_led_pattern_select();
143 case N_LASER_LED: return laser_pattern_select();
144 default: return NULL;
148 void pattern_reload()
152 for (i = 0; i < N_LEDS; i++)
153 led_set_pattern(i, pattern_select(i));
156 static void inline pattern_finished(unsigned char n)
160 led_patterns[n] = NULL;
163 led_set_pattern(0, pattern_select(0));
164 } else if (n == N_STATUS_LED) {
165 if (!led_patterns[N_ILLUM_LED])
166 led_set_pattern(N_ILLUM_LED,
167 pattern_select(N_ILLUM_LED));
168 } else if (n == N_ILLUM_LED) {
169 if (!led_patterns[N_STATUS_LED])
170 led_set_pattern(N_STATUS_LED,
171 pattern_select(N_STATUS_LED));
173 led_set_pattern(n, pattern_select(n));
177 void patterns_next_tick()
181 for (i = 0; i < N_LEDS; i++) {
182 if (!led_patterns[i]) {
187 if (--led_counters[i] == 0) {
188 pattern_t *p = led_patterns[i];
190 if (p->duration_fib == 0) { // END
191 /* Keep the last state, wait for others */
195 led_set_pattern(i, p);