Skip to content

Commit

Permalink
Add PAD_GetOrigin
Browse files Browse the repository at this point in the history
Truncate origin for analog mode 0
  • Loading branch information
Extrems committed Feb 26, 2025
1 parent b12728e commit d77d358
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 29 deletions.
1 change: 1 addition & 0 deletions gc/ogc/pad.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ void PAD_ControlMotor(s32 chan,u32 cmd);
void PAD_SetAnalogMode(u32 mode);
void PAD_SetSamplingRate(u32 samplingrate);
void PAD_SetSpec(u32 spec);
void PAD_GetOrigin(PADStatus *origin);
u32 PAD_GetSpec(void);
u32 PAD_GetType(s32 chan,u32 *type);
u32 PAD_IsBarrel(s32 chan);
Expand Down
92 changes: 63 additions & 29 deletions libogc/pad.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ static u32 __pad_xpatchbits = 0xf0000000;
static u32 __pad_recalibrated$207 = 0;

static u32 __pad_type[PAD_CHANMAX];
static s8 __pad_origin[PAD_CHANMAX][12];
static PADStatus __pad_origin[PAD_CHANMAX];
static u32 __pad_cmdprobedevice[PAD_CHANMAX];

static keyinput __pad_keys[PAD_CHANMAX];
Expand Down Expand Up @@ -243,12 +243,12 @@ static void SPEC2_MakeStatus(u32 chan,u32 *data,PADStatus *status)
status->substickY = 0;
} else {
__pad_barrelbits &= ~PAD_ENABLEDMASK(chan);
status->stickX = __pad_clampS8(status->stickX,__pad_origin[chan][2]);
status->stickY = __pad_clampS8(status->stickY,__pad_origin[chan][3]);
status->substickX = __pad_clampS8(status->substickX,__pad_origin[chan][4]);
status->substickY = __pad_clampS8(status->substickY,__pad_origin[chan][5]);
status->triggerL = __pad_clampU8(status->triggerL,__pad_origin[chan][6]);
status->triggerR = __pad_clampU8(status->triggerR,__pad_origin[chan][7]);
status->stickX = __pad_clampS8(status->stickX,__pad_origin[chan].stickX);
status->stickY = __pad_clampS8(status->stickY,__pad_origin[chan].stickY);
status->substickX = __pad_clampS8(status->substickX,__pad_origin[chan].substickX);
status->substickY = __pad_clampS8(status->substickY,__pad_origin[chan].substickY);
status->triggerL = __pad_clampU8(status->triggerL,__pad_origin[chan].triggerL);
status->triggerR = __pad_clampU8(status->triggerR,__pad_origin[chan].triggerR);
}
}

Expand Down Expand Up @@ -312,26 +312,31 @@ static void __pad_updateorigin(s32 chan)

mask = PAD_ENABLEDMASK(chan);
mode = __pad_analogmode&0x0700;
if(mode==0x0100) {
__pad_origin[chan][4] &= ~0x0f;
__pad_origin[chan][5] &= ~0x0f;
__pad_origin[chan][8] &= ~0x0f;
__pad_origin[chan][9] &= ~0x0f;
if(mode==0x100) {
__pad_origin[chan].substickX &= ~0x0f;
__pad_origin[chan].substickY &= ~0x0f;
__pad_origin[chan].analogA &= ~0x0f;
__pad_origin[chan].analogB &= ~0x0f;
} else if(mode==0x200) {
__pad_origin[chan][4] &= ~0x0f;
__pad_origin[chan][5] &= ~0x0f;
__pad_origin[chan][6] &= ~0x0f;
__pad_origin[chan][7] &= ~0x0f;
__pad_origin[chan].substickX &= ~0x0f;
__pad_origin[chan].substickY &= ~0x0f;
__pad_origin[chan].triggerL &= ~0x0f;
__pad_origin[chan].triggerR &= ~0x0f;
} else if(!mode || mode==0x500 || mode==0x600 || mode==0x700) {
__pad_origin[chan].triggerL &= ~0x0f;
__pad_origin[chan].triggerR &= ~0x0f;
__pad_origin[chan].analogA &= ~0x0f;
__pad_origin[chan].analogB &= ~0x0f;
}

__pad_origin[chan][2] -= 128;
__pad_origin[chan][3] -= 128;
__pad_origin[chan][4] -= 128;
__pad_origin[chan][5] -= 128;
__pad_origin[chan].stickX -= 128;
__pad_origin[chan].stickY -= 128;
__pad_origin[chan].substickX -= 128;
__pad_origin[chan].substickY -= 128;

if(__pad_xpatchbits&mask && __pad_origin[chan][2]>64) {
if(__pad_xpatchbits&mask && __pad_origin[chan].stickX>64) {
type = SI_GetType(chan)&~0xffff;
if(type==SI_GC_CONTROLLER) __pad_origin[chan][2] = 0;
if(type==SI_GC_CONTROLLER) __pad_origin[chan].stickX = 0;
}
}

Expand Down Expand Up @@ -395,11 +400,11 @@ static void __pad_typeandstatuscallback(s32 chan,u32 type)
}

