@@ -87,18 +87,19 @@ struct _wpad_cb {
8787
8888static syswd_t __wpad_timer ;
8989static vu32 __wpads_inited = 0 ;
90+ static vu32 __wpad_guests_inited = 0 ;
9091static vs32 __wpads_bonded = 0 ;
9192static u32 __wpad_idletimeout = 300 ;
9293static vu32 __wpads_active = 0 ;
9394static vu32 __wpads_used = 0 ;
9495static wiimote * * __wpads = NULL ;
95- static wiimote_listen __wpads_listen [WPAD_MAX_DEVICES ];
96- static WPADData wpaddata [WPAD_MAX_DEVICES ];
97- static struct _wpad_cb __wpdcb [WPAD_MAX_DEVICES ];
98- static conf_pads __wpad_devs ;
99- static conf_pad_guests __wpad_guests ;
100- static struct linkkey_info __wpad_keys [CONF_PAD_MAX_REGISTERED ];
101- static struct linkkey_info __wpad_guest_keys [CONF_PAD_ACTIVE_AND_OTHER ];
96+ static wiimote_listen __wpads_listen [WPAD_MAX_DEVICES ] = { 0 } ;
97+ static WPADData wpaddata [WPAD_MAX_DEVICES ] = { 0 } ;
98+ static struct _wpad_cb __wpdcb [WPAD_MAX_DEVICES ] = { 0 } ;
99+ static conf_pads __wpad_devs = { 0 } ;
100+ static conf_pad_guests __wpad_guests = { 0 } ;
101+ static struct linkkey_info __wpad_keys [CONF_PAD_MAX_REGISTERED ] = { 0 } ;
102+ static struct linkkey_info __wpad_guest_keys [CONF_PAD_ACTIVE_AND_OTHER ] = { 0 } ;
102103
103104static sem_t __wpad_confsave_sem ;
104105static bool __wpad_confsave_thread_running = false;
@@ -818,6 +819,23 @@ static void __wpad_hostsyncbuttonCB(u32 held)
818819 _CPU_ISR_Restore (level );
819820}
820821
822+ static s32 GetActiveSlot (struct bd_addr * pad_addr )
823+ {
824+ int i ;
825+ int slot = CONF_PAD_MAX_ACTIVE ;
826+ struct bd_addr bdaddr ;
827+
828+ for (i = 0 ; i < CONF_PAD_MAX_ACTIVE ; i ++ ) {
829+ BD_ADDR_FROM_BYTES (& bdaddr ,__wpad_devs .active [i ].bdaddr );
830+ if (bd_addr_cmp (pad_addr ,& bdaddr )) {
831+ slot = i ;
832+ break ;
833+ }
834+ }
835+
836+ return slot ;
837+ }
838+
821839s32 __wpad_read_remote_name_finished (s32 result ,void * userdata )
822840{
823841 u32 level ;
@@ -832,18 +850,12 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata)
832850 if (!strncmp ("Nintendo RVL-" , (char * )info -> name , 13 )) {
833851 // Found Wii accessory, is it controller or something else?
834852 if (!strncmp ("Nintendo RVL-CNT-" , (char * )info -> name , 17 )) {
835- // Check active list
836- for (i = 0 ; i < CONF_PAD_MAX_ACTIVE ; i ++ ) {
837- BD_ADDR_FROM_BYTES (& (bdaddr ),__wpad_devs .active [i ].bdaddr );
838- if (bd_addr_cmp (& info -> bdaddr ,& bdaddr )) {
839- WIIUSE_DEBUG ("Wiimote already active in slot %d" , i );
840- slot = i ;
841- break ;
842- }
843- }
844-
845- // Not active, try to make active
846- if (slot >= CONF_PAD_MAX_ACTIVE ) {
853+ slot = GetActiveSlot (& info -> bdaddr );
854+ if (slot < CONF_PAD_MAX_ACTIVE ) {
855+ WIIUSE_DEBUG ("Wiimote already active in slot %d" , slot );
856+ } else {
857+ // Not active, try to make active
858+ slot = WPAD_MAX_DEVICES ;
847859 for (i = 0 ; i < CONF_PAD_MAX_ACTIVE ; i ++ ) {
848860 if (!(__wpads_used & (1 <<i ))) {
849861 WIIUSE_DEBUG ("Attempting to connect to Wiimote using slot %d" , i );
@@ -855,7 +867,7 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata)
855867 } else {
856868 // Check for balance board
857869 BD_ADDR_FROM_BYTES (& (bdaddr ),__wpad_devs .balance_board .bdaddr );
858- if (bd_addr_cmp (& info -> bdaddr ,& bdaddr )) {
870+ if (bd_addr_cmp (& info -> bdaddr ,& bdaddr )) {
859871 WIIUSE_DEBUG ("Balance Board already registered" );
860872 slot = WPAD_BALANCE_BOARD ;
861873 }
@@ -888,23 +900,6 @@ s32 __wpad_read_remote_name_finished(s32 result,void *userdata)
888900 return result ;
889901}
890902
891- static s32 GetActiveSlot (struct bd_addr * pad_addr )
892- {
893- int i ;
894- int slot = CONF_PAD_MAX_ACTIVE ;
895- struct bd_addr bdaddr ;
896-
897- for (i = 0 ; i < CONF_PAD_MAX_ACTIVE ; i ++ ) {
898- BD_ADDR_FROM_BYTES (& bdaddr ,__wpad_devs .active [i ].bdaddr );
899- if (bd_addr_cmp (pad_addr ,& bdaddr )) {
900- slot = i ;
901- break ;
902- }
903- }
904-
905- return slot ;
906- }
907-
908903static s32 GetRegisteredSlot (struct bd_addr * pad_addr )
909904{
910905 int i ;
@@ -1732,7 +1727,10 @@ s32 WPAD_Shutdown(void)
17321727 BTE_Close ();
17331728
17341729 __wpad_confsave_thread_stop ();
1735- CONF_SetPadGuestDevices (& __wpad_guests );
1730+ if (__wpad_guests_inited ) {
1731+ CONF_SetPadGuestDevices (& __wpad_guests );
1732+ }
1733+
17361734 CONF_SaveChanges ();
17371735
17381736 __wpads_inited = WPAD_STATE_DISABLED ;
0 commit comments