JavaでWiiリモコンを使ってみる

今回はJavaでWiiリモコンを使ってみたいと思います。

日本語文献が少ないうえに古いので、新しい文献として使っていただければなと思います。

# 注意
WiiリモコンをPCにBluetoothデバイスとしてペアリングしなければ動作しません。
必ずペアリングしてから実行してください。

# 環境
Windows 10 Home Edition
Eclipse 4.6
Java 1.8

# ライブラリの調達
Mavenとかではなく普通のプロジェクトとして進めていきます。

## WiiuseJ
https://code.google.com/archive/p/wiiusej/downloads のWiiusej 0.12a.zip

# プロジェクトのセットアップ
リソースフォルダ内にWindowsならwiiuse.dllとWiiUseJ.dll、Macユーザならlibwiiuse.soとlibWiiuseJ.soを入れましょう。

# ライブラリを弄る
## とりあえずWiiリモコンを探す
Wiiリモコンが見つかった場合にはwiimote変数にWiiリモコンのオブジェクトが入ります。

```java:example.java
import com.github.awvalenti.wiiusej.WiiusejNativeLibraryLoadingException;

import wiiusej.WiiUseApiManager;
import wiiusej.Wiimote;

public class MainAccessPoint {
	
	private Wiimote wiimote;
	private Wiimote[] wiimotes;
	
	public MainAccessPoint() throws InterruptedException {
		try {
			System.out.println("Finding wiimotes...");
			
			while(wiimotes == null) {
				/*2019/8/5 ミスがありました。getWiimotes(1);ではなく、getWiimotes(1, true);でした。またWiiUseApiManagerへはstaticアクセスでした。*/
				wiimotes = WiiUseApiManager.getWiimotes(1, true);
				if(wiimotes != null && wiimotes.length > 0) {
					wiimote = wiimotes[0];
					System.out.println("Wiiリモコンが見つかりました。 Id: " + wiimote.getId());
					break;
				}
				wiimotes = null;
				continue;
			}
			
		} catch (WiiusejNativeLibraryLoadingException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String args[]) throws InterruptedException {
		MainAccessPoint main = new MainAccessPoint();
	}
}
```

## LEDを変えてみる
１番目の引数から左から順番にbooleanで指定します。

```java:
wiimote.setLeds(true, false, false, false);
```

## Wiiリモコンにリスナを登録する
以下のリスナをwiimoteに登録します。

### リスナ
```java:Listener.java
import wiiusej.values.GForce;
import wiiusej.wiiusejevents.physicalevents.ExpansionEvent;
import wiiusej.wiiusejevents.physicalevents.IREvent;
import wiiusej.wiiusejevents.physicalevents.MotionSensingEvent;
import wiiusej.wiiusejevents.physicalevents.WiimoteButtonsEvent;
import wiiusej.wiiusejevents.utils.WiimoteListener;
import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerInsertedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.ClassicControllerRemovedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.DisconnectionEvent;
import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroInsertedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.GuitarHeroRemovedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.NunchukInsertedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.NunchukRemovedEvent;
import wiiusej.wiiusejevents.wiiuseapievents.StatusEvent;

public class Listener implements WiimoteListener {

    public Listener() {
    }

    // ボタン押下時に発火。どのボタンかはメソッド名でわかると思います。
    @Override
    public void onButtonsEvent(WiimoteButtonsEvent arg0) {
        if(arg0.isButtonHomeJustPressed()) {

        } else if(arg0.isButtonHomeJustReleased()) {

        } else if(arg0.isButtonPlusJustPressed()) {

        } else if(arg0.isButtonPlusJustReleased()) {

        } else if(arg0.isButtonMinusJustPressed()) {

        } else if(arg0.isButtonMinusJustReleased()) {

        } else if(arg0.isButtonOneJustPressed()) {

        } else if(arg0.isButtonOneJustReleased()) {

        } else if(arg0.isButtonTwoJustPressed()) {

        } else if(arg0.isButtonTwoJustReleased()) {

        } else if(arg0.isButtonAJustPressed()) {

        } else if(arg0.isButtonAJustReleased()) {

        } else if(arg0.isButtonBJustPressed()) {

        } else if(arg0.isButtonBJustReleased()) {

        } else if(arg0.isButtonRightJustPressed()) {

        } else if(arg0.isButtonRightJustReleased()) {

        } else if(arg0.isButtonLeftJustPressed()) {

        } else if(arg0.isButtonLeftJustReleased()) {

        } else if(arg0.isButtonUpJustPressed()) {

        } else if(arg0.isButtonUpJustReleased()) {

        } else if(arg0.isButtonDownJustPressed()) {

        } else if(arg0.isButtonDownJustReleased()) {

        }
    }

    // Wiiリモコンが動いた時に発火。
    @Override
    public void onMotionSensingEvent(MotionSensingEvent arg0) {
        // 3軸加速度センサの値が１～-１の範囲で返ってきます。
        GForce force = arg0.getGforce();
        System.out.println("X: " + force.getX());
        System.out.println("Y: " + force.getY());
        System.out.println("Z: " + force.getZ());
    }

    @Override public void onStatusEvent(StatusEvent arg0) {}
    @Override public void onDisconnectionEvent(DisconnectionEvent arg0) {}
    @Override public void onClassicControllerInsertedEvent(ClassicControllerInsertedEvent arg0) {}
    @Override public void onClassicControllerRemovedEvent(ClassicControllerRemovedEvent arg0) {}
    @Override public void onExpansionEvent(ExpansionEvent arg0) {}
    @Override public void onGuitarHeroInsertedEvent(GuitarHeroInsertedEvent arg0) {}
    @Override public void onGuitarHeroRemovedEvent(GuitarHeroRemovedEvent arg0) {}
    @Override public void onIrEvent(IREvent arg0) {}
    @Override public void onNunchukInsertedEvent(NunchukInsertedEvent arg0) {}
    @Override public void onNunchukRemovedEvent(NunchukRemovedEvent arg0) {}

}
```

### リスナをwiimoteに登録

```java
wiimote.addWiiMoteEventListeners(new Listener());
```

### モーションリスナを有効化する
モーションを取得するには以下のコードを書く必要があります。

```java
wiimote.activateMotionSensing();
```

また何かわかったら追記します。
わからないこと等あればコメントでお願いします。