#include <Servo.h>
#include <SoftwareSerial.h> 
SoftwareSerial mySerial(A0,A1); 
Servo myservoA;
Servo myservoB;
Servo myservoC;
Servo myservoD;
String readString;
const int ledPin =  13;
char unChar;
///-------------------------------
const int s0 = 2; ///ต่อ 2
const int s1 = 3;///ต่อ 3
const int s2 = 4;///ต่อ 4
const int s3 = 5;///ต่อ 5
const int nLED = 6; // LED///ต่อ 6
const int out = 7; // TCS230 output///ต่อ 7
int red = 0;//ตัวแปร สี แดง
int green = 0;//ตัวแปร สี เขียว
int blue = 0;//ตัวแปร สี น้ำเงิน
////-----------------------------
int posA=100;
int posB=100;
int posC=100;
int posD=100;
 
int posSA1[50];
int posSB1[50];
int posSC1[50];
int posSD1[50];
//------------------
int posSA2[50];
int posSB2[50];
int posSC2[50];
int posSD2[50];
//------------------
int posSA3[50];
int posSB3[50];
int posSC3[50];
int posSD3[50];
//----------------
int Step=0;
int Start=0;
int Max=0;
int DL=100;
int pro=1;
int co=1;///สี
void setup() 
{
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(nLED, OUTPUT);
pinMode(out, INPUT);
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
digitalWrite(nLED, LOW);
  
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);
  Serial.begin(57600);
  while (!Serial)
  {
 
  }
 
  Serial.println("TF-robot");
  Serial.println("พร้อมทำงาน");
  myservoA.attach(8);
  myservoA.write(posA);
    myservoB.attach(9);
  myservoB.write(posB);
    myservoC.attach(10);
  myservoC.write(posC);
    myservoD.attach(11);
  myservoD.write(posD);
  
  mySerial.begin(9600);
  mySerial.println("");
 
 
}
 
void loop() 
{ 
 
  if (mySerial.available()) 
  {
    unChar = mySerial.read();
    Serial.println(unChar);
 
     
  if(unChar=='A'&&posB<=140)
    {
     posB=posB+1;
     myservoB.write(posB);
     Serial.println(posB);
     delay(50);
     }
  if(unChar=='B'&&posB>=70)
    {
     posB=posB-1;
     myservoB.write(posB);
     Serial.println(posB);
      delay(50);
     }
  
  if(unChar=='C'&&posA<=170)
    {
     posA=posA+1;
     myservoA.write(posA);
      Serial.println(posA);
       delay(50);
     }
  if(unChar=='D'&&posA>=10)
    {
     posA=posA-1;
     myservoA.write(posA);
      Serial.println(posA);
 delay(50);
     }
  if(unChar=='F'&&posC>=70)
    {
     posC=posC-1;
     myservoC.write(posC);
      Serial.println(posC);
      delay(50);
    }
    
    if(unChar=='E'&&posC<=150)
    {
      posC=posC+1;
     myservoC.write(posC);
      Serial.println(posC);
       delay(50);
    }   
 
  if(unChar=='N'&&posD>=85)
    {
      posD=posD-1;
     myservoD.write(posD); 
      Serial.println(posD);
       delay(50);     
    }
    
    if(unChar=='M'&&posD<=140)
    {
      posD=posD+1;
     myservoD.write(posD);   
      Serial.println(posD);  
       delay(50); 
    }   
/////////////////////////////////////////////////////////////
    
    if(unChar=='I')//สามเหลี่ยม
    {
    Serial.println("I"); 
     digitalWrite(ledPin, LOW);
     delay(1000);
     digitalWrite(ledPin, HIGH);
     Step=0;
     Start=0;     //หยุดออโต้
    }  
     
    if(unChar=='J')//กากบาท
        
    {
     digitalWrite(ledPin, LOW);
     delay(1000);
     digitalWrite(ledPin, HIGH);
     Serial.println("J"); //หยุดออโต้
      Step=0;
      Start=0;   
    }   
    /////////////////////////////////////////////////////
        if(unChar=='K')//สี่เหลี่ยม
    {
           digitalWrite(ledPin, LOW);
     delay(1000);
     digitalWrite(ledPin, HIGH);
     Serial.println("K");
      Step=0;
      Start=1;  //เริ่ม auto
    }  
////////////////////////////////////////////////////////
       if(unChar=='L')//วงกลม
    {
      digitalWrite(ledPin, LOW);
     delay(100);
     digitalWrite(ledPin, HIGH);
      Serial.println("L");  
      Save();//บันทึก
    }  
///////////////////////////////////////////////////////////
    
       if(unChar=='G')//selec
    {
      
      if(pro==3)
      {    digitalWrite(ledPin, LOW);
     delay(1000);
     digitalWrite(ledPin, HIGH);
      Serial.println("L");  
      pro=1;
     }
      else if(pro==1)
      {    
        digitalWrite(ledPin, LOW);
        delay(100);
         digitalWrite(ledPin, HIGH);
        delay(100);
        digitalWrite(ledPin, LOW);
        delay(100);
         digitalWrite(ledPin, HIGH);         
      Serial.println("L");  
      pro=2;
     } 
       else if(pro==2)
      {    
     digitalWrite(ledPin, LOW);
     delay(100);
     digitalWrite(ledPin, HIGH);
     delay(100);
     digitalWrite(ledPin, LOW);
     delay(100);
     digitalWrite(ledPin, HIGH);
     delay(100);
     digitalWrite(ledPin, LOW);
     delay(100);
     digitalWrite(ledPin, HIGH); 
      Serial.println("L");  
      pro=3;
     } 
    }  
 
       if(unChar=='H')//start
    {
      digitalWrite(ledPin, LOW);
     delay(1000);
     digitalWrite(ledPin, HIGH);
      Serial.println("L");  
Step=0;
Start=0;
Max=0;
DL=100;
pro=1;
color();
    }  
/////////////////////////////////////////////////////////////////
  }
//////////////////////////////////////////  
else if(Start==1)//ทำงานรัน
{
  if(co==1)
  {
   runARM1(); 
  }
   else if(co==2)
  {
   runARM2(); 
  } 
    else if(co==3)
  {
   runARM3(); 
  }
}
//////-------------------------------------------------------
 
 
 
 
 
  
}//////////////////////ลูป
 
 
 
