leJOS EV3でタッチセンサーのon／offのイベント処理

```TouchDetectorSample.java
package ev3.touchDetector;

import lejos.hardware.Button;
import lejos.hardware.port.SensorPort;
import lejos.hardware.sensor.BaseSensor;
import lejos.hardware.sensor.EV3TouchSensor;
import lejos.robotics.Touch;
import lejos.robotics.TouchAdapter;
import lejos.robotics.objectdetection.Feature;
import lejos.robotics.objectdetection.FeatureDetector;
import lejos.robotics.objectdetection.FeatureListener;
import lejos.robotics.objectdetection.TouchFeatureDetector;

public class TouchDetectorSample {

	public static void main(String[] args) {
		EV3TouchSensor ts = new EV3TouchSensor(SensorPort.S1); // S1ポートのタッチセンサーを使えるようにする

		// タッチセンサーが押されたときに処理するように設定する
		Touch touch = new TouchAdapter(ts);
		TouchFeatureDetector touchDetector = new TouchFeatureDetector(touch);
		touchDetector.addListener(new PressedProcess());
		
		// タッチセンサーが放されたときに処理するように設定する
		Touch release = new ReleaseAdapter(ts);
		TouchFeatureDetector releaseDetector = new TouchFeatureDetector(release);
		releaseDetector.addListener(new ReleasedProcess());

		Button.waitForAnyPress();	// 何かボタンが押されるまで待つ
	}
	
}

// EV3のAPIにあるTouchAdapterのisPressed()の結果を反転させて、放されたときにイベントを発生させる
class ReleaseAdapter extends TouchAdapter {

	public ReleaseAdapter(BaseSensor touchSensor) {
		super(touchSensor);
	}

	public boolean isPressed() {
		return !super.isPressed();
	}

}

// タッチセンサーが押された時の処理を持つクラス
class PressedProcess implements FeatureListener {

	public void featureDetected(Feature feature, FeatureDetector detector) {
		System.out.println("Pressed");
	}
	
}

// タッチセンサーが放された時の処理を持つクラス
class ReleasedProcess implements FeatureListener {

	public void featureDetected(Feature feature, FeatureDetector detector) {
		System.out.println("Released");
	}
	
}
```

フィールドの値を変更する場合のサンプル

```TouchDetectorUseFieldSample.java
package ev3.touchDetector;

import lejos.hardware.Button;
import lejos.hardware.port.SensorPort;
import lejos.hardware.sensor.EV3TouchSensor;
import lejos.robotics.Touch;
import lejos.robotics.TouchAdapter;
import lejos.robotics.objectdetection.Feature;
import lejos.robotics.objectdetection.FeatureDetector;
import lejos.robotics.objectdetection.FeatureListener;
import lejos.robotics.objectdetection.TouchFeatureDetector;
import lejos.utility.Delay;

public class TouchDetectorUseFieldSample {
	static boolean isPressed = false;
	
	public static void main(String[] args) {
		EV3TouchSensor ts = new EV3TouchSensor(SensorPort.S1); // S1ポートのタッチセンサーを使えるようにする

		// タッチセンサーが押されたときに処理するように設定する
		Touch touch = new TouchAdapter(ts);
		TouchFeatureDetector touchDetector = new TouchFeatureDetector(touch);
		touchDetector.addListener(new PressedProcess());
		
		// タッチセンサーが放されたときに処理するように設定する
		Touch release = new ReleaseAdapter(ts);
		TouchFeatureDetector releaseDetector = new TouchFeatureDetector(release);
		releaseDetector.addListener(new ReleasedProcess());

		while(!Button.ESCAPE.isDown()) {
			System.out.println("Pressed:" + isPressed);	// isPressedフィールドの値を表示する
			Delay.msDelay(500);	// 500ミリ秒まつ
		}
		
	}

	// タッチセンサーが押された時の処理を持つクラス
	static class PressedProcess implements FeatureListener {
		public void featureDetected(Feature feature, FeatureDetector detector) {
			isPressed = true;
		}
	}

	// タッチセンサーが放された時の処理を持つクラス
	static class ReleasedProcess implements FeatureListener {
		public void featureDetected(Feature feature, FeatureDetector detector) {
			isPressed = false;
		}
	}
}

```