#include<TAH.h>

TAH myTAH;


int mode, joyX, joyY, dPad, Buttonpadtag;

char val;          // Store Value of Buttonpadtag
char mem = ' ';    // Store Value of Buttonpadtag till getting new Value


void setup() 
{
  
 Keyboard.begin();
 Mouse.begin();
 Keyboard.releaseAll();  
  
Serial.begin(9600);
myTAH.begin(9600);

myTAH.enterCommandMode();

myTAH.setName("Play");
myTAH.setWorkRole(SLAVE);
myTAH.setAuth(OPEN);
myTAH.setWorkMode(REMOTE_CONTROL);
myTAH.setiBeaconMode(ON);

myTAH.exitCommandMode();
}


void loop() 
{
  // if there's any serial available, read it:
  if (myTAH.available()) 
  {
    
    ///// Parsing Value From Left Controller
    
    mode = myTAH.parseInt();
    
    joyX = myTAH.parseInt(); 
  
    joyY = myTAH.parseInt();
  
    dPad = myTAH.parseInt();   
      
    Buttonpadtag = myTAH.parseInt();

    

     
     // joystick value mapping
     joyX = map(joyX, -128,128, 0, 255);
     joyY = map(joyY, 128, -128, 0, 255);


    

    // look for the newline. That's the end of your
    // sentence:
    if (myTAH.read() == 'P') 
    {
 
      if(mode == 0) // App is in PS mode
      {
      
        // Always be getting fresh data
         dataForController_t SonycontrollerData = SonygetControllerData();
        // Then send out the data over the USB connection
         // Joystick.set(controllerData) also works.
        Joystick.setControllerData(SonycontrollerData);
      }
      
      else if(mode == 1) // App is in Computer Joystick Mode
      {
      /////////  Button Pad mapped to User Defined Computer Keys  ////////////
if(Buttonpadtag >> 0  && Buttonpadtag != 5 && Buttonpadtag != 6)
{ 
  val = Buttonpadtag;
  mem = val;
  Keyboard.press(val);
  
}

else
{
val = mem;
Keyboard.release(val);
}




if(Buttonpadtag == 5)
{
Keyboard.press(KEY_ESC);
}
else
{
Keyboard.release(KEY_ESC);
}


if(Buttonpadtag == 6)
{
Mouse.press(MOUSE_LEFT);
}
else
{
Mouse.release(MOUSE_LEFT);
}

//////////////////////////////////////////////////////////////////////




/////////  dPad mapped to Computer Arrow Keys  ////////////

if(dPad == 2 )
{
Keyboard.press(KEY_UP_ARROW);
Keyboard.release(KEY_DOWN_ARROW);
Keyboard.release(KEY_RIGHT_ARROW);
Keyboard.release(KEY_LEFT_ARROW);
}


if(dPad == 8 )
{
Keyboard.press(KEY_DOWN_ARROW);
Keyboard.release(KEY_UP_ARROW);
Keyboard.release(KEY_RIGHT_ARROW);
Keyboard.release(KEY_LEFT_ARROW);
}



if(dPad == 6 )
{
Keyboard.press(KEY_RIGHT_ARROW);
Keyboard.release(KEY_UP_ARROW);
Keyboard.release(KEY_DOWN_ARROW);
Keyboard.release(KEY_LEFT_ARROW);
}


if(dPad == 4 )
{
Keyboard.press(KEY_LEFT_ARROW);
Keyboard.release(KEY_UP_ARROW);
Keyboard.release(KEY_DOWN_ARROW);
Keyboard.release(KEY_RIGHT_ARROW);
}


if(dPad == 3 )
{
Keyboard.press(KEY_UP_ARROW);
Keyboard.press(KEY_RIGHT_ARROW);
Keyboard.release(KEY_DOWN_ARROW);
Keyboard.release(KEY_LEFT_ARROW);
}


if(dPad == 9 )
{
Keyboard.press(KEY_DOWN_ARROW);
Keyboard.press(KEY_RIGHT_ARROW);
Keyboard.release(KEY_UP_ARROW);
Keyboard.release(KEY_LEFT_ARROW);
}


if(dPad == 7 )
{
Keyboard.press(KEY_DOWN_ARROW);
Keyboard.press(KEY_LEFT_ARROW);
Keyboard.release(KEY_UP_ARROW);
Keyboard.release(KEY_RIGHT_ARROW);

}


if(dPad == 1 )
{
Keyboard.press(KEY_UP_ARROW);
Keyboard.press(KEY_LEFT_ARROW);
Keyboard.release(KEY_DOWN_ARROW);
Keyboard.release(KEY_RIGHT_ARROW);
}


if(dPad == 5)
{
Keyboard.release(KEY_UP_ARROW);
Keyboard.release(KEY_DOWN_ARROW);
Keyboard.release(KEY_RIGHT_ARROW);
Keyboard.release(KEY_LEFT_ARROW);
}

//////////////////////////////////////////////////////////////////////
   
}




   

     //print the three numbers in one string as hexadecimal:
     Serial.print(mode, DEC);
     Serial.print(",");
     Serial.print(joyX, DEC);
     Serial.print(",");
     Serial.print(joyY, DEC);
     Serial.print(",");
     Serial.print(dPad, DEC);
     Serial.print(",");
     Serial.println(Buttonpadtag, DEC);

     Serial.flush(); 
     
    

    }
  }
}




///////////// Play Station Data Structure /////////////

dataForController_t SonygetControllerData(void)
{  
  // Set up a place for our controller data
  //  Use the getBlankDataForController() function, since
  //  just declaring a fresh dataForController_t tends
  //  to get you one filled with junk from other, random
  //  values that were in those memory locations before
  dataForController_t controllerData = getBlankDataForController();
  // Since our buttons are all held high and
  //  pulled low when pressed, we use the "!"
  //  operator to invert the readings from the pins
  
  
    if(Buttonpadtag == 1)
  {
  controllerData.crossOn = 1;
  Serial.println(" Cross");
  }

  else if(Buttonpadtag == 2)
  {
  controllerData.circleOn = 1;
  Serial.println(" Circle");
  }
  
  else if(Buttonpadtag == 3)
  {
  controllerData.squareOn = 1;
  Serial.println(" Square");
  }
  
  else if(Buttonpadtag == 4 )
  {
  controllerData.triangleOn = 1;
  Serial.println(" Triangle");
  }
  
  else if(Buttonpadtag == 7 )
  {
  controllerData.selectOn = 1;
  Serial.println(" Select");
  }
  
  else if(Buttonpadtag == 8 )
  {
  controllerData.startOn = 1;
  Serial.println(" Start");
  }
  

  
  


  // Set the analog sticks

  controllerData.leftStickX = joyX;
  controllerData.leftStickY = joyY;

  // And return the data!
  return controllerData;
}