Help us understand the problem. What is going on with this article?

java 状態マシン 自動車

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした