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