struct ps2_data {
	// analog
	byte LX, LY, RX, RY;
	// trigger
	bool L1, R1, L2, R2, L3, R3;
	// dpad
	bool Up, Down, Left, Right;
	// function
	bool Triangle, Cross, Square, Circle;
	// start/select
	bool Start, Select;
} ps2;


void parse(String incoming_data) {
	// analog
	ps2.LX = (incoming_data.substring(1, 4)).toInt();
	ps2.LY = (incoming_data.substring(4, 7)).toInt();
	ps2.RX = (incoming_data.substring(7, 10)).toInt();
	ps2.RY = (incoming_data.substring(10, 13)).toInt();

	// button
	// shoulder button
	ps2.L1 = incoming_data[13] - '0';
	ps2.R1 = incoming_data[14] - '0';
	ps2.L2 = incoming_data[15] - '0';
	ps2.R2 = incoming_data[16] - '0';
	ps2.L3 = incoming_data[17] - '0';
	ps2.R3 = incoming_data[18] - '0';

	// dpad 
	ps2.Up = incoming_data[19] - '0';
	ps2.Down = incoming_data[20] - '0';
	ps2.Left = incoming_data[21] - '0';
	ps2.Right = incoming_data[22] - '0';
	// start/sel
	ps2.Start = incoming_data[23] - '0';
	ps2.Select = incoming_data[24] - '0';
	// // function button
	ps2.Triangle = incoming_data[25] - '0';
	ps2.Cross = incoming_data[26] - '0';
	ps2.Square = incoming_data[27] - '0';
	ps2.Circle = incoming_data[28] - '0';
}

void printStruct(ps2_data ps2) {
	Serial.print("Left Analog (X, Y): "); 
	Serial.print(ps2.LX); Serial.print("; "); Serial.println(ps2.LY);
	Serial.print("Right Analog (X, Y): "); 
	Serial.print(ps2.RX); Serial.print("; "); Serial.println(ps2.RY);

	if (ps2.Up) Serial.println("Up pressed");
	if (ps2.Down) Serial.println("Down pressed");
	if (ps2.Left) Serial.println("Left pressed");
	if (ps2.Right) Serial.println("Right pressed");

	if (ps2.L1) Serial.println("L1 pressed");
	if (ps2.R1) Serial.println("R1 pressed");
	if (ps2.L2) Serial.println("L2 pressed");
	if (ps2.R2) Serial.println("R2 pressed");
	if (ps2.L3) Serial.println("L3 pressed");
	if (ps2.R3) Serial.println("R3 pressed");

	if (ps2.Triangle) Serial.println("Triangle pressed");
	if (ps2.Cross) Serial.println("Cross pressed");
	if (ps2.Square) Serial.println("Square pressed");
	if (ps2.Circle) Serial.println("Circle pressed");

	if (ps2.Start) Serial.println("Start pressed");
	if (ps2.Select) Serial.println("Select pressed");
}

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

void loop() {
  // put your main code here, to run repeatedly:
	if (Serial.available() > 0) {
		uint64_t t1 = millis();
		Serial.print("Start decoding - "); Serial.println(t1);
		String serial_in = Serial.readStringUntil('\n');
		serial_in.trim();
		Serial.println(serial_in[2]);
		if (serial_in[0] == 70) { // verify packet
			parse(serial_in);
			// Serial.println(serial_in);
			// delay(100);
		}
		Serial.print("Finished decoding - took "); Serial.println((millis() - t1));
		printStruct(ps2);
	}
  delay(10); // this speeds up the simulation
}