// Every-16-6
// 2021.1.24
// Arduino Nano Every を使用する。
// PWM周波数を15.7kHzにする。

#define  VOL   A6
#define  GEN   A7
#define  SEN1  11
#define  SEN2  12
#define  SEN3  2
#define  SEN4  14
#define  CH1   15
#define  CH2   16
#define  CH3   17
#define  CH4   18
#define  UNTEN 19
#define  F11  10
#define  F12  9
#define  F21  6
#define  F22  5
#define  P12  8
#define  P34  7
#define  P5  4
#define  P6  3

  int i;
  int vol;
  int gen;

void setup() {
  pinMode(VOL,INPUT);
  pinMode(GEN,INPUT);
  pinMode(SEN1,INPUT);
  pinMode(SEN2,INPUT);
  pinMode(SEN3,INPUT);
  pinMode(SEN4,INPUT);
  pinMode(CH1,INPUT);
  pinMode(CH2,INPUT);
  pinMode(CH3,INPUT);
  pinMode(CH4,INPUT);
  pinMode(UNTEN,INPUT);
  pinMode(F11,OUTPUT);
  pinMode(F12,OUTPUT);
  pinMode(F21,OUTPUT);
  pinMode(F22,OUTPUT);
  pinMode(P12,OUTPUT);
  pinMode(P34,OUTPUT);
  pinMode(P5,OUTPUT);
  pinMode(P6,OUTPUT);

  TCA0.SINGLE.CTRLA = 0b0101;    //PWM周波数の変更

  analogWrite(F11,0);
  analogWrite(F12,0);
  analogWrite(F21,0);
  analogWrite(F22,0);
  digitalWrite(P12,HIGH);
  delay(8000);
  digitalWrite(P34,HIGH);
  delay(8000);
  digitalWrite(P5,HIGH);
  delay(8000);
  digitalWrite(P6,HIGH);
  delay(8000);
  digitalWrite(P12,LOW);
  delay(8000);
  digitalWrite(P34,LOW);
  delay(8000);
  digitalWrite(P5,LOW);
  delay(8000);
  digitalWrite(P6,LOW);
  delay(8000);
}

void mode1(){
  if (digitalRead(SEN1)==LOW){    //ホームに列車はいるか?負論理
    digitalWrite(P12,LOW);
    delay(8000);
    digitalWrite(P34,LOW);
    delay(8000);
    digitalWrite(P5,LOW);
    delay(8000);
    digitalWrite(P6,LOW);
    delay(8000);
   
    vol=analogRead(VOL)/4;
    delay(100);
    analogWrite(F11,vol*50/255);  //室内灯点灯
    analogWrite(F21,vol*50/255);
    delay(8000); 
  
    for(i=50;i<255;i++){      //加速する
      vol=analogRead(VOL)/4;
      delay(200);
      analogWrite(F11,vol*i/255);
      analogWrite(F21,vol*i/255);
    }

    while (digitalRead(SEN3) == HIGH) {     //S3を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F11,vol);
      analogWrite(F21,vol);
    }

    while (digitalRead(SEN4) == HIGH) {     //S4を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F11,vol);
      analogWrite(F21,vol);
    }

    while (digitalRead(SEN1) == HIGH) {     //S1を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F11,vol);
      analogWrite(F21,vol);
    }

    for(i=255;i>50;i--){     //減速
      gen=analogRead(GEN)/8;
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F11,vol*i/255);
      analogWrite(F21,vol*i/255);
      delay(gen);
    }
    delay(8000);
    analogWrite(F11,0);    //停車
    analogWrite(F21,0);
  }
  delay(8000);
  return;
}

void mode2() {
  if (digitalRead(SEN2)==LOW){    //ホームに列車はいるか?負論理
    digitalWrite(P12,HIGH);
    delay(8000);
    digitalWrite(P34,LOW);
    delay(8000);
    digitalWrite(P5,LOW);
    delay(8000);
    digitalWrite(P6,LOW);
    delay(8000);
   
    vol=analogRead(VOL)/4;
    delay(100);
    analogWrite(F12,vol*50/255);  //室内灯点灯
    analogWrite(F22,vol*50/255);
    delay(8000); 
  
    for(i=50;i<255;i++){      //加速する
      vol=analogRead(VOL)/4;
      delay(200);
      analogWrite(F12,vol*i/255);
      analogWrite(F22,vol*i/255);
    }

    while (digitalRead(SEN4) == HIGH) {     //S3を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F12,vol);
      analogWrite(F22,vol);
    }

    while (digitalRead(SEN3) == HIGH) {     //S4を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F12,vol);
      analogWrite(F22,vol);
    }

    while (digitalRead(SEN2) == HIGH) {     //S1を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F12,vol);
      analogWrite(F22,vol);
    }

    for(i=255;i>50;i--){     //減速
      gen=analogRead(GEN)/8;
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F12,vol*i/255);
      analogWrite(F22,vol*i/255);
      delay(gen);
    }
    delay(20000);
    analogWrite(F12,0);    //停車
    analogWrite(F22,0);
  }
  delay(8000);
  return;
}

