//Sargun Singh, 300340568, ENGR 1190 Midterm

//Library for servo
#include <Servo.h>

//Servo object
Servo myServo;

//Array that contains the pin numbers of all 4 leds
int leds[4] = {5,6,9,10};

//Function to setup arduino and start communications.
void setup() {
  //Lines 15 through 18 assign leds to pins
  pinMode(5, OUTPUT); //amber led
  pinMode(6, OUTPUT); //blue led
  pinMode(9, OUTPUT); //red led
  pinMode(10, OUTPUT); //green led

  //Lines 21 through 24 assigns push buttons to pins.
  pinMode(2, INPUT); //push button a (red)
  pinMode(12, INPUT); //push button b (green)
  pinMode(8, INPUT); //push button c (blue)
  pinMode(7, INPUT); //push button d (yellow)

  //designates pin 11 to servo motor
  myServo.attach(11);//servo motor

  //Initialize serial communication at a speed of 9600 bits per second.
  Serial.begin(9600);

  //Initialize random number generator function
  randomSeed(analogRead(0));
}

//Function that continuously loops performing tasks, responding to changes, and control devices.
void loop() {

  //Following for loop turns off all leds to start off.
  for(int i = 0; i < 4; i++){
      digitalWrite(leds[i], HIGH);//turns led off.
  }

  //********TASK 1 BEGIN*****************************************************************************************************
  //Check if button A (red) is being pressed
  if(digitalRead(2) == HIGH){
    //This first for loop starts from green goes to blue blinking each led twice.
    for(int i =3; i >=1; i--){
      //This nested for loop blinks leds twice
      for(int j =0; j < 2; j++){
        if(digitalRead(2) == LOW){break;}//if the button is let go then the leds stop blinking.
        digitalWrite(leds[i], LOW);//turn current led on
        delay(150);//delay 150 ms
        digitalWrite(leds[i], HIGH);//turn current led off
        delay(150);//delay 150ms
      }
    }
    //This second for loop starts from orange and goes to red blinking each led twice
    for(int i =0; i < 3; i++){
      //This nested for loop blinks leds twice
      for(int j =0; j < 2; j++){
        if(digitalRead(2) == LOW){break;}//if the button is let go then the leds stop blinking.
        digitalWrite(leds[i], LOW);//turn current led on
        delay(150);//delay 150 ms
        digitalWrite(leds[i], HIGH);//turn current led off
        delay(150);//delay 150ms
      }
    }
  }
  //********TASK 1 END******************************************************************************************************

  //********TASK 2 BEGIN**********************************************************************************************************
  //Check if button B(green) is being pressed
  if(digitalRead(12) == HIGH){
    //get a random value from 0 to 3 and store it in integer rLed named after randomLed.
    int rLed = random(4);
    //For loop blinks light twice with 150 ms delay
    for(int i = 0; i < 2;i++){
      digitalWrite(leds[rLed], LOW);//turn on random led
      delay(150);//delay 150ms
      digitalWrite(leds[rLed], HIGH);//turn off random led
      delay(150);//delay 150ms
    }
  }
  //*********TASK 2 END*****************************************************************************************************

  //********TASK 3 BEGIN****************************************************************************************************
  //Check if button C (blue) is being pressed
  if(digitalRead(8) == HIGH){
    //This for loop rotated servo from 20 degrees to 120 degrees with 8 ms delay per degree
    for(int i = myServo.read(); i < 120; i++){
      if(digitalRead(8) == LOW){break;}//if button C is let go stop rotating
      myServo.write(i);//rotates servo
      delay(8);//delay 8ms
    }
    //This for loop rotates servo from 120 degree back to 20 degrees with 8 ms delay per degree
    for(int i =120; i >= 20; i--){
      if(digitalRead(8) == LOW){break;} //if button C is let go stop rotating
      myServo.write(i);//rotates servo
      delay(8);//delay 8ms
    }
  }
  //********TASK 3 END**********************************************************************************************************
  
  //********TASK 4 BEGIN************************************************************************************************************
  //Check is button D(orange) is being pressed
  if(digitalRead(7) == HIGH){

    myServo.write(30);//rotate servo to 30 degrees
    //Following for loop blinks blue led twice.
    for(int i =0; i < 2; i++){
      digitalWrite(6, LOW);//turn on blue led
      delay(150);//delay 150ms
      digitalWrite(6, HIGH);//turn off blue led
      delay(150);//delay 150ms
    }

    myServo.write(90);//rotate servo to 90 degrees
    //Following for loop blinks green led three times. 
    for(int i =0; i < 3; i++){
      digitalWrite(10, LOW);//turn on green led
      delay(150);//delay 150ms
      digitalWrite(10, HIGH);//turn off green led
      delay(150);//delay 150ms
    }

    myServo.write(120);//rotate servo to 120 degrees
    //Following for loop blinks orange and red leds alternatively twice
    for(int i =0; i < 2; i++){
      digitalWrite(5, LOW);//turn on orange led
      delay(150);//delay 150ms
      digitalWrite(5, HIGH);//turn off orange led
      delay(150);//delay 150ms

      digitalWrite(9, LOW);//turn on red led
      delay(150);//delay 150ms
      digitalWrite(9, HIGH);//turn off red led
      delay(150);//delay 150ms
    }
  }
  //*********TASK 4 END********************************************************************************************************
}