serial commands 1-9 to test loopback pins
[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[] = { 2,3,4,5, 6,7,8,9, 1};
22 int test_out[]  = { 1,0,0,0, 0,1,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   pinMode(receiver[0][0], INPUT);
31   pinMode(receiver[0][1], INPUT);
32   pinMode(receiver[0][2], INPUT);
33   pinMode(receiver[0][3], INPUT);
34
35   pinMode(receiver[1][0], INPUT);
36   pinMode(receiver[1][1], INPUT);
37   pinMode(receiver[1][2], INPUT);
38   pinMode(receiver[1][3], INPUT);
39
40   pinMode(LED, OUTPUT);
41
42 #if DEBUG
43   Serial.print("boot master=");
44   Serial.println(digitalRead(REC_MASTER) == HIGH );
45 #endif
46
47 #if TEST
48   for(int i=0;i<nr_test_pins;i++) {
49     pinMode(test_pins[i], OUTPUT);
50     digitalWrite(test_pins[i], test_out[i]);
51   }
52 #endif
53 }
54
55 int receiver_selection( int nr ) {
56   int StateA = digitalRead( receiver[nr][0] ) == HIGH;
57   int StateB = digitalRead( receiver[nr][1] ) == HIGH;
58   int StateC = digitalRead( receiver[nr][2] ) == HIGH;
59   int StateD = digitalRead( receiver[nr][3] ) == HIGH;
60
61 #ifdef DEBUG
62   Serial.print("<");
63   Serial.print(StateA);
64   Serial.print(StateB);
65   Serial.print(StateC);
66   Serial.print(StateD);
67   Serial.print(">");
68 #endif
69
70   if ( StateA + StateB + StateC + StateD == 0 ) { // no inputs active
71     return 0;
72   }
73
74   if ( StateA + StateB + StateC + StateD != 1 ) { // only one active at a time
75     return -1; // error
76   }
77
78   if ( StateA ) {
79     return 1;
80   } else if ( StateB ) {
81     return 2;
82   } else if ( StateC ) {
83     return 3;
84   } else if ( StateD ) {
85     return 4;
86   }
87
88   return 0; // receiver off
89 }
90
91 #define LED_NO_ACTIVE_INPUTS 2000
92 #define LED_MULTIPLE_INPUTS  125
93 #define LED_SERIAL           250
94 #define LED_OFF              0
95
96 int current_sat = 0;
97 int blink_interval = LED_NO_ACTIVE_INPUTS; // 2 sec on/off no receivers turned on
98
99 void loop(){
100
101   int nr = 1;  
102
103   while(nr) {
104     int sat = receiver_selection(nr-1);
105
106     #if DEBUG
107     Serial.print(" r");
108     Serial.print(nr);
109     Serial.print("=");
110     Serial.print(sat);
111     Serial.print("|");
112     #endif
113   
114     nr++;
115     if (nr > 2) nr = 0;
116   
117     if ( sat == 0 ) { // slow blink
118       blink_interval = LED_NO_ACTIVE_INPUTS;
119     } else if ( sat < 0 ) { // error
120       blink_interval = LED_MULTIPLE_INPUTS;
121     } else {
122       blink_interval = LED_OFF;
123   
124       if ( digitalRead(REC_MASTER) == HIGH ) {
125         nr = 0; // stop
126         #if DEBUG
127         Serial.print("M");
128         #endif
129       }
130   
131       if ( current_sat != sat ) {
132  
133         current_sat = sat;
134   
135         for(int repeat=0; repeat<2; repeat++) {
136   
137           Serial.print("@L,");
138           Serial.println( char('A' - 1 + sat) );
139   
140           for(int i=0; i<sat; i++) {
141             digitalWrite(LED, HIGH);
142             delay(LED_SERIAL);
143             digitalWrite(LED, LOW);
144             delay(LED_SERIAL);
145           }
146           delay( 2000 - sat * LED_SERIAL ); // sleep up to 2s
147     //assert(4 * LED_SERIAL < 2000);
148         }
149       }
150     } 
151   }
152
153
154 #if DEBUG
155   Serial.print(" sat=");
156   Serial.print(current_sat);
157   Serial.print(" blink=");
158   Serial.println(blink_interval);
159 #endif
160
161   // handle next led blink event in time
162   int m = millis() % ( blink_interval * 2 );
163   if ( blink_interval != 0 ) {
164     if ( m > blink_interval ) {
165       digitalWrite(LED, HIGH);
166     } else {
167       digitalWrite(LED, LOW);
168     }
169   } else {
170     digitalWrite(LED, LOW);
171   }
172
173   #if TEST
174   while ( Serial.available() ) {
175     int serial = Serial.read();
176     Serial.print(serial, HEX);
177     if ( serial >= '1' && serial <= ( '1' + nr_test_pins ) ) {
178       int nr = serial - '1';
179       Serial.print(" toggle pin ");
180       test_out[nr] = ! test_out[nr];
181       int pin = test_pins[nr];
182       Serial.print(pin);
183       Serial.print("=");
184       int out = test_out[nr];
185       Serial.print(out);
186       digitalWrite( pin, out );
187
188     }
189     Serial.print(" <");
190     for(int i=0;i<nr_test_pins;i++) {
191       if ( i == 4 || i == 8 ) Serial.print(" ");
192       Serial.print(test_out[i]);
193     }
194     Serial.println(">");
195   }
196   #endif
197 }
198
199