【leJOS】モーター回転開始、停止時のイベント処理を実装する

## はじめに
この記事はleJOSの開発環境が整っていることが前提にしています。
詳しくはこちらの記事を参考にして下さい。
>
[【leJOS】mindstorm-EV3をJavaでプログラミングしよう【環境構築前編】
](http://qiita.com/murotani/items/2790f1ef5afed3a5d13c)

>
[【leJOS】mindstorm-EV3をJavaでプログラミングしよう【環境構築後編】](http://qiita.com/murotani/items/0972e6f36676c61e3f57)

## 概要
モーターが回転開始した時や、停止した時のイベントを取得する方法をサンプルコードで説明します。
addEventListenerメソッドを使って実装します。

##モーターの回転開始、停止イベント

```java:Ev3Motor.java
import lejos.hardware.Button;
import lejos.hardware.motor.EV3LargeRegulatedMotor;
import lejos.hardware.port.MotorPort;
import lejos.robotics.RegulatedMotor;
import lejos.robotics.RegulatedMotorListener;

public class Ev3Motor {

	private static RegulatedMotor m;

	public static void main(String[] args) {
		m = new EV3LargeRegulatedMotor(MotorPort.A);
		m.addListener(new RotateStateEvent());
        m.rotate(360);
		Button.waitForAnyPress();
	}
}

class RotateStateEvent implements RegulatedMotorListener{
	@Override
	public void rotationStarted(RegulatedMotor motor, int tachoCount, boolean stalled, long timeStamp) {
		System.out.println("ROTATE");		
	}

	@Override
	public void rotationStopped(RegulatedMotor motor, int tachoCount, boolean stalled, long timeStamp) {
		System.out.println("STOP");
	}
	
}


```
サンプルプログラムではRegulatedMotorListenerインターフェースを継承したRotateStateEventクラスのインスタンスをaddEventListenerメソッドの引数に与えています。
RegulatedMotorListenerインターフェースにはモーターが回転開始した時に発火するrotationStartedメソッドと、モーターが回転停止した時に発火するrotationStoppedメソッドが定義されています。
それぞれのメソッド内に実現したい処理を実装しましょう。
サンプルプログラムではLCDにイベントが発火すると"ROTATE"もしくは"STOP"を出力するように実装しました。




## ボタン押下イベントを取得する
同じ要領でEV3本体のボタンの押下イベントを取得することができます。
例えばEV3本体の中心ボタンの押下イベントを登録するにはaddKeyListenerメソッドを使って以下のように書きます。

```java
Button.ENTER.addKeyListener(new ButtonEvent(m));
```
サンプルプログラムでは、引数にlejos.hardware.KeyListenerインターフェースを継承したButtonEventクラスのインスタンスを渡しています。ButtonEventクラス内にボタンが押された時に発火するkeyPressedメソッドと、ボタンが離された時に発火するkeyReleasedイベントを実装します。

ボタンの押下状態によってモーターの回転方向を切り替えるサンプルプログラムを以下に示します。

![スクリーンショット 2017-02-09 20.59.39.png](https://qiita-image-store.s3.amazonaws.com/0/149019/63e81db9-2cd7-1209-1af4-5255e6121702.png)


```java:Ev3Motor.java
import lejos.hardware.Button;
import lejos.hardware.Key;
import lejos.hardware.motor.EV3LargeRegulatedMotor;
import lejos.hardware.port.MotorPort;
import lejos.robotics.RegulatedMotor;
import lejos.robotics.RegulatedMotorListener;
import lejos.hardware.KeyListener;

public class Ev3Motor {

	private static RegulatedMotor m;

	public static void main(String[] args) {
		m = new EV3LargeRegulatedMotor(MotorPort.A);
		m.addListener(new RotateStateEvent()); //モーター回転状態イベントの登録
		Button.UP.addKeyListener(new ButtonEvent(m)); //ボタン押下状態イベントの登録
		Button.DOWN.addKeyListener(new ButtonEvent(m));
		Button.ESCAPE.addKeyListener(new ButtonEvent(m));
		while(true){}
	}
}

class RotateStateEvent implements RegulatedMotorListener{ //モーター回転状態変化イベント
	@Override
	public void rotationStarted(RegulatedMotor motor, int tachoCount, boolean stalled, long timeStamp) { //回転開始時のイベント
		System.out.println("ROTATE");		
	}

	@Override
	public void rotationStopped(RegulatedMotor motor, int tachoCount, boolean stalled, long timeStamp) { //回転停止時のイベント
		System.out.println("STOP");
	}
	
}

class ButtonEvent implements KeyListener{ //ボタン押下状態イベント
	private RegulatedMotor _Motor;
	
	public ButtonEvent(RegulatedMotor Motor) {
		_Motor = Motor;
	}

	@Override
	public void keyPressed(Key k) { //モーターを押した時のイベント
		switch (k.getId()){
		case Button.ID_UP:
			 System.out.println("UP");
			 _Motor.forward();
			 break;
		case Button.ID_DOWN:
			 System.out.println("DOWN");
			 _Motor.backward();
			 break;
		}
	}

	@Override
	public void keyReleased(Key k) { //ボタンを離した時のイベント
		switch (k.getId()){
		case Button.ID_UP:
			 _Motor.stop();
			 break;
		case Button.ID_DOWN:
			 _Motor.stop();
			 break;
		case Button.ID_ESCAPE:
			System.out.println("ESCAPE");
			_Motor.stop();
			System.exit(0);
			break;
		}
	}
	
}
```

## 参考
[【leJOS】JavaでEV3のモーターを制御しよう](http://qiita.com/murotani/private/2a98164f9b3819f8ee64)