diff --git a/pom.xml b/pom.xml index 45ad63d..16b86f5 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ de.srsoftware tools - 1.1.7 + 1.1.8 compile diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index c1d263a..97c52e0 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -262,6 +262,7 @@ public class Plan { actionMenu().addTo(menu); moveMenu().addTo(menu); tileMenu().addTo(menu); + trainMenu().addTo(menu); return menu; } @@ -376,9 +377,13 @@ public class Plan { Object result = Train.action(params); return result instanceof Train ? html() : result; } + + public Route route(int routeId) { + return routes.get(routeId); + } private Object routeProperties(int id) { - Route route = routes.get(id); + Route route = route(id); if (route == null) return t("Could not find route \"{}\"",id); return route.properties(); } @@ -493,18 +498,24 @@ public class Plan { return new Tag("div").clazz("list").content(tiles.toString()).addTo(tileMenu); } + private Tag trainMenu() throws IOException { + Tag tileMenu = new Tag("div").clazz("trains").title(t("Manage trains")).content(t("Trains")); + + StringBuffer tiles = new StringBuffer(); + return new Tag("div").clazz("list").content(tiles.toString()).addTo(tileMenu); + } + private Object update(HashMap params) throws IOException { if (params.containsKey(ROUTE)) { Route route = routes.get(Integer.parseInt(params.get(ROUTE))); if (route == null) return t("Unknown route: {}",params.get(ROUTE)); route.update(params); - } else update(Integer.parseInt(params.get("x")),Integer.parseInt(params.get("y")),params); + } else update(get(params.get(Tile.ID),true),params); return this.html(); } - private void update(int x,int y, HashMap params) throws IOException { - Tile tile = get(Tile.id(x, y),true); - if (tile != null) set(x,y,tile.update(params)); + private void update(Tile tile, HashMap params) throws IOException { + if (tile != null) place(tile.update(params)); } public void warn(Contact contact) { diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java index 8b9a0ce..708a6e1 100644 --- a/src/main/java/de/srsoftware/web4rail/Route.java +++ b/src/main/java/de/srsoftware/web4rail/Route.java @@ -5,6 +5,7 @@ import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -13,6 +14,7 @@ import java.util.Map.Entry; import java.util.Vector; import org.json.JSONArray; +import org.json.JSONException; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -115,15 +117,15 @@ public class Route { public void complete() { if (contacts.size()>1) { // mindestens 2 Kontakte: erster Kontakt aktiviert Block, vorletzter Kontakt leitet Bremsung ein - addAction(contacts.firstElement().trigger(),new ActivateRoute(this)); + addAction(contacts.firstElement().trigger(),new ActivateRoute(id())); Contact nextToLastContact = contacts.get(contacts.size()-2); - addAction(nextToLastContact.trigger(),new SpeedReduction(this,30)); - addAction(nextToLastContact.trigger(),new SetSignalsToStop(this)); + addAction(nextToLastContact.trigger(),new SpeedReduction(id(),30)); + addAction(nextToLastContact.trigger(),new SetSignalsToStop(id())); } if (!contacts.isEmpty()) { Contact lastContact = contacts.lastElement(); - addAction(lastContact.trigger(), new SpeedReduction(this, 0)); - addAction(lastContact.trigger(), new FinishRoute(this)); + addAction(lastContact.trigger(), new SpeedReduction(id(), 0)); + addAction(lastContact.trigger(), new FinishRoute(id())); } } @@ -137,7 +139,7 @@ public class Route { Vector actions = triggers.get(contact.trigger()); for (Action action : actions) { try { - action.fire(); + action.fire(contact.plan()); } catch (IOException e) { LOG.warn("Action did not fire properly: {}",action,e); } @@ -184,25 +186,25 @@ public class Route { } public String json() { - JSONObject props = new JSONObject(); + JSONObject json = new JSONObject(); - props.put(ID, id()); + json.put(ID, id()); Vector tileIds = new Vector(); for (Tile t : this.path) tileIds.add(t.id()); - props.put(PATH, tileIds); + json.put(PATH, tileIds); Vector signalIds = new Vector(); // list all signals affecting this route for (Tile t : this.signals) signalIds.add(t.id()); - props.put(SIGNALS, signalIds); + json.put(SIGNALS, signalIds); JSONArray turnouts = new JSONArray(); for (Entry entry : this.turnouts.entrySet()) { Turnout t = entry.getKey(); turnouts.put(new JSONObject(Map.of(Turnout.ID,t.id(),Turnout.STATE,entry.getValue()))); } - props.put(TURNOUTS, turnouts); - props.put(START_DIRECTION, startDirection); - props.put(END_DIRECTION, startDirection); + json.put(TURNOUTS, turnouts); + json.put(START_DIRECTION, startDirection); + json.put(END_DIRECTION, endDirection); JSONArray jTriggers = new JSONArray(); for (Entry> entry : triggers.entrySet()) { @@ -218,12 +220,12 @@ public class Route { jTriggers.put(trigger); } - if (!jTriggers.isEmpty()) props.put(ACTIONS, jTriggers); + if (!jTriggers.isEmpty()) json.put(ACTIONS, jTriggers); String name = name(); - if (name != null) props.put(NAME, name); + if (name != null) json.put(NAME, name); - return props.toString(); + return json.toString(); } private Route load(JSONObject json,Plan plan) { @@ -235,12 +237,46 @@ public class Route { Tile tile = plan.get((String) tileId,false); if (startBlock == null) { start((Block) tile, startDirection); - } else add(tile, endDirection); + } else if (tile instanceof Block) { // make sure, endDirection is set on last block + add(tile,endDirection); + } else { + add(tile, null); + } } if (json.has(NAME)) name(json.getString(NAME)); + if (json.has(TURNOUTS)) { + JSONArray turnouts = json.getJSONArray(TURNOUTS); + for (int i=0; i maxSpeed) train.setSpeed(maxSpeed); } diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java index d0107fc..2c6aa73 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Train.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java @@ -59,13 +59,17 @@ public class Train { private Block block = null; private class Autopilot extends Thread{ + boolean stop = false; + @Override public void run() { try { + stop = false; Vector path = new Vector(); while (true) { if (route == null) { - Thread.sleep(3000); + Thread.sleep(2000); + if (stop) return; Train.this.start(); path = route == null ? new Vector() : route.path(); } else { @@ -74,7 +78,7 @@ public class Train { if (t instanceof Contact) ((Contact)t).activate(); } } - Thread.sleep(500); + Thread.sleep(250); } } catch (Exception e) { e.printStackTrace(); @@ -87,6 +91,8 @@ public class Train { private static final String MODE_UPDATE = "update"; private static final String MODE_AUTO = "auto"; + private static final String MODE_STOP = "stop"; + public int speed = 0; private Autopilot autopilot = null; @@ -133,6 +139,8 @@ public class Train { return train.props(); case MODE_START: return train.start(); + case MODE_STOP: + return train.stop(); case MODE_UPDATE: return train.update(params); default: return t("Unknown mode {} for {}",mode,train); @@ -235,7 +243,11 @@ public class Train { new Tag("li").content(t("Direction: heading {}",direction)).addTo(list); new Tag("li").clazz("link").attr("onclick","train("+id+",'"+MODE_START+"')").content(t("start")).addTo(list).addTo(window); - new Tag("li").clazz("link").attr("onclick","train("+id+",'"+MODE_AUTO+"')").content(t("auto")).addTo(list).addTo(window); + if (autopilot == null) { + new Tag("li").clazz("link").attr("onclick","train("+id+",'"+MODE_AUTO+"')").content(t("auto")).addTo(list).addTo(window); + } else { + new Tag("li").clazz("link").attr("onclick","train("+id+",'"+MODE_STOP+"')").content(t("stop")).addTo(list).addTo(window); + } return window; } @@ -283,6 +295,12 @@ public class Train { return t("started {}",this); } + private Object stop() { + autopilot.stop = true; + autopilot = null; + return t("{} stopping at next block {}"); + } + private static String t(String message, Object...fills) { return Translation.get(Application.class, message, fills); } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java index 631df9e..03122f7 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java @@ -147,6 +147,7 @@ public abstract class Tile { JSONObject pos = json.getJSONObject(POS); x = pos.getInt(X); y = pos.getInt(Y); + if (json.has(ONEW_WAY)) oneWay = Direction.valueOf(json.getString(ONEW_WAY)); return this; } @@ -155,6 +156,10 @@ public abstract class Tile { plan.place(this); } + public Plan plan() { + return plan; + } + public Tile plan(Plan plan) { this.plan = plan; return this; @@ -173,8 +178,7 @@ public abstract class Tile { public Tag propForm() { Form form = new Form(); new Tag("input").attr("type", "hidden").attr("name","action").attr("value", "update").addTo(form); - new Tag("input").attr("type", "hidden").attr("name","x").attr("value", x).addTo(form); - new Tag("input").attr("type", "hidden").attr("name","y").attr("value", y).addTo(form); + new Tag("input").attr("type", "hidden").attr("name",ID).attr("value", id()).addTo(form); List pd = possibleDirections(); if (!pd.isEmpty()) {