/**
   created by garzoli
   http://www.instructables.com/member/garzoli/
*/

const int DELAY = 10;

// define pins for LEDs
const int REAR_RED_LEFT = 13;
const int REAR_RED_RIGHT = 12;
const int REAR_RED_MIDDLE = 11;

const int YELLOW_LEFT = 10;
const int YELLOW_RIGHT = 9;

const int FRONT_WHITE_RIGHT = 8;
const int FRONT_WHITE_LEFT = 7;

const int BLUE_1 = 6;
const int BLUE_2 = 5;
const int BLUE_3 = 4;
const int BLUE_4 = 3;

int min = 0;
int max = 100;
int step = 0;

int yellowState = LOW;
int yellowDivider = 20;

int redState = LOW;
int redDivider = 25;


void setup() {
  // set pin modes
  pinMode(REAR_RED_LEFT, OUTPUT);
  pinMode(REAR_RED_RIGHT, OUTPUT);
  pinMode(REAR_RED_MIDDLE, OUTPUT);

  pinMode(YELLOW_LEFT, OUTPUT);
  pinMode(YELLOW_RIGHT, OUTPUT);

  pinMode(FRONT_WHITE_RIGHT, OUTPUT);
  pinMode(FRONT_WHITE_LEFT, OUTPUT);

  pinMode(BLUE_1, OUTPUT);
  pinMode(BLUE_2, OUTPUT);
  pinMode(BLUE_3, OUTPUT);
  pinMode(BLUE_4, OUTPUT);

  // set default pin values
  digitalWrite(REAR_RED_LEFT, LOW);
  digitalWrite(REAR_RED_RIGHT, LOW);
  digitalWrite(REAR_RED_MIDDLE, LOW);

  digitalWrite(YELLOW_LEFT, LOW);
  digitalWrite(YELLOW_RIGHT, LOW);

  digitalWrite(FRONT_WHITE_RIGHT, LOW);
  digitalWrite(FRONT_WHITE_LEFT, LOW);

  digitalWrite(BLUE_1, LOW);
  digitalWrite(BLUE_2, LOW);
  digitalWrite(BLUE_3, LOW);
  digitalWrite(BLUE_4, LOW);

  // init step
  step = min;
}

void loop() {
  ++step;
  if (step >= max) {
    step = min;
  }
  delay(DELAY);
  displayYellow();
  displayRed();
  displayBlue();
  displayWhite();
  delay(DELAY);
}

/**
   flip-flop yellow LEDs
*/
void displayYellow() {
  if (step % yellowDivider == 0) {
    yellowState = !yellowState;
    Serial.println(step);
    Serial.println(yellowState);
    digitalWrite(YELLOW_LEFT, yellowState);
    digitalWrite(YELLOW_RIGHT, !yellowState);
  }
}

/**
   blinking red light
*/
void displayRed() {
  if (step % redDivider == 0) {
    redState = !redState;
    digitalWrite(REAR_RED_LEFT, redState);
    digitalWrite(REAR_RED_RIGHT, redState);
    digitalWrite(REAR_RED_MIDDLE, !redState);
  }
}
/**
   running light effect
*/
void displayBlue() {
  digitalWrite(BLUE_1, LOW);
  digitalWrite(BLUE_2, LOW);
  digitalWrite(BLUE_3, LOW);
  digitalWrite(BLUE_4, LOW);

  switch (step) {
    case 10:
    case 50:
      digitalWrite(BLUE_1, HIGH);
      break;
    case 20:
    case 60:
      digitalWrite(BLUE_2, HIGH);
      break;
    case 30:
    case 70:
      digitalWrite(BLUE_3, HIGH);
      break;
    case 40:
    case 80:
      digitalWrite(BLUE_4, HIGH);
      break;
  }
}

/**
   vibrating white light
*/
void displayWhite() {
  if (step % 2 == 0) {
    digitalWrite(FRONT_WHITE_RIGHT, HIGH);
    digitalWrite(FRONT_WHITE_LEFT, HIGH);
  } else {
    digitalWrite(FRONT_WHITE_RIGHT, LOW);
    digitalWrite(FRONT_WHITE_LEFT, LOW);
  }
}

