#include <Arduino.h>

struct SerialData {
  // analog data
  int LStickX, LStickY;
  int RStickX, RStickY;
  // digital data
  int L1, R1, L2, R2;
  int Up, Down, Left, Right;
  int Square, Cross, Triangle, Circle;
};

SerialData parseSerialData(String serial) {
  // create new object to store data
  SerialData parsedData;
  // parsing analog data
  parsedData.LStickX = (serial.substring(0, 3)).toInt();
  parsedData.LStickY = (serial.substring(3, 6)).toInt();
  parsedData.RStickX = (serial.substring(6, 9)).toInt();
  parsedData.RStickY = (serial.substring(9, 12)).toInt();
  // parsing digital data
  // triggers
  parsedData.L1 = (serial.substring(12, 13)).toInt();
  parsedData.L2 = (serial.substring(13, 14)).toInt();
  parsedData.R1 = (serial.substring(14, 15)).toInt();
  parsedData.R2 = (serial.substring(15, 16)).toInt();
  // dpad
  parsedData.Up = (serial.substring(16, 17)).toInt();
  parsedData.Down = (serial.substring(17, 18)).toInt();
  parsedData.Left = (serial.substring(18, 19)).toInt();
  parsedData.Right = (serial.substring(19, 20)).toInt();
  // functions
  parsedData.Square = (serial.substring(20, 21)).toInt();
  parsedData.Cross = (serial.substring(21, 22)).toInt();
  parsedData.Triangle = (serial.substring(22, 23)).toInt();
  parsedData.Circle = (serial.substring(23, 24)).toInt();
  
  return parsedData;
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("Hello, ESP32!");
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available() > 0) {
    String inp = Serial.readString(); inp.trim();
    SerialData ps2 = parseSerialData(inp);
    Serial.printf(
      "Analog: %d - %d - %d - %d / Triggers: %d - %d - %d - %d / Dpad: %d - %d - %d - %d / Function: %d - %d - %d- %d",
      ps2.LStickX, ps2.LStickY, ps2.RStickX, ps2.RStickY, ps2.L1, ps2.L2, ps2.R1, ps2.R2, ps2.Up, ps2.Down, ps2.Left, ps2.Right, ps2.Square, ps2.Cross, ps2.Triangle, ps2.Circle
    );
    Serial.println();
  }
  delay(10); // this speeds up the simulation
}