diff --git a/pom.xml b/pom.xml index a967a7b..04ce705 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 0.10.16 + 0.11.1 Web4Rail jar Java Model Railway Control diff --git a/src/main/java/de/srsoftware/web4rail/Range.java b/src/main/java/de/srsoftware/web4rail/Range.java new file mode 100644 index 0000000..2d31f59 --- /dev/null +++ b/src/main/java/de/srsoftware/web4rail/Range.java @@ -0,0 +1,37 @@ +package de.srsoftware.web4rail; + +import java.util.Map; +import java.util.Random; + +import org.json.JSONObject; + +/** + * Class for integer ranges (min…max) + * @author Stephan Richter + */ +public class Range { + private static final Random random = new Random(); + private static final String MAX = "max"; + private static final String MIN = "min"; + + public int min=0,max=10000; + + public JSONObject json() { + return new JSONObject(Map.of(MIN,min,MAX,max)); + } + + public Range load(JSONObject json) { + min = json.getInt(MIN); + max = json.getInt(MAX); + return this; + } + + public int random() { + return min + random.nextInt(max - min); + } + + @Override + public String toString() { + return min+"…"+max; + } +} diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java index 9715ca2..f3fb852 100644 --- a/src/main/java/de/srsoftware/web4rail/Route.java +++ b/src/main/java/de/srsoftware/web4rail/Route.java @@ -365,6 +365,7 @@ public class Route extends BaseClass{ } if (isSet(train)) { train.set(endBlock); + train.setWaitTime(endBlock.getWaitTime(train)); train.heading(endDirection.inverse()); if (train.route == this) train.route = null; } diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java index 35aa342..0069d28 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Train.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java @@ -27,6 +27,7 @@ import de.srsoftware.web4rail.Application; import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Plan; import de.srsoftware.web4rail.Plan.Direction; +import de.srsoftware.web4rail.Range; import de.srsoftware.web4rail.Route; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.actions.Action.Context; @@ -47,7 +48,6 @@ public class Train extends BaseClass implements Comparable { public static final String LOCO_ID = "locoId"; private static final String TRACE = "trace"; private static final HashMap trains = new HashMap<>(); - public static final String ID = "id"; public int id; @@ -79,6 +79,7 @@ public class Train extends BaseClass implements Comparable { private class Autopilot extends Thread{ boolean stop = false; + int waitTime = 100; @Override public void run() { @@ -86,7 +87,9 @@ public class Train extends BaseClass implements Comparable { stop = false; while (true) { if (isNull(route)) { - Thread.sleep(1000); + LOG.debug("Waiting {} secs...",waitTime/1000d); + Thread.sleep(waitTime); + if (waitTime > 100) waitTime /=2; if (stop) return; Train.this.start(); } @@ -645,4 +648,8 @@ public class Train extends BaseClass implements Comparable { public void removeFromTrace(Tile tile) { trace.remove(tile); } + + public void setWaitTime(Range waitTime) { + if (autopilot != null) autopilot.waitTime = waitTime.random(); + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java index bc4568c..92570f8 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java @@ -13,6 +13,7 @@ import org.json.JSONObject; import de.srsoftware.tools.Tag; import de.srsoftware.web4rail.Connector; import de.srsoftware.web4rail.Plan.Direction; +import de.srsoftware.web4rail.Range; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.moving.Train; import de.srsoftware.web4rail.tags.Button; @@ -33,8 +34,6 @@ public abstract class Block extends StretchableTile{ private static final String NO_TAG = "[default]"; private static final String NEW_TAG = "new_tag"; private static final String TAG = "tag"; - private static final String MAX = "max"; - private static final String MIN = "min"; private static final String WAIT_TIMES = "wait_times"; public String name = "Block"; @@ -50,28 +49,6 @@ public abstract class Block extends StretchableTile{ waitTimes.add(defaultWT); } - /** - * class for min-max range - */ - public class Range{ - public int min=0,max=10000; - - public JSONObject json() { - return new JSONObject(Map.of(MIN,min,MAX,max)); - } - - public Range load(JSONObject json) { - min = json.getInt(MIN); - max = json.getInt(MAX); - return this; - } - - @Override - public String toString() { - return min+"…"+max; - } - } - /** * aggregates all (directional) wait times for one tag */ @@ -313,4 +290,13 @@ public abstract class Block extends StretchableTile{ } return null; } + + public Range getWaitTime(Train train) { + for (WaitTime wt : waitTimes) { + if (train.tags().contains(wt.tag)) { + return wt.get(train.direction()); + } + } + return getWaitTime(NO_TAG).get(train.direction()); + } }