/*
This software is provided "as-is," without any express or implied warranty. 
In no event shall CW Electronx be held liable for any damages arising from the use of the software.
*/

String data, readData;
String pinNum;
String pinStatus;
int pinNumInt;
int sensorValue = 0;  

void setup() 
{
  //Initialize serial
    Serial.begin(9600);
  
  //Set the pins to be outputs
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT); 
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT); 
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT); 
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT); 
    pinMode(10, OUTPUT);
    pinMode(11, OUTPUT); 
    pinMode(12, OUTPUT);
    pinMode(13, OUTPUT); 
  
//INITIALIZE AND CONFIGURE ESP8266 (IP: 192.168.4.1 and PORT: 2000)
//APPEARS TO TAKE MULITPLE TIMES TO CONFIGURE AS SERVER
//CLIENT NEEDS TO WAIT BEFORE SENDING COMMANDS TO SERVER UNTIAL INITIALIZED
    Serial.println("AT");
    delay(5000);
    Serial.println("AT+RST");
    delay(5000);
    Serial.println("AT+CIPMUX=1");
    delay(2000);
    Serial.println("");
    Serial.println("AT+CIPMUX=1");
    delay(5000);
    Serial.println("AT+CIPSERVER=1,2000");
    delay(2000);
    Serial.println("");
    Serial.println("AT+CIPSERVER=1,2000");
    
}

void loop() 
{  
  //Get Serial Command============================================== 
  // Read Serial Data when Available
  while (Serial.available() > 0) 
  {    
      readData = Serial.readString();
    
      data = readData.substring(readData.indexOf(':'), readData.indexOf('$')); 
      
      //e.i. D02L or D02H ---> Pin#: 2 Status Request: L or H
      pinNum = data.substring(1,3);
      pinStatus = data.substring(3,4);
   }
   
   //Process and Set Command to Outputs=============================
   //Convert pin number String to int
   pinNumInt = pinNum.toInt();
   
   //Check to see if request is in the range of the outputs
   if((pinNumInt < 14) && (pinNumInt > 1))
   {
       setOutput(pinStatus, pinNumInt);
   }
   
}

void setOutput(String statusStringIN, int pinIN)
{
  if(0 == statusStringIN.compareTo("H"))
  {
      digitalWrite(pinIN, HIGH);
  }
  else if(0 == statusStringIN.compareTo("L"))
  {
      digitalWrite(pinIN, LOW);
  }
  //else Do NOTHING if Command not recognized
}
