目次 ⇒ Javaアルゴリズムライブラリ-Artery-サンプル
Q08_01.java
package jp.avaj.lib.algo;
import jp.avaj.lib.test.ArTest;
/**
ArStateMechine-状態マシン-自動車
・状態マシンのごく簡単なサンプルとして自動車を取り上げる
・実際の自動車と比較すれば、簡単すぎるが、次の動作をする
・アクセルを踏む⇒エンジンが回転する⇒車輪が回転する
・アクセルを離す⇒エンジンが停止する⇒車輪が停止する
・本サンプルではArStateMachineの実装としてArStateMachineDefaultを使用している
・ArStateMachineDefaultは状態マシンが変化した時に、さらにイベントを発生させることができる
・アクセル⇒エンジン⇒車輪のイベント伝達は、この機能を利用している.
*/
public class Q08_01 {
public static void main(String[] args) {
// 車輪の状態マシン
ArStateMachineDefault wheel = new ArStateMachineDefault();
{
// 状態遷移マトリックス
ArStateTransition[] matrix = new ArStateTransition[] {
// 回転中に停止イベント⇒停止する
new ArStateTransition(WheelState.ROTATE,WheelEvent.OFF,WheelState.STOP,null),
// 停止中に動作イベント⇒回転する
new ArStateTransition(WheelState.STOP,WheelEvent.ON,WheelState.ROTATE,null),
};
// 初期設定する,最初は停止状態
wheel.init(WheelState.STOP, matrix);
}
// エンジンの状態マシン
ArStateMachineDefault engine = new ArStateMachineDefault();
{
// 状態遷移マトリックス
ArStateTransition[] matrix = new ArStateTransition[] {
// 回転中に停止イベント⇒停止する、WheelEvent.OFFを出す
new ArStateTransition(EngineState.ROTATE,EngineEvent.OFF,EngineState.STOP,WheelEvent.OFF),
// 停止中に起動イベント⇒回転する、WheelEvent.OFFを出す
new ArStateTransition(EngineState.STOP,EngineEvent.ON,EngineState.ROTATE,WheelEvent.ON)
};
// 初期設定する、最初は停止状態
engine.init(EngineState.STOP,matrix);
// 車輪と結びつける(trueは接続する,falseは接続断する)⇒イベントが送信される
engine.connect(wheel,true);
}
// アクセルの状態マシン
ArStateMachineDefault accel = new ArStateMachineDefault();
{
// 状態遷移マトリックス
ArStateTransition[] matrix = new ArStateTransition[] {
// 踏込んだ状態で離すイベント⇒OFFになる,EngineEvent.OFFを出す
new ArStateTransition(AccelState.ON,AccelEvent.OFF,AccelState.OFF,EngineEvent.OFF),
// 離した状態で踏込むイベント⇒ONになる,EngineEvent.ONを出す
new ArStateTransition(AccelState.OFF,AccelEvent.ON,AccelState.ON,EngineEvent.ON)
};
// 初期設定する、最初は離した状態
accel.init(AccelState.OFF,matrix);
// エンジンと結びつける(trueは接続する,falseは接続断する)⇒イベントが送信される
accel.connect(engine,true);
}
// テストケースを開始する
ArTest.startTestCase("Q08_01");
// アクセルを踏み込む
accel.sendEvent(AccelEvent.ON);
// エンジンが回転していることを確認する
ArTest.equals("accel:on","expected",EngineState.ROTATE,"engine",engine.getState());
// 車輪が回転していることを確認する
ArTest.equals("accel:on","expecteed",WheelState.ROTATE,"wheel",wheel.getState());
// アクセルを離す
accel.sendEvent(AccelEvent.OFF);
// エンジンが停止していることを確認する
ArTest.equals("accel:off","expected",EngineState.STOP,"engine",engine.getState());
// 車輪が停止していることを確認する
ArTest.equals("accel:off","expecteed",WheelState.STOP,"wheel",wheel.getState());
// テストケースを終了する
ArTest.endTestCase();
}
/** アクセルの状態. */
static enum AccelState { ON,OFF; }
/** アクセルへのイベント. */
static enum AccelEvent { ON,OFF; }
/** エンジンの状態. */
static enum EngineState { ROTATE,STOP; }
/** エンジンへのイベント. */
static enum EngineEvent { ON,OFF; }
/** 車輪の状態. */
static enum WheelState { ROTATE,STOP; }
/** 車輪へのイベント. */
static enum WheelEvent { ON,OFF; }
}
結果は次のとおり。
result.txt
**** Q08_01 start ****
OK accel:on:expected=ROTATE:engine=ROTATE
OK accel:on:expecteed=ROTATE:wheel=ROTATE
OK accel:off:expected=STOP:engine=STOP
OK accel:off:expecteed=STOP:wheel=STOP
**** Q08_01 summary ****
test count = 4
success = 4