Skip to content

Commit 8ec50d7

Browse files
committed
Add extended PAD buttons
1 parent 649cfc2 commit 8ec50d7

2 files changed

Lines changed: 75 additions & 17 deletions

File tree

include/ogc/pad.h

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,30 @@
3737
#define PAD_BUTTON_Y 0x0800
3838
#define PAD_BUTTON_MENU 0x1000
3939
#define PAD_BUTTON_START 0x1000
40+
41+
#define PADEX_STICK_LEFT (0x0001<<16)
42+
#define PADEX_STICK_RIGHT (0x0002<<16)
43+
#define PADEX_STICK_DOWN (0x0004<<16)
44+
#define PADEX_STICK_UP (0x0008<<16)
45+
#define PADEX_SUBSTICK_LEFT (0x0010<<16)
46+
#define PADEX_SUBSTICK_RIGHT (0x0020<<16)
47+
#define PADEX_SUBSTICK_DOWN (0x0040<<16)
48+
#define PADEX_SUBSTICK_UP (0x0080<<16)
49+
#define PADEX_BUTTON_C_LEFT (0x0100<<16)
50+
#define PADEX_BUTTON_C_RIGHT (0x0200<<16)
51+
#define PADEX_BUTTON_C_DOWN (0x0400<<16)
52+
#define PADEX_BUTTON_C_UP (0x0800<<16)
53+
#define PADEX_TRIGGER_R (0x1000<<16)
54+
#define PADEX_TRIGGER_L (0x2000<<16)
55+
#define PADEX_ANALOG_A (0x4000<<16)
56+
#define PADEX_ANALOG_B (0x8000<<16)
57+
58+
#define PADEX_STEERING_LEFT PADEX_STICK_LEFT
59+
#define PADEX_STEERING_RIGHT PADEX_STICK_RIGHT
60+
#define PADEX_PEDAL_GAS PADEX_ANALOG_A
61+
#define PADEX_PEDAL_BRAKE PADEX_ANALOG_B
62+
#define PADEX_PADDLE_LEFT PADEX_TRIGGER_L
63+
#define PADEX_PADDLE_RIGHT PADEX_TRIGGER_R
4064
/*+----------------------------------------------------------------------------------------------+*/
4165
/*+----------------------------------------------------------------------------------------------+*/
4266
/*+----------------------------------------------------------------------------------------------+*/
@@ -80,9 +104,9 @@ u32 PAD_IsBarrel(s32 chan);
80104

81105
u32 PAD_ScanPads(void);
82106

83-
u16 PAD_ButtonsUp(s32 chan);
84-
u16 PAD_ButtonsDown(s32 chan);
85-
u16 PAD_ButtonsHeld(s32 chan);
107+
u32 PAD_ButtonsUp(s32 chan);
108+
u32 PAD_ButtonsDown(s32 chan);
109+
u32 PAD_ButtonsHeld(s32 chan);
86110

87111
s8 PAD_SubStickX(s32 chan);
88112
s8 PAD_SubStickY(s32 chan);

libogc/pad.c

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ typedef struct _keyinput {
2828
u8 triggerR;
2929
u8 analogA;
3030
u8 analogB;
31-
u16 up;
32-
u16 down;
33-
u16 state;
34-
u32 chan;
31+
u32 up;
32+
u32 down;
33+
u32 state;
34+
s32 chan;
3535
} keyinput;
3636

3737
typedef void (*SPECCallback)(u32 chan,u32 *data,PADStatus *status);
@@ -874,7 +874,7 @@ u32 PAD_ScanPads(void)
874874
s32 i;
875875
u32 resetBits;
876876
u32 padBit,connected;
877-
u16 state,oldstate;
877+
u32 state,oldstate;
878878
SISteeringStatus steering;
879879
PADStatus padstatus[PAD_CHANMAX];
880880
N64Status n64status;
@@ -900,6 +900,21 @@ u32 PAD_ScanPads(void)
900900
__pad_keys[i].analogA = padstatus[i].analogA;
901901
__pad_keys[i].analogB = padstatus[i].analogB;
902902

