// #include <SoftwareSerial.h>
// SoftwareSerial  EEBlue(0, 1); // RX | TX

#include <IRremote.h>
#define PIN_RECEIVER A0
IRrecv receiver(PIN_RECEIVER);

// defining the pins used for each drink, you can  changes this depending how you connect the pumps and the drinks.

int Vodka = 2;
int Cointreau = 3;
int CranberryJuice = 4;
int GrapeJuice = 5;
int LimeJuice = 6;
int CleaningWater = 7;
int Blender = 8;
int Discharge = 9;

int state = 0;
int interval = 500;

// Function declaration for ConcurrentMix
void ConcurrentMix(
  int DelayTimeVodka, int DelayTimeCointreau, int DelayTimeCranberryJuice,
  int DelayTimeGrapeJuice, int DelayTimeLimeJuice, int DelayTimeCleaningWater,
  int DelayTimeBlender, int DelayTimeDischarge , bool includeCleaningWater);

void setup()
{
  // Start the remote control receiver
  receiver.enableIRIn(); 

  Serial.begin(9600);
  Serial.println("The bluetooth gates are open.\
 Connect to HC-05 from any  other bluetooth device with 1234 as pairing key!");
   // Set pin 2-9 to  output pins to drive the relay board

  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
}

void loop()

{
  if (Serial.available() > 0)
  {                        // Checks whether data is comming from the serial port
    state = Serial.read(); // Reads the data from the serial port
    Serial.println(state);
  }

  // In the absense of the bluetooth controller, I have used an IR remote control for controlling the system.
  // Checks received an IR signal
  if (receiver.decode()) {
    state = receiver.decodedIRData.command;
    Serial.println(state);
    receiver.resume();  
    // Receive the next value
  }


 //  Cocktails:

  // 1.	Cosmopolitan (vodka, Cointreau, Cranberry, Lime)
  if (state == "cos" || state == 48)
  {
    Serial.println("Cosmopolitan in the making");
    ConcurrentMix(4000, 5000, 3000, 0, 1000, 0, 4000, 8000,false);
    // Vodka, Cointreau, CranberryJuice, GrapeJuice, LimeJuice, CleaningWater, Blender, Discharge
  }

  // 2.	Vodka- cranberry (Vodka, Cranberry)
  if (state == "vkc" || state == 24)
  {
    Serial.println("Vodka- cranberry in the making");
    ConcurrentMix(3000, 0, 2000, 0, 0, 0, 2000, 1500, false);
    // Vodka, Cointreau, CranberryJuice, GrapeJuice, LimeJuice, CleaningWater, Blender, Discharge
  }

  // 3.	Vodka Sidecar (vodka, Cointreau, lime)
  if (state == "vsc" || state == 122)
  {
    Serial.println("Vodka- Sidecar in the making");
    ConcurrentMix(8000, 8000, 0, 0, 8000, 0, 3000, 800, false);
    // Vodka, Cointreau, CranberryJuice, GrapeJuice, LimeJuice, CleaningWater, Blender, Discharge
  }

  // 4.	Seabreeze (Vodka, Grapefruit, Cranberry)
  if (state == "sb" || state == 16)
  {
    Serial.println("Seabreeze in the making");
    ConcurrentMix(800, 0, 800, 800, 0, 0, 800, 800, false);
    // Vodka, Cointreau, CranberryJuice, GrapeJuice, LimeJuice, CleaningWater, Blender, Discharge
  }

  // 5.	GreyHound (Vodka, Grapefruit)
  if (state == "gh" || state == 56)
  {
    Serial.println("GreyHound in the making");
    ConcurrentMix(800, 0, 0, 800, 0, 0, 800, 800, false);
    // Vodka, Cointreau, CranberryJuice, GrapeJuice, LimeJuice, CleaningWater, Blender, Discharge
  }

  // 6.	Cape codder (Vodka, cranberry)
  if (state == "cc" || state == 90)
  {
    Serial.println("Cape codder in the making");
    ConcurrentMix(800, 0, 800, 0, 0, 0, 800, 800, false);
    // Vodka, Cointreau, CranberryJuice, GrapeJuice, LimeJuice, CleaningWater, Blender, Discharge
  }


  // Perform Cleaning
  if (state == 'x' || state == 176)
  {
    Serial.println("Perform Cleaning");
    ConcurrentMix(0, 0, 0, 0, 0, 1000, 4000, 3000, true);
  }

  //  Set-up all (intial first time after cleaning)
  if (state == "u" || state == 104)
  {
    Serial.println("Set-up  All");
    ConcurrentMix(800, 800, 800, 800, 800, 0, 0, 0,false); 
    // Vodka, Cointreau, CranberryJuice, GrapeJuice, LimeJuice, CleaningWater, Blender, Discharge
  }

}

void ConcurrentMix(
  int DelayTimeVodka, int DelayTimeCointreau, int DelayTimeCranberryJuice,
  int DelayTimeGrapeJuice, int DelayTimeLimeJuice, int DelayTimeCleaningWater,
  int DelayTimeBlender, int DelayTimeDischarge, bool includeCleaningWater) {


  state = 0;
  delay(2000);

  // All ingredient pumps are activated concurrently
  digitalWrite(Vodka, HIGH);
  digitalWrite(Cointreau, HIGH);
  digitalWrite(CranberryJuice, HIGH);
  digitalWrite(GrapeJuice, HIGH);
  digitalWrite(LimeJuice, HIGH);
  // Check if CleaningWater should be included
  if (includeCleaningWater) {
    digitalWrite(CleaningWater, HIGH);
  }

  // Concurrent dispensing of ingredients
  delay(DelayTimeVodka);
  digitalWrite(Vodka, LOW);
  delay(DelayTimeCointreau);
  digitalWrite(Cointreau, LOW);
  delay(DelayTimeCranberryJuice);
  digitalWrite(CranberryJuice, LOW);
  delay(DelayTimeGrapeJuice);
  digitalWrite(GrapeJuice, LOW);
  delay(DelayTimeLimeJuice);
  digitalWrite(LimeJuice, LOW);
 // Turn off CleaningWater if included
  if (includeCleaningWater) {
    digitalWrite(CleaningWater, LOW);
  }
  

  // Delay after dispensing ingredients
  delay(2000);

  // Sequential cleaning cycle
  // Turn off Blender and Discharge for cleaning
  digitalWrite(Blender, LOW);
  digitalWrite(Discharge, LOW);

  // Cleaning Water runs for the specified time
  digitalWrite(CleaningWater, HIGH);
  delay(DelayTimeCleaningWater);
  digitalWrite(CleaningWater, LOW);  // Turn off CleaningWater

  // Blender operates after cleaning water
  delay(100);
  digitalWrite(Blender, HIGH);
  delay(DelayTimeBlender);
  digitalWrite(Blender, LOW);

  // Discharge pump operates after blender
  delay(100);
  digitalWrite(Discharge, HIGH);
  delay(DelayTimeDischarge);
  digitalWrite(Discharge, LOW);

  Serial.println("Drink is done!");
  state = 0;

  // Notify MIT App Inventor when processing is complete
  Serial.println("Done");
}
$abcdeabcde151015202530354045505560fghijfghij