7 // serial commands for loop-back test
10 // pins, 2 receivers 4 satelites signals from Diseqc for each
11 int receiver[2][4] = {
16 // pin for master disable if shorted to ground (GND is next to D2, so jumpers nicely)
19 // normal arduino LED on D13
23 // keys in serial: 1 2 3 4 5 6 7 8 9
24 int test_pins[] = { 12,11,10,9, 8,7,6,5, 4 };
25 int test_out[] = { 0, 0, 0,0, 0,0,0,0, 1};
26 int nr_test_pins = sizeof(test_pins)/sizeof(int);
27 // loop test pins to receiver pins above for testing
29 int master_enabled() {
30 return digitalRead(REC_MASTER) == HIGH ? 1 : 0;
34 Serial.begin(9600); // FIXME check speed
36 pinMode(REC_MASTER, INPUT_PULLUP); // pullup for jumper/button
38 for(int nr=0; nr<2; nr++) {
39 for(int input=0; input<4; input++) {
40 pinMode(receiver[nr][input], INPUT);
47 Serial.print("boot master=");
48 Serial.println(master_enabled());
52 for(int i=0;i<nr_test_pins;i++) {
53 pinMode(test_pins[i], OUTPUT);
54 digitalWrite(test_pins[i], test_out[i]);
59 char restore[10] = "";
62 int receiver_satelite( int nr ) {
70 if ( ! master_enabled() ) restore[len++] = '9';
76 for(int i=0; i<4; i++) {
77 int a = analogRead( receiver[nr][i] );
78 int on_off = a > 512 ? 1 : 0;
82 restore[len++] = char('1' + (nr * 4) + i);
94 if ( active == 0 ) { // no inputs active
98 if ( active != 1 ) { // only one active at a time
102 Serial.print(" selected=");
103 Serial.print(selected);
108 #define LED_NO_ACTIVE_INPUTS 2000
109 #define LED_MULTIPLE_INPUTS 125
110 #define LED_SERIAL 200 // < 250
114 int blink_interval = LED_NO_ACTIVE_INPUTS; // 2 sec on/off no receivers turned on
115 int last_changed_nr = -1;
116 int last_receiver_satelite[2] = { -1, -1 };
122 while(nr && nr <= 2) {
127 int sat = receiver_satelite(i);
128 int last_sat = last_receiver_satelite[i];
129 last_receiver_satelite[i] = sat;
132 Serial.print(" nr:");
136 Serial.print(" last:");
137 Serial.print(last_sat);
140 int prefer_master = master_enabled();
141 if ( ! prefer_master ) {
143 if ( last_sat != sat ) {
146 last_changed_nr = current_nr;
149 sat = receiver_satelite( (i+1)%2 ); // check other receiver
161 if ( last_changed_nr != current_nr ) {
162 sat = current_sat; // ignore, last not changed
168 if ( sat == 0 ) { // slow blink
169 blink_interval = LED_NO_ACTIVE_INPUTS;
171 } else if ( sat < 0 ) { // error
172 blink_interval = LED_MULTIPLE_INPUTS;
175 blink_interval = LED_OFF;
177 if ( prefer_master ) {
181 if ( nr == 1 ) { // need to check 2nd receiver error and report it
182 int error = receiver_satelite(i + 1);
185 if ( error == -1 ) blink_interval = LED_MULTIPLE_INPUTS;
189 if ( last_sat != sat ) {
191 last_changed_nr = current_nr;
198 if ( last_changed_nr != current_nr ) {
199 sat = current_sat; // ignore, last not changed
205 if ( current_sat != sat ) {
207 last_changed_nr = current_nr;
211 for(int repeat=0; repeat<2; repeat++) {
214 Serial.println( char('A' + sat - 1) );
216 for(int i=0; i<sat; i++) {
217 digitalWrite(LED, HIGH);
219 digitalWrite(LED, LOW);
222 delay( ( 5 - sat ) * LED_SERIAL * 2 ); // sleep up to 2s
223 //assert(4 * LED_SERIAL < 2000);
234 Serial.print("| sat=");
235 Serial.print(current_sat);
236 Serial.print(" from:");
237 Serial.print(last_changed_nr);
238 Serial.print(" restore>");
239 Serial.print(restore);
240 Serial.print(" blink=");
241 Serial.println(blink_interval);
244 // handle next led blink event in time
245 int m = millis() % ( blink_interval * 2 );
246 if ( blink_interval != 0 ) {
247 if ( m > blink_interval ) {
248 digitalWrite(LED, HIGH);
250 digitalWrite(LED, LOW);
253 digitalWrite(LED, LOW);
257 while ( Serial.available() ) {
258 int serial = Serial.read();
259 Serial.print(serial, HEX);
260 if ( serial >= '1' && serial <= ( '1' + nr_test_pins ) ) {
261 int nr = serial - '1';
262 Serial.print(" toggle pin ");
263 test_out[nr] = ! test_out[nr];
264 int pin = test_pins[nr];
267 int out = test_out[nr];
269 digitalWrite( pin, out );
273 for(int i=0;i<nr_test_pins;i++) {
274 if ( i == 4 || i == 8 ) Serial.print(" ");
275 Serial.print(test_out[i]);
282 // vim: tabstop=2 shiftwidth=2 expandtab