// Every-10-4
// 2020.4.19
// Arduino Nano Every を使用する。
// PWM周波数を15.7kHzにする。

#define  UNTEN 14
#define  VOL   A2
#define  GEN   A3
#define  SEN1  11
#define  SEN2  12
#define  SEN3  20
#define  SEN4  19
#define  SEN5  10
#define  F1  6
#define  F2  5
#define  F3  3
#define  P1  8
#define  P2  9

  int i;
  int sen1;
  int sen2;
  int sen3;
  int sen4;
  int sen5;
  int vol;
  int gen;
  int unten;
  int point;

void setup() {
  pinMode(UNTEN,INPUT);
  pinMode(VOL,INPUT);
  pinMode(GEN,INPUT);
  pinMode(SEN1,INPUT);
  pinMode(SEN2,INPUT);
  pinMode(SEN3,INPUT);
  pinMode(SEN4,INPUT);
  pinMode(SEN5,INPUT);
  pinMode(F1,OUTPUT);
  pinMode(F2,OUTPUT);
  pinMode(F3,OUTPUT);
  pinMode(P1,OUTPUT);
  pinMode(P2,OUTPUT);
  
  TCA0.SINGLE.CTRLA = 0b0101; //PWM周波数の変更
  
  analogWrite(F1,0);
  analogWrite(F2,0);
  analogWrite(F3,0);

  digitalWrite(P1,HIGH);
  delay(8000);
  digitalWrite(P2,HIGH);
  delay(8000);
  digitalWrite(P1,LOW);
  delay(8000);
  digitalWrite(P2,LOW);
  delay(8000);
}

void loop() {
  unten = digitalRead(UNTEN);
  while (unten == LOW) {
    unten = digitalRead(UNTEN);
    analogWrite(F1,0);
    analogWrite(F2,0);
    analogWrite(F3,0);
  }

  //****** 待避モード ************
  sen1 = digitalRead(SEN1);
  while (sen1 == HIGH) {      //列車イが来るまで待て
    vol=analogRead(VOL)/4;
    delay(10);
    analogWrite(F1,vol);
    analogWrite(F2,vol);
    sen1 = digitalRead(SEN1);
  }
  
  point= 0;                  //列車イが来たので判断する
  sen2 = digitalRead(SEN2);  //後方に列車がいるか?
  if (sen2 == LOW) {         //列車ロがいるのでイは待避モードに入る
    digitalWrite(P1,HIGH);    //P1を反位に
    delay(8000);
    sen3 = digitalRead(SEN3);
    while (sen3 == HIGH) {    //待避線センサまでイは走行せよ
      vol=analogRead(VOL)/4;
      delay(10);
      analogWrite(F1,vol);
      analogWrite(F3,vol);
      sen3 = digitalRead(SEN3);
      sen1 = digitalRead(SEN1);
      if (sen1 == HIGH){     //イの最後尾は通過したか?
        delay(1000);
        sen1 = digitalRead(SEN1);  //ダブルカウント
        if (sen1 == HIGH){
          point= 1;                //フラグを立てる
        }
      }
      sen1 = digitalRead(SEN1);     //もう一度チェック
      if (sen1 == LOW && point==1){  //次の列車ロが来た
        digitalWrite(P1,LOW);        //P1を定位に
      }
    }
    point= 0;    //イが待避線センサまで来たのでフラグを消す
      
    digitalWrite(P1,LOW);    //P1を定位に
    delay(8000);
    for(i=255;i>-1;i--){      //イは待避線停車
      gen=analogRead(GEN)/5;
      analogWrite(F3,vol*i/255);
      delay(gen);
    }
    analogWrite(F3,0);

    sen4 = digitalRead(SEN4);
    while (sen4 == HIGH) {     //追越した列車ロは通過したか?
      vol=analogRead(VOL)/4;
      delay(10);
      analogWrite(F1,vol);
      analogWrite(F2,vol);
      sen4 = digitalRead(SEN4);
    }
    delay(10000);

    sen5 = digitalRead(SEN5);   //本線のセンサをチェック
    if (sen5 == LOW){           //本線に後続の列車ハがいるか
      while (sen5 == LOW){      //列車ハが通り過ぎるまで待て
        vol=analogRead(VOL)/4;
        delay(10);
        analogWrite(F1,vol);
        analogWrite(F2,vol);
        sen5 = digitalRead(SEN5);
      }
      sen4 = digitalRead(SEN4);
      while (sen4 == HIGH) {    //改めて列車ハは通過したか?
        vol=analogRead(VOL)/4;
        delay(10);
        analogWrite(F1,vol);
        analogWrite(F2,vol);
        sen4 = digitalRead(SEN4);
      } 
    }

    digitalWrite(P2,HIGH);        //P2を反位に
    delay(8000);
    for(i=50;i<255;i++){          //副本線の電車イを発車
      gen=analogRead(GEN)/5;
      analogWrite(F3,vol*i/255);
      delay(gen);
    }
    
    sen4 = digitalRead(SEN4);
    while (sen4 == LOW) {     //列車ロまたはハは通過したか?
      vol=analogRead(VOL)/4;
      delay(10);
      analogWrite(F1,vol);
      analogWrite(F2,vol);
      sen4 = digitalRead(SEN4);
    } 
      
    sen4 = digitalRead(SEN4);
    while (sen4 == HIGH) {    //列車イは来たか?
      vol=analogRead(VOL)/4;
      delay(10);
      analogWrite(F1,vol);
      analogWrite(F2,vol);
      sen4 = digitalRead(SEN4);
    } 
    digitalWrite(P2,LOW);      //P2を定位に
    delay(8000);
  
  } else {                    //列車イは本線を通過せよ
    while (sen1 == LOW) {     //列車イがセンサ1を通過するまで待て
      vol=analogRead(VOL)/4;
      delay(10);
      analogWrite(F1,vol);
      analogWrite(F2,vol);
      sen1 = digitalRead(SEN1);
    }
    delay(10000);
  }
}