Java State Machine Auto

Inhaltsverzeichnis ⇒ Java Algorithm Library-Artery-Sample

Q08_01.java


package jp.avaj.lib.algo;

import jp.avaj.lib.test.ArTest;

/**
ArStateMechine-Zustandsmaschine-Wagen

・ Nehmen Sie das Auto als sehr einfaches Beispiel für die Zustandsmaschine
・ Es ist im Vergleich zum tatsächlichen Auto zu einfach, aber es macht Folgendes
・ Gas geben ⇒ Motor dreht sich ⇒ Räder drehen sich
・ Gas geben ⇒ Motor stoppt ⇒ Räder stoppen

-In diesem Beispiel wird ArStateMachineDefault als Implementierung von ArStateMachine verwendet.
-ArStateMachineDefault kann weitere Ereignisse auslösen, wenn sich die Zustandsmaschine ändert
・ Gaspedal ⇒ Motor ⇒ Radereignisgetriebe nutzt diese Funktion.

 */
public class Q08_01 {

  public static void main(String[] args) {
    //Radzustandsmaschine
    ArStateMachineDefault wheel = new ArStateMachineDefault();
    {
      //Zustandsübergangsmatrix
      ArStateTransition[] matrix = new ArStateTransition[] {
        //Ereignis während der Drehung stoppen ⇒ Stopp
        new ArStateTransition(WheelState.ROTATE,WheelEvent.OFF,WheelState.STOP,null),
        //Betriebsereignis im gestoppten Zustand ⇒ Drehen
        new ArStateTransition(WheelState.STOP,WheelEvent.ON,WheelState.ROTATE,null),
      };
      //Grundeinstellung,Anfangs gestoppt
      wheel.init(WheelState.STOP, matrix);
    }
    //Motorzustandsmaschine
    ArStateMachineDefault engine = new ArStateMachineDefault();
    {
      //Zustandsübergangsmatrix
      ArStateTransition[] matrix = new ArStateTransition[] {
        //Ereignis während der Drehung stoppen ⇒ Stopp, WheelEvent.Ausschalten
        new ArStateTransition(EngineState.ROTATE,EngineEvent.OFF,EngineState.STOP,WheelEvent.OFF),
        //Ereignis starten, während gestoppt ⇒ Drehen, WheelEvent.Ausschalten
        new ArStateTransition(EngineState.STOP,EngineEvent.ON,EngineState.ROTATE,WheelEvent.ON)
      };
      //Grundeinstellung, zunächst gestoppt
      engine.init(EngineState.STOP,matrix);
      //Mit Rädern verbinden(true verbindet,falsche Verbindungsabbrüche)⇒ Ereignis wird gesendet
      engine.connect(wheel,true);
    }
    //Beschleuniger-Zustandsmaschine
    ArStateMachineDefault accel = new ArStateMachineDefault();
    {
      //Zustandsübergangsmatrix
      ArStateTransition[] matrix = new ArStateTransition[] {
        //Ereignis, das beim Betreten ausgelöst werden soll ⇒ AUS,EngineEvent.Ausschalten
        new ArStateTransition(AccelState.ON,AccelEvent.OFF,AccelState.OFF,EngineEvent.OFF),
        //Ereignis, auf das getreten werden soll, während es getrennt ist ⇒ Einschalten,EngineEvent.Schalte ein
        new ArStateTransition(AccelState.OFF,AccelEvent.ON,AccelState.ON,EngineEvent.ON)
      };
      //Grundeinstellung, zunächst getrennt
      accel.init(AccelState.OFF,matrix);
      //Mit dem Motor verbinden(true verbindet,falsche Verbindungsabbrüche)⇒ Ereignis wird gesendet
      accel.connect(engine,true);
    }

    //Starten Sie einen Testfall
    ArTest.startTestCase("Q08_01");

    //Treten Sie auf das Gaspedal
    accel.sendEvent(AccelEvent.ON);
    //Stellen Sie sicher, dass der Motor läuft
    ArTest.equals("accel:on","expected",EngineState.ROTATE,"engine",engine.getState());
    //Stellen Sie sicher, dass die Räder durchdrehen
    ArTest.equals("accel:on","expecteed",WheelState.ROTATE,"wheel",wheel.getState());

    //Lassen Sie das Gaspedal los
    accel.sendEvent(AccelEvent.OFF);
    //Stellen Sie sicher, dass der Motor abgestellt ist
    ArTest.equals("accel:off","expected",EngineState.STOP,"engine",engine.getState());
    //Stellen Sie sicher, dass die Räder angehalten sind
    ArTest.equals("accel:off","expecteed",WheelState.STOP,"wheel",wheel.getState());

    //Beenden Sie den Testfall
    ArTest.endTestCase();
  }
  /**Beschleunigerstatus. */
  static enum AccelState { ON,OFF; }
  /**Ereignis zum Beschleuniger. */
  static enum AccelEvent { ON,OFF; }

  /**Motorzustand. */
  static enum EngineState { ROTATE,STOP; }
  /**Ereignis zum Motor. */
  static enum EngineEvent { ON,OFF; }

  /**Radzustand. */
  static enum WheelState { ROTATE,STOP; }
  /**Ereignis zum Lenkrad. */
  static enum WheelEvent { ON,OFF; }
}


Das Ergebnis ist wie folgt.

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

Recommended Posts

Java State Machine Auto
Ich habe Spring State Machine ausprobiert
Was ist JVM (Java Virtual Machine)?
Java
Java
Beispielautomat mit Java
Java markiert PPT-Dokumente als Endzustand
Beispiel eines mit Java hergestellten Verkaufsautomaten (Klassifizierung)
Verkaufsautomat mit Java (domänengesteuert)