Restructure
[liquid-crystal-terminal.git] / terminal / leds.ino
1 #include "leds.h"
2
3 void leds_setup(void)
4 {
5 pinMode(LEDS_GRN, OUTPUT);
6 pinMode(LEDS_RED, OUTPUT);
7 pinMode(LED1, OUTPUT);
8 pinMode(LED2, OUTPUT);
9 pinMode(LED3, OUTPUT);
10 pinMode(LED4, OUTPUT);
11 }
12
13 /**
14 * Tasks for the LEDs. Needs to be called every few ms(?) for multiplexing.
15 * When an LED is blinking and in the off period, it is necessary to call
16 * digitalWrite() twice and set the cathode. This ensures that the function
17 * takes equally long to return on every iteration, s.t. the blinking duty
18 * cycle is exactly 50% and LEDs blink equally bright, regardless of the status
19 * of other LEDs.
20 */
21 void leds_tasks(void)
22 {
23 leds.counter++;
24 switch (leds.counter & 0x03) {
25 case 0:
26 digitalWrite(LED4, 1);
27 if ((leds.a & LED_BLINK) && leds.counter & 0x4000) {
28 digitalWrite(LEDS_GRN, 0);
29 digitalWrite(LEDS_RED, 0);
30 } else {
31 digitalWrite(LEDS_GRN, leds.a & 1);
32 digitalWrite(LEDS_RED, leds.a & 2);
33 }
34 digitalWrite(LED1, 0);
35 break;
36 case 1:
37 digitalWrite(LED1, 1);
38 if ((leds.b & LED_BLINK) && leds.counter & 0x4000) {
39 digitalWrite(LEDS_GRN, 0);
40 digitalWrite(LEDS_RED, 0);
41 } else {
42 digitalWrite(LEDS_GRN, leds.b & 1);
43 digitalWrite(LEDS_RED, leds.b & 2);
44 }
45 digitalWrite(LED2, 0);
46 break;
47 case 2:
48 digitalWrite(LED2, 1);
49 if ((leds.c & LED_BLINK) && leds.counter & 0x4000) {
50 digitalWrite(LEDS_GRN, 0);
51 digitalWrite(LEDS_RED, 0);
52 } else {
53 digitalWrite(LEDS_GRN, leds.c & 1);
54 digitalWrite(LEDS_RED, leds.c & 2);
55 }
56 digitalWrite(LED3, 0);
57 break;
58 case 3:
59 digitalWrite(LED3, 1);
60 if ((leds.d & LED_BLINK) && leds.counter & 0x4000) {
61 digitalWrite(LEDS_GRN, 0);
62 digitalWrite(LEDS_RED, 0);
63 } else {
64 digitalWrite(LEDS_GRN, leds.d & 1);
65 digitalWrite(LEDS_RED, leds.d & 2);
66 }
67 digitalWrite(LED4, 0);
68 break;
69 }
70 }