1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
|
#include "ps2pad.h"
#include <libpad.h>
#include <libdma.h>
#include <libgraph.h>
#define BUTTON_LEFT(d) ((d[2] & (1 << (3+4)))==0)
#define BUTTON_DOWN(d) ((d[2] & (1 << (2+4)))==0)
#define BUTTON_RIGHT(d) ((d[2] & (1 << (1+4)))==0)
#define BUTTON_UP(d) ((d[2] & (1 << (0+4)))==0)
#define BUTTON_START(d) ((d[2] & (1 << 3))==0)
#define BUTTON_RSTICK(d) ((d[2] & (1 << 2))==0)
#define BUTTON_LSTICK(d) ((d[2] & (1 << 1))==0)
#define BUTTON_SELECT(d) ((d[2] & (1 << 0))==0)
#define BUTTON_SQUARE(d) ((d[3] & (1 << (3+4)))==0)
#define BUTTON_X(d) ((d[3] & (1 << (2+4)))==0)
#define BUTTON_CIRCLE(d) ((d[3] & (1 << (1+4)))==0)
#define BUTTON_TRI(d) ((d[3] & (1 << (0+4)))==0)
#define BUTTON_R1(d) ((d[3] & (1 << 3))==0)
#define BUTTON_L1(d) ((d[3] & (1 << 2))==0)
#define BUTTON_R2(d) ((d[3] & (1 << 1))==0)
#define BUTTON_L2(d) ((d[3] & (1 << 0))==0)
static int term_id = 0;
static u_long128 mPadDMABuf[scePadDmaBufferMax] __attribute__((aligned (64)));
static int mPadState;
static int mPadPhase;
static unsigned char mActDirect[6];
static unsigned char mActAlign[6];
static unsigned short PadReadData(int events[NumPadEvents])
{
static unsigned char rdata_prev[32];
unsigned char rdata[32];
unsigned short tpad = 0;
unsigned short paddata = 0;
static unsigned short rpad = 0;
if (scePadRead(0,0,rdata) == 0)
return 0;
if (rdata[0] == 0)
{
paddata = (unsigned short)(0xffff ^ ((rdata[2]<<8)|rdata[3]));
tpad = (unsigned short)(paddata & ~rpad);
rpad = paddata;
term_id = (rdata[1]>>4);
events[PadLeft] = (BUTTON_LEFT(rdata) && !BUTTON_LEFT(rdata_prev));
events[PadDown] = (BUTTON_DOWN(rdata) && !BUTTON_DOWN(rdata_prev));
events[PadRight] = (BUTTON_RIGHT(rdata) && !BUTTON_RIGHT(rdata_prev));
events[PadUp] = (BUTTON_UP(rdata) && !BUTTON_UP(rdata_prev));
events[PadStart] = (BUTTON_START(rdata) && !BUTTON_START(rdata_prev));
events[PadRightStick] = (BUTTON_RSTICK(rdata) && !BUTTON_RSTICK(rdata_prev));
events[PadLeftStick] = (BUTTON_LSTICK(rdata) && !BUTTON_LSTICK(rdata_prev));
events[PadSelect] = (BUTTON_SELECT(rdata) && !BUTTON_SELECT(rdata_prev));
events[PadSquare] = (BUTTON_SQUARE(rdata) && !BUTTON_SQUARE(rdata_prev));
events[PadX] = (BUTTON_X(rdata) && !BUTTON_X(rdata_prev));
events[PadCircle] = (BUTTON_CIRCLE(rdata) && !BUTTON_CIRCLE(rdata_prev));
events[PadTriangle] = (BUTTON_TRI(rdata) && !BUTTON_TRI(rdata_prev));
events[PadR1] = (BUTTON_R1(rdata) && !BUTTON_R1(rdata_prev));
events[PadL1] = (BUTTON_L1(rdata) && !BUTTON_L1(rdata_prev));
events[PadR2] = (BUTTON_R2(rdata) && !BUTTON_R2(rdata_prev));
events[PadL2] = (BUTTON_L2(rdata) && !BUTTON_L2(rdata_prev));
}
// store current data
memcpy(rdata_prev, rdata, 32);
return (tpad);
}
#define ROOT_DIR "host0:/usr/local/sce/iop/modules/"
int PadInit(void)
{
int i;
mPadPhase = 0;
mPadState = 0;
for (i=0; i <6; i++)
{
mActDirect[i] = 0;
mActAlign[i] = 0;
}
// Load serial io module
if (0 >= sceSifLoadModule(ROOT_DIR "sio2man.irx", 0, NULL))
return 0;
// Load control pad module
if (0 >= sceSifLoadModule(ROOT_DIR "padman.irx", 0, NULL))
return 0;
// Misc init
sceDmaReset(1); // reset DMA
sceGsResetPath(); // reset GS
sceGsSyncPath(0, 0); // wait for completion
// Open the pad port
scePadInit(0);
if (0 == scePadPortOpen(0, 0, mPadDMABuf))
return 0; // couldn't initialize pad
return 1;
}
void PadReadInput(int events[NumPadEvents])
{
static int id = 0;
int exid;
int i;
for(i = 0 ; i < NumPadEvents ; i++)
events[i] = 0;
// check buttons or some junk
mPadState = scePadGetState(0, 0);
//if (mPadState >= 0 && state <= 7)
// scePadStateIntToStr(state, buf); // get error string
if (mPadState == scePadStateDiscon)
mPadPhase = 0; // lost pad
switch(mPadPhase)
{
case 0:
{
// Wait until stable or need to find ctp1
if (mPadState != scePadStateStable && mPadState != scePadStateFindCTP1)
break;
// Get controller ID
id = scePadInfoMode(0, 0, InfoModeCurID, 0);
if (id == 0)
break;
// Is there an extended ID?
exid = scePadInfoMode(0,0, InfoModeCurExID, 0);
if (exid > 0)
id = exid;
if (id == 40)
// Special processing for "standard" controller
mPadPhase = 40;
else if (id == 7)
// Special processing for "analog" controller
mPadPhase = 70;
else
// Skip to end of setup
mPadPhase = 99;
break;
}
// 1st step special processing for "standard" controller
case 40:
if (scePadInfoMode(0, 0, InfoModeCurExID, 0)==0)
{
// Skip to end if this was set from an extended ID
mPadPhase = 99;
break;
}
// Set main mode
if (scePadSetMainMode(0, 0, 1, 0)==1)
mPadPhase++;
break;
// 2nd step special processing for "standard" controller
case 41:
if (scePadGetReqState(0,0) == scePadReqStateFaild)
mPadPhase--; // failed, go back a phase
if (scePadGetReqState(0,0) == scePadReqStateComplete)
mPadPhase = 0; // completed, go back to beginning to try again
break;
// 1st step special processing for "analog" controller
case 70:
if (scePadInfoAct(0, 0, -1, 0)==0)
mPadPhase = 99; // done
mActAlign[0] = 0;
mActAlign[1] = 1;
for (i=2; i<6; i++)
mActAlign[i] = 0xff;
if (scePadSetActAlign(0, 0, mActAlign))
mPadPhase++;
break;
// 2nd step special processing for "analog" controller
case 71:
if (scePadGetReqState(0,0) == scePadReqStateFaild)
mPadPhase--;
if (scePadGetReqState(0,0) == scePadReqStateComplete)
mPadPhase = 99; // finished, jump to end
case 99:
default:
if (mPadState == scePadStateStable || mPadState == scePadStateFindCTP1)
{
// read button states
//unsigned short pad = ReadPadData();
PadReadData(events);
if (term_id != id)
mPadPhase = 0;
}
break;
};
}
|