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()) {