LoginSignup
0
0

More than 3 years have passed since last update.

java 状態マシン 自動車

Posted at

目次 ⇒ 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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0