2008年5月16日金曜日

Sensorを使おう!!

相変わらず,ノラリクラリとSunSPOTで遊んでいます.

今回はセンサーの使い方メモ.
SunSPOTのeDemoボードには,
- 照度センサー
- 3軸加速度センサー
- 温度センサー
が付いています.
当然ながら開発者はこれらのセンサーから,値を取得したり,値の変化イベントを拾ったり出来ます.

そんなわけで,やり方メモ.今回は照度センサーを例にしますが,別のセンサーでも大差ありません.また,スイッチなんかも全て同じような使い方です(これがオブジェクト指向の良いトコロ).


1.照度センサーのインスタンス作成.
これは,EDemoBoard.getInstance().get~でいけます.~の部分はセンサーによって異なります.例えばこんな感じ.
ILightSensor Light = EDemoBoard.getInstance().getLightSensor();


2.センサーから現在の値を取得.
センサーが現在観察している値を取得するメソッドです.
但し,こいつはセンサーごとにメソッド名・引数共に異なりますので注意!!
Light.getAverageValue()
// 又は
Light.getAverageValue(int n)


3.イベントを拾う
Javaプログラマはおなじみのイベントハンドラの登録です.
手順としては,
-1- イベントハンドラの作成と登録
-2- 閾値(Threshold)の設定
-3- 閾値イベントの有効化
です.
注意事項としては,-3-で有効化した閾値イベントの有効期限は1度だけです.どーいうことかというと,閾値イベントを有効にしておけば,値が閾値を越えたときに登録したイベントハンドラのメソッドが呼ばれます.しかし,そこで閾値イベントは無効になり,次回からは閾値を超えてもイベントハンドラは呼ばれません.これを避けるためには,イベントハンドラ内で再び閾値イベントを有効にする必要があります.

ま,これは実際にソースを見たほうが早いでしょう.
// イベントハンドラ登録
Light.addILightSensorThresholdListener(new ILightSensorThresholdListener() {
// 閾値を越える変化があった時に呼び出される.
public void thresholdExceeded(ILightSensor light, int val) {
System.out.println("thresholdExceeded!!");
System.out.println("val:" + val);
light.enableThresholdEvents(true); // イベント登録は毎回有効にする.
}
// 閾値が変更されたとき呼び出される
public void thresholdChanged(ILightSensor light, int low, int high) {
System.out.println("thresholdChanged!!");
System.out.println("Low:" + low + "\tHigh:" + high);
}
});
Light.setThresholds(20, 60); // 閾値の設定(直後にthresholdChangedが呼ばれる
Light.enableThresholdEvents(true);// イベント登録を有効化

ソースから分かるように,ThresholdListenerは2つのメソッドを持ちます.1つは,閾値を越えたときに呼ばれるメソッド.もう1つは,閾値が変更されたときに呼ばれるメソッドです.これは,他のセンサーにも共通なようです.

追記
さっき気づいたのだけれども,SPOT ManagerのConsoleに
SDK Color: "purple". Demos color: "orange". Release mismatch. Demos not installable.

のエラーが.
確かにNetBeans上でDemo眺めてるとクラスが見つからなかったり不思議なエラーが出てたなぁと,しみじみ納得.

0 件のコメント: