Found some good documentation on the protocol here. Relevant to the re-init process: "With no controller attached, the gamecube probes for a controller by sending the sequence 000000001 about every 12ms." Looks like we want something along the lines of what I have above, except instead of if(!timeouted()), else..., make it while(timeouted()) {init() then wait 12ms}