#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=50;
int pro=1;
int co=1;///สี
int DK =20;
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=='C'&&posA<=170)
    {
     posA=posA+4;
      myservoA.write(posA);
       delay(DK);
   
     }
  else if(unChar=='D'&&posA>=0)
    {
    posA=posA-4;
     myservoA.write(posA);
 delay(DK);
     }
       
   else  if(unChar=='A'&&posB<=140)
    {
     posB=posB+4;Serial.println(posB);
     myservoB.write(posB);
 
     delay(DK);
     }
   else  if(unChar=='B'&&posB>=70)
    {
     posB=posB-4;
     myservoB.write(posB);
      delay(DK);
     }
  
  
    else if(unChar=='F'&&posC>=70)
    {
     posC=posC-4;
     myservoC.write(posC);
    //  Serial.println(posC);
      delay(DK);
    }
    
     else  if(unChar=='E'&&posC<=150)
    {
      posC=posC+4;
     myservoC.write(posC);
  //    Serial.println(posC);
       delay(DK);
    }   
    else if(unChar=='M'&&posD>=85)
    {
      posD=posD-4;
     myservoD.write(posD); 
  //    Serial.println(posD);
       delay(DK);     
    }
    
     else  if(unChar=='N'&&posD<=140)
    {
      posD=posD+4;
     myservoD.write(posD);   
       delay(DK); 
    }   
/////////////////////////////////////////////////////////////จบควบคุม
    
     
    /////////////////////////////////////////////////////
        if(unChar=='K')//สี่เหลี่ยม
    {
     digitalWrite(ledPin, LOW);
     delay(1000);
     digitalWrite(ledPin, HIGH);
    
      Step=1;
      Start=1;  //เริ่ม auto
    }  
////////////////////////////////////////////////////////
       if(unChar=='L')//วงกลม
    {
      digitalWrite(ledPin, LOW);
     delay(100);
     digitalWrite(ledPin, HIGH);
      
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();
      Save();//บันทึก
    }  
    
///////////////////////////////////////////////////////////
    
       if(unChar=='H')//start
    {
      digitalWrite(ledPin, LOW);
     delay(1000);
     digitalWrite(ledPin, HIGH);
      
Step=0;
Start=0;
Max=0;
DL=100;
pro=1;
 }
//    else
//    {
// 
//  myservoA.write(posA);
//  myservoB.write(posB);
//  myservoC.write(posC);
//  myservoD.write(posD);
//  mySerial.println("");
//    }  
/////////////////////////////////////////////////////////////////
  }
//////////////////////////////////////////  
 if(Start==1)//ทำงานรัน
{
   runARM1(); 
}
//////-------------------------------------------------------
  
}//////////////////////ลูป
void Save()
{
posSA1[Step]=posA;
posSB1[Step]=posB;
posSC1[Step]=posC;
posSD1[Step]=posD;
Step++;  
Max=Step;
Print();
}
//------------------------------
void runARM1()///pro1
{
if(Max==Step)///กรณีหยุด
{
//Start=0;
Step=0;  
}
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 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();  
}