#include  <Chrono.h>

#define led1 2
#define led2 3
#define led3 4
#define led4 5
#define led5 6

#define btn1 8
#define btn2 9
#define btn3 10
#define btn4 11

Chrono chronoled;
Chrono chronobtn;

int leds[5] = {led1, led2, led3, led4, led5};
int ledpointer = 0;
bool l2r = true;
bool ledstop = false;
bool btnstate;
bool lastbtnstate[4] = {HIGH, HIGH, HIGH, HIGH};

int basetime = 1000;
int ldtime = 0;
int ddelay = 50;

void setup() {
  // put your setup code here, to run once:
  chronobtn.stop();
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);

  pinMode(btn1, INPUT_PULLUP);
  pinMode(btn2, INPUT_PULLUP);
  pinMode(btn3, INPUT_PULLUP);
  pinMode(btn4, INPUT_PULLUP);

  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  bool btn1read = digitalRead(btn1);
  bool btn2read = digitalRead(btn2);
  bool btn3read = digitalRead(btn3);
  bool btn4read = digitalRead(btn4);

  //reverse
  if (btn1read != lastbtnstate[0]) {
    btn1read = lastbtnstate;
    if (btnstate == LOW && chronobtn.hasPassed(10)) {
      l2r = !l2r;
    }
    chronobtn.restart();
  }

  //Speed Up
  if (btn2read != lastbtnstate[1]) {
    btn2read = lastbtnstate;
    if (btnstate == LOW && chronobtn.hasPassed(10)) {
      basetime -= 100;
      if (basetime < 0) {
        basetime = 1000;
      }
      Serial.println(basetime);
    }
    chronobtn.restart();
  }

  //Slow down
  if (btn3read != lastbtnstate[2]) {
    btn3read = lastbtnstate;
    if (btnstate == LOW && chronobtn.hasPassed(10)) {
      basetime += 100;
      if (basetime > 3500) {
        basetime = 1000;
      }
      Serial.println(basetime);
    }
    chronobtn.restart();
  }

  //freeze
  if (btn4read != lastbtnstate[3]) {
    btn4read = lastbtnstate;
    if (btnstate == LOW && chronobtn.hasPassed(10)) {
      if (ledstop) {
        chronoled.resume();
        ledstop = false;
      } else {
        chronoled.stop();
        ledstop = true;
      }
      Serial.println("4");
    }
    chronobtn.restart();
  }




  //LED time & reverse opration
  if (chronoled.hasPassed(basetime, true)) {
    if (l2r) {
      Serial.print("Now  ");
      Serial.println(ledpointer);
      if (ledpointer < 5) {
        // ledpointer = 0;
        if(ledpointer != 0){
        digitalWrite(leds[ledpointer - 1], LOW);
        }
        digitalWrite(leds[ledpointer], HIGH);
        ledpointer++;
        Serial.print("next  ");
      Serial.println(ledpointer);
      }
      else {
        ledpointer = 0;
        digitalWrite(leds[ledpointer], LOW);
        
      }
    } else {
      if (ledpointer < 0) {
        ledpointer = 5;
      }
      ledpointer--;
      digitalWrite(leds[ledpointer + 1], LOW);
      digitalWrite(leds[ledpointer], HIGH);
    }
  }
}