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