diff --git a/pom.xml b/pom.xml
index 8fda7bb..f733371 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
de.srsoftware
web4rail
- 0.10.14
+ 0.10.15
Web4Rail
jar
Java Model Railway Control
diff --git a/resources/css/style.css b/resources/css/style.css
index bb2ed60..e5156c5 100644
--- a/resources/css/style.css
+++ b/resources/css/style.css
@@ -251,3 +251,12 @@ svg.disabled rect{
stroke-width:5;
stroke: red;
}
+
+#train-wait-form input{
+ text-align: right;
+ width: 100px;
+}
+
+#train-wait-form td{
+ text-align: right;
+}
\ No newline at end of file
diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java
index 470bfe0..c5c7e52 100644
--- a/src/main/java/de/srsoftware/web4rail/moving/Train.java
+++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java
@@ -71,11 +71,24 @@ public class Train extends BaseClass implements Comparable {
private Vector locos = new Vector();
private static final String TAGS = "tags";
+ private static final String WAIT_TIMES = "wait_times";
+ private static final String MAX = "max";
+ private static final String MIN = "min";
+
private HashSet tags = new HashSet();
+ private HashMap waitTimes = new HashMap();
private Block block = null;
LinkedList trace = new LinkedList();
+
+ public class WaitTime{
+ public int min =0,max=10000;
+ @Override
+ public String toString() {
+ return min+"..."+max+" s";
+ }
+ }
private class Autopilot extends Thread{
boolean stop = false;
@@ -327,6 +340,11 @@ public class Train extends BaseClass implements Comparable {
json.put(TRACE, tileIds);
if (!tags.isEmpty()) json.put(TAGS, tags);
+ JSONObject jWaitTimes = new JSONObject();
+ for (Entry entry: waitTimes.entrySet()) {
+ jWaitTimes.put(entry.getKey(), Map.of(MIN,entry.getValue().min,MAX,entry.getValue().max));
+ }
+ json.put(WAIT_TIMES, jWaitTimes);
return json;
}
@@ -370,7 +388,14 @@ public class Train extends BaseClass implements Comparable {
if (json.has(BLOCK)) block = (Block) plan.get(json.getString(BLOCK), false).set(this); // do not move this up! during set, other fields will be referenced!
for (Object id : json.getJSONArray(CARS)) add(Car.get(id));
for (Object id : json.getJSONArray(LOCOS)) add((Locomotive) Car.get(id));
-
+ if (json.has(WAIT_TIMES)) {
+ JSONObject jWaitTimes = json.getJSONObject(WAIT_TIMES);
+ for (String key : jWaitTimes.keySet()) {
+ JSONObject wt = jWaitTimes.getJSONObject(key);
+ setWaitTime(key, wt.getInt(MIN), true);
+ setWaitTime(key, wt.getInt(MAX), false);
+ }
+ }
return this;
}
@@ -551,6 +576,22 @@ public class Train extends BaseClass implements Comparable {
this.speed = v;
}
+ public void setWaitTime(String key,int time, boolean min) {
+ WaitTime wt = waitTime(key);
+ if (time < 0) time = 0;
+ if (min) {
+ wt.min = time;
+ if (wt.max < time) wt.max = time;
+ } else {
+ wt.max = time;
+ if (wt.min > time) wt.min = time;
+ }
+ }
+
+ public void setWaitTime(Block block, Direction dir, int time, boolean min) {
+ setWaitTime(block.id()+":"+dir, time, min);
+ }
+
public void showTrace() {
int remainingLength = length();
if (remainingLength<1) remainingLength=1;
@@ -643,11 +684,21 @@ public class Train extends BaseClass implements Comparable {
return this;
}
-
-
-
public void removeFromTrace(Tile tile) {
trace.remove(tile);
}
+
+ public WaitTime waitTime(String key) {
+ WaitTime wt = waitTimes.get(key);
+ if (wt == null) {
+ wt = new WaitTime();
+ waitTimes.put(key, wt);
+ }
+ return wt;
+ }
+
+ public WaitTime waitTime(Block block, Direction dir) {
+ return waitTime(block.id()+":"+dir);
+ }
}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java
index 8e23dec..00a3b61 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java
@@ -4,12 +4,17 @@ import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import org.json.JSONObject;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Connector;
+import de.srsoftware.web4rail.Plan.Direction;
+import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.moving.Train;
+import de.srsoftware.web4rail.moving.Train.WaitTime;
+import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tags.Checkbox;
import de.srsoftware.web4rail.tags.Form;
import de.srsoftware.web4rail.tags.Input;
@@ -33,6 +38,9 @@ public abstract class Block extends StretchableTile{
config.put(NAME, name);
return config;
}
+
+ public abstract Direction directionA();
+ public abstract Direction directionB();
@Override
public JSONObject json() {
@@ -64,6 +72,52 @@ public abstract class Block extends StretchableTile{
return form;
}
+
+ @Override
+ public Window propMenu() {
+ Window win = super.propMenu();
+ Form form = new Form("train-wait-form");
+ new Tag("h4").content(t("Stop settings")).addTo(win);
+ new Input(REALM,REALM_PLAN).hideIn(form);
+ new Input(ID,id()).hideIn(form);
+ new Input(ACTION,ACTION_UPDATE).hideIn(form);
+
+ Tag table = new Tag("table");
+ Tag row = new Tag("tr");
+ new Tag("td").content(t("Direction")).addTo(row);
+ new Tag("th").attr("colspan", 2).content(directionA().toString()).addTo(row);
+ new Tag("th").attr("colspan", 2).content(directionB().toString()).addTo(row);
+
+ row.addTo(table);
+
+ row = new Tag("tr");
+ new Tag("th").content(t("Train")).addTo(row);
+ new Tag("th").content(t("min")).addTo(row);
+ new Tag("th").content(t("max")).addTo(row);
+ new Tag("th").content(t("min")).addTo(row);
+ new Tag("th").content(t("max")).addTo(row);
+ row.addTo(table);
+
+ for (Train train : Train.list()) {
+ row = new Tag("tr");
+ new Tag("td").content(train.name()).addTo(row);
+ Direction a = directionA();
+ WaitTime wtA = train.waitTime(this, a);
+ Direction b = directionB();
+ WaitTime wtB = train.waitTime(this, b);
+ new Input("train."+train.id+"."+directionA()+".min",wtA.min).numeric().addTo(new Tag("td")).addTo(row);
+ new Input("train."+train.id+"."+directionA()+".max",wtA.max).numeric().addTo(new Tag("td")).addTo(row);
+ new Input("train."+train.id+"."+directionB()+".min",wtB.min).numeric().addTo(new Tag("td")).addTo(row);
+ new Input("train."+train.id+"."+directionB()+".max",wtB.max).numeric().addTo(new Tag("td")).addTo(row);
+ row.addTo(table);
+ }
+
+ table.addTo(form);
+
+ new Button(t("Apply")).addTo(form).addTo(win);
+
+ return win;
+ }
public abstract List startPoints();
@@ -107,6 +161,26 @@ public abstract class Block extends StretchableTile{
}
}
turnAllowed = params.containsKey(ALLOW_TURN) && params.get(ALLOW_TURN).equals("on");
+
+ for (Entry entry : params.entrySet()) {
+ String key = entry.getKey();
+ if (key.startsWith("train.")) {
+ String[] parts = key.split("\\.");
+ int trainId = Integer.parseInt(parts[1]);
+ Train t = Train.get(trainId);
+ if (t == null) continue;
+
+ Direction dir = Direction.valueOf(parts[2]);
+ boolean min = parts[3].equals("min");
+ int time = Integer.parseInt(entry.getValue());
+
+ t.setWaitTime(this,dir,time,min);
+
+ LOG.debug("{} / {} : {}",t,dir,t.waitTime(this, dir));
+
+ }
+ }
+
return super.update(params);
}
}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/BlockH.java b/src/main/java/de/srsoftware/web4rail/tiles/BlockH.java
index 69d981f..9a0eca9 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/BlockH.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/BlockH.java
@@ -23,6 +23,16 @@ public class BlockH extends Block{
return new HashMap<>();
}
}
+
+ @Override
+ public Direction directionA() {
+ return Direction.WEST;
+ }
+
+ @Override
+ public Direction directionB() {
+ return Direction.EAST;
+ }
@Override
public int width() {
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/BlockV.java b/src/main/java/de/srsoftware/web4rail/tiles/BlockV.java
index 0be0f5b..a716375 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/BlockV.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/BlockV.java
@@ -24,6 +24,16 @@ public class BlockV extends Block{
}
}
+ @Override
+ public Direction directionA() {
+ return Direction.NORTH;
+ }
+
+ @Override
+ public Direction directionB() {
+ return Direction.SOUTH;
+ }
+
@Override
public int height() {
return stretch;