fix blinks, added debug output
[Arduino] / Diseq_c / Diseq_c.ino
1 /*
2 pins, 2 recorders 4 inputs each 
3  */
4
5 #define DEBUG 1
6
7 #define REC_1_A A0
8 #define REC_1_B A1
9 #define REC_1_C A2
10 #define REC_1_D A3
11
12 #define REC_2_A A4
13 #define REC_2_B A5
14 #define REC_2_C A6
15 #define REC_2_D A7
16
17 #define REC_MASTER 2
18
19 #define LED 13
20
21 void setup(){
22   Serial.begin(9600); // FIXME check speed
23
24   pinMode(REC_MASTER, INPUT_PULLUP); // pullup for jumper/button
25
26   pinMode(REC_1_A, INPUT);
27   pinMode(REC_1_B, INPUT);
28   pinMode(REC_1_C, INPUT);
29   pinMode(REC_1_D, INPUT);
30
31   pinMode(REC_2_A, INPUT);
32   pinMode(REC_2_B, INPUT);
33   pinMode(REC_2_C, INPUT);
34   pinMode(REC_2_D, INPUT);
35
36   pinMode(LED, OUTPUT);
37
38 #if DEBUG
39   Serial.print("boot master=");
40   Serial.println(digitalRead(REC_MASTER) == HIGH );
41 #endif
42 }
43
44 int recorder_inputs( int PinA, int PinB, int PinC, int PinD ) {
45   int StateA = digitalRead( PinA ) == HIGH;
46   int StateB = digitalRead( PinB ) == HIGH;
47   int StateC = digitalRead( PinC ) == HIGH;
48   int StateD = digitalRead( PinD ) == HIGH;
49
50 #ifdef DEBUG
51   Serial.print("<");
52   Serial.print(StateA);
53   Serial.print(StateB);
54   Serial.print(StateC);
55   Serial.print(StateD);
56   Serial.print(">");
57 #endif
58
59   if ( StateA + StateB + StateC + StateD != 1 ) { // only one active at a time
60     return -1; // error
61   }
62
63   if ( StateA ) {
64     return 1;
65   } else if ( StateB ) {
66     return 2;
67   } else if ( StateC ) {
68     return 3;
69   } else if ( StateD ) {
70     return 4;
71   }
72
73   return 0; // receiver off
74 }
75
76 #define LED_NO_ACTIVE_INPUTS 2000
77 #define LED_MULTIPLE_INPUTS  125
78 #define LED_SERIAL           250
79 #define LED_OFF              0
80
81 int current_sat = 0;
82 int blink_interval = LED_NO_ACTIVE_INPUTS; // 2 sec on/off no receivers turned on
83
84
85 void loop(){
86   
87   int sat = recorder_inputs( REC_1_A, REC_1_B, REC_1_C, REC_1_D );
88   volatile int try_slave = 1;
89
90 again_for_slave:
91
92 #if DEBUG
93   Serial.print(" r1 ");
94   Serial.print(sat);
95 #endif
96
97   if ( sat == 0 ) { // slow blink
98     blink_interval = LED_NO_ACTIVE_INPUTS;
99   } else if ( sat < 0 ) { // error
100     blink_interval = LED_MULTIPLE_INPUTS;
101   } else {
102
103     if ( digitalRead(REC_MASTER) == HIGH ) {
104       try_slave = 0;
105       Serial.print("M");
106     }
107
108     if ( current_sat != sat ) {
109
110       current_sat = sat;
111       blink_interval = LED_OFF;
112
113       for(int repeat=0; repeat<2; repeat++) {
114
115         Serial.print("@L,");
116         Serial.println( char('A' - 1 + sat) );
117
118         for(int i=0; i<sat; i++) {
119           digitalWrite(LED, HIGH);
120           delay(LED_SERIAL);
121           digitalWrite(LED, LOW);
122           delay(LED_SERIAL);
123         }
124         delay( 2000 - sat * LED_SERIAL ); // sleep up to 2s
125         //assert(4 * LED_SERIAL < 2000);
126       }
127
128     } 
129   }
130
131   if ( try_slave == 1 ) {
132     try_slave = 0;
133     sat = recorder_inputs( REC_2_A, REC_2_B, REC_2_C, REC_2_D );
134 #if DEBUG
135     Serial.print(" r2 ");
136     Serial.print(sat);
137 #endif
138     goto again_for_slave;
139   }
140
141 #if DEBUG
142   Serial.print(" sat=");
143   Serial.print(current_sat);
144   Serial.print(" blink=");
145   Serial.println(blink_interval);
146 #endif
147
148   // handle next led blink event in time
149   int m = millis() % ( blink_interval * 2 );
150   if ( blink_interval != 0 ) {
151     if ( m > blink_interval ) {
152       digitalWrite(LED, HIGH);
153     } else {
154       digitalWrite(LED, LOW);
155     }
156   } else {
157     digitalWrite(LED, LOW);
158   }
159 }
160
161
162