const byte BUTTON_PIN = 2; 
const byte LEDS_PIN[7] = { 13, 12, 11, 10, 9, 8, 7 };
const byte LEDS_PIN_REVERS[7] = { 7, 8, 9, 10, 11, 12, 13 };
const byte LEDS_PIN_COUNT = 7;
const byte MAX_MODE = 6;


void setup() {
  //Serial.begin(115200);
  for (byte led: LEDS_PIN)
    pinMode(led, OUTPUT);
   
  pinMode(BUTTON_PIN, INPUT_PULLUP);
}

byte buttonLastState = LOW;
byte mode = 0;

void loop() {
  byte buttonCurrentState = digitalRead(BUTTON_PIN);

  if (buttonLastState != buttonCurrentState) {
    buttonLastState = buttonCurrentState;

    if (buttonCurrentState == LOW) {
      mode += 1;
      if (mode > MAX_MODE) mode = 0;
      //Serial.println(mode);
    }
  }

  switch (mode) {
    case 1: ledLightsSolid(); break;
    case 2: ledLightsOff(); ledLightsBlinkInLine(); break;
    case 3: ledLightsOff(); ledLightsBlinkInLineRevers(); break;
    case 4: ledLightsOff(); ledLightsBlinkInPingPong(); break;
    case 5: ledLightsFadeInOut(); break;
    case 6: ledLightsFromMiddleSolid(); break;       
    default: ledLightsOff(); // mode = 0
  }
}

void ledLightsOff() {
  for (byte led: LEDS_PIN)
    digitalWrite(led, LOW);    
}

void ledLightsSolid() {
  for (byte led: LEDS_PIN)
    digitalWrite(led, HIGH);  
}

void ledLightsBlinkInLine() {
  for (byte led: LEDS_PIN) {
    digitalWrite(led, HIGH); 
    if (delayLoop(150)) return;
    digitalWrite(led, LOW);
  }   
}

void ledLightsBlinkInLineRevers() {  
  for (byte led: LEDS_PIN_REVERS) {
    digitalWrite(led, HIGH); 
    if (delayLoop(150)) return;
    digitalWrite(led, LOW);
  }   
}

void ledLightsBlinkInPingPong() {
  ledLightsBlinkInLine();
  ledLightsBlinkInLineRevers();
}

void ledLightsFadeInOut() {
  ledLightsOff();
  if (delayLoop(200)) return;
  ledLightsSolid();
  if (delayLoop(500)) return;  
}

void ledLightsFromMiddleSolid() {
  byte middle = (byte) LEDS_PIN_COUNT / 2;

  ledLightsOff();
  if (delayLoop(200)) return;
  digitalWrite(LEDS_PIN[middle], HIGH);
  if (delayLoop(200)) return;

  for (byte i=1; i<=middle; i++) {
    digitalWrite(LEDS_PIN[middle - i], HIGH);
    digitalWrite(LEDS_PIN[middle + i], HIGH);
    if (delayLoop(200)) return;
  }

  if (delayLoop(500)) return;  
}

boolean delayLoop(unsigned int delayInterval) {
  unsigned long startMillis = millis();

  do {
    if (digitalRead(BUTTON_PIN) == LOW) return true;
  } while (millis() - startMillis < delayInterval);

  return false;
}