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;