f6587f083644554e41bc135376f41fa64f257d71
[Arduino] / Diseq_c / Diseq_c.ino
1 /*
2  */
3
4 // debug on serial
5 #define DEBUG 1
6
7 // serial commands for loop-back test
8 #define TEST 1
9
10 // pins, 2 recorders 4 inputs each 
11 int receiver[2][4] = {
12   { A0, A1, A2, A3 },
13   { A4, A5, A6, A7 },
14 };
15
16 #define REC_MASTER 2
17
18 #define LED 13
19
20 //                  rec1        rec2     master
21 int test_pins[] = { 12,11,10,9, 8,7,6,5, 4 };
22 int test_out[]  = {  0, 0, 0,0, 0,0,0,0, 1};
23 int nr_test_pins = sizeof(test_pins)/sizeof(int);
24
25 void setup(){
26   Serial.begin(9600); // FIXME check speed
27
28   pinMode(REC_MASTER, INPUT_PULLUP); // pullup for jumper/button
29
30   for(int nr=0; nr<2; nr++) {
31     for(int input=0; input<4; input++) {
32       pinMode(receiver[nr][input], INPUT);
33     }
34   }
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 #if TEST
44   for(int i=0;i<nr_test_pins;i++) {
45     pinMode(test_pins[i], OUTPUT);
46     digitalWrite(test_pins[i], test_out[i]);
47   }
48 #endif
49 }
50
51 int receiver_selection( int nr ) {
52
53   #ifdef DEBUG
54   Serial.print("<");
55   #endif
56
57   int active = 0;
58   int selected = -1;
59   for(int i=0; i<4; i++) {
60     int a = analogRead( receiver[nr][i] );
61     int on_off = a > 512 ? 1 : 0;
62     active += on_off;
63     if ( on_off ) selected = i+1;
64
65     //Serial.print(a);
66     //Serial.print("~");
67     Serial.print(on_off);
68     //Serial.print(" ");
69   }
70
71   Serial.print(">");
72   Serial.print(selected);
73
74   if ( active == 0 ) { // no inputs active
75     return 0;
76   }
77
78   if ( active != 1 ) { // only one active at a time
79     return -1; // error
80   }
81
82   return selected;
83 }
84
85 #define LED_NO_ACTIVE_INPUTS 2000
86 #define LED_MULTIPLE_INPUTS  125
87 #define LED_SERIAL           200 // < 250
88 #define LED_OFF              0
89
90 int current_sat = 0;
91 int blink_interval = LED_NO_ACTIVE_INPUTS; // 2 sec on/off no receivers turned on
92 int last_changed_nr = -1;
93 int last_receiver_selection[2] = { -1, -1 };
94
95 void loop(){
96
97   int nr = 1;
98
99   while(nr && nr <= 2) {
100     int i = nr - 1;
101
102     int current_nr = nr;
103
104     int sat = receiver_selection(i);
105     int last_sat = last_receiver_selection[i];
106     last_receiver_selection[i] = sat;
107
108     #if DEBUG
109     Serial.print(" nr:");
110     Serial.print(nr);
111     Serial.print("=");
112     Serial.print(sat);
113     Serial.print(" last:");
114     Serial.print(last_sat);
115     Serial.print("|");
116     #endif
117
118     int prefer_master = 0;
119     if ( digitalRead(REC_MASTER) == HIGH ) {
120       prefer_master = 1;
121     } else {
122         if ( last_sat != sat ) {
123           Serial.print("C");
124           last_changed_nr = current_nr;
125           nr=0; // stop
126         } else {
127           Serial.print("=");
128           nr++; // next
129           continue;
130         }
131
132         if ( last_changed_nr != current_nr ) {
133           sat = current_sat; // ignore, last not changed
134           Serial.print("I");
135         }
136
137
138     }
139  
140     if ( sat == 0 ) { // slow blink
141       blink_interval = LED_NO_ACTIVE_INPUTS;
142       nr++; // next
143     } else if ( sat < 0 ) { // error
144       blink_interval = LED_MULTIPLE_INPUTS;
145       nr = 0;
146     } else {
147       blink_interval = LED_OFF;
148   
149       if ( prefer_master ) {
150         #if DEBUG
151         Serial.print("[M]");
152         #endif
153         if ( nr == 1 ) { // need to check 2nd recorder error
154           int error = receiver_selection(i + 1);
155           Serial.print(error);
156           if ( error == -1 ) blink_interval = LED_MULTIPLE_INPUTS;
157         }
158         nr = 0; // stop
159       } else {
160         if ( last_sat != sat ) {
161           Serial.print("[C]");
162           last_changed_nr = current_nr;
163           nr=0;
164         } else {
165           Serial.print("[S]");
166           nr++;
167         }
168
169         if ( last_changed_nr != current_nr ) {
170           sat = current_sat; // ignore, last not changed
171           Serial.print("[I]");
172         }
173   
174       }
175
176       if ( current_sat != sat ) {
177
178   last_changed_nr = current_nr;
179         current_sat = sat;
180         nr = 0; // stop
181
182         for(int repeat=0; repeat<2; repeat++) {
183   
184           Serial.print("@L,");
185           Serial.println( char('A' + sat - 1) );
186   
187           for(int i=0; i<sat; i++) {
188             digitalWrite(LED, HIGH);
189             delay(LED_SERIAL);
190             digitalWrite(LED, LOW);
191             delay(LED_SERIAL);
192           }
193           delay( ( 5 - sat ) * LED_SERIAL * 2 ); // sleep up to 2s
194     //assert(4 * LED_SERIAL < 2000);
195         }
196
197       }
198
199     } // while
200
201   }
202
203
204   #if DEBUG
205   Serial.print(" sat=");
206   Serial.print(current_sat);
207   Serial.print(" from:");
208   Serial.print(last_changed_nr);
209   Serial.print(" blink=");
210   Serial.println(blink_interval);
211   #endif
212
213   // handle next led blink event in time
214   int m = millis() % ( blink_interval * 2 );
215   if ( blink_interval != 0 ) {
216     if ( m > blink_interval ) {
217       digitalWrite(LED, HIGH);
218     } else {
219       digitalWrite(LED, LOW);
220     }
221   } else {
222     digitalWrite(LED, LOW);
223   }
224
225   #if TEST
226   while ( Serial.available() ) {
227     int serial = Serial.read();
228     Serial.print(serial, HEX);
229     if ( serial >= '1' && serial <= ( '1' + nr_test_pins ) ) {
230       int nr = serial - '1';
231       Serial.print(" toggle pin ");
232       test_out[nr] = ! test_out[nr];
233       int pin = test_pins[nr];
234       Serial.print(pin);
235       Serial.print("=");
236       int out = test_out[nr];
237       Serial.print(out);
238       digitalWrite( pin, out );
239
240     }
241     Serial.print(" <");
242     for(int i=0;i<nr_test_pins;i++) {
243       if ( i == 4 || i == 8 ) Serial.print(" ");
244       Serial.print(test_out[i]);
245     }
246     Serial.println(">");
247   }
248   #endif
249 }
250
251