//ATTINY85 is used for this project.

#include <avr/sleep.h>
#include <avr/interrupt.h>
const int switchPin                     = 4; //4
const int statusLED                     = 3; //for debugging only
const int mosfet                        = 1; //1

uint8_t ledStatus = 0; //0 = off, 1=FLASH_FAST, 2=FLASH_MEDIUM, 3=FLASH_LOW, 4=SOLID

unsigned long prevFlashDelay = 0;
boolean ledOn = false;
boolean btn1Pressed = false;

void setup() {
  pinMode(switchPin, INPUT);
  digitalWrite(switchPin, HIGH);
  pinMode(statusLED, OUTPUT);
  pinMode(mosfet, OUTPUT);

  digitalWrite(mosfet, LOW);
  digitalWrite(statusLED, HIGH);
  delay(500);

  prevFlashDelay = millis();
  sleep();
  digitalWrite(statusLED, LOW);

}
void sleep() {
  GIMSK |= _BV(PCIE);                     // Enable Pin Change Interrupts
  PCMSK |= _BV(PCINT4);                   // Use PB4 as interrupt pin
  ADCSRA &= ~_BV(ADEN);                   // ADC off
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);    // replaces above statement
  sleep_enable();                         // Sets the Sleep Enable bit in the MCUCR Register (SE BIT)
  sei();                                  // Enable interrupts
  sleep_cpu();                            // sleep
  cli();                                  // Disable interrupts
  PCMSK &= ~_BV(PCINT4);                  // Turn off PB4 as interrupt pin
  sleep_disable();                        // Clear SE bit
  ADCSRA |= _BV(ADEN);                    // ADC on
  sei();                                  // Enable interrupts
} // sleep
ISR(PCINT0_vect) {
  // This is called when the interrupt occurs, but I don't need to do anything in it
}

void loop() {

  int b = digitalRead(switchPin);

  if (b == HIGH && !btn1Pressed) {
    btn1Pressed = true;
    digitalWrite(statusLED, LOW);

    if (ledStatus >= 4) { //SOLID
      ledStatus = 0; //OFF
    } else {
      ledStatus ++;
    }

    delay(300);
    prevFlashDelay = millis();
    

  } else if (b == LOW && btn1Pressed) {
    btn1Pressed = false;
    delay(300);
  }

  switch (ledStatus) {
    case 0: //OFF
      ledBlinkingFunction(0);
      break;
    case 1://FAST
      ledBlinkingFunction(100);
      break;
    case 2:
      ledBlinkingFunction(300);
      break;
    case 3:
      ledBlinkingFunction(600);
      break;
    case 4:
      ledBlinkingFunction(10000);
      break;
    default:
      // statements
      break;
  }

}

void ledBlinkingFunction(int ledBlinkSpeed) {

  if (ledBlinkSpeed > 0) {

    if (ledBlinkSpeed == 10000 && digitalRead(mosfet) == LOW) {
      //solid led
      digitalWrite(mosfet, HIGH);
    } else  if (millis() - prevFlashDelay > ledBlinkSpeed) {

      if (!ledOn) {
        ledOn = true;
        digitalWrite(mosfet, HIGH);
      } else {
        ledOn = false;
        digitalWrite(mosfet, LOW);
      }
      prevFlashDelay = millis();
    }

  } else if (ledBlinkSpeed == 0) {
    //sleep
    digitalWrite(mosfet, LOW);
    //set that we don't want the user to press the button ultil asleep
    if (!btn1Pressed) {
      sleep();
    }
  }  else if (digitalRead(mosfet) == HIGH) {

    digitalWrite(mosfet, LOW);
  }
}