void mode3(){
  if (digitalRead(SEN1)==LOW){    //ホームに列車はいるか?負論理
    digitalWrite(P12,LOW);
    delay(8000);
    digitalWrite(P34,LOW);
    delay(8000);
    digitalWrite(P5,LOW);
    delay(8000);
    digitalWrite(P6,LOW);
    delay(8000);
   
    vol=analogRead(VOL)/4;
    delay(100);
    analogWrite(F11,vol*50/255);  //室内灯点灯
    analogWrite(F21,vol*50/255);
    delay(8000); 
  
    for(i=50;i<255;i++){      //加速する
      vol=analogRead(VOL)/4;
      delay(200);
      analogWrite(F11,vol*i/255);
      analogWrite(F21,vol*i/255);
    }

    while (digitalRead(SEN3) == HIGH) {     //S3を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F11,vol);
      analogWrite(F21,vol);
    }
    digitalWrite(P6,HIGH);        //リバース設定
    delay(8000);
    digitalWrite(P34,HIGH);
    delay(8000);
    digitalWrite(P12,HIGH);
    delay(8000);
    analogWrite(F21,0);
    analogWrite(F22,vol);

    while (digitalRead(SEN4) == HIGH) {     //S4を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F11,vol);
      analogWrite(F22,vol);
    }
    digitalWrite(P6,LOW);        //リバース設定を戻す
    delay(8000);
    analogWrite(F11,0);
    analogWrite(F12,vol);
    analogWrite(F22,vol);

    while (digitalRead(SEN3) == HIGH) {     //S3を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F12,vol);
      analogWrite(F22,vol);
    }
    digitalWrite(P34,LOW);
    delay(30000);
 
    while (digitalRead(SEN2) == HIGH) {     //S2を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F12,vol);
      analogWrite(F22,vol);
    }

    for(i=255;i>50;i--){     //減速
      gen=analogRead(GEN)/8;
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F12,vol*i/255);
      analogWrite(F22,vol*i/255);
      delay(gen);
    }
    delay(8000);
    analogWrite(F12,0);    //停車
    analogWrite(F22,0);
  }
  delay(8000);
  return;
}

void mode4(){
  if (digitalRead(SEN2)==LOW){    //ホームに列車はいるか?負論理
    digitalWrite(P12,HIGH);
    delay(8000);
    digitalWrite(P34,LOW);
    delay(8000);
    digitalWrite(P5,LOW);
    delay(8000);
    digitalWrite(P6,LOW);
    delay(8000);
   
    vol=analogRead(VOL)/4;
    delay(100);
    analogWrite(F12,vol*50/255);  //室内灯点灯
    analogWrite(F22,vol*50/255);
    delay(8000); 
  
    for(i=50;i<255;i++){      //加速する
      vol=analogRead(VOL)/4;
      delay(200);
      analogWrite(F12,vol*i/255);
      analogWrite(F22,vol*i/255);
    }

    while (digitalRead(SEN4) == HIGH) {     //S4を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F12,vol);
      analogWrite(F22,vol);
    }
    digitalWrite(P5,HIGH);        //リバース設定
    delay(8000);
    digitalWrite(P34,HIGH);
    delay(8000);
    digitalWrite(P12,HIGH);
    delay(8000);
    analogWrite(F12,0);
    analogWrite(F11,vol);

    while (digitalRead(SEN3) == HIGH) {     //S3を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F11,vol);
      analogWrite(F22,vol);
    }
    digitalWrite(P5,LOW);        //リバース設定を戻す
    delay(8000);
    analogWrite(F22,0);
    analogWrite(F21,vol);
    analogWrite(F11,vol);

    while (digitalRead(SEN4) == HIGH) {     //S4を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F21,vol);
      analogWrite(F11,vol);
    }
    digitalWrite(P12,LOW);
    delay(30000);
 
    while (digitalRead(SEN1) == HIGH) {     //S1を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F21,vol);
      analogWrite(F11,vol);
    }

    for(i=255;i>50;i--){     //減速
      gen=analogRead(GEN)/8;
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F21,vol*i/255);
      analogWrite(F11,vol*i/255);
      delay(gen);
    }
    delay(8000);
    analogWrite(F11,0);    //停車
    analogWrite(F21,0);
  }
  delay(8000);
  return;
}

