diff --git a/pom.xml b/pom.xml
index bc893b5..9385e7c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
de.srsoftware
web4rail
- 1.4.12
+ 1.4.13
Web4Rail
jar
Java Model Railway Control
diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java
index 681540c..8244396 100644
--- a/src/main/java/de/srsoftware/web4rail/Route.java
+++ b/src/main/java/de/srsoftware/web4rail/Route.java
@@ -36,6 +36,7 @@ import de.srsoftware.web4rail.tags.Input;
import de.srsoftware.web4rail.tags.Table;
import de.srsoftware.web4rail.tags.Window;
import de.srsoftware.web4rail.threads.RoutePrepper;
+import de.srsoftware.web4rail.threads.Simulator;
import de.srsoftware.web4rail.tiles.Block;
import de.srsoftware.web4rail.tiles.BlockContact;
import de.srsoftware.web4rail.tiles.Contact;
@@ -855,6 +856,10 @@ public class Route extends BaseClass {
return this;
}
+ private void simulate() {
+ new Simulator(this);
+ }
+
public boolean startNow() {
LOG.debug("{}.startNow()",this);
@@ -885,6 +890,8 @@ public class Route extends BaseClass {
}
context.waitTime(endBlock.getWaitTime(train, endDirection).random());
+
+ if (!contacts.isEmpty() && contacts.stream().filter(contact -> contact.addr() != 0).findAny().isEmpty()) simulate();
return true;
}
diff --git a/src/main/java/de/srsoftware/web4rail/threads/Simulator.java b/src/main/java/de/srsoftware/web4rail/threads/Simulator.java
new file mode 100644
index 0000000..e776cef
--- /dev/null
+++ b/src/main/java/de/srsoftware/web4rail/threads/Simulator.java
@@ -0,0 +1,26 @@
+package de.srsoftware.web4rail.threads;
+
+import de.srsoftware.web4rail.Application;
+import de.srsoftware.web4rail.BaseClass;
+import de.srsoftware.web4rail.Route;
+import de.srsoftware.web4rail.tiles.Contact;
+import de.srsoftware.web4rail.tiles.Tile;
+
+public class Simulator extends BaseClass implements Runnable {
+
+ private Route route;
+
+ public Simulator(Route route) {
+ this.route = route;
+ new Thread(this,Application.threadName(this)).start();
+ }
+
+ @Override
+ public void run() {
+ for (Tile tile : route.path()) {
+ sleep(1000);
+ if (tile instanceof Contact) ((Contact)tile).activate(true);
+ }
+ }
+
+}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Bridge.java b/src/main/java/de/srsoftware/web4rail/tiles/Bridge.java
index db6252d..e1068e4 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Bridge.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Bridge.java
@@ -66,6 +66,20 @@ public abstract class Bridge extends Tile {
return super.load(json);
}
+ @Override
+ public boolean lockFor(Context context, boolean downgrade) {
+ if (lockingTrain() == context.train()) return true;
+ if (!super.lockFor(context, downgrade)) return false;
+ return isSet(counterpart) ? counterpart.lockFor(context, downgrade) : true;
+ }
+
+ @Override
+ public boolean reserveFor(Context context) {
+ if (reservingTrain() == context.train()) return true;
+ if (!super.reserveFor(context)) return false;
+ return isSet(counterpart) ? counterpart.reserveFor(context) : true;
+ }
+
@Override
public boolean setTrain(Train newTrain) {
if (occupyingTrain() == newTrain) return true;
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
index a5cbe6b..c07e125 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java
@@ -434,6 +434,10 @@ public abstract class Tile extends BaseClass implements Comparable {
plan.place(this);
return true;
}
+
+ protected Train reservingTrain() {
+ return reservingTrain;
+ }
public TreeSet routes() {
return routes;