--- /dev/null
+#include "leds.h"
+
+void leds_setup(void)
+{
+ pinMode(LEDS_GRN, OUTPUT);
+ pinMode(LEDS_RED, OUTPUT);
+ pinMode(LED1, OUTPUT);
+ pinMode(LED2, OUTPUT);
+ pinMode(LED3, OUTPUT);
+ pinMode(LED4, OUTPUT);
+}
+
+/**
+ * Tasks for the LEDs. Needs to be called every few ms(?) for multiplexing.
+ * When an LED is blinking and in the off period, it is necessary to call
+ * digitalWrite() twice and set the cathode. This ensures that the function
+ * takes equally long to return on every iteration, s.t. the blinking duty
+ * cycle is exactly 50% and LEDs blink equally bright, regardless of the status
+ * of other LEDs.
+ */
+void leds_tasks(void)
+{
+ leds.counter++;
+ switch (leds.counter & 0x03) {
+ case 0:
+ digitalWrite(LED4, 1);
+ if ((leds.a & LED_BLINK) && leds.counter & 0x4000) {
+ digitalWrite(LEDS_GRN, 0);
+ digitalWrite(LEDS_RED, 0);
+ } else {
+ digitalWrite(LEDS_GRN, leds.a & 1);
+ digitalWrite(LEDS_RED, leds.a & 2);
+ }
+ digitalWrite(LED1, 0);
+ break;
+ case 1:
+ digitalWrite(LED1, 1);
+ if ((leds.b & LED_BLINK) && leds.counter & 0x4000) {
+ digitalWrite(LEDS_GRN, 0);
+ digitalWrite(LEDS_RED, 0);
+ } else {
+ digitalWrite(LEDS_GRN, leds.b & 1);
+ digitalWrite(LEDS_RED, leds.b & 2);
+ }
+ digitalWrite(LED2, 0);
+ break;
+ case 2:
+ digitalWrite(LED2, 1);
+ if ((leds.c & LED_BLINK) && leds.counter & 0x4000) {
+ digitalWrite(LEDS_GRN, 0);
+ digitalWrite(LEDS_RED, 0);
+ } else {
+ digitalWrite(LEDS_GRN, leds.c & 1);
+ digitalWrite(LEDS_RED, leds.c & 2);
+ }
+ digitalWrite(LED3, 0);
+ break;
+ case 3:
+ digitalWrite(LED3, 1);
+ if ((leds.d & LED_BLINK) && leds.counter & 0x4000) {
+ digitalWrite(LEDS_GRN, 0);
+ digitalWrite(LEDS_RED, 0);
+ } else {
+ digitalWrite(LEDS_GRN, leds.d & 1);
+ digitalWrite(LEDS_RED, leds.d & 2);
+ }
+ digitalWrite(LED4, 0);
+ break;
+ }
+}