903+
if(!PAD_IsBarrel(i)) {
904+
if(padstatus[i].stickX<(INT8_MIN/2)) state |= PADEX_STICK_LEFT;
905+
if(padstatus[i].stickX>(INT8_MAX/2)) state |= PADEX_STICK_RIGHT;
906+
if(padstatus[i].stickY<(INT8_MIN/2)) state |= PADEX_STICK_DOWN;
907+
if(padstatus[i].stickY>(INT8_MAX/2)) state |= PADEX_STICK_UP;
908+
if(padstatus[i].substickX<(INT8_MIN/2)) state |= PADEX_SUBSTICK_LEFT;
909+
if(padstatus[i].substickX>(INT8_MAX/2)) state |= PADEX_SUBSTICK_RIGHT;
910+
if(padstatus[i].substickY<(INT8_MIN/2)) state |= PADEX_SUBSTICK_DOWN;
911+
if(padstatus[i].substickY>(INT8_MAX/2)) state |= PADEX_SUBSTICK_UP;
912+
if(padstatus[i].triggerR>(UINT8_MAX/2)) state |= PADEX_TRIGGER_R;
913+
if(padstatus[i].triggerL>(UINT8_MAX/2)) state |= PADEX_TRIGGER_L;
914+
if(padstatus[i].analogA>(UINT8_MAX/2)) state |= PADEX_ANALOG_A;
915+
if(padstatus[i].analogB>(UINT8_MAX/2)) state |= PADEX_ANALOG_B;
916+
}
917+
903918
oldstate = __pad_keys[i].state;
904919
__pad_keys[i].up = ~state & oldstate;
905920
__pad_keys[i].down = state & ~oldstate;
@@ -922,21 +937,33 @@ u32 PAD_ScanPads(void)
922937
if(n64status.button&N64_BUTTON_DOWN) state |= PAD_BUTTON_DOWN;
923938
if(n64status.button&N64_BUTTON_UP) state |= PAD_BUTTON_UP;
924939
if(n64status.button&N64_BUTTON_Z) state |= PAD_TRIGGER_Z;
925-
if(n64status.button&N64_BUTTON_R) state |= PAD_TRIGGER_R;
926-
if(n64status.button&N64_BUTTON_L) state |= PAD_TRIGGER_L;
940+
if(n64status.button&N64_BUTTON_R) state |= PAD_TRIGGER_R | PADEX_TRIGGER_R;
941+
if(n64status.button&N64_BUTTON_L) state |= PAD_TRIGGER_L | PADEX_TRIGGER_L;
927942
if(n64status.button&N64_BUTTON_A) state |= PAD_BUTTON_A;
928943
if(n64status.button&N64_BUTTON_B) state |= PAD_BUTTON_B;
929944
if(n64status.button&N64_BUTTON_START) state |= PAD_BUTTON_START;
945+
if(n64status.button&N64_BUTTON_C_LEFT) state |= PADEX_SUBSTICK_LEFT | PADEX_BUTTON_C_LEFT;
946+
if(n64status.button&N64_BUTTON_C_RIGHT) state |= PADEX_SUBSTICK_RIGHT | PADEX_BUTTON_C_RIGHT;
947+
if(n64status.button&N64_BUTTON_C_DOWN) state |= PADEX_SUBSTICK_DOWN | PADEX_BUTTON_C_DOWN;
948+
if(n64status.button&N64_BUTTON_C_UP) state |= PADEX_SUBSTICK_UP | PADEX_BUTTON_C_UP;
949+
if(n64status.stickX<(INT8_MIN/2)) state |= PADEX_STICK_LEFT;
950+
if(n64status.stickX>(INT8_MAX/2)) state |= PADEX_STICK_RIGHT;
951+
if(n64status.stickY<(INT8_MIN/2)) state |= PADEX_STICK_DOWN;
952+
if(n64status.stickY>(INT8_MAX/2)) state |= PADEX_STICK_UP;
930953

