| 1 | 
 //--------------------------------------------------------------------------- | 
 
 
 
 
 
 | 2 | 
 // File name:   pad.c | 
 
 
 
 
 
 | 3 | 
 //--------------------------------------------------------------------------- | 
 
 
 
 
 
 | 4 | 
 #include "launchelf.h" | 
 
 
 
 
 
 | 5 | 
  | 
 
 
 
 
 
 | 6 | 
 static char padBuf_t[2][256] __attribute__((aligned(64))); | 
 
 
 
 
 
 | 7 | 
 struct padButtonStatus buttons_t[2]; | 
 
 
 
 
 
 | 8 | 
 u32 padtype_t[2]; | 
 
 
 
 
 
 | 9 | 
 u32 paddata, paddata_t[2]; | 
 
 
 
 
 
 | 10 | 
 u32 old_pad = 0, old_pad_t[2] = {0, 0}; | 
 
 
 
 
 
 | 11 | 
 u32 new_pad, new_pad_t[2]; | 
 
 
 
 
 
 | 12 | 
 u32 joy_value = 0; | 
 
 
 
 
 
 | 13 | 
 static int test_joy = 0; | 
 
 
 
 
 
 | 14 | 
  | 
 
 
 
 
 
 | 15 | 
 //--------------------------------------------------------------------------- | 
 
 
 
 
 
 | 16 | 
 // read PAD, without KB, and allow no auto-repeat. This is needed in code | 
 
 
 
 
 
 | 17 | 
 // that is used regardless of VSync cycles, and where KB is not wanted. | 
 
 
 
 
 
 | 18 | 
 //--------------------------------------------------------------------------- | 
 
 
 
 
 
 | 19 | 
 int readpad_noKBnoRepeat(void) | 
 
 
 
 
 
 | 20 | 
 { | 
 
 
 
 
 
 | 21 | 
         int port, state, ret[2]; | 
 
 
 
 
 
 | 22 | 
  | 
 
 
 
 
 
 | 23 | 
         for(port=0; port<2; port++){ | 
 
 
 
 
 
 | 24 | 
                 if((state=padGetState(port, 0))==PAD_STATE_STABLE | 
 
 
 
 
 
 | 25 | 
                         ||(state == PAD_STATE_FINDCTP1)){ | 
 
 
 
 
 
 | 26 | 
                         //Deal with cases where pad state is valid for padRead | 
 
 
 
 
 
 | 27 | 
                         ret[port] = padRead(port, 0, &buttons_t[port]); | 
 
 
 
 
 
 | 28 | 
                         if (ret[port] != 0){ | 
 
 
 
 
 
 | 29 | 
                                 paddata_t[port] = 0xffff ^ buttons_t[port].btns; | 
 
 
 
 
 
 | 30 | 
                                 new_pad_t[port] = paddata_t[port] & ~old_pad_t[port]; | 
 
 
 
 
 
 | 31 | 
                                 old_pad_t[port] = paddata_t[port]; | 
 
 
 
 
 
 | 32 | 
                         } | 
 
 
 
 
 
 | 33 | 
                 }else{ | 
 
 
 
 
 
 | 34 | 
                         //Deal with cases where pad state is not valid for padRead | 
 
 
 
 
 
 | 35 | 
                         new_pad_t[port]=0; | 
 
 
 
 
 
 | 36 | 
                 }  //ends 'if' testing for state valid for padRead | 
 
 
 
 
 
 | 37 | 
         }  //ends for | 
 
 
 
 
 
 | 38 | 
         new_pad = new_pad_t[0]|new_pad_t[1]; //This has only new button bits | 
 
 
 
 
 
 | 39 | 
         paddata = paddata_t[0]|paddata_t[1]; //This has all pressed button bits | 
 
 
 
 
 
 | 40 | 
         return (ret[0]|ret[1]); | 
 
 
 
 
 
 | 41 | 
 } | 
 
 
 
 
 
 | 42 | 
 //------------------------------ | 
 
 
 
 
 
 | 43 | 
 //endfunc readpad_noKBnoRepeat | 
 
 
 
 
 
 | 44 | 
 //--------------------------------------------------------------------------- | 
 
 
 
 
 
 | 45 | 
 // read PAD, but ignore KB. This is needed in code with own KB handlers, | 
 
 
 
 
 
 | 46 | 
 // such as the virtual keyboard input routines for 'Rename' and 'New Dir' | 
 
 
 
 
 
 | 47 | 
 //--------------------------------------------------------------------------- | 
 
 
 
 
 
 | 48 | 
 int readpad_no_KB(void) | 
 
 
 
 
 
 | 49 | 
 { | 
 
 
 
 
 
 | 50 | 
         static u64 rpt_time[2]={0,0}; | 
 
 
 
 
 
 | 51 | 
         static int rpt_count[2]; | 
 
 
 
 
 
 | 52 | 
         int port, state, ret[2]; | 
 
 
 
 
 
 | 53 | 
  | 
 
 
 
 
 
 | 54 | 
         for(port=0; port<2; port++){ | 
 
 
 
 
 
 | 55 | 
                 if((state=padGetState(port, 0))==PAD_STATE_STABLE | 
 
 
 
 
 
 | 56 | 
                         ||(state == PAD_STATE_FINDCTP1)){ | 
 
 
 
 
 
 | 57 | 
                         //Deal with cases where pad state is valid for padRead | 
 
 
 
 
 
 | 58 | 
                         ret[port] = padRead(port, 0, &buttons_t[port]); | 
 
 
 
 
 
 | 59 | 
                         if (ret[port] != 0){ | 
 
 
 
 
 
 | 60 | 
                                 paddata_t[port] = 0xffff ^ buttons_t[port].btns; | 
 
 
 
 
 
 | 61 | 
                                 if((padtype_t[port] == 2) && (1 & (test_joy++))){//DualShock && time for joy scan | 
 
 
 
 
 
 | 62 | 
                                         joy_value=0; | 
 
 
 
 
 
 | 63 | 
                                         if(buttons_t[port].rjoy_h >= 0xbf){ | 
 
 
 
 
 
 | 64 | 
                                                 paddata_t[port]=PAD_R3_H1; | 
 
 
 
 
 
 | 65 | 
                                                 joy_value=buttons_t[port].rjoy_h-0xbf; | 
 
 
 
 
 
 | 66 | 
                                         }else if(buttons_t[port].rjoy_h <= 0x40){ | 
 
 
 
 
 
 | 67 | 
                                                 paddata_t[port]=PAD_R3_H0; | 
 
 
 
 
 
 | 68 | 
                                                 joy_value=-(buttons_t[port].rjoy_h-0x40); | 
 
 
 
 
 
 | 69 | 
                                         }else if(buttons_t[port].rjoy_v <= 0x40){ | 
 
 
 
 
 
 | 70 | 
                                                 paddata_t[port]=PAD_R3_V0; | 
 
 
 
 
 
 | 71 | 
                                                 joy_value=-(buttons_t[port].rjoy_v-0x40); | 
 
 
 
 
 
 | 72 | 
                                         }else if(buttons_t[port].rjoy_v >= 0xbf){ | 
 
 
 
 
 
 | 73 | 
                                                 paddata_t[port]=PAD_R3_V1; | 
 
 
 
 
 
 | 74 | 
                                                 joy_value=buttons_t[port].rjoy_v-0xbf; | 
 
 
 
 
 
 | 75 | 
                                         }else if(buttons_t[port].ljoy_h >= 0xbf){ | 
 
 
 
 
 
 | 76 | 
                                                 paddata_t[port]=PAD_L3_H1; | 
 
 
 
 
 
 | 77 | 
                                                 joy_value=buttons_t[port].ljoy_h-0xbf; | 
 
 
 
 
 
 | 78 | 
                                         }else if(buttons_t[port].ljoy_h <= 0x40){ | 
 
 
 
 
 
 | 79 | 
                                                 paddata_t[port]=PAD_L3_H0; | 
 
 
 
 
 
 | 80 | 
                                                 joy_value=-(buttons_t[port].ljoy_h-0x40); | 
 
 
 
 
 
 | 81 | 
                                         }else if(buttons_t[port].ljoy_v <= 0x40){ | 
 
 
 
 
 
 | 82 | 
                                                 paddata_t[port]=PAD_L3_V0; | 
 
 
 
 
 
 | 83 | 
                                                 joy_value=-(buttons_t[port].ljoy_v-0x40); | 
 
 
 
 
 
 | 84 | 
                                         }else if(buttons_t[port].ljoy_v >= 0xbf){ | 
 
 
 
 
 
 | 85 | 
                                                 paddata_t[port]=PAD_L3_V1; | 
 
 
 
 
 
 | 86 | 
                                                 joy_value=buttons_t[port].ljoy_v-0xbf; | 
 
 
 
 
 
 | 87 | 
                                         } | 
 
 
 
 
 
 | 88 | 
                                 } | 
 
 
 
 
 
 | 89 | 
                                 new_pad_t[port] = paddata_t[port] & ~old_pad_t[port]; | 
 
 
 
 
 
 | 90 | 
                                 if(old_pad_t[port] == paddata_t[port]){ | 
 
 
 
 
 
 | 91 | 
                                         //no change of pad data | 
 
 
 
 
 
 | 92 | 
                                         if(Timer() > rpt_time[port]){ | 
 
 
 
 
 
 | 93 | 
                                                 new_pad_t[port]=paddata_t[port]; //Accept repeated buttons as new | 
 
 
 
 
 
 | 94 | 
                                                 rpt_time[port] = Timer() + 40; //Min delay = 40ms => 25Hz repeat | 
 
 
 
 
 
 | 95 | 
                                                 if(rpt_count[port]++ < 20) | 
 
 
 
 
 
 | 96 | 
                                                         rpt_time[port] += 43; //Early delays = 83ms => 12Hz repeat | 
 
 
 
 
 
 | 97 | 
                                         } | 
 
 
 
 
 
 | 98 | 
                                 }else{ | 
 
 
 
 
 
 | 99 | 
                                         //pad data has changed ! | 
 
 
 
 
 
 | 100 | 
                                         rpt_count[port] = 0; | 
 
 
 
 
 
 | 101 | 
                                         rpt_time[port] = Timer()+400; //Init delay = 400ms | 
 
 
 
 
 
 | 102 | 
                                         old_pad_t[port] = paddata_t[port]; | 
 
 
 
 
 
 | 103 | 
                                 } | 
 
 
 
 
 
 | 104 | 
                         } | 
 
 
 
 
 
 | 105 | 
                 }else{ | 
 
 
 
 
 
 | 106 | 
                         //Deal with cases where pad state is not valid for padRead | 
 
 
 
 
 
 | 107 | 
                         //NB: This should NOT clear KB repeat test variables | 
 
 
 
 
 
 | 108 | 
                         new_pad_t[port]=0; | 
 
 
 
 
 
 | 109 | 
                         //old_pad_t[port]=0; //Clearing this could cause hasty repeats | 
 
 
 
 
 
 | 110 | 
                 }  //ends 'if' testing for state valid for padRead | 
 
 
 
 
 
 | 111 | 
         }  //ends for | 
 
 
 
 
 
 | 112 | 
         new_pad = new_pad_t[0]|new_pad_t[1]; | 
 
 
 
 
 
 | 113 | 
         paddata = paddata_t[0]|paddata_t[1]; //This has all pressed button bits | 
 
 
 
 
 
 | 114 | 
         return (ret[0]|ret[1]); | 
 
 
 
 
 
 | 115 | 
 } | 
 
 
 
 
 
 | 116 | 
 //------------------------------ | 
 
 
 
 
 
 | 117 | 
 //endfunc readpad_no_KB | 
 
 
 
 
 
 | 118 | 
 //--------------------------------------------------------------------------- | 
 
 
 
 
 
 | 119 | 
 // simPadKB attempts reading data from a USB keyboard, and map this as a | 
 
 
 
 
 
 | 120 | 
 // virtual gamepad. (Very improvised and sloppy, but it should work fine.) | 
 
 
 
 
 
 | 121 | 
 //--------------------------------------------------------------------------- | 
 
 
 
 
 
 | 122 | 
 int simPadKB(void) | 
 
 
 
 
 
 | 123 | 
 { | 
 
 
 
 
 
 | 124 | 
         int     ret, command; | 
 
 
 
 
 
 | 125 | 
         unsigned char KeyPress; | 
 
 
 
 
 
 | 126 | 
  | 
 
 
 
 
 
 | 127 | 
         if((!setting->usbkbd_used)||(!PS2KbdRead(&KeyPress))) | 
 
 
 
 
 
 | 128 | 
                 return 0; | 
 
 
 
 
 
 | 129 | 
         if(KeyPress != PS2KBD_ESCAPE_KEY) | 
 
 
 
 
 
 | 130 | 
                 command = KeyPress; | 
 
 
 
 
 
 | 131 | 
         else { | 
 
 
 
 
 
 | 132 | 
                 PS2KbdRead(&KeyPress); | 
 
 
 
 
 
 | 133 | 
                 command = 0x100+KeyPress; | 
 
 
 
 
 
 | 134 | 
         } | 
 
 
 
 
 
 | 135 | 
         ret = 1;  //Assume that the entered key is a valid command | 
 
 
 
 
 
 | 136 | 
         switch(command) { | 
 
 
 
 
 
 | 137 | 
                 case 0x11B:                 //Escape == Triangle | 
 
 
 
 
 
 | 138 | 
                         new_pad = PAD_TRIANGLE; | 
 
 
 
 
 
 | 139 | 
                         break; | 
 
 
 
 
 
 | 140 | 
                 case 0x00A:                 //Enter == OK | 
 
 
 
 
 
 | 141 | 
                   if(!swapKeys) | 
 
 
 
 
 
 | 142 | 
                         new_pad = PAD_CIRCLE; | 
 
 
 
 
 
 | 143 | 
                   else | 
 
 
 
 
 
 | 144 | 
                         new_pad = PAD_CROSS; | 
 
 
 
 
 
 | 145 | 
                   break; | 
 
 
 
 
 
 | 146 | 
                 case 0x020:                 //Space == Cancel/Mark | 
 
 
 
 
 
 | 147 | 
                   if(!swapKeys) | 
 
 
 
 
 
 | 148 | 
                         new_pad = PAD_CROSS; | 
 
 
 
 
 
 | 149 | 
                   else | 
 
 
 
 
 
 | 150 | 
                         new_pad = PAD_CIRCLE; | 
 
 
 
 
 
 | 151 | 
                   break; | 
 
 
 
 
 
 | 152 | 
                 case 0x031:                 //'1' == L1 | 
 
 
 
 
 
 | 153 | 
                         new_pad = PAD_L1; | 
 
 
 
 
 
 | 154 | 
                         break; | 
 
 
 
 
 
 | 155 | 
                 case 0x032:                 //'2' == L2 | 
 
 
 
 
 
 | 156 | 
                         new_pad = PAD_L2; | 
 
 
 
 
 
 | 157 | 
                         break; | 
 
 
 
 
 
 | 158 | 
                 case 0x033:                 //'3' == L3 | 
 
 
 
 
 
 | 159 | 
                         new_pad = PAD_L3; | 
 
 
 
 
 
 | 160 | 
                         break; | 
 
 
 
 
 
 | 161 | 
                 case 0x077:                 //'w' == Up | 
 
 
 
 
 
 | 162 | 
                         new_pad = PAD_UP; | 
 
 
 
 
 
 | 163 | 
                         break; | 
 
 
 
 
 
 | 164 | 
                 case 0x061:                 //'a' == Left | 
 
 
 
 
 
 | 165 | 
                         new_pad = PAD_LEFT; | 
 
 
 
 
 
 | 166 | 
                         break; | 
 
 
 
 
 
 | 167 | 
                 case 0x073:                 //'s' == Right | 
 
 
 
 
 
 | 168 | 
                         new_pad = PAD_RIGHT; | 
 
 
 
 
 
 | 169 | 
                         break; | 
 
 
 
 
 
 | 170 | 
                 case 0x07A:                 //'z' == Down | 
 
 
 
 
 
 | 171 | 
                         new_pad = PAD_DOWN; | 
 
 
 
 
 
 | 172 | 
                         break; | 
 
 
 
 
 
 | 173 | 
                 case 0x030:                 //'0' == R1 | 
 
 
 
 
 
 | 174 | 
                         new_pad = PAD_R1; | 
 
 
 
 
 
 | 175 | 
                         break; | 
 
 
 
 
 
 | 176 | 
                 case 0x039:                 //'9' == R2 | 
 
 
 
 
 
 | 177 | 
                         new_pad = PAD_R2; | 
 
 
 
 
 
 | 178 | 
                         break; | 
 
 
 
 
 
 | 179 | 
                 case 0x038:                 //'8' == R3 | 
 
 
 
 
 
 | 180 | 
                         new_pad = PAD_R3; | 
 
 
 
 
 
 | 181 | 
                         break; | 
 
 
 
 
 
 | 182 | 
                 case 0x069:                 //'i' == Triangle | 
 
 
 
 
 
 | 183 | 
                         new_pad = PAD_TRIANGLE; | 
 
 
 
 
 
 | 184 | 
                         break; | 
 
 
 
 
 
 | 185 | 
                 case 0x06A:                 //'j' == Square | 
 
 
 
 
 
 | 186 | 
                         new_pad = PAD_SQUARE; | 
 
 
 
 
 
 | 187 | 
                         break; | 
 
 
 
 
 
 | 188 | 
                 case 0x06B:                 //'k' == Circle | 
 
 
 
 
 
 | 189 | 
                         new_pad = PAD_CIRCLE; | 
 
 
 
 
 
 | 190 | 
                         break; | 
 
 
 
 
 
 | 191 | 
                 case 0x06D:                 //'m' == Cross | 
 
 
 
 
 
 | 192 | 
                         new_pad = PAD_CROSS; | 
 
 
 
 
 
 | 193 | 
                         break; | 
 
 
 
 
 
 | 194 | 
                 case 0x101:                 //F1 == L1 | 
 
 
 
 
 
 | 195 | 
                         new_pad = PAD_L1; | 
 
 
 
 
 
 | 196 | 
                         break; | 
 
 
 
 
 
 | 197 | 
                 case 0x102:                 //F2 == L2 | 
 
 
 
 
 
 | 198 | 
                         new_pad = PAD_L2; | 
 
 
 
 
 
 | 199 | 
                         break; | 
 
 
 
 
 
 | 200 | 
                 case 0x103:                 //F3 == L3 | 
 
 
 
 
 
 | 201 | 
                         new_pad = PAD_L3; | 
 
 
 
 
 
 | 202 | 
                         break; | 
 
 
 
 
 
 | 203 | 
                 case 0x12C:                 //Up == Up | 
 
 
 
 
 
 | 204 | 
                         new_pad = PAD_UP; | 
 
 
 
 
 
 | 205 | 
                         break; | 
 
 
 
 
 
 | 206 | 
                 case 0x12A:                 //Left == Left | 
 
 
 
 
 
 | 207 | 
                         new_pad = PAD_LEFT; | 
 
 
 
 
 
 | 208 | 
                         break; | 
 
 
 
 
 
 | 209 | 
                 case 0x129:                 //Right == Right | 
 
 
 
 
 
 | 210 | 
                         new_pad = PAD_RIGHT; | 
 
 
 
 
 
 | 211 | 
                         break; | 
 
 
 
 
 
 | 212 | 
                 case 0x12B:                 //Down == Down | 
 
 
 
 
 
 | 213 | 
                         new_pad = PAD_DOWN; | 
 
 
 
 
 
 | 214 | 
                         break; | 
 
 
 
 
 
 | 215 | 
                 case 0x123:                 //Insert == Select | 
 
 
 
 
 
 | 216 | 
                         new_pad = PAD_SELECT; | 
 
 
 
 
 
 | 217 | 
                         break; | 
 
 
 
 
 
 | 218 | 
                 case 0x10C:                 //F12 == R1 | 
 
 
 
 
 
 | 219 | 
                         new_pad = PAD_R1; | 
 
 
 
 
 
 | 220 | 
                         break; | 
 
 
 
 
 
 | 221 | 
                 case 0x10B:                 //F11 == R2 | 
 
 
 
 
 
 | 222 | 
                         new_pad = PAD_R2; | 
 
 
 
 
 
 | 223 | 
                         break; | 
 
 
 
 
 
 | 224 | 
                 case 0x10A:                 //F10 == R3 | 
 
 
 
 
 
 | 225 | 
                         new_pad = PAD_R3; | 
 
 
 
 
 
 | 226 | 
                         break; | 
 
 
 
 
 
 | 227 | 
                 case 0x124:                 //Home == Triangle | 
 
 
 
 
 
 | 228 | 
                         new_pad = PAD_TRIANGLE; | 
 
 
 
 
 
 | 229 | 
                         break; | 
 
 
 
 
 
 | 230 | 
                 case 0x127:                 //End == Square | 
 
 
 
 
 
 | 231 | 
                         new_pad = PAD_SQUARE; | 
 
 
 
 
 
 | 232 | 
                         break; | 
 
 
 
 
 
 | 233 | 
                 case 0x125:                 //PgUp == Circle | 
 
 
 
 
 
 | 234 | 
                         new_pad = PAD_CIRCLE; | 
 
 
 
 
 
 | 235 | 
                         break; | 
 
 
 
 
 
 | 236 | 
                 case 0x128:                 //PgDn == Cross | 
 
 
 
 
 
 | 237 | 
                         new_pad = PAD_CROSS; | 
 
 
 
 
 
 | 238 | 
                         break; | 
 
 
 
 
 
 | 239 | 
                 case 0x126:                 //Delete == Start | 
 
 
 
 
 
 | 240 | 
                         new_pad = PAD_START; | 
 
 
 
 
 
 | 241 | 
                         break; | 
 
 
 
 
 
 | 242 | 
                 default:                    //Unrecognized key => no pad button | 
 
 
 
 
 
 | 243 | 
                         ret = 0; | 
 
 
 
 
 
 | 244 | 
                         break; | 
 
 
 
 
 
 | 245 | 
         } | 
 
 
 
 
 
 | 246 | 
         return ret; | 
 
 
 
 
 
 | 247 | 
 } | 
 
 
 
 
 
 | 248 | 
 //------------------------------ | 
 
 
 
 
 
 | 249 | 
 //endfunc simPadKB | 
 
 
 
 
 
 | 250 | 
 //--------------------------------------------------------------------------- | 
 
 
 
 
 
 | 251 | 
 // readpad will call readpad_no_KB, and if no new pad buttons are found, it | 
 
 
 
 
 
 | 252 | 
 // will also attempt reading data from a USB keyboard, and map this as a | 
 
 
 
 
 
 | 253 | 
 // virtual gamepad. (Very improvised and sloppy, but it should work fine.) | 
 
 
 
 
 
 | 254 | 
 //--------------------------------------------------------------------------- | 
 
 
 
 
 
 | 255 | 
 int readpad(void) | 
 
 
 
 
 
 | 256 | 
 { | 
 
 
 
 
 
 | 257 | 
         int     ret; | 
 
 
 
 
 
 | 258 | 
  | 
 
 
 
 
 
 | 259 | 
         if((ret=readpad_no_KB()) && new_pad) | 
 
 
 
 
 
 | 260 | 
                 return ret; | 
 
 
 
 
 
 | 261 | 
  | 
 
 
 
 
 
 | 262 | 
         return simPadKB(); | 
 
 
 
 
 
 | 263 | 
 } | 
 
 
 
 
 
 | 264 | 
 //------------------------------ | 
 
 
 
 
 
 | 265 | 
 //endfunc readpad | 
 
 
 
 
 
 | 266 | 
 //--------------------------------------------------------------------------- | 
 
 
 
 
 
 | 267 | 
 // readpad_noRepeat calls readpad_noKBnoRepeat, and if no new pad buttons are | 
 
 
 
 
 
 | 268 | 
 // found, it also attempts reading data from a USB keyboard, and map this as | 
 
 
 
 
 
 | 269 | 
 // a virtual gamepad. (Very improvised and sloppy, but it should work fine.) | 
 
 
 
 
 
 | 270 | 
 //--------------------------------------------------------------------------- | 
 
 
 
 
 
 | 271 | 
 int readpad_noRepeat(void) | 
 
 
 
 
 
 | 272 | 
 { | 
 
 
 
 
 
 | 273 | 
         int     ret; | 
 
 
 
 
 
 | 274 | 
  | 
 
 
 
 
 
 | 275 | 
         if((ret=readpad_noKBnoRepeat()) && new_pad) | 
 
 
 
 
 
 | 276 | 
                 return ret; | 
 
 
 
 
 
 | 277 | 
  | 
 
 
 
 
 
 | 278 | 
         return simPadKB(); | 
 
 
 
 
 
 | 279 | 
 } | 
 
 
 
 
 
 | 280 | 
 //------------------------------ | 
 
 
 
 
 
 | 281 | 
 //endfunc readpad_noRepeat | 
 
 
 
 
 
 | 282 | 
 //--------------------------------------------------------------------------- | 
 
 
 
 
 
 | 283 | 
 // Wait for specific PAD, but also accept disconnected state | 
 
 
 
 
 
 | 284 | 
 void waitPadReady(int port, int slot) | 
 
 
 
 
 
 | 285 | 
 { | 
 
 
 
 
 
 | 286 | 
         int state, lastState; | 
 
 
 
 
 
 | 287 | 
         char stateString[16]; | 
 
 
 
 
 
 | 288 | 
  | 
 
 
 
 
 
 | 289 | 
         state = padGetState(port, slot); | 
 
 
 
 
 
 | 290 | 
         lastState = -1; | 
 
 
 
 
 
 | 291 | 
         while((state != PAD_STATE_DISCONN) | 
 
 
 
 
 
 | 292 | 
                 && (state != PAD_STATE_STABLE) | 
 
 
 
 
 
 | 293 | 
                 && (state != PAD_STATE_FINDCTP1)){ | 
 
 
 
 
 
 | 294 | 
                 if (state != lastState) | 
 
 
 
 
 
 | 295 | 
                         padStateInt2String(state, stateString); | 
 
 
 
 
 
 | 296 | 
                 lastState = state; | 
 
 
 
 
 
 | 297 | 
                 state=padGetState(port, slot); | 
 
 
 
 
 
 | 298 | 
         } | 
 
 
 
 
 
 | 299 | 
 } | 
 
 
 
 
 
 | 300 | 
 //--------------------------------------------------------------------------- | 
 
 
 
 
 
 | 301 | 
 // Wait for any PAD, but also accept disconnected states | 
 
 
 
 
 
 | 302 | 
 void waitAnyPadReady(void) | 
 
 
 
 
 
 | 303 | 
 { | 
 
 
 
 
 
 | 304 | 
         int state_1, state_2; | 
 
 
 
 
 
 | 305 | 
  | 
 
 
 
 
 
 | 306 | 
         state_1 = padGetState(0, 0); | 
 
 
 
 
 
 | 307 | 
         state_2 = padGetState(1, 0); | 
 
 
 
 
 
 | 308 | 
         while((state_1 != PAD_STATE_DISCONN) && (state_2 != PAD_STATE_DISCONN) | 
 
 
 
 
 
 | 309 | 
                 && (state_1 != PAD_STATE_STABLE) && (state_2 != PAD_STATE_STABLE) | 
 
 
 
 
 
 | 310 | 
                 && (state_1 != PAD_STATE_FINDCTP1) && (state_2 != PAD_STATE_FINDCTP1)){ | 
 
 
 
 
 
 | 311 | 
                 state_1 = padGetState(0, 0); | 
 
 
 
 
 
 | 312 | 
                 state_2 = padGetState(1, 0); | 
 
 
 
 
 
 | 313 | 
         } | 
 
 
 
 
 
 | 314 | 
 } | 
 
 
 
 
 
 | 315 | 
 //--------------------------------------------------------------------------- | 
 
 
 
 
 
 | 316 | 
 // setup PAD | 
 
 
 
 
 
 | 317 | 
 int setupPad(void) | 
 
 
 
 
 
 | 318 | 
 { | 
 
 
 
 
 
 | 319 | 
         int ret, i, port, state, modes; | 
 
 
 
 
 
 | 320 | 
  | 
 
 
 
 
 
 | 321 | 
         padInit(0); | 
 
 
 
 
 
 | 322 | 
  | 
 
 
 
 
 
 | 323 | 
         for(port=0; port<2; port++){ | 
 
 
 
 
 
 | 324 | 
                 padtype_t[port] = 0;  //Assume that we don't have a proper PS2 controller | 
 
 
 
 
 
 | 325 | 
                 if((ret = padPortOpen(port, 0, &padBuf_t[port][0])) == 0) | 
 
 
 
 
 
 | 326 | 
                         return 0; | 
 
 
 
 
 
 | 327 | 
                 waitPadReady(port, 0); | 
 
 
 
 
 
 | 328 | 
                 state = padGetState(port, 0); | 
 
 
 
 
 
 | 329 | 
                 if(state != PAD_STATE_DISCONN){ //if anything connected to this port | 
 
 
 
 
 
 | 330 | 
                         modes = padInfoMode(port, 0, PAD_MODETABLE, -1); | 
 
 
 
 
 
 | 331 | 
                         if (modes != 0){ //modes != 0, so it may be a dualshock type | 
 
 
 
 
 
 | 332 | 
                                 for(i=0; i<modes; i++){ | 
 
 
 
 
 
 | 333 | 
                                         if (padInfoMode(port, 0, PAD_MODETABLE, i) == PAD_TYPE_DUALSHOCK){ | 
 
 
 
 
 
 | 334 | 
                                                 padtype_t[port] = 2; //flag normal PS2 controller | 
 
 
 
 
 
 | 335 | 
                                                 break; | 
 
 
 
 
 
 | 336 | 
                                         } | 
 
 
 
 
 
 | 337 | 
                                 } //ends for (modes) | 
 
 
 
 
 
 | 338 | 
                         } else { //modes == 0, so this is a digital controller | 
 
 
 
 
 
 | 339 | 
                                 padtype_t[port] = 1; //flag digital controller | 
 
 
 
 
 
 | 340 | 
                         } | 
 
 
 
 
 
 | 341 | 
                         if(padtype_t[port] == 2)                                        //if DualShock | 
 
 
 
 
 
 | 342 | 
                                 padSetMainMode(port, 0, PAD_MMODE_DUALSHOCK, PAD_MMODE_LOCK);   //Set DualShock | 
 
 
 
 
 
 | 343 | 
                         else                                                            //else | 
 
 
 
 
 
 | 344 | 
                                 padSetMainMode(port, 0, PAD_MMODE_DIGITAL, PAD_MMODE_UNLOCK);   //Set Digital | 
 
 
 
 
 
 | 345 | 
                         waitPadReady(port, 0);                                          //Await completion | 
 
 
 
 
 
 | 346 | 
                 } else {                                          //Nothing is connected to this port | 
 
 
 
 
 
 | 347 | 
                                 padSetMainMode(port, 0, PAD_MMODE_DUALSHOCK, PAD_MMODE_LOCK); //Fake DualShock | 
 
 
 
 
 
 | 348 | 
                                 waitPadReady(port, 0);                                        //Await completion | 
 
 
 
 
 
 | 349 | 
                 } | 
 
 
 
 
 
 | 350 | 
         } //ends for (port) | 
 
 
 
 
 
 | 351 | 
         return 1; | 
 
 
 
 
 
 | 352 | 
 } | 
 
 
 
 
 
 | 353 | 
 //--------------------------------------------------------------------------- | 
 
 
 
 
 
 | 354 | 
 // End of file: pad.c | 
 
 
 
 
 
 | 355 | 
 //--------------------------------------------------------------------------- |