if(!(type&SI_GC_WIRELESS) || type&SI_WIRELESS_IR) {
if(recal_bits) ret = SI_Transfer(__pad_resettingchan,&__pad_cmdcalibrate,3,__pad_origin[__pad_resettingchan],10,__pad_origincallback,0);
else ret = SI_Transfer(__pad_resettingchan,&__pad_cmdreadorigin,1,__pad_origin[__pad_resettingchan],10,__pad_origincallback,0);
if(recal_bits) ret = SI_Transfer(__pad_resettingchan,&__pad_cmdcalibrate,3,&__pad_origin[__pad_resettingchan],10,__pad_origincallback,0);
else ret = SI_Transfer(__pad_resettingchan,&__pad_cmdreadorigin,1,&__pad_origin[__pad_resettingchan],10,__pad_origincallback,0);
} else if(type&SI_WIRELESS_FIX_ID && !(type&SI_WIRELESS_CONT_MASK) && !(type&SI_WIRELESS_LITE)) {
if(type&SI_WIRELESS_RECEIVED) ret = SI_Transfer(__pad_resettingchan,&__pad_cmdreadorigin,1,__pad_origin[__pad_resettingchan],10,__pad_origincallback,0);
else ret = SI_Transfer(__pad_resettingchan,&__pad_cmdprobedevice[__pad_resettingchan],3,__pad_origin[__pad_resettingchan],8,__pad_probecallback,0);
if(type&SI_WIRELESS_RECEIVED) ret = SI_Transfer(__pad_resettingchan,&__pad_cmdreadorigin,1,&__pad_origin[__pad_resettingchan],10,__pad_origincallback,0);
else ret = SI_Transfer(__pad_resettingchan,&__pad_cmdprobedevice[__pad_resettingchan],3,&__pad_origin[__pad_resettingchan],8,__pad_probecallback,0);
}
if(!ret) {
__pad_pendingbits |= mask;
Expand All @@ -421,7 +426,7 @@ static void __pad_receivecheckcallback(s32 chan,u32 type)
__pad_checkingbits &= ~mask;
if(!(tmp&0x0f)
&& (type&SI_GC_WIRELESS) && (type&SI_WIRELESS_RECEIVED) && (type&SI_WIRELESS_FIX_ID)
&& !(type&SI_WIRELESS_IR) && !(type&SI_WIRELESS_CONT_MASK) && !(type&SI_WIRELESS_LITE)) SI_Transfer(chan,&__pad_cmdreadorigin,1,__pad_origin[chan],10,__pad_originupdatecallback,0);
&& !(type&SI_WIRELESS_IR) && !(type&SI_WIRELESS_CONT_MASK) && !(type&SI_WIRELESS_LITE)) SI_Transfer(chan,&__pad_cmdreadorigin,1,&__pad_origin[chan],10,__pad_originupdatecallback,0);
else __pad_disable(chan);
}
}
Expand Down Expand Up @@ -465,7 +470,7 @@ static void __pad_doreset(void)
#endif
__pad_resettingbits &= ~PAD_ENABLEDMASK(__pad_resettingchan);

memset(__pad_origin[__pad_resettingchan],0,12);
memset(&__pad_origin[__pad_resettingchan],0,sizeof(PADStatus));
SI_GetTypeAsync(__pad_resettingchan,__pad_typeandstatuscallback);
}

Expand Down Expand Up @@ -621,7 +626,7 @@ u32 PAD_Read(PADStatus *status)
if(status[chan].button&0x00002000) {
memset(&status[chan],0,sizeof(PADStatus));
status[chan].err = PAD_ERR_TRANSFER;
SI_Transfer(chan,&__pad_cmdreadorigin,1,__pad_origin[chan],10,__pad_originupdatecallback,0);
SI_Transfer(chan,&__pad_cmdreadorigin,1,&__pad_origin[chan],10,__pad_originupdatecallback,0);
} else {
status[chan].err = PAD_ERR_NONE;
status[chan].button &= ~0x80;
Expand All @@ -638,6 +643,35 @@ u32 PAD_Read(PADStatus *status)
return ret;
}

void PAD_GetOrigin(PADStatus *origin)
{
u32 chan,mask;
u32 level;

_CPU_ISR_Disable(level);
chan = 0;
while(chan<4) {
mask = PAD_ENABLEDMASK(chan);
if(__pad_pendingbits&mask) {
PAD_Reset(0);
memset(&origin[chan],0,sizeof(PADStatus));
origin[chan].err = PAD_ERR_NOT_READY;
} else if(__pad_resettingbits&mask || __pad_resettingchan==chan) {
memset(&origin[chan],0,sizeof(PADStatus));
origin[chan].err = PAD_ERR_NOT_READY;
} else if(!(__pad_enabledbits&mask)) {
memset(&origin[chan],0,sizeof(PADStatus));
origin[chan].err = PAD_ERR_NO_CONTROLLER;
} else {
memcpy(&origin[chan],&__pad_origin[chan],sizeof(PADStatus));
origin[chan].err = PAD_ERR_NONE;
origin[chan].button &= ~0x80;
}
chan++;
}
_CPU_ISR_Restore(level);
}

u32 PAD_Reset(u32 mask)
{
u32 level;
Expand Down

0 comments on commit d77d358

Please sign in to comment.