931954
__pad_keys[i].stickX = n64status.stickX;
932955
__pad_keys[i].stickY = n64status.stickY;
933956
__pad_keys[i].substickX = 0;
934957
__pad_keys[i].substickY = 0;
958+
__pad_keys[i].triggerL = 0;
959+
__pad_keys[i].triggerR = 0;
935960

936-
if(n64status.button&N64_BUTTON_C_RIGHT) __pad_keys[i].substickX += INT8_MAX;
937-
if(n64status.button&N64_BUTTON_C_LEFT) __pad_keys[i].substickX -= INT8_MAX;
938-
if(n64status.button&N64_BUTTON_C_DOWN) __pad_keys[i].substickY -= INT8_MAX;
939-
if(n64status.button&N64_BUTTON_C_UP) __pad_keys[i].substickY += INT8_MAX;
961+
if(state&PADEX_SUBSTICK_LEFT) __pad_keys[i].substickX -= INT8_MAX;
962+
if(state&PADEX_SUBSTICK_RIGHT) __pad_keys[i].substickX += INT8_MAX;
963+
if(state&PADEX_SUBSTICK_DOWN) __pad_keys[i].substickY -= INT8_MAX;
964+
if(state&PADEX_SUBSTICK_UP) __pad_keys[i].substickY += INT8_MAX;
965+
if(state&PADEX_TRIGGER_R) __pad_keys[i].triggerR += UINT8_MAX;
966+
if(state&PADEX_TRIGGER_L) __pad_keys[i].triggerL += UINT8_MAX;
940967

941968
oldstate = __pad_keys[i].state;
942969
__pad_keys[i].up = ~state & oldstate;
@@ -971,6 +998,13 @@ u32 PAD_ScanPads(void)
971998
__pad_keys[i].analogA = steering.gas;
972999
__pad_keys[i].analogB = steering.brake;
9731000

1001+
if(steering.steering<(INT8_MIN/4)) state |= PADEX_STEERING_LEFT;
1002+
if(steering.steering>(INT8_MAX/4)) state |= PADEX_STEERING_RIGHT;
1003+
if(steering.right>(UINT8_MAX/2)) state |= PADEX_PADDLE_RIGHT;
1004+
if(steering.left>(UINT8_MAX/2)) state |= PADEX_PADDLE_LEFT;
1005+
if(steering.gas>(UINT8_MAX/2)) state |= PADEX_PEDAL_GAS;
1006+
if(steering.brake>(UINT8_MAX/2)) state |= PADEX_PEDAL_BRAKE;
1007+
9741008
oldstate = __pad_keys[i].state;
9751009
__pad_keys[i].up = ~state & oldstate;
9761010
__pad_keys[i].down = state & ~oldstate;
@@ -1017,19 +1051,19 @@ u32 PAD_ScanPads(void)
10171051
return connected;
10181052
}
10191053

1020-
u16 PAD_ButtonsUp(s32 chan)
1054+
u32 PAD_ButtonsUp(s32 chan)
10211055
{
10221056
if(chan<PAD_CHAN0 || chan>PAD_CHAN3 || __pad_keys[chan].chan==-1) return 0;
10231057
return __pad_keys[chan].up;
10241058
}
10251059

1026-
u16 PAD_ButtonsDown(s32 chan)
1060+
u32 PAD_ButtonsDown(s32 chan)
10271061
{
10281062
if(chan<PAD_CHAN0 || chan>PAD_CHAN3 || __pad_keys[chan].chan==-1) return 0;
10291063
return __pad_keys[chan].down;
10301064
}
10311065

1032-
u16 PAD_ButtonsHeld(s32 chan)
1066+
u32 PAD_ButtonsHeld(s32 chan)
10331067
{
10341068
if(chan<PAD_CHAN0 || chan>PAD_CHAN3 || __pad_keys[chan].chan==-1) return 0;
10351069
return __pad_keys[chan].state;

0 commit comments

Comments
 (0)