The unified diff between revisions [81e4dce2..] and [9142f333..] 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 [9142f3330490a5aa00c1686475633b620c2ef5e7]
#
# add_file "led.c"
#  content [4451940c19abd23f90df9a9f1e14e01e21b8714e]
#
============================================================
--- /dev/null	
+++ led.c	4451940c19abd23f90df9a9f1e14e01e21b8714e
@@ -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 * TIMER0_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();
+}