//Programm "Fischhafen"
int statKFold = 0;           // Variablen "old" = Ist-Zustand der Fahrstaße
int statKFnew = 0;         //Variablen "new" = Soll-Zustand
int statKPold = 0;
int statKPnew = 0;
int statLold = 0;
int statLnew = 0;
int statMold = 0;
int statMnew = 0;
int signalpin=0;
int weichenpin1 = 0;
int weichenpin2 = 0;

void setup() {
  pinMode(3,OUTPUT);     // Pin-Zuordnung
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
  }

void loop() {
  statKFnew = analogRead(1);          // Soll-Status Fahrstraße  abfragen
  if (statKFnew > 0) {
    statKFnew = 1;
  }
  if (statKFnew != statKFold) {       // wenn geändert, dann Reaktion
    changeKF();
  }
  statKPnew = analogRead(2);  
  if (statKPnew > 0) {
    statKPnew = 1;
  }
  if (statKPnew != statKPold) {
    changeKP();
  }
  statLnew = analogRead(3);  
  if (statLnew > 0) {
    statLnew = 1;
  }
  if (statLnew != statLold) {
    changeL();
  }
  statMnew = analogRead(4);  
  if (statMnew > 0) {
    statMnew = 1;
  }
  if (statMnew != statMold) {
    changeM();
  }
  delay (500) ;         // wenn keine Aenderung, dann wieder von vorn
}

void changeKF () {    //Status Fahrstraße geändert
  signalpin=3;             // Zuweisung für spätere Änderung
  if (statKFold > statKFnew) {
    statKFold = 0;      // Fahrstraße intern zurücksetzen
    setback();             // Fahrstraße extern zurücksetzen
  }
  if (statMold > 0) {      // kollidierende Fahrstraße eingestellt ?
    beepy();                    // dann Piepston
  }
  statKFold = 1;               // ansonsten neue Fahrstraße einstellen
  weichenpin1 = 9;        // Weichenstellung definieren
  weichenpin2 = 10;
  worker();                       // und dort passiert es
  }

void changeKP() {                    // ebenso wie changeKF
  signalpin = 4;
  if (statKPold > statKPnew) {
    statKPold = 0;
    setback();
  }
  if (statLold > 0) {
    beepy();
  }
  if (statMold > 0) {
    beepy();
  }
  statKFold = 1;
  weichenpin1 = 9;
  weichenpin2 = 11;
  worker();
}

void changeL() {                                  // ebenso wie changeKF
 signalpin = 5;
  if (statLold > statLnew) {
    statKPold = 0;
    setback();
  }
  if (statKFold > 0) {
    beepy();
  }
  if (statKPold > 0) {
    beepy();
  }
  statLold = 1;
  weichenpin1 = 8;
  weichenpin2 = 10;
  worker(); 
}

void changeM() {                               // ebenso wie change KF
 signalpin = 6;
  if (statMold > statMnew) {
    statMold = 0;
    setback();
  }
  if (statKPold > 0) {
    beepy();
  }
  statMold = 1;
  weichenpin1 = 7;
  weichenpin2 = 12; //12 = dummy
  worker(); 
}

void worker() {                                          // die eigentliche Arbeit
  digitalWrite (signalpin,HIGH);            // Signal- und Fahrstromrelais AN
  digitalWrite (weichenpin1,HIGH);   //  1. Weichenstellimpuls
  delay (500);
  digitalWrite (weichenpin1,LOW);     // 2. Weichenstellimpuls
  digitalWrite (weichenpin2,HIGH);
  delay (500);
  digitalWrite (weichenpin2,LOW);
loop (0)                                                         // und wieder zur Loop
}

void setback()  {                   // Fahrstrsse aufloesen und Signal rot
  digitalWrite (signalpin,LOW);
loop (0)
}

void beepy() {                     // Fehlerhinweis - irregulaere Fahrstraße
  tone (13,100,500); //mit pin 13, 100 Hertz, 1/2 Sekunde
  noTone (13);
}