yashiganiの英傑になるまで死ねない日記

週末はマスターバイクでハイラルを走り回ります

WiiRemoteJ 試してみた

Java から Wiiリモコン を触れる WiiRemoteJ というライブラリがあるので試してみた


ライブラリのインストールらへんはググればすぐわかるので,置いといて
記述自体はべりー簡単
これだけで Wiiリモコン をマウスの代わりに使える

import wiiremotej.*;
import wiiremotej.event.*;

import java.awt.AWTException;
import java.io.IOException;

public class WiiRemoteMouseEmulator extends WiiRemoteAdapter {
  public static void main(String[] args)  throws IOException {
    System.setProperty("bluecove.jsr82.psm_minimum_off", "true");
    WiiRemoteJ.setConsoleLoggingAll();

    WiiRemote remote = null;

    while (remote == null) {
      try {
        System.out.println("scan...");
        remote = WiiRemoteJ.findRemote();
      }
      catch(Exception e) {
        remote = null;
        e.printStackTrace();
        System.out.println("Failed to connect remote. Trying again.");
      }
    }

    remote.addWiiRemoteListener(new WiiRemoteMouseEmulator(remote));
    remote.setAccelerometerEnabled(true);
    remote.setSpeakerEnabled(true);
    remote.setIRSensorEnabled(true, WRIREvent.BASIC);
    remote.setLEDIlluminated(0, true);

    try {
      remote.setMouse(new IRAccelerometerMouse(1.3, 1.3, 0.0001, 0.0001, Math.PI / 4));
    } catch (SecurityException e) {
      e.printStackTrace();
    } catch (AWTException e) {
      e.printStackTrace();
    }
    remote.getButtonMaps().add(new ButtonMouseMap(WRButtonEvent.A, java.awt.event.InputEvent.BUTTON1_MASK));
    remote.getButtonMaps().add(new ButtonMouseMap(WRButtonEvent.B, java.awt.event.InputEvent.BUTTON3_MASK));
    remote.getButtonMaps().add(new ButtonKeyMap(WRButtonEvent.UP, java.awt.event.KeyEvent.VK_UP));
    remote.getButtonMaps().add(new ButtonKeyMap(WRButtonEvent.DOWN, java.awt.event.KeyEvent.VK_DOWN));
    remote.getButtonMaps().add(new ButtonKeyMap(WRButtonEvent.RIGHT, java.awt.event.KeyEvent.VK_RIGHT));
    remote.getButtonMaps().add(new ButtonKeyMap(WRButtonEvent.LEFT, java.awt.event.KeyEvent.VK_LEFT));

    final WiiRemote remoteF = remote;
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable(){ public void run() { remoteF.disconnect(); } } ));
  }

  WiiRemote remote = null;
  public WiiRemoteMouseEmulator(WiiRemote remote) {
    this.remote = remote;
  }

  public void disconnected() {
    System.out.println("Remote disconnected... Please Wii again.");
    System.exit(0);
  }

  public void statusReported(WRStatusEvent evt) {
    System.out.println("Battery level: " + (double)evt.getBatteryLevel()/2+ "%");
    System.out.println("Continuous: " + evt.isContinuousEnabled());
    System.out.println("Remote continuous: " + remote.isContinuousEnabled());
  }

  public void IRInputReceived(WRIREvent evt) {
  }

  public void buttonInputReceived(WRButtonEvent evt) {
    try {
      if (evt.isPressed(WRButtonEvent.HOME)) {
        boolean lightChanged = false;
        if (evt.wasPressed(WRButtonEvent.A + WRButtonEvent.B)) {
          remote.disconnect();
          System.exit(0);
        }
      }
    } catch (Exception e) {e.printStackTrace();}
  }
}


起動して,Wiiリモコン の 1 と 2 を押しながら待ってるとコネクションが確立される
ボタンは

A -> 左クリック
B -> 右クリック
十字キー -> アローキー

にそれぞれ割り当ててある


なかなかコネクションがつながらなかったり,ぶちぶちコネクションが切れたりでイライラはするけど,Wiiリモコン で Mac が動くので楽しい
テレビの画面とかを使ってる人ならだらだら YouTube とか観るのに使えそう

本当はマリカーとかのアクションを盗聴して Twitter にポストしまくるとかしたかったけど,コネクションを Wii に取られると拾えないみたい
残念