package kukaWii.wiiHandle.internal;
import motej.Mote;
import motej.MoteFinder;
import motej.MoteFinderListener;
import motej.event.MoteDisconnectedEvent;
import motej.event.MoteDisconnectedListener;
/**
* Verwaltet eine Verbindung zu einer WiiMote. Rei�t die Verbindung ab, so wird automatisch <code>mote = null</code> gesetzt.
* Dazu ist ggf. ein Listener auf der Mote im Programm anzumelden.
* @author Kai Hufenbach
*
*/
public class Connection {
private static Mote mote = null;
private final MoteFinder finder;
private static final Object LOCK = new Object();
public Connection(){
finder = MoteFinder.getMoteFinder();
MoteFinderListener moteFinderListener = new MoteFinderListener() {
@Override
public void moteFound(Mote m) {
System.out.println("Remote found: " + m.getBluetoothAddress());
mote = m;
mote.setPlayerLeds(new boolean[]{true, false, false, false});
mote.addMoteDisconnectedListener(new MoteDisconnectedListener<Mote>() {
@Override
public void moteDisconnected(MoteDisconnectedEvent<Mote> evt) {
System.out.println("Remote disconnected!");
mote.disconnect();
mote = null;
}
});
synchronized (LOCK){
LOCK.notify();
}
}
};
finder.addMoteFinderListener(moteFinderListener);
}
private void discover(){
if(mote == null){
System.out.println("No remote connected - discovering for 30 seconds.");
finder.startDiscovery();
synchronized (LOCK) {
try {
LOCK.wait(30000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Stop discovery");
finder.stopDiscovery();
}
}
/**
* Gibt Wii-Remote Objekt zur�ck. Sucht, wenn n�tig nach einer neuen Wii-Remote.
* @return Die Wii-Remote
*/
public Mote getRemote(){
while(mote == null){
discover();
}
return mote;
}
}