Skip to content

Commit 6059843

Browse files
authored
Wiimotes: Clear Wiimote active list on poweroff (#240)
1 parent f94db70 commit 6059843

4 files changed

Lines changed: 51 additions & 9 deletions

File tree

gc/wiiuse/wiiuse.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -720,8 +720,8 @@ WIIUSE_EXPORT extern const char* wiiuse_version();
720720
#ifndef GEKKO
721721
WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes);
722722
#else
723-
WIIUSE_EXPORT extern int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err));
724-
WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err));
723+
WIIUSE_EXPORT extern int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, const u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err));
724+
WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, const u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err));
725725
WIIUSE_EXPORT extern struct wiimote_t** wiiuse_init(int wiimotes, wii_event_cb event_cb);
726726
WIIUSE_EXPORT extern void wiiuse_sensorbar_enable(int enable);
727727
#endif

libogc/system.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ extern void __reset(u32 reset_code);
205205

206206
extern u32 __IPC_ClntInit(void);
207207
extern u32 __PADDisableRecalibration(s32 disable);
208+
extern u32 __WPADClearActiveList(void);
208209

209210
extern void __console_init_ex(void *conbuffer,int tgt_xstart,int tgt_ystart,int tgt_stride,int con_xres,int con_yres,int con_stride);
210211

@@ -1189,8 +1190,15 @@ void SYS_ResetSystem(s32 reset,u32 reset_code,s32 force_menu)
11891190

11901191
__dsp_shutdown();
11911192

1192-
if(reset==SYS_SHUTDOWN) {
1193-
ret = __PADDisableRecalibration(TRUE);
1193+
switch(reset) {
1194+
case SYS_SHUTDOWN:
1195+
ret = __PADDisableRecalibration(TRUE);
1196+
break;
1197+
case SYS_POWEROFF:
1198+
case SYS_POWEROFF_STANDBY:
1199+
case SYS_POWEROFF_IDLE:
1200+
__WPADClearActiveList();
1201+
break;
11941202
}
11951203

11961204
while(__call_resetfuncs(FALSE)==0);

wiiuse/io_wii.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ void __wiiuse_sensorbar_enable(int enable)
161161
IRQ_Restore(level);
162162
}
163163

164-
int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err))
164+
int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, const u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err))
165165
{
166166
s32 err;
167167

@@ -205,7 +205,7 @@ int wiiuse_accept(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name
205205
return 0;
206206
}
207207

208-
int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err))
208+
int wiiuse_connect(struct wiimote_listen_t *wml, struct bd_addr *bdaddr, const u8 *name, struct wiimote_t *(*assign_cb)(wiimote_listen *wml, u8 err))
209209
{
210210
s32 err;
211211

wiiuse/wpad.c

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,40 @@ static s32 __wpad_onreset(s32 final)
137137
return 1;
138138
}
139139

140+
u32 __WPADClearActiveList(void)
141+
{
142+
u32 level,ret;
143+
144+
_CPU_ISR_Disable(level);
145+
146+
if(CONF_GetPadDevices(&__wpad_devs) < 0) {
147+
ret = 1;
148+
goto err;
149+
}
150+
151+
__wpads_active = 0;
152+
__wpads_used = 0;
153+
memset(__wpad_devs.active,0,sizeof(__wpad_devs.active));
154+
memset(&__wpad_guests,0,sizeof(__wpad_guests));
155+
memset(__wpad_guest_keys,0,sizeof(__wpad_guest_keys));
156+
157+
if(CONF_SetPadDevices(&__wpad_devs) < 0) {
158+
ret = 1;
159+
goto err;
160+
}
161+
162+
if(CONF_SetPadGuestDevices(&__wpad_guests) < 0) {
163+
ret = 1;
164+
goto err;
165+
}
166+
167+
ret = CONF_SaveChanges();
168+
169+
err:
170+
_CPU_ISR_Restore(level);
171+
return ret;
172+
}
173+
140174
static void __wpad_def_powcb(s32 chan)
141175
{
142176
SYS_DoPowerCB();
@@ -939,7 +973,7 @@ static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_ty
939973
int slot = WPAD_MAX_DEVICES;
940974
int confslot = CONF_PAD_MAX_ACTIVE;
941975
struct bd_addr bdaddr;
942-
u8 *name = NULL;
976+
const u8 *name = NULL;
943977

944978
WIIUSE_DEBUG("__wpad_connreqCB");
945979
_CPU_ISR_Disable(level);
@@ -950,7 +984,7 @@ static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_ty
950984
confslot = GetActiveSlot(pad_addr);
951985
if (confslot < CONF_PAD_MAX_ACTIVE) {
952986
BD_ADDR_FROM_BYTES(&bdaddr,__wpad_devs.active[confslot].bdaddr);
953-
name = (u8 *)__wpad_devs.active[confslot].name;
987+
name = (const u8 *)__wpad_devs.active[confslot].name;
954988
WIIUSE_DEBUG("Active pad '%s' found in slot %d", name, confslot);
955989
if (!(__wpads_used & (1<<confslot)) || bd_addr_cmp(pad_addr,&bdaddr))
956990
slot = confslot;
@@ -962,7 +996,7 @@ static s8 __wpad_connreqCB(void *arg,struct bd_addr *pad_addr,u8 *cod,u8 link_ty
962996
for(i=0; i<CONF_PAD_MAX_REGISTERED; i++) {
963997
BD_ADDR_FROM_BYTES(&bdaddr,__wpad_devs.registered[i].bdaddr);
964998
if(bd_addr_cmp(pad_addr,&bdaddr)) {
965-
name = (u8 *)__wpad_devs.registered[i].name;
999+
name = (const u8 *)__wpad_devs.registered[i].name;
9661000
WIIUSE_DEBUG("Registered pad '%s' found in slot %d", name, i);
9671001

9681002
// Not active, try to make active

0 commit comments

Comments
 (0)