detect no selected inputs first
[Arduino] / Diseq_c / Diseq_c.ino
1 /*
2  */
3
4 // debug on serial
5 #define DEBUG 1
6
7 // pins, 2 recorders 4 inputs each 
8 int receiver[2][4] = {
9         { A0, A1, A2, A3 },
10         { A4, A5, A6, A7 },
11 };
12
13 #define REC_MASTER 2
14
15 #define LED 13
16
17 void setup(){
18   Serial.begin(9600); // FIXME check speed
19
20   pinMode(REC_MASTER, INPUT_PULLUP); // pullup for jumper/button
21
22   pinMode(receiver[0][0], INPUT);
23   pinMode(receiver[0][1], INPUT);
24   pinMode(receiver[0][2], INPUT);
25   pinMode(receiver[0][3], INPUT);
26
27   pinMode(receiver[1][0], INPUT);
28   pinMode(receiver[1][1], INPUT);
29   pinMode(receiver[1][2], INPUT);
30   pinMode(receiver[1][3], INPUT);
31
32   pinMode(LED, OUTPUT);
33
34 #if DEBUG
35   Serial.print("boot master=");
36   Serial.println(digitalRead(REC_MASTER) == HIGH );
37 #endif
38 }
39
40 int receiver_selection( int nr ) {
41   int StateA = digitalRead( receiver[nr][0] ) == HIGH;
42   int StateB = digitalRead( receiver[nr][1] ) == HIGH;
43   int StateC = digitalRead( receiver[nr][2] ) == HIGH;
44   int StateD = digitalRead( receiver[nr][3] ) == HIGH;
45
46 #ifdef DEBUG
47   Serial.print("<");
48   Serial.print(StateA);
49   Serial.print(StateB);
50   Serial.print(StateC);
51   Serial.print(StateD);
52   Serial.print(">");
53 #endif
54
55   if ( StateA + StateB + StateC + StateD == 0 ) { // no inputs active
56     return 0;
57   }
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 nr = 1;  
88
89   while(nr) {
90     int sat = receiver_selection(nr-1);
91
92     #if DEBUG
93     Serial.print(" r");
94     Serial.print(nr);
95     Serial.print("=");
96     Serial.print(sat);
97     Serial.print("|");
98     #endif
99   
100     nr++;
101     if (nr > 2) nr = 0;
102   
103     if ( sat == 0 ) { // slow blink
104       blink_interval = LED_NO_ACTIVE_INPUTS;
105     } else if ( sat < 0 ) { // error
106       blink_interval = LED_MULTIPLE_INPUTS;
107     } else {
108       blink_interval = LED_OFF;
109   
110       if ( digitalRead(REC_MASTER) == HIGH ) {
111         nr = 0; // stop
112         #if DEBUG
113         Serial.print("M");
114         #endif
115       }
116   
117       if ( current_sat != sat ) {
118  
119         current_sat = sat;
120   
121         for(int repeat=0; repeat<2; repeat++) {
122   
123           Serial.print("@L,");
124           Serial.println( char('A' - 1 + sat) );
125   
126           for(int i=0; i<sat; i++) {
127             digitalWrite(LED, HIGH);
128             delay(LED_SERIAL);
129             digitalWrite(LED, LOW);
130             delay(LED_SERIAL);
131           }
132           delay( 2000 - sat * LED_SERIAL ); // sleep up to 2s
133         //assert(4 * LED_SERIAL < 2000);
134         }
135       }
136     } 
137   }
138
139
140 #if DEBUG
141   Serial.print(" sat=");
142   Serial.print(current_sat);
143   Serial.print(" blink=");
144   Serial.println(blink_interval);
145 #endif
146
147   // handle next led blink event in time
148   int m = millis() % ( blink_interval * 2 );
149   if ( blink_interval != 0 ) {
150     if ( m > blink_interval ) {
151       digitalWrite(LED, HIGH);
152     } else {
153       digitalWrite(LED, LOW);
154     }
155   } else {
156     digitalWrite(LED, LOW);
157   }
158 }
159
160
161