first draft which compiles
[Arduino] / Diseq_c / Diseq_c.ino
1 /*
2 pins, 2 recorders 4 inputs each 
3  */
4
5 #define REC_1_A A0
6 #define REC_1_B A1
7 #define REC_1_C A2
8 #define REC_1_D A3
9
10 #define REC_2_A A4
11 #define REC_2_B A5
12 #define REC_2_C A6
13 #define REC_2_D A7
14
15 #define REC_MASTER 2
16
17 #define LED 13
18
19 void setup(){
20   Serial.begin(9600); // FIXME check speed
21
22   pinMode(REC_MASTER, INPUT_PULLUP); // pullup for jumper/button
23
24   pinMode(REC_1_A, INPUT);
25   pinMode(REC_1_B, INPUT);
26   pinMode(REC_1_C, INPUT);
27   pinMode(REC_1_D, INPUT);
28
29   pinMode(REC_2_A, INPUT);
30   pinMode(REC_2_B, INPUT);
31   pinMode(REC_2_C, INPUT);
32   pinMode(REC_2_D, INPUT);
33
34   pinMode(LED, OUTPUT);
35
36 }
37
38 int recorder_inputs( int PinA, int PinB, int PinC, int PinD ) {
39   int StateA = digitalRead( PinA );
40   int StateB = digitalRead( PinB );
41   int StateC = digitalRead( PinC );
42   int StateD = digitalRead( PinD );
43   
44   if ( StateA + StateB + StateC + StateD != 1 ) { // only one active at a time
45     return -1; // error
46   }
47
48   if ( StateA ) {
49     return 1;
50   } else if ( StateB ) {
51     return 2;
52   } else if ( StateC ) {
53     return 3;
54   } else if ( StateD ) {
55     return 4;
56   }
57
58   return 0; // receiver off
59 }
60
61 #define LED_NO_ACTIVE_INPUTS 2000
62 #define LED_ERROR            125
63 #define LED_SERIAL           250
64 #define LED_OFF              0
65
66 int current_L = 0;
67 int blink_interval = LED_NO_ACTIVE_INPUTS; // 2 sec on/off no receivers turned on
68 int next_blink = 0;
69
70
71 void loop(){
72   
73   int sat = recorder_inputs( REC_1_A, REC_1_B, REC_1_C, REC_1_D );
74   int try_slave = 1;
75
76 again_for_slave:
77   if ( sat < 0 ) { // error
78     blink_interval = LED_ERROR;
79   } else if ( sat == 0 ) {
80     blink_interval = LED_NO_ACTIVE_INPUTS;
81   } else {
82
83     if ( digitalRead(REC_MASTER) == HIGH ) try_slave = 0;
84
85     if ( current_L != sat ) {
86
87       blink_interval = LED_OFF;
88
89       for(int repeat=0; repeat<2; repeat++) {
90
91         Serial.print("@L,");
92         Serial.println( 'A' - 1 + sat );
93
94         for(int i=0; i<sat; i++) {
95           digitalWrite(LED, HIGH);
96           delay(LED_SERIAL);
97           digitalWrite(LED, LOW);
98           delay(LED_SERIAL);
99         }
100         delay( 2000 - sat * LED_SERIAL ); // sleep up to 2s
101       }
102
103     } 
104   }
105
106   if ( try_slave == 1 ) {
107     try_slave = 0;
108     sat = recorder_inputs( REC_2_A, REC_2_B, REC_2_C, REC_2_D );
109     goto again_for_slave;
110   }
111
112   // handle next led blink event in time
113   int m = micros();
114   if ( blink_interval != 0 && m > next_blink ) {
115     digitalWrite(LED, ! digitalRead(LED));
116     next_blink = m + blink_interval;
117   }
118
119 }
120
121
122