void mode5(){
    if (digitalRead(SEN1)==HIGH){    //ホームに列車が居ない場合は中止。負論理
          return;
    }
    if (digitalRead(SEN2)==HIGH){    //ホームに列車が居ない場合は中止。負論理
          return;
    }
    digitalWrite(P12,LOW);
    delay(8000);
    digitalWrite(P34,LOW);
    delay(8000);
    digitalWrite(P5,LOW);
    delay(8000);
    digitalWrite(P6,LOW);
    delay(8000);
   
    vol=analogRead(VOL)/4;
    delay(100);
    analogWrite(F11,vol*50/255);  //室内灯点灯
    analogWrite(F21,vol*50/255);
    delay(8000); 
  
    for(i=50;i<255;i++){      //加速する
      vol=analogRead(VOL)/4;
      delay(200);
      analogWrite(F11,vol*i/255);
      analogWrite(F21,vol*i/255);
    }

    while (digitalRead(SEN3) == HIGH) {     //S3を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F11,vol);
      analogWrite(F21,vol);
    }
    digitalWrite(P6,HIGH);        //リバース設定
    delay(8000);
    digitalWrite(P34,HIGH);
    delay(8000);
    digitalWrite(P12,HIGH);
    delay(8000);
    analogWrite(F21,0);
    analogWrite(F22,vol);

    while (digitalRead(SEN4) == HIGH) {     //S4を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F11,vol);
      analogWrite(F22,vol);
    }
    digitalWrite(P6,LOW);        //リバース設定を戻す
    delay(8000);
    analogWrite(F11,0);
    analogWrite(F12,vol);
    analogWrite(F22,vol);

    while (digitalRead(SEN3) == HIGH) {     //S3を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F12,vol);
      analogWrite(F22,vol);
    }
    digitalWrite(P34,LOW);
    delay(30000);             //ホームの列車が出ていくまで待つ。
 
    while (digitalRead(SEN2) == HIGH) {     //S2を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F12,vol);
      analogWrite(F22,vol);
    }
    delay(8000);
    digitalWrite(P34,HIGH);     //ホーム2を遮断して列車を停止させる。
    delay(8000);

    while (digitalRead(SEN3) == HIGH) {     //S3を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F12,vol);
      analogWrite(F22,vol);
    }
    digitalWrite(P5,HIGH);
    delay(8000);
    analogWrite(F22,0);
    analogWrite(F21,vol);
    delay(8000);

    while (digitalRead(SEN4) == HIGH) {     //S4を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F12,vol);
      analogWrite(F21,vol);
    }
    analogWrite(F12,0);
    analogWrite(F11,vol);
    digitalWrite(P12,LOW);     //ホーム1に入線させる
    delay(8000);
    
    while (digitalRead(SEN1) == HIGH) {     //S1を待つ
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F21,vol);
      analogWrite(F11,vol);
    }

    for(i=255;i>50;i--){     //減速
      gen=analogRead(GEN)/8;
      vol=analogRead(VOL)/4;
      delay(100);
      analogWrite(F11,vol*i/255);
      analogWrite(F21,vol*i/255);
      delay(gen);
    }
    delay(8000);
    analogWrite(F11,0);    //停車
    analogWrite(F21,0);
    delay(8000);
    return;
}

void loop(){
  if (digitalRead(UNTEN)==HIGH){
    if (digitalRead(CH1)==HIGH && digitalRead(CH2)==HIGH && digitalRead(CH3)==HIGH && digitalRead(CH4)==HIGH){
      mode1();
    } else if (digitalRead(CH1)==LOW && digitalRead(CH2)==HIGH && digitalRead(CH3)==HIGH && digitalRead(CH4)==HIGH){
      mode2();
    } else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==LOW && digitalRead(CH3)==HIGH && digitalRead(CH4)==HIGH){
      mode1();
      mode1();
    } else if (digitalRead(CH1)==LOW && digitalRead(CH2)==LOW && digitalRead(CH3)==HIGH && digitalRead(CH4)==HIGH){
      mode2();
      mode2();
    } else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==HIGH && digitalRead(CH3)==LOW && digitalRead(CH4)==HIGH){
      mode1();
      mode2();
    } else if (digitalRead(CH1)==LOW && digitalRead(CH2)==HIGH && digitalRead(CH3)==LOW && digitalRead(CH4)==HIGH){
      mode3();
    } else if (digitalRead(CH1)==HIGH && digitalRead(CH2)==LOW && digitalRead(CH3)==LOW && digitalRead(CH4)==HIGH){
      mode4();
    } else if (digitalRead(CH1)==LOW && digitalRead(CH2)==LOW && digitalRead(CH3)==LOW && digitalRead(CH4)==HIGH){
      mode5();
    }
    delay (8000);
  }  
}