/*  BLUE ROVIER 316 Arduino Code
    Incoming data  and Commands based on AMR voice and corresponding softwares
    Date modified : 5 December 2016
    Arduino code for BLUE ROVIER 316, originally built in July 2016, but modified in December, making
    more flexible, including advanced features and user friendly.
*/
//------------------------------------------------Operating System--------------------------------------------------//

#include <Servo.h>
#include <SoftwareSerial.h>
#include <Wtv020sd16p.h>
#include <Ultrasonic.h>

int mA1 = 8;
int mA2 = 9;
int mB1 = 10;
int mB2 = 11;
int reset = 2;
int clock = 3;
int data = 4;
int busy = 5;

int leftLook;
int rightLook;
int distance;
String voice;

Wtv020sd16p wtv020sd16p(reset, clock, data, busy);//create an object wtv020sd16p(sound module)
SoftwareSerial BT(0, 1); //TX and RX respectively
Servo myservo; //create a servo object
Ultrasonic ultrasonic(6, 7); //Trigger and Echo respectively


void setup() {

  pinMode(mA1, OUTPUT);//Set the motor pins as output
  pinMode(mA2, OUTPUT);
  pinMode(mB1, OUTPUT);
  pinMode(mB2, OUTPUT);

  myservo.attach(12);//Attaches the servo on pin 12
  BT.begin(9600);
  Serial.begin(9600);//Start a serial communication
  wtv020sd16p.reset();//Reset the module

  servofunction();
  delay(500);//delay added to make things prominent
  wtv020sd16p.playVoice(0);//Say hello to everyone
}

void loop() {

  while (BT.available()) {// Check for incoming Serial Data over Bluetooth
    delay(10);//Delay added to make things stable
    char c = BT.read();//Conduct a Serial Bluetooth read
    voice += c;//Build the Strings
  }
  if (voice.length() > 0) {//If any Serial data is available
    Serial.println(voice);//Print the data on the serial monitor
    {
      //                 Answering General Questions
      if (voice == "*what is your name#" ) {
        wtv020sd16p.playVoice(1);
      }
      else if (voice == "*what is your phone number#")
      { wtv020sd16p.playVoice(2);
      }
      else if (voice == "*how old are you#")
      { wtv020sd16p.playVoice(3);
      }
      else if (voice == "*are you married#")
      { wtv020sd16p.playVoice(4);
      }
      else if (voice == "*do you like games#")
      { wtv020sd16p.playVoice(5);
      }
      else if (voice ==  "*how are you#")
      { wtv020sd16p.playVoice(6);
      }
      else if (voice == "*what do you like to do#")
      { wtv020sd16p.playVoice(7);
      }
      else if (voice == "*can you play any game#")
      { wtv020sd16p.playVoice(8);
      }
      else if (voice ==  "*can you think#")
      { wtv020sd16p.playVoice(9);
      }
      else if (voice == "*what can you do#")
      { wtv020sd16p.playVoice(10);
      }
      else if (voice == "*do you have any friends#")
      { wtv020sd16p.playVoice(11);
      }
      else if (voice == "*introduce yourself#") {
        wtv020sd16p.playVoice(12);
      }
      else if (voice == "*which language can you speak#")
      { wtv020sd16p.playVoice(13);
      }
      else if (voice == "*can you speak any other language#")
      { wtv020sd16p.playVoice(14);
      }
      else if (voice == "*what do you like to eat#")
      { wtv020sd16p.playVoice(15);
      }
      else if (voice == "*can you dance#") {
        wtv020sd16p.playVoice(16);
      }
      else if  (voice ==  "*can you sing#") {
        wtv020sd16p.playVoice(16);
      }
      else if (voice == "*hello#") {
        wtv020sd16p.playVoice(17);
      }
      else if (voice == "*which sport do you like#") {
        wtv020sd16p.playVoice(18);
      }
      //                            Physical Activities

      else if (voice == "*look left#") {
        myservo.write(180);
      }
      else if (voice == "*look right#") {
        myservo.write(0);
      }
      else if (voice == "*look ahead#") {
        myservo.write(90);
      }
      else if (voice == "*turn front#") {
        myservo.write(90);
      }

      else if (voice == "*go forward#") {
        forward();
        delay(700);
        stop();
      }
      else if (voice == "A") {
        forward();
      }
      else if (voice == "*go back#") {
        backward();
        delay(700);
        stop();
      }
      else if (voice == "B") {
        backward();
      }
      else if (voice == "*turn left#") {
        myservo.write(180);
        delay(500);
        myservo.write(90);
        delay(400);
        left();
        delay(750);
        stop();
      }
      else if (voice == "C") {
        left();
      }
      else if (voice == "G") {//look left
        myservo.write(180);
      }
      else if (voice == "*turn right#") {
        myservo.write(0);
        delay(500);
        myservo.write(90);
        delay(400);
        right();
        delay(750);
        stop();
      }
      else if (voice == "D") {
        right();
      }
      else if (voice == "F") {//look right
        myservo.write(0);
      }
      else if (voice == "*stop#") {
        stop();
        wtv020sd16p.reset();
        myservo.write(90);
      }
      else if (voice == "E") {
        stop();
        myservo.write(90);
      }

      //                              Performing Activities
      while (voice ==  "*avoid the obstacles#") {// Obstacle avoidance mode
        obstacleavoidance();
      }
    }
    voice = "";//Reset the variable
  }
}//SKYLARK SYSTEM
//Version 30.11.18
//                                   Functions

void servofunction() {
  myservo.write(180);
  delay(500);
  myservo.write(90);
  delay(500);
  myservo.write(0);
  delay(500);
  myservo.write(90);
}

void forward() {
  digitalWrite(mA1, HIGH);
  digitalWrite(mA2, LOW);
  digitalWrite(mB1, HIGH);
  digitalWrite(mB2, LOW);
}
void backward() {
  digitalWrite(mA1, LOW);
  digitalWrite(mA2, HIGH);
  digitalWrite(mB1, LOW);
  digitalWrite(mB2, HIGH);
}
void right() {
  digitalWrite(mA1, HIGH);
  digitalWrite(mA2, LOW);
  digitalWrite(mB1, LOW);
  digitalWrite(mB2, HIGH);
}
void left() {
  digitalWrite(mA1, LOW);
  digitalWrite(mA2, HIGH);
  digitalWrite(mB1, HIGH);
  digitalWrite(mB2, LOW);
}
void stop() {
  digitalWrite(mA1, LOW);
  digitalWrite(mA2, LOW);
  digitalWrite(mB1, LOW);
  digitalWrite(mB2, LOW);
}

void obstacleavoidance() {
  distance = ultrasonic.Ranging(CM); // (Use CM for centimeter and INC for inches)
  delay (50);// check for objects
  
  if (distance > 30) {
    forward();
  }

  else if (distance <= 30) {
    backward();// Act as a brake
    stop(); //Object detected 
    delay(500);
    distances(); // Proceed to the next function

  }
}
void distances() {

  myservo.write(180);//take distances from the left side
  delay(350);
  leftLook = ultrasonic.Ranging(CM);

  myservo.write(90);
  delay(500);
  myservo.write(0);//take distances from the right side
  delay(350);
  rightLook = ultrasonic.Ranging(CM);
  myservo.write(90);
  delay(40);
  comparison();
}
void comparison() {
  if (leftLook > rightLook) {
    left();
    delay(750);
    obstacleavoidance();
  }
  else if (leftLook < rightLook) {
    right();
    delay(750);
    obstacleavoidance();
  }
  else if (leftLook < 15 && rightLook < 15) {
    backward();
    delay(350);
    stop();
    distances();
  }
}
//------------------------------------------------------Operating System-----------------------------------------------------------//
//Version 30.11.18
