The unified diff between revisions [81e4dce2..] and [24d5b9f4..] is displayed below. It can also be downloaded as a raw diff.
This diff has been restricted to the following files: 'led.c'
# # old_revision [81e4dce274e79dd9187ed4bd182e1d6fc0fdfb37] # new_revision [24d5b9f4dff9135787b198fe1127d9c1e3326b9c] # # add_file "led.c" # content [c5ff1936310b87f8ddb877b8d60f17617f4daabd] # ============================================================ --- /dev/null +++ led.c c5ff1936310b87f8ddb877b8d60f17617f4daabd @@ -0,0 +1,59 @@ +/* led.c */ + +#include "led.h" +#include "timer.h" + +#define FP0XVAL (*((volatile unsigned int *) 0x3FFFC014)) + +led_pattern *led_current_pattern; +led_pattern *led_current_pointer; +unsigned int led_next_time; +bool led_next_state; + +led_pattern led_pattern_active[] = {250, 250, 0}; +led_pattern led_pattern_unknown[] = {100, 100, 0}; + +void led_set(bool on) +{ + if (on) + FP0XVAL &= ~0x04000000; + else + FP0XVAL |= 0x04000000; +} + +void led_update(void) +{ + unsigned int time = timer_read(); + + /* This should never be possible, but let's just be sure. */ + if (!led_current_pattern) + return; + if (!led_current_pointer) + return; + + if (((signed int) (((signed int)led_next_time)-time)) > 0) + return; + + led_set(led_next_state); + led_next_state = !led_next_state; + led_next_time += *led_current_pointer * TIMER_MS; + led_current_pointer++; + if (*led_current_pointer == 0) + led_current_pointer = led_current_pattern; +} + +void led_set_pattern(led_pattern *pattern) +{ + if (led_current_pattern == pattern) + return; + led_current_pattern = pattern; +} + +void led_init(void) +{ + led_current_pattern = led_pattern_unknown; + led_current_pointer = led_pattern_unknown; + led_next_state = TRUE; + led_next_time = timer_read(); + led_update(); +}