//Pad information, keystate, mode, config mode, vibration\r
static PadDataS pad[8];
-static int reqPos, respSize, req, ledStateReq44;\r
+static int reqPos, respSize, req;
+static int ledStateReq44[8];
\r
-static unsigned char buf[256];\r
+static unsigned char buf[256];
+static unsigned char bufMulti[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
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
//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 resp41[8] = {0xF3, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+static unsigned char resp43[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};
REQ4F = 0x4F
};
+
+
+
+//NO MULTITAP
+
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
+ if(pad[padIndex].configMode == 1){\r
+ memcpy(buf, resp43, 8);\r
+ break;\r
}\r
//else, not in config mode, pad keystate return (already in the buffer)\r
break;\r
memcpy(buf, resp4F, 8);\r
break;\r
}
-}\r
+}
+
+
+\r
\r
void reqIndex2Treatment(int padIndex, char value){\r
- switch (value){\r
+ switch (req){\r
case CMD_CONFIG_MODE :\r
//0x43\r
if(value == 0){\r
- pad[padIndex].configMode = FALSE;\r
+ pad[padIndex].configMode = 0;\r
}else{\r
- pad->configMode = TRUE;\r
+ pad[padIndex].configMode = 1;\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
+ ledStateReq44[padIndex] = value;\r
break;\r
case CMD_QUERY_ACT :\r
//0x46\r
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);
+ //printf("vibration pad %i", padIndex);
}
-}\r
-
-\r
-\r
-//Build response for 0x42 request Multitap in port\r
-void _PADstartPollMultitap(PadDataS padd[4]) {\r
- int i = 0;\r
- int offset = 2;\r
- PadDataS pad;\r
- for(i = 0; i < 4; i++) {\r
- offset = 2 + (i * 8);\r
- pad = padd[i];\r
- switch (pad.controllerType) {\r
- case PSE_PAD_TYPE_MOUSE:\r
- multitappar[offset] = 0x12;\r
- multitappar[offset + 1] = 0x5a;\r
- multitappar[offset + 2] = pad.buttonStatus & 0xff;\r
- multitappar[offset + 3] = pad.buttonStatus >> 8;\r
- multitappar[offset + 4] = pad.moveX;\r
- multitappar[offset + 5] = pad.moveY;\r
-\r
- break;\r
- case PSE_PAD_TYPE_NEGCON: // npc101/npc104(slph00001/slph00069)\r
- multitappar[offset] = 0x23;\r
- multitappar[offset + 1] = 0x5a;\r
- multitappar[offset + 2] = pad.buttonStatus & 0xff;\r
- multitappar[offset + 3] = pad.buttonStatus >> 8;\r
- multitappar[offset + 4] = pad.rightJoyX;\r
- multitappar[offset + 5] = pad.rightJoyY;\r
- multitappar[offset + 6] = pad.leftJoyX;\r
- multitappar[offset + 7] = pad.leftJoyY;\r
-\r
- break;\r
- case PSE_PAD_TYPE_ANALOGPAD: // scph1150\r
- multitappar[offset] = 0x73;\r
- multitappar[offset + 1] = 0x5a;\r
- multitappar[offset + 2] = pad.buttonStatus & 0xff;\r
- multitappar[offset + 3] = pad.buttonStatus >> 8;\r
- multitappar[offset + 4] = pad.rightJoyX;\r
- multitappar[offset + 5] = pad.rightJoyY;\r
- multitappar[offset + 6] = pad.leftJoyX;\r
- multitappar[offset + 7] = pad.leftJoyY;\r
-\r
- break;\r
- case PSE_PAD_TYPE_ANALOGJOY: // scph1110\r
- multitappar[offset] = 0x53;\r
- multitappar[offset + 1] = 0x5a;\r
- multitappar[offset + 2] = pad.buttonStatus & 0xff;\r
- multitappar[offset + 3] = pad.buttonStatus >> 8;\r
- multitappar[offset + 4] = pad.rightJoyX;\r
- multitappar[offset + 5] = pad.rightJoyY;\r
- multitappar[offset + 6] = pad.leftJoyX;\r
- multitappar[offset + 7] = pad.leftJoyY;\r
-\r
- break;\r
- case PSE_PAD_TYPE_STANDARD:\r
- default:\r
- multitappar[offset] = 0x41;\r
- multitappar[offset + 1] = 0x5a;\r
- multitappar[offset + 2] = pad.buttonStatus & 0xff;\r
- multitappar[offset + 3] = pad.buttonStatus >> 8;\r
- }\r
- }\r
- memcpy(buf, multitappar, 34);\r
- respSize = 34;\r
-}\r
+}
+
+
+
//Build response for 0x42 request Pad in port\r
void _PADstartPoll(PadDataS *pad) {\r
respSize = 8;\r
break;\r
case PSE_PAD_TYPE_STANDARD:\r
- default:\r
+ default:
+ stdpar[0] = 0x41;\r
stdpar[2] = pad->buttonStatus & 0xff;\r
- stdpar[3] = pad->buttonStatus >> 8;\r
- memcpy(buf, stdpar, 4);\r
+ stdpar[3] = pad->buttonStatus >> 8;
+ //avoid analog value in multitap mode if change pad type in game.
+ stdpar[4] = 0xff;
+ stdpar[5] = 0xff;
+ stdpar[6] = 0xff;
+ stdpar[7] = 0xff;\r
+ memcpy(buf, stdpar, 8);\r
respSize = 8;\r
}\r
}\r
\r
+
+//Build response for 0x42 request Multitap in port
+//Response header for multitap : 0x80, 0x5A, (Pad information port 1-2A), (Pad information port 1-2B), (Pad information port 1-2C), (Pad information port 1-2D)\r
+void _PADstartPollMultitap(PadDataS padd[4]) {\r
+ int i = 0;\r
+ int offset = 2;\r
+ PadDataS pad;\r
+ for(i = 0; i < 4; i++) {\r
+ offset = 2 + (i * 8);\r
+ pad = padd[i];\r
+ _PADstartPoll(&pad);
+ memcpy(multitappar+offset, stdpar, 8);\r
+ }\r
+ memcpy(bufMulti, multitappar, 34);\r
+ respSize = 34;\r
+}
\r
\r
-unsigned char _PADpoll(int padIndex, unsigned char value) {
- \r
- //If no multitap on the port, we made the full implementation of dualshock protocol\r
- if(multitap1 == 0){
- if(reqPos==0){
- //mem the request number
- req = value;\r
- //copy the default value of request response in buffer instead of the keystate\r
- initBufForRequest(padIndex,value);
- }\r
- \r
- //if no new request the pad return 0xff, for signaling connected\r
- if ( reqPos >= respSize) return 0xff;\r
- \r
- switch(reqPos){\r
- case 2:\r
- reqIndex2Treatment(padIndex, value);\r
- break;\r
- case 3:\r
- switch(req) {\r
- case CMD_SET_MODE_AND_LOCK :\r
- //change mode on pad\r
- break;\r
- case CMD_READ_DATA_AND_VIBRATE:\r
- //mem the vibration value for Large motor;\r
- pad[padIndex].Vib[1] = value;\r
- //vibration
- vibrate(padIndex);\r
- break;\r
- \r
- break;\r
- }\r
+unsigned char _PADpoll(int port, unsigned char value) {
+ if(reqPos==0){
+ //mem the request number
+ req = value;\r
+ //copy the default value of request response in buffer instead of the keystate\r
+ initBufForRequest(port,value);
+ }\r
+ \r
+ //if no new request the pad return 0xff, for signaling connected\r
+ if ( reqPos >= respSize) return 0xff;\r
+ \r
+ switch(reqPos){\r
+ case 2:\r
+ reqIndex2Treatment(port, value);\r
+ break;\r
+ case 3:\r
+ switch(req) {\r
+ case CMD_SET_MODE_AND_LOCK :\r
+ //change mode on pad\r
+ break;\r
+ case CMD_READ_DATA_AND_VIBRATE:\r
+ //mem the vibration value for Large motor;\r
+ pad[port].Vib[1] = value;\r
+ //vibration
+ vibrate(port);\r
+ break;\r
+ \r
+ break;\r
}\r
}\r
return buf[reqPos++];\r
-}\r
+}
+
+
+unsigned char _PADpollMultitap(int port, unsigned char value) {
+ if ( reqPos >= respSize) return 0xff;\r
+ return bufMulti[reqPos++];\r
+}
+\r
\r
// refresh the button state on port 1.\r
// int pad is not needed.\r
}
_PADstartPollMultitap(padd);\r
}
- printf("\n");
+ //printf("\npad 1 : ");
return 0x00;\r
}\r
\r
unsigned char CALLBACK PAD1__poll(unsigned char value) {
- char tmp = _PADpoll(0, value);
- printf("%2x:%2x , ",value,tmp);\r
+ char tmp;
+ if(multitap1 == 1){
+ tmp = _PADpollMultitap(0, value);
+ }else{
+ tmp = _PADpoll(0, value);
+ }
+ //printf("%2x:%2x, ",value,tmp);\r
return tmp;\r
\r
}\r
unsigned char CALLBACK PAD2__startPoll(int pad) {
reqPos = 0;\r
int pad_index = 0;
- if(multitap1 == 1){
- pad_index+=4;
- }else{
- pad_index=1;
+ if(multitap1 == 0 && multitap2 == 0){
+ pad_index += 1;
+ }else if(multitap1 == 1 && multitap2 == 0){
+ pad_index += 4;
+ }else if(multitap1 == 0 && multitap2 == 2){
+ pad_index += 1;
+ }else if(multitap1 == 1 && multitap2 == 2){
+ pad_index += 4;
}
+
//first call the pad provide if a multitap is connected between the psx and himself
if(multitap2 == -1){
PadDataS padd;
}
_PADstartPollMultitap(padd);\r
}
+ //printf("\npad 2 : ");
return 0x00;\r
}\r
\r
unsigned char CALLBACK PAD2__poll(unsigned char value) {\r
- return _PADpoll(1,value);\r
+ char tmp;
+ if(multitap2 == 2){
+ tmp = _PADpollMultitap(1, value);
+ }else{
+ tmp = _PADpoll(1, value);
+ }
+ //printf("%2x:%2x, ",value,tmp);\r
+ return tmp;\r
}\r
\r
long CALLBACK PAD2__configure(void) { return 0; }\r