現在、LeJOS Ev3 ライブラリを使用しており、次のリスナーをプログラムしています。
import lejos.hardware.port.Port;
import robots.ev3.drive.parts.LightSensor;
public abstract class LightListener {
protected int trigger;
protected boolean dark;
public LightListener(int triggerLevel) { trigger = triggerLevel; }
public void notify(LightSensor s) {
// Depending on the value that s measures, either the method
// dark or bright is called
}
public void initialValue(int level) {
dark = level < trigger;
}
abstract public void bright(Port port, int level);
abstract public void dark(Port port, int level);
}
ご覧のとおり、センサーが何を測定しているかに応じて、さまざまなメソッドを呼び出すことになっている notify というメソッドがあります。値が変化したかどうかを常にチェックする while ループを使用せずに、センサーが測定している値が変化したときにのみ通知メソッドを呼び出すことができるようにしたいと考えています。しかし、これを達成する方法を考えたり見つけたりすることができませんでした。
私に起こった唯一のことは、このコードを実行するスレッドを開始することです:
while(true) {
waitForSensorValueToChange();
listener.notify(sensor);
}
しかし、繰り返しになりますが、イベントが発生するのを待つことができるかどうかさえわかりません (常に値をチェックする必要はありません)。
編集 - 繰り返し提案されてきたので、LightSensor に addLightListener(LightListener listener) というメソッドを既に追加したことを述べます。これは、ポーリングを回避するという私の問題を解決しません。