diff --git a/pom.xml b/pom.xml
index c9ec239..c594e30 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
de.srsoftware
web4rail
- 0.3.2
+ 0.3.3
Web4Rail
Java Model Railway Control
https://github.com/StephanRichter/Web4Rail
diff --git a/resources/js/plan.js b/resources/js/plan.js
index 542051b..df6793d 100644
--- a/resources/js/plan.js
+++ b/resources/js/plan.js
@@ -147,8 +147,8 @@ function runAction(ev){
return request({action:ev.target.id,file:'default'}); // TODO: ask for name
}
-function train(x,y,action){
- return request({action:action+"Train",x:x,y:y});
+function train(id,mode){
+ return request({action:"train",id:id,mode:mode});
}
function stream(ev){
diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java
index 3a0558f..7385724 100644
--- a/src/main/java/de/srsoftware/web4rail/Plan.java
+++ b/src/main/java/de/srsoftware/web4rail/Plan.java
@@ -110,9 +110,7 @@ public class Plan {
private static final String ID = "id";
private static final String ROUTE = "route";
private static final HashMap clients = new HashMap();
- private static final String ACTION_SHOW_TRAIN = "showTrain";
- private static final String ACTION_START_TRAIN = "startTrain";
- private static final String ACTION_UPDATE_TRAIN = "updateTrain";
+ private static final String ACTION_TRAIN = "train";
private HashMap> tiles = new HashMap>();
private HashSet blocks = new HashSet();
@@ -411,15 +409,10 @@ public class Plan {
return routeProperties(params.get(ID));
case ACTION_SAVE:
return saveTo(params.get(FILE));
- case ACTION_SHOW_TRAIN:
- return show(train(get(params.get(X),params.get(Y),true)));
- case ACTION_START_TRAIN:
- return start(train(get(params.get(X),params.get(Y),true)));
+ case ACTION_TRAIN:
+ return trainAction(params);
case ACTION_UPDATE:
- return update(params);
- case ACTION_UPDATE_TRAIN:
- return updateTrain(params);
-
+ return update(params);
default:
LOG.warn("Unknown action: {}",action);
}
@@ -431,12 +424,9 @@ public class Plan {
}
}
- private Train train(Tile tile) {
- if (tile instanceof Block) {
- Block block = (Block) tile;
- return block.train();
- }
- return null;
+ private Object trainAction(HashMap params) throws IOException {
+ Object result = Train.action(params);
+ return result instanceof Train ? html() : result;
}
private Object routeProperties(String routeId) {
@@ -508,15 +498,6 @@ public class Plan {
tile.position(x, y).plan(this);
column.put(y,tile);
}
-
- private Tag show(Train train) {
- return (train == null) ? null : train.props();
- }
-
- private String start(Train train) throws IOException {
- if (train == null) return null;
- return train.start();
- }
public synchronized void stream(String data) {
data = data.replaceAll("\n", "").replaceAll("\r", "");
@@ -600,11 +581,6 @@ public class Plan {
Tile tile = get(x,y,true);
if (tile != null) set(x,y,tile.update(params));
}
-
- private Object updateTrain(HashMap params) throws IOException {
- Train.update(params);
- return this.html();
- }
public void warn(Contact contact) {
stream(t("Warning: {}",t("Ghost train @ {}",contact)));
diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java
index 7e9ab26..084185b 100644
--- a/src/main/java/de/srsoftware/web4rail/Route.java
+++ b/src/main/java/de/srsoftware/web4rail/Route.java
@@ -133,6 +133,11 @@ public class Route {
}
}
+ public Vector contacts() {
+ return new Vector<>(contacts);
+ }
+
+
public void finish() throws IOException {
startBlock.train(null);
endBlock.train(train.heading(endDirection.inverse()));
diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java
index 52400af..d8d292f 100644
--- a/src/main/java/de/srsoftware/web4rail/moving/Train.java
+++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java
@@ -18,14 +18,42 @@ import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.tags.Checkbox;
import de.srsoftware.web4rail.tags.Form;
import de.srsoftware.web4rail.tiles.Block;
+import de.srsoftware.web4rail.tiles.Contact;
import de.srsoftware.web4rail.tiles.Signal;
public class Train {
+
+ private class Autopilot extends Thread{
+ @Override
+ public void run() {
+ try {
+ Vector contacts = null;
+ while (true) {
+ if (route == null) {
+ Train.this.start();
+ contacts = route == null ? new Vector() : route.contacts();
+ } else {
+ if (!contacts.isEmpty()) {
+ Contact contact = contacts.remove(0);
+ contact.activate();
+ }
+ }
+ Thread.sleep(1000);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
private static final Logger LOG = LoggerFactory.getLogger(Train.class);
private static final String PUSH_PULL = "pushPull";
private static int count = 0;
private static final HashMap trains = new HashMap();
- private static final String ID = "id";
+ public static final String ID = "id";
+ public static final String MODE_START = "start";
+ public static final String MODE_SHOW = "show";
+ private static final String MODE_UPDATE = "update";
+ private static final String MODE_AUTO = "auto";
private Vector locos = new Vector();
private Vector cars = new Vector();
private String name = null;
@@ -34,13 +62,36 @@ public class Train {
public int speed = 0;
private Direction direction;
private boolean pushPull = false;
- private int id;
+ public int id;
+ private Autopilot autopilot = null;
public Train(Locomotive loco) {
id = ++count;
add(loco);
trains.put(id, this);
}
+
+ public static Object action(HashMap params) throws IOException {
+ if (!params.containsKey(Train.ID)) return t("No train id passed!");
+ int id = Integer.parseInt(params.get(Train.ID));
+ Train train = trains.get(id);
+ if (train == null) return(t("No train with id {}!",id));
+ if (!params.containsKey("mode")) return t("No mode set for train action!");
+ String mode = params.get("mode");
+ switch (mode) {
+ case MODE_AUTO:
+ return train.automatic();
+ case MODE_SHOW:
+ return train.props();
+ case MODE_START:
+ return train.start();
+ case MODE_UPDATE:
+ return train.update(params);
+ default: return t("Unknown mode {} for {}",mode,train);
+ }
+
+ //return null;
+ }
public void add(Car car) {
if (car == null) return;
@@ -49,6 +100,14 @@ public class Train {
} else cars.add(car);
}
+ private String automatic() {
+ if (autopilot == null) {
+ autopilot = new Autopilot();
+ autopilot.start();
+ }
+ return t("{} now in auto-mode",this);
+ }
+
public void block(Block block) {
this.block = block;
}
@@ -83,8 +142,9 @@ public class Train {
Window window = new Window("train-properties",t("Properties of {}",getClass().getSimpleName()));
Form form = new Form();
- new Tag("input").attr("type", "hidden").attr("name","action").attr("value", "updateTrain").addTo(form);
+ new Tag("input").attr("type", "hidden").attr("name","action").attr("value", "train").addTo(form);
new Tag("input").attr("type", "hidden").attr("name",ID).attr("value", id).addTo(form);
+ new Tag("input").attr("type", "hidden").attr("name","mode").attr("value", MODE_UPDATE).addTo(form);
Checkbox pp = new Checkbox(PUSH_PULL, t("Push-pull train"), pushPull);
pp.addTo(form);
@@ -99,7 +159,8 @@ public class Train {
new Tag("li").content(t("Current location: {}",block)).addTo(list);
new Tag("li").content(t("Direction: heading {}",direction)).addTo(list);
- new Tag("li").clazz("link").attr("onclick","train("+block.x+","+block.y+",'start')").content(t("start")).addTo(list).addTo(window);
+ 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);
return window;
}
@@ -148,16 +209,14 @@ public class Train {
}
private void turn() throws IOException {
- direction = direction.inverse();
+ if (direction != null) direction = direction.inverse();
if (block != null) block.train(this);
}
- public static void update(HashMap params) {
+ public Train update(HashMap params) {
LOG.debug("update({})",params);
- int id = Integer.parseInt(params.get(ID));
- Train train = trains.get(id);
- if (train == null) return;
- train.pushPull = params.containsKey(PUSH_PULL) && params.get(PUSH_PULL).equals("on");
+ pushPull = params.containsKey(PUSH_PULL) && params.get(PUSH_PULL).equals("on");
+ return this;
}
}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Block.java b/src/main/java/de/srsoftware/web4rail/tiles/Block.java
index e023d2e..1096322 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Block.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Block.java
@@ -56,8 +56,8 @@ public abstract class Block extends StretchableTile{
if (train != null) {
new Tag("h4").content(t("Train:")).addTo(window);
- new Tag("span").clazz("link").attr("onclick","train("+x+","+y+",'show')").content(train.name()).addTo(window);
- new Tag("span").clazz("link").attr("onclick","train("+x+","+y+",'start')").content(" - "+t("start")).addTo(window);
+ new Tag("span").clazz("link").attr("onclick","train("+train.id+",'"+Train.MODE_SHOW+"')").content(train.name()).addTo(window);
+ new Tag("span").clazz("link").attr("onclick","train("+train.id+",'"+Train.MODE_START+"')").content(" - "+t("start")).addTo(window);
}
return window;
}
diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
index 13e8c19..dfe7ddb 100644
--- a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
+++ b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java
@@ -9,7 +9,7 @@ public abstract class Contact extends Tile{
private boolean active = false;
- private void activate() throws IOException {
+ public void activate() throws IOException {
active = true;
stream();
new Thread() {