diff --git a/pom.xml b/pom.xml
index a801ce9..e47be07 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
de.srsoftware
web4rail
- 1.2.20
+ 1.2.21
Web4Rail
jar
Java Model Railway Control
diff --git a/src/main/java/de/srsoftware/web4rail/BaseClass.java b/src/main/java/de/srsoftware/web4rail/BaseClass.java
index 5c94935..cea381a 100644
--- a/src/main/java/de/srsoftware/web4rail/BaseClass.java
+++ b/src/main/java/de/srsoftware/web4rail/BaseClass.java
@@ -127,6 +127,7 @@ public abstract class BaseClass implements Constants{
sb.append("(");
sb.append(t("Train: {}",train));
if (isSet(direction)) sb.append(", "+t("Direction: {}",direction));
+ if (isSet(block)) sb.append(", "+t("Block: {}",block));
if (isSet(route)) sb.append(", "+t("Route: {}",route));
if (isSet(contact)) sb.append(", "+t("Contact: {}",contact));
sb.append(")");
diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java
index e78c8b5..c004f74 100644
--- a/src/main/java/de/srsoftware/web4rail/Route.java
+++ b/src/main/java/de/srsoftware/web4rail/Route.java
@@ -42,7 +42,6 @@ import de.srsoftware.web4rail.tiles.Shadow;
import de.srsoftware.web4rail.tiles.Signal;
import de.srsoftware.web4rail.tiles.Tile;
import de.srsoftware.web4rail.tiles.Turnout;
-import de.srsoftware.web4rail.tiles.Turnout.State;
/**
* A route is a vector of tiles that leads from one block to another.
*
@@ -50,6 +49,10 @@ import de.srsoftware.web4rail.tiles.Turnout.State;
*
*/
public class Route extends BaseClass implements Comparable{
+
+ public enum State {
+ FREE, LOCKED, PREPARED, STARTED;
+ }
private static final Logger LOG = LoggerFactory.getLogger(Route.class);
private static final String ACTIONS = "actions";
@@ -64,6 +67,7 @@ public class Route extends BaseClass implements Comparable{
static final String PATH = "path";
static final String SIGNALS = "signals";
static final String TURNOUTS = "turnouts";
+ private State state = State.FREE;
private static final String ROUTE_START = "route_start";
@@ -125,7 +129,7 @@ public class Route extends BaseClass implements Comparable{
timestamp = new Date().getTime();
if (train.speed == 0) aborted = true;
while (train.speed > ENDSPEED) {
- if (aborted) break;
+ if (aborted || train.nextRoutePrepared()) break;
train.setSpeed(train.speed - 5);
try {
sleep(timeStep);
@@ -145,7 +149,7 @@ public class Route extends BaseClass implements Comparable{
public Direction endDirection;
private Vector path;
private Vector signals;
- public Train train;
+ private Train train;
private HashMap triggeredActions = new HashMap();
private HashMap turnouts;
private Block startBlock = null;
@@ -309,14 +313,14 @@ public class Route extends BaseClass implements Comparable{
signals.add(signal);
}
- void addTurnout(Turnout t, State s) {
+ void addTurnout(Turnout t, Turnout.State s) {
turnouts.put(t, s);
}
private Fieldset turnouts() {
Fieldset win = new Fieldset(t("Turnouts"));
Tag list = new Tag("ul");
- for (Entry entry : turnouts.entrySet()) {
+ for (Entry entry : turnouts.entrySet()) {
Turnout turnout = entry.getKey();
Plan.addLink(turnout, turnout+": "+t(entry.getValue().toString()), list);
}
@@ -351,7 +355,7 @@ public class Route extends BaseClass implements Comparable{
}
public void brakeStart() {
- if (isNull(train)) return;
+ if (isNull(train)) return;
brakeProcessor = new BrakeProcessor(this,train);
}
@@ -453,8 +457,9 @@ public class Route extends BaseClass implements Comparable{
public boolean fireSetupActions(Context context) {
ActionList setupActions = triggeredActions.get(ROUTE_SETUP);
- if (isNull(setupActions)) return true;
- return setupActions.fire(context);
+ if (isSet(setupActions) && !setupActions.fire(context)) return false;
+ state = State.PREPARED;
+ return true;
}
private String generateName() {
@@ -499,7 +504,7 @@ public class Route extends BaseClass implements Comparable{
json.put(SIGNALS, signalIds);
JSONArray turnouts = new JSONArray();
- for (Entry entry : this.turnouts.entrySet()) {
+ for (Entry entry : this.turnouts.entrySet()) {
Turnout t = entry.getKey();
turnouts.put(new JSONObject(Map.of(Turnout.ID,t.id().toString(),Turnout.STATE,entry.getValue())));
}
@@ -703,9 +708,9 @@ public class Route extends BaseClass implements Comparable{
break;
}
}
- if (!success) for (Tile tile :alreadyLocked) {
- tile.setRoute(null);
- }
+ if (success) {
+ state = State.LOCKED;
+ } else for (Tile tile :alreadyLocked) tile.setRoute(null);
return success;
}
@@ -801,6 +806,7 @@ public class Route extends BaseClass implements Comparable{
train = null;
}
triggeredContacts.clear();
+ state = State.FREE;
return true;
}
@@ -818,8 +824,8 @@ public class Route extends BaseClass implements Comparable{
file.close();
}
- public void setLast(State state) {
- if (isNull(state) || state == State.UNDEF) return;
+ public void setLast(Turnout.State state) {
+ if (isNull(state) || state == Turnout.State.UNDEF) return;
Tile lastTile = path.lastElement();
if (lastTile instanceof Turnout) addTurnout((Turnout) lastTile,state);
}
@@ -833,9 +839,9 @@ public class Route extends BaseClass implements Comparable{
public boolean setTurnouts() {
Turnout turnout = null;
- for (Entry entry : turnouts.entrySet()) try {
+ for (Entry entry : turnouts.entrySet()) try {
turnout = entry.getKey();
- State targetVal = entry.getValue();
+ Turnout.State targetVal = entry.getValue();
if (!turnout.state(targetVal).succeeded()) return false;
try {
Thread.sleep(500);
@@ -851,6 +857,21 @@ public class Route extends BaseClass implements Comparable{
String[] parts = name().split("-");
return parts[0].trim()+"–"+parts[parts.length-1].trim();
}
+
+ public Route.State state(){
+ return state;
+ }
+
+ public boolean start(Train newTrain) {
+ if (isNull(newTrain)) return false; // can't set route's train to null
+ if (isSet(train)) {
+ if (newTrain != train) return false; // can't alter route's train
+ } else train = newTrain; // set new train
+ ActionList startActions = triggeredActions.get(ROUTE_START);
+ if (isSet(startActions) && !startActions.fire(new Context(this).train(train))) return false; // start actions failed
+ state = State.STARTED;
+ return true;
+ }
public Block startBlock() {
return startBlock;
@@ -874,15 +895,8 @@ public class Route extends BaseClass implements Comparable{
if (isSet(train)) train.addToTrace(trace);
}
- public boolean train(Train newTrain) {
- if (isSet(train) && newTrain != train) return false;
- train = newTrain;
- if (isSet(train)) {
- ActionList startActions = triggeredActions.get(ROUTE_START);
- if (isNull(startActions)) return true;
- return startActions.fire(new Context(this).train(train));
- }
- return true;
+ public Train train() {
+ return train;
}
public Route unlock() throws IOException {
diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java
index 0761a99..2d19c9a 100644
--- a/src/main/java/de/srsoftware/web4rail/moving/Train.java
+++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java
@@ -496,6 +496,10 @@ public class Train extends BaseClass implements Comparable {
this.name = newName;
return this;
}
+
+ public boolean nextRoutePrepared() {
+ return isSet(nextRoute) && nextRoute.state() == Route.State.PREPARED;
+ }
@Override
protected Window properties(List