uint8_t const changePin {2};
uint8_t const patternCountLimit {2};

bool commuted {false};
uint8_t patternCount {0};


void flash1() {
  for (int i {0}; i < 20; i++) {
    digitalWrite(LED_BUILTIN, HIGH);
    commutableDelayPin(1000, LOW);
    digitalWrite(LED_BUILTIN, LOW);
    commutableDelayPin(1000, LOW);
  }
}

void flash2() {
  for (int i {0}; i < 20; i++) {
    digitalWrite(LED_BUILTIN, HIGH);
    commutableDelayPin(200, LOW);
    digitalWrite(LED_BUILTIN, LOW);
    commutableDelayPin(1000, LOW);
  }
}

void commutableDelayPin(uint32_t const delayTime, bool const commuteState) {
  uint32_t startTime {millis()};

  while (millis() - startTime < delayTime and not commuted) {
    if (digitalRead(changePin) == commuteState) {
      commuted = true;
    }
  }
}

void commutableCatchPin(bool const commuteState) {
  if (not commuted) {
    return;
  }
  commuted = false;

  while(digitalRead(changePin) == commuteState);
  delay(200);

  digitalWrite(LED_BUILTIN, LOW);
  patternCount = (patternCount + 1) % patternCountLimit;
}


void setup() {
  Serial.begin(9600);

  pinMode(changePin, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  commutableCatchPin(LOW);

  if (not patternCount) {
    flash1();
    return;
  }
  flash2();
}