void Save()
{
if(pro==1) 
{ 
posSA1[Step]=posA;
posSB1[Step]=posB;
posSC1[Step]=posC;
posSD1[Step]=posD;
Step++;  
Max=Step;
Print();
}
else if(pro==2) 
{ 
posSA2[Step]=posA;
posSB2[Step]=posB;
posSC2[Step]=posC;
posSD2[Step]=posD;
Step++;  
Max=Step;
Print();
}
else if(pro==3) 
{ 
posSA3[Step]=posA;
posSB3[Step]=posB;
posSC3[Step]=posC;
posSD3[Step]=posD;
Step++;  
Max=Step;
Print();
}
 
}
//------------------------------
void runARM1()///pro1
{
if(Max==Step)///กรณีหยุด
{
//Start=0;
Step=0;  
color();
}
else if(posA<posSA1[Step])
{
posA++;
myservoA.write(posA);  
delay(DL); 
}  
else if(posA>posSA1[Step])
{
posA--;
myservoA.write(posA); 
delay(DL);    
}
 
 
else if(posB<posSB1[Step])
{
posB++;
myservoB.write(posB);
delay(DL);  
} 
else if(posB>posSB1[Step])
{
posB--;
myservoB.write(posB);
delay(DL);
}
 
else if(posC<posSC1[Step])
{
posC++; 
myservoC.write(posC);
delay(DL); 
}
else if(posC>posSC1[Step])
{
posC--;
myservoC.write(posC);
delay(DL);
}
 
else if(posD<posSD1[Step])
{
posD++; 
myservoD.write(posD); 
delay(DL);
}
else if(posD>posSD1[Step])
{
posD--;
myservoD.write(posD);
delay(DL);
}
 
else
{
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);  
Step++;
Print();
delay(1000);
}
}
//-----------------------------
void runARM2()///pro2
{
if(Max==Step)///กรณีหยุด
{
//Start=0;
Step=0;  
color();
}
else if(posA<posSA2[Step])
{
posA++;
myservoA.write(posA);  
delay(DL); 
}  
else if(posA>posSA2[Step])
{
posA--;
myservoA.write(posA); 
delay(DL);    
}
 
 
else if(posB<posSB2[Step])
{
posB++;
myservoB.write(posB);
delay(DL);  
} 
else if(posB>posSB2[Step])
{
posB--;
myservoB.write(posB);
delay(DL);
}
 
else if(posC<posSC2[Step])
{
posC++; 
myservoC.write(posC);
delay(DL); 
}
else if(posC>posSC2[Step])
{
posC--;
myservoC.write(posC);
delay(DL);
}
 
else if(posD<posSD2[Step])
{
posD++; 
myservoD.write(posD);
delay(DL); 
}
else if(posD>posSD2[Step])
{
posD--;
myservoD.write(posD);
delay(DL);
}
 
else
{
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);  
Step++;
Print();
delay(1000);
}
}
 
 
void runARM3()///pro3
{
if(Max==Step)///กรณีหยุด
{
//Start=0;
Step=0;  
color();
}
else if(posA<posSA3[Step])
{
posA++;
myservoA.write(posA);  
delay(DL); 
}  
else if(posA>posSA3[Step])
{
posA--;
myservoA.write(posA); 
delay(DL);    
}
 
 
else if(posB<posSB3[Step])
{
posB++;
myservoB.write(posB);
delay(DL);  
} 
else if(posB>posSB3[Step])
{
posB--;
myservoB.write(posB);
delay(DL);
}
 
else if(posC<posSC3[Step])
{
posC++; 
myservoC.write(posC);
delay(DL); 
}
else if(posC>posSC3[Step])
{
posC--;
myservoC.write(posC);
delay(DL);
}
 
else if(posD<posSD3[Step])
{
posD++; 
myservoD.write(posD); 
delay(DL);
}
else if(posD>posSD3[Step])
{
posD--;
myservoD.write(posD);
delay(DL);
}
 
else
{
digitalWrite(ledPin, LOW);
delay(100);
digitalWrite(ledPin, HIGH);  
Step++;
Print();
delay(1000);
}
}
 
void Print()
{
Serial.print("step= ");
Serial.print(Step);
Serial.print("  P_A= ");
Serial.print(posA);
Serial.print("  P_B= ");
Serial.print(posB);
Serial.print("  P_C= ");
Serial.print(posC);
Serial.print("  P_D= ");
Serial.print(posD);
Serial.println();  
}
 
 
void color() 
{
digitalWrite(nLED,HIGH);
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
// count OUT, pRed, RED
red = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(s3, HIGH);
//count OUT, pBLUE, BLUE
blue = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(s2, HIGH);
// count OUT, pGreen, GREEN
green = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(nLED,0);
 
 
if (red < blue && red < green) 
{
Serial.println("Red");
co=1;
}
 
else if (blue < red && blue < green) 
{ 
Serial.println("blue");
co=2;
}
else 
{
Serial.println("green");
co=3;
}
 
}