first draft which compiles
authorDobrica Pavlinusic <dpavlin@rot13.org>
Fri, 10 Feb 2017 18:27:37 +0000 (19:27 +0100)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Fri, 10 Feb 2017 19:46:39 +0000 (20:46 +0100)
Diseq_c/Diseq_c.ino [new file with mode: 0644]
Diseq_c/rs232.txt [new file with mode: 0644]

diff --git a/Diseq_c/Diseq_c.ino b/Diseq_c/Diseq_c.ino
new file mode 100644 (file)
index 0000000..3c0a08c
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+pins, 2 recorders 4 inputs each 
+ */
+
+#define REC_1_A A0
+#define REC_1_B A1
+#define REC_1_C A2
+#define REC_1_D A3
+
+#define REC_2_A A4
+#define REC_2_B A5
+#define REC_2_C A6
+#define REC_2_D A7
+
+#define REC_MASTER 2
+
+#define LED 13
+
+void setup(){
+  Serial.begin(9600); // FIXME check speed
+
+  pinMode(REC_MASTER, INPUT_PULLUP); // pullup for jumper/button
+
+  pinMode(REC_1_A, INPUT);
+  pinMode(REC_1_B, INPUT);
+  pinMode(REC_1_C, INPUT);
+  pinMode(REC_1_D, INPUT);
+
+  pinMode(REC_2_A, INPUT);
+  pinMode(REC_2_B, INPUT);
+  pinMode(REC_2_C, INPUT);
+  pinMode(REC_2_D, INPUT);
+
+  pinMode(LED, OUTPUT);
+
+}
+
+int recorder_inputs( int PinA, int PinB, int PinC, int PinD ) {
+  int StateA = digitalRead( PinA );
+  int StateB = digitalRead( PinB );
+  int StateC = digitalRead( PinC );
+  int StateD = digitalRead( PinD );
+  
+  if ( StateA + StateB + StateC + StateD != 1 ) { // only one active at a time
+    return -1; // error
+  }
+
+  if ( StateA ) {
+    return 1;
+  } else if ( StateB ) {
+    return 2;
+  } else if ( StateC ) {
+    return 3;
+  } else if ( StateD ) {
+    return 4;
+  }
+
+  return 0; // receiver off
+}
+
+#define LED_NO_ACTIVE_INPUTS 2000
+#define LED_ERROR            125
+#define LED_SERIAL           250
+#define LED_OFF              0
+
+int current_L = 0;
+int blink_interval = LED_NO_ACTIVE_INPUTS; // 2 sec on/off no receivers turned on
+int next_blink = 0;
+
+
+void loop(){
+  
+  int sat = recorder_inputs( REC_1_A, REC_1_B, REC_1_C, REC_1_D );
+  int try_slave = 1;
+
+again_for_slave:
+  if ( sat < 0 ) { // error
+    blink_interval = LED_ERROR;
+  } else if ( sat == 0 ) {
+    blink_interval = LED_NO_ACTIVE_INPUTS;
+  } else {
+
+    if ( digitalRead(REC_MASTER) == HIGH ) try_slave = 0;
+
+    if ( current_L != sat ) {
+
+      blink_interval = LED_OFF;
+
+      for(int repeat=0; repeat<2; repeat++) {
+
+        Serial.print("@L,");
+        Serial.println( 'A' - 1 + sat );
+
+        for(int i=0; i<sat; i++) {
+          digitalWrite(LED, HIGH);
+          delay(LED_SERIAL);
+          digitalWrite(LED, LOW);
+          delay(LED_SERIAL);
+        }
+        delay( 2000 - sat * LED_SERIAL ); // sleep up to 2s
+      }
+
+    } 
+  }
+
+  if ( try_slave == 1 ) {
+    try_slave = 0;
+    sat = recorder_inputs( REC_2_A, REC_2_B, REC_2_C, REC_2_D );
+    goto again_for_slave;
+  }
+
+  // handle next led blink event in time
+  int m = micros();
+  if ( blink_interval != 0 && m > next_blink ) {
+    digitalWrite(LED, ! digitalRead(LED));
+    next_blink = m + blink_interval;
+  }
+
+}
+
+
+
diff --git a/Diseq_c/rs232.txt b/Diseq_c/rs232.txt
new file mode 100644 (file)
index 0000000..18f3e7b
--- /dev/null
@@ -0,0 +1,30 @@
+Popis ulaza:
+
+1. Prijemnik 1 Sat A    (Tx @L,A )
+2. Prijemnik 1 Sat B    (Tx @L,B )
+3. Prijemnik 1 Sat C    (Tx @L,C )
+4. Prijemnik 1 Sat D    (Tx @L,D )
+
+5. Prijemnik 2 Sat A    (Tx @L,A )
+6. Prijemnik 2 Sat B    (Tx @L,B )
+7. Prijemnik 2 Sat C    (Tx @L,C )
+8. Prijemnik 2 Sat D    (Tx @L,D )
+
+9. Master - Slave mod rada
+
+
+Moguće situacije i način signalizacije LED diode:
+
+    1) Niti jedan od 8 ulaza nije aktivan, LED treperi sporo (2 sec. ON, 2. sec. OFF)
+    2) Aktivno više od jednog ulaza po prijemniku (greška Diseq-C dekodera) LED treperi brzo (1/8 sec ON, 1/8 sec. OFF)
+    3) Aktivan jedan ulaz po prijemniku (1-4 i 5-8) LED ne svijetli
+    4) Promjena stanja ulaza bilo kojeg prijemnika, na RS232 portu šalje dva puta za redom odgovarajuću komandu (npr. @L,A ). Pauza između komande je 2 sec. Slanje komande  se signalizira samo jednom odgovarajućim brojem treptaja LED diode (1/4 ON, 1/4 OFF)
+  
+Aktivirani ulaz                Komanda na RS232        Broj treptaja
+1 ili 5                        @L,A                    1
+2 ili 6                        @L,B                    2
+3 ili 7                        @L,C                    3
+4 ili 8                        @L,D                    4
+
+    5) Ako je ulaz 9. aktivan (Master - Slave mod rada)  uređaj ignorira promjene na "Prijemniku 2"  ( ulazi 5-8 ) sve dok je aktivan "Prijemnik 1" ( ulazi 1-4 ). 
+