+unsigned char stdpar[8] = { 0x41, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\r
+unsigned char multitappar[34] = { 0x80, 0x5a,
+ 0x41, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\r
+ 0x41, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\r
+ 0x41, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\r
+ 0x41, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\r
+ \r
+//response for request 44, 45, 46, 47, 4C, 4D\r
+static unsigned char resp45[8] = {0xF3, 0x5A, 0x01, 0x02, 0x00, 0x02, 0x01, 0x00};\r
+static unsigned char resp46_00[8] = {0xF3, 0x5A, 0x00, 0x00, 0x01, 0x02, 0x00, 0x0A};\r
+static unsigned char resp46_01[8] = {0xF3, 0x5A, 0x00, 0x00, 0x01, 0x01, 0x01, 0x14};\r
+static unsigned char resp47[8] = {0xF3, 0x5A, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00};\r
+static unsigned char resp4C_00[8] = {0xF3, 0x5A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00};\r
+static unsigned char resp4C_01[8] = {0xF3, 0x5A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00};\r
+static unsigned char resp4D[8] = {0xF3, 0x5A, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF};\r
+
+//fixed reponse of request number 41, 48, 49, 4A, 4B, 4E, 4F
+static unsigned char resp40[8] = {0xF3, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+static unsigned char resp41[8] = {0xF3, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\r
+static unsigned char resp44[8] = {0xF3, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+static unsigned char resp49[8] = {0xF3, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+static unsigned char resp4A[8] = {0xF3, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+static unsigned char resp4B[8] = {0xF3, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+static unsigned char resp4E[8] = {0xF3, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+static unsigned char resp4F[8] = {0xF3, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+// Resquest of psx core
+enum {
+ // REQUEST
+ // first call of this request for the pad, the pad is configured as an digital pad.
+ // 0x0X, 0x42, 0x0Y, 0xZZ, 0xAA, 0x00, 0x00, 0x00, 0x00
+ // X pad number (used for the multitap, first request response 0x00, 0x80, 0x5A, (8 bytes pad A), (8 bytes pad B), (8 bytes pad C), (8 bytes pad D)
+ // Y if 1 : psx request the full length response for the multitap, 3 bytes header and 4 block of 8 bytes per pad
+ // Y if 0 : psx request a pad key state
+ // ZZ rumble small motor 00-> OFF, 01 -> ON
+ // AA rumble large motor speed 0x00 -> 0xFF
+ // RESPONSE
+ // header 3 Bytes
+ // 0x00
+ // PadId -> 0x41 for digital pas, 0x73 for analog pad
+ // 0x5A mode has not change (no press on analog button on the center of pad), 0x00 the analog button have been pressed and the mode switch
+ // 6 Bytes for keystates
+ CMD_READ_DATA_AND_VIBRATE = 0x42,
+
+ // REQUEST
+ // Header
+ // 0x0N, 0x43, 0x00, XX, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ // XX = 00 -> Normal mode : Seconde bytes of response = padId
+ // XX = 01 -> Configuration mode : Seconde bytes of response = 0xF3
+ // RESPONSE
+ // enter in config mode example :
+ // req : 01 43 00 01 00 00 00 00 00 00
+ // res : 00 41 5A buttons state, analog states
+ // exit config mode :
+ // req : 01 43 00 00 00 00 00 00 00 00
+ // res : 00 F3 5A buttons state, analog states
+ CMD_CONFIG_MODE = 0x43,
+
+ // Set led State
+ // REQUEST
+ // 0x0N, 0x44, 0x00, VAL, SEL, 0x00, 0x00, 0x00, 0x00
+ // If sel = 2 then
+ // VAL = 00 -> OFF
+ // VAL = 01 -> ON
+ // RESPONSE
+ // 0x00, 0xF3, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ CMD_SET_MODE_AND_LOCK = 0x44,
+
+ // Get Analog Led state
+ // REQUEST
+ // 0x0N, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ // RESPONSE
+ // 0x00, 0xF3, 0x5A, 0x01, 0x02, VAL, 0x02, 0x01, 0x00
+ // VAL = 00 Led OFF
+ // VAL = 01 Led ON
+ CMD_QUERY_MODEL_AND_MODE = 0x45,
+
+ //Get Variable A
+ // REQUEST
+ // 0x0N, 0x46, 0x00, 0xXX, 0x00, 0x00, 0x00, 0x00, 0x00
+ // RESPONSE
+ // XX=00
+ // 0x00, 0xF3, 0x5A, 0x00, 0x00, 0x01, 0x02, 0x00, 0x0A
+ // XX=01
+ // 0x00, 0xF3, 0x5A, 0x00, 0x00, 0x01, 0x01, 0x01, 0x14
+ CMD_QUERY_ACT = 0x46,
+
+ // REQUEST
+ // 0x0N, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ // RESPONSE
+ // 0x00, 0xF3, 0x5A, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00
+ CMD_QUERY_COMB = 0x47,
+
+ // REQUEST
+ // 0x0N, 0x4C, 0x00, 0xXX, 0x00, 0x00, 0x00, 0x00, 0x00
+ // RESPONSE
+ // XX = 0
+ // 0x00, 0xF3, 0x5A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00
+ // XX = 1
+ // 0x00, 0xF3, 0x5A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00
+ CMD_QUERY_MODE = 0x4C,
+
+ // REQUEST
+ // 0x0N, 0x4D, 0x00, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF
+ // RESPONSE
+ // 0x00, 0xF3, 0x5A, old value or
+ // AA = 01 unlock large motor (and swap VAL1 and VAL2)
+ // BB = 01 unlock large motor (default)
+ // CC, DD, EE, FF = all FF -> unlock small motor
+ //
+ // default repsonse for analog pad with 2 motor : 0x00 0xF3 0x5A 0x00 0x01 0xFF 0xFF 0xFF 0xFF
+ //
+ CMD_VIBRATION_TOGGLE = 0x4D,
+ REQ40 = 0x40,
+ REQ41 = 0x41,
+ REQ49 = 0x49,
+ REQ4A = 0x4A,
+ REQ4B = 0x4B,
+ REQ4E = 0x4E,
+ REQ4F = 0x4F
+};
+
+void initBufForRequest(int padIndex, char value){
+ switch (value){\r
+ //Pad keystate already in buffer\r
+ //case CMD_READ_DATA_AND_VIBRATE :\r
+ // break;\r
+ case CMD_CONFIG_MODE :\r
+ if(pad[padIndex].configMode == TRUE){\r
+ buf[0] = 0xF3;
+ buf[1] = 0x53;\r
+ }\r
+ //else, not in config mode, pad keystate return (already in the buffer)\r
+ break;\r
+ case CMD_SET_MODE_AND_LOCK :\r
+ memcpy(buf, resp44, 8);\r
+ break;\r
+ case CMD_QUERY_MODEL_AND_MODE :\r
+ memcpy(buf, resp45, 8);\r
+ break;\r
+ case CMD_QUERY_ACT :\r
+ memcpy(buf, resp46_00, 8);\r
+ break;\r
+ case CMD_QUERY_COMB :\r
+ memcpy(buf, resp47, 8);\r
+ break;\r
+ case CMD_QUERY_MODE :\r
+ memcpy(buf, resp4C_00, 8);\r
+ break;\r
+ case CMD_VIBRATION_TOGGLE :\r
+ memcpy(buf, resp4D, 8);\r
+ break;\r
+ case REQ40 :\r
+ memcpy(buf, resp40, 8);\r
+ break;\r
+ case REQ41 :\r
+ memcpy(buf, resp41, 8);\r
+ break;\r
+ case REQ49 :\r
+ memcpy(buf, resp49, 8);\r
+ break;\r
+ case REQ4A :\r
+ memcpy(buf, resp4A, 8);\r
+ break;\r
+ case REQ4B :\r
+ memcpy(buf, resp4B, 8);\r
+ break;\r
+ case REQ4E :\r
+ memcpy(buf, resp4E, 8);\r
+ break;\r
+ case REQ4F :\r
+ memcpy(buf, resp4F, 8);\r
+ break;\r
+ }
+}\r
+\r
+void reqIndex2Treatment(int padIndex, char value){\r
+ switch (value){\r
+ case CMD_CONFIG_MODE :\r
+ //0x43\r
+ if(value == 0){\r
+ pad[padIndex].configMode = FALSE;\r
+ }else{\r
+ pad->configMode = TRUE;\r
+ }\r
+ break;\r
+ case CMD_SET_MODE_AND_LOCK :\r
+ //0x44 store the led state for change mode if the next value = 0x02\r
+ //0x01 analog ON\r
+ //0x00 analog OFF\r
+ ledStateReq44 = value;\r
+ break;\r
+ case CMD_QUERY_ACT :\r
+ //0x46\r
+ if(value==1){\r
+ memcpy(buf, resp46_01, 8);\r
+ }\r
+ break;\r
+ \r
+ case CMD_QUERY_MODE :\r
+ if(value==1){\r
+ memcpy(buf, resp4C_01, 8);\r
+ }\r
+ break;\r
+ case CMD_VIBRATION_TOGGLE :\r
+ //0x4D\r
+ memcpy(buf, resp4D, 8);\r
+ break;\r
+ case CMD_READ_DATA_AND_VIBRATE:\r
+ //mem the vibration value for small motor;\r
+ pad[padIndex].Vib[0] = value;
+ }\r
+}\r
+
+void vibrate(int padIndex){
+ if(pad[padIndex].Vib[0] != pad[padIndex].VibF[0] || pad[padIndex].Vib[1] != pad[padIndex].VibF[1]){
+ //value is different update Value and call libretro for vibration
+ pad[padIndex].VibF[0] = pad[padIndex].Vib[0];
+ pad[padIndex].VibF[1] = pad[padIndex].Vib[1];
+ plat_trigger_vibrate(padIndex, pad[padIndex].VibF[0], pad[padIndex].VibF[1]);
+ printf("new value for vibration pad %i", padIndex);
+ }
+}\r
+
+\r
+\r
+//Build response for 0x42 request Multitap in port\r
+void _PADstartPollMultitap(PadDataS padd[4]) {\r