// Forum: https://forum.arduino.cc/t/rgbw-pattern-problem/1247866
// This Wokwi project: https://wokwi.com/projects/395236442837506049

// -------------------------------------------
// Glue for the Uno
#define PA13 13
#define PA4  4
#define PA5  9
#define PA6  6
#define PA7  5
#define PB1  3
// -------------------------------------------

// #include <Arduino.h>
#include <EEPROM.h>

#define led PA13
#define btn PA4
#define ledG PA5
#define ledR PA6
#define ledB PA7
#define ledW PB1
#define longTime 5000

int lastState = 0;
int currentState;
int caseSet = 0;
int countPress = 0;

unsigned long pressedTime = 0;
unsigned long releasedTime = 0;
unsigned long previousPressTime = 0;
int lastButtonState = 1;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
int buttonState;
int eepromValue;
int cnt = 15000;

void setup() {
  Serial.begin(115200);              // 9600 is very slow
  EEPROM.begin();
  eepromValue = EEPROM.read(0);
  Serial.print("eepromValue = ");
  Serial.print(eepromValue);
  eepromValue = 8;
  Serial.print(" -> ");
  Serial.println(eepromValue);
  delay(2000);
  pinMode(led, OUTPUT);
  pinMode(btn, INPUT);
}

void loop() {
  if (caseSet == 0) {
    grbwOutputFunc();
    int currentState = digitalRead(btn);
    if (lastState == HIGH && currentState == LOW) {
      pressedTime = millis();
    } else if (lastState == LOW && currentState == HIGH) {
      releasedTime = millis();
    }
    long pressDuration = releasedTime - pressedTime;
    if (pressDuration > longTime) {
      digitalWrite(led, HIGH);
      caseSet = 1;
    } else {
      digitalWrite(led, LOW);
      caseSet = 0;
    }
    lastState = currentState;
  }

  if (caseSet == 1) {
    int reading = digitalRead(btn);
    if (reading != lastButtonState) {
      lastDebounceTime = millis();
    }
    if ((millis() - lastDebounceTime) > debounceDelay) {
      if (reading != buttonState) {
        buttonState = reading;
        if (buttonState == LOW) {
          countPress++;
          if (countPress > 10) {
            countPress = 1;
          }
          EEPROM.write(0, countPress);
          //      EEPROM.commit();      // not for an Arduino Uno
          Serial.println((String)"broj: " + countPress);
          switch (countPress) {
            case 1:
              analogWriteColor1();
              break;
            case 2:
              analogWriteColor2();
              break;
            case 3:
              analogWriteColor3();
              break;
            case 4:
              analogWriteColor4();
              break;
            case 5:
              analogWriteColor5();
              break;
            case 6:
              analogWriteColor6();
              break;
            case 7:
              analogWriteColor7();
              break;
            case 8:
              analogWriteColor8();
              break;
            case 9:
              analogWriteColor9();
              break;
            case 10:
              analogWriteColor10();
              break;
          }
        }// if buttonState is low
      }// if reading is not buttonState
      if ((millis() - lastDebounceTime) > cnt) {
          //        NVIC_SystemReset();        // not for an Arduino Uno
          Serial.println("Press RESET button");
          while(true) 
            delay(10);
      }
    }
    lastButtonState = reading;
  }//caseSet 1
}
void grbwOutputFunc() {
  switch (eepromValue) {
    case 1:
      analogWriteColor1();
      break;
    case 2:
      analogWriteColor2();
      break;
    case 3:
      analogWriteColor3();
      break;
    case 4:
      analogWriteColor4();
      break;
    case 5:
      analogWriteColor5();
      break;
    case 6:
      analogWriteColor6();
      break;
    case 7:
      analogWriteColor7();
      break;
    case 8:
      analogWriteColor8();
      break;
    case 9:
      analogWriteColor9();
      break;
    case 10:
      analogWriteColor10();
      break;
  }
}

void analogWriteColor1() {
  Serial.print("(1)");
  analogWrite(ledG, 255);
  analogWrite(ledR, 0);
  analogWrite(ledB, 0);
  analogWrite(ledW, 0);
}

void analogWriteColor2() {
  Serial.print("(2)");
  analogWrite(ledG, 0);
  analogWrite(ledR, 255);
  analogWrite(ledB, 0);
  analogWrite(ledW, 0);
}

void analogWriteColor3() {
  Serial.print("(3)");
  analogWrite(ledG, 0);
  analogWrite(ledR, 0);
  analogWrite(ledB, 255);
  analogWrite(ledW, 0);
}

void analogWriteColor4() {
  Serial.print("(4)");
  analogWrite(ledG, 0);
  analogWrite(ledR, 0);
  analogWrite(ledB, 0);
  analogWrite(ledW, 255);
}

void analogWriteColor5() {
  Serial.print("(5)");
  analogWrite(ledG, 150);
  analogWrite(ledR, 150);
  analogWrite(ledB, 0);
  analogWrite(ledW, 0);
}

void analogWriteColor6() {
  Serial.print("(6)");
  analogWrite(ledG, 150);
  analogWrite(ledR, 0);
  analogWrite(ledB, 150);
  analogWrite(ledW, 0);
}

void analogWriteColor7() {
  Serial.print("(7)");
  analogWrite(ledG, 0);
  analogWrite(ledR, 150);
  analogWrite(ledB, 150);
  analogWrite(ledW, 0);
}

void analogWriteColor8() {
  Serial.print("(8)");
  analogWrite(ledG, 100);
  analogWrite(ledR, 255);
  analogWrite(ledB, 50);
  analogWrite(ledW, 0);
}

void analogWriteColor9() {
  Serial.print("(9)");
  analogWrite(ledG, 20);
  analogWrite(ledR, 120);
  analogWrite(ledB, 200);
  analogWrite(ledW, 0);
}

void analogWriteColor10() {
  analogWrite(ledG, 180);
  analogWrite(ledR, 60);
  analogWrite(ledB, 30);
  analogWrite(ledW, 0);
}