From e1d338411039c4945dd7bae985ba2a50b565cc74 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Thu, 5 Nov 2020 23:23:33 +0100 Subject: [PATCH] bugfixes --- pom.xml | 2 +- .../de/srsoftware/web4rail/Application.java | 2 +- .../de/srsoftware/web4rail/Constants.java | 17 +++++---- .../java/de/srsoftware/web4rail/Plan.java | 13 ++++--- .../java/de/srsoftware/web4rail/Route.java | 21 +++++++++-- .../de/srsoftware/web4rail/moving/Train.java | 37 ++++++++++++------- .../de/srsoftware/web4rail/tiles/Tile.java | 11 ++++-- .../de/srsoftware/web4rail/tiles/Turnout.java | 4 +- 8 files changed, 69 insertions(+), 38 deletions(-) diff --git a/pom.xml b/pom.xml index 27e3a13..841a3bc 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 0.10.2 + 0.10.3 Web4Rail jar Java Model Railway Control diff --git a/src/main/java/de/srsoftware/web4rail/Application.java b/src/main/java/de/srsoftware/web4rail/Application.java index 5e72cc3..8effbc3 100644 --- a/src/main/java/de/srsoftware/web4rail/Application.java +++ b/src/main/java/de/srsoftware/web4rail/Application.java @@ -67,7 +67,7 @@ public class Application implements Constants{ server.setExecutor(java.util.concurrent.Executors.newCachedThreadPool()); server.start(); try { - plan = Plan.load("default"); + plan = Plan.load(Plan.DEFAULT_NAME); } catch (FileNotFoundException e) { plan = new Plan(); } diff --git a/src/main/java/de/srsoftware/web4rail/Constants.java b/src/main/java/de/srsoftware/web4rail/Constants.java index ce5fbf1..04d64ce 100644 --- a/src/main/java/de/srsoftware/web4rail/Constants.java +++ b/src/main/java/de/srsoftware/web4rail/Constants.java @@ -46,13 +46,14 @@ public interface Constants { public static final String REALM_PLAN = "plan"; public static final String REALM_TRAIN = "train"; - public static final String ID = "id"; - public static final String PORT = "port"; + public static final String BLOCK = "block"; + public static final String CONTACT = "contact"; + public static final String CONTEXT = "context"; + public static final String DISABLED = "disabled"; + public static final String GITHUB_URL = "https://github.com/srsoftware-de/Web4Rail"; + public static final String ID = "id"; + public static final String NBSP = " "; + public static final String PORT = "port"; + public static final String TYPE = "type"; public static final Charset UTF8 = StandardCharsets.UTF_8; - public static final String CONTACT = "contact"; - public static final String TYPE = "type"; - public static final String NBSP = " "; - public static final String CONTEXT = "context"; - public static final String GITHUB_URL = "https://github.com/srsoftware-de/Web4Rail"; - public static final String DISABLED = "disabled"; } diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index bea0550..c21a4ba 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -106,14 +106,15 @@ public class Plan implements Constants{ } - private static final String TILE = "tile"; + private static final String ACTION_QR = "qrcode"; + public static final String DEFAULT_NAME = "default"; + private static final String DIRECTION = "direction"; + private static final String HELP = "help"; private static final Logger LOG = LoggerFactory.getLogger(Plan.class); + private static final String TILE = "tile"; private static final String X = "x"; private static final String Y = "y"; - private static final String DIRECTION = "direction"; private static final HashMap clients = new HashMap(); - private static final String ACTION_QR = "qrcode"; - private static final String HELP = "help"; public HashMap tiles = new HashMap(); // The list of tiles of this plan, i.e. the Track layout private HashSet blocks = new HashSet(); // the list of tiles, that are blocks @@ -152,7 +153,7 @@ public class Plan implements Constants{ case ACTION_MOVE: return moveTile(params.get(DIRECTION),params.get(Tile.ID)); case ACTION_SAVE: - return saveTo("default"); + return saveTo(DEFAULT_NAME); case ACTION_UPDATE: return update(get(params.get(Tile.ID),true),params); } @@ -403,12 +404,12 @@ public class Plan implements Constants{ } catch (Exception e) { LOG.warn("Was not able to load cars!",e); } + Tile.loadAll(filename+".plan",plan); try { Train.loadAll(filename+".trains",plan); } catch (Exception e) { LOG.warn("Was not able to load trains!",e); } - Tile.loadAll(filename+".plan",plan); try { Route.loadAll(filename+".routes",plan); } catch (Exception e) { diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java index 8787ca6..1f9033a 100644 --- a/src/main/java/de/srsoftware/web4rail/Route.java +++ b/src/main/java/de/srsoftware/web4rail/Route.java @@ -340,6 +340,8 @@ public class Route extends BaseClass{ } train.set(endBlock); train.heading(endDirection.inverse()); + if (train.route == this) train.route = null; + } public boolean fireSetupActions(Context context) { @@ -366,9 +368,9 @@ public class Route extends BaseClass{ return id; } - public boolean isFree() { + public boolean isFreeFor(Train newTrain) { for (int i=1; i routes, String filename) throws IOException { diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java index 4f963ad..df52ab1 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Train.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java @@ -42,8 +42,11 @@ import de.srsoftware.web4rail.tiles.Tile; public class Train extends BaseClass implements Comparable { private static final Logger LOG = LoggerFactory.getLogger(Train.class); - public static final String HEAD = "train_head"; - public static final String TAIL = "train_tile"; + private static final String CAR_ID = "carId"; + public static final String HEAD = "train_head"; + public static final String LOCO_ID = "locoId"; + public static final String TAIL = "train_tile"; + private static final String TRACE = "trace"; private static final HashMap trains = new HashMap<>(); public static final String ID = "id"; @@ -96,9 +99,6 @@ public class Train extends BaseClass implements Comparable { } } - public static final String LOCO_ID = "locoId"; - private static final String CAR_ID = "carId"; - public int speed = 0; private Autopilot autopilot = null; @@ -164,7 +164,7 @@ public class Train extends BaseClass implements Comparable { continue; } } - if (!rt.isFree()) { // keine belegten Routen wählen + if (!rt.isFreeFor(this)) { // keine belegten Routen wählen LOG.debug("{} is not free!",rt); continue; } @@ -280,17 +280,25 @@ public class Train extends BaseClass implements Comparable { private JSONObject json() { JSONObject json = new JSONObject(); json.put(ID, id); - json.put(NAME,name); - if (isSet(route)) json.put(ROUTE, route.id()); - if (isSet(direction)) json.put(DIRECTION, direction); json.put(PUSH_PULL, pushPull); + + if (isSet(block)) json.put(BLOCK, block.id()); if (isSet(name))json.put(NAME, name); + if (isSet(route)) json.put(ROUTE, route.id()); + if (isSet(direction)) json.put(DIRECTION, direction); + Vector locoIds = new Vector(); for (Locomotive loco : locos) locoIds.add(loco.id()); json.put(LOCOS, locoIds); + Vector carIds = new Vector(); for (Car car : cars) carIds.add(car.id()); json.put(CARS,carIds); + + Vector tileIds = new Vector(); + for (Tile tile : trace) tileIds.add(tile.id()); + json.put(TRACE, tileIds); + if (!tags.isEmpty()) json.put(TAGS, tags); return json; } @@ -319,7 +327,7 @@ public class Train extends BaseClass implements Comparable { int id = json.getInt(ID); Train train = new Train(null,id); - train.load(json).plan(plan); + train.plan(plan).load(json); line = file.readLine(); } @@ -328,11 +336,14 @@ public class Train extends BaseClass implements Comparable { private Train load(JSONObject json) { pushPull = json.getBoolean(PUSH_PULL); + if (json.has(BLOCK)) block = (Block) plan.get(json.getString(BLOCK), false); + if (json.has(DIRECTION)) direction = Direction.valueOf(json.getString(DIRECTION)); if (json.has(NAME)) name = json.getString(NAME); + if (json.has(TAGS)) json.getJSONArray(TAGS ).forEach(elem -> { tags.add(elem.toString()); }); + if (json.has(TRACE)) json.getJSONArray(TRACE).forEach(elem -> { trace.add(plan.get(elem.toString(), false).set(this)); }); for (Object id : json.getJSONArray(CARS)) add(Car.get(id)); for (Object id : json.getJSONArray(LOCOS)) add((Locomotive) Car.get(id)); - if (json.has(TAGS)) json.getJSONArray(TAGS).forEach(elem -> { tags.add(elem.toString()); }); - if (json.has(DIRECTION)) direction = Direction.valueOf(json.getString(DIRECTION)); + return this; } @@ -523,7 +534,7 @@ public class Train extends BaseClass implements Comparable { private Object stopNow() { quitAutopilot(); setSpeed(0); - route = null; + if (isSet(route)) route.reset(); return t("Stopped {}.",this); } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java index 4a5f026..612ea7b 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java @@ -34,6 +34,7 @@ import de.srsoftware.web4rail.tags.Button; import de.srsoftware.web4rail.tags.Checkbox; import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Input; +import de.srsoftware.web4rail.tags.Label; import de.srsoftware.web4rail.tags.Radio; /** @@ -118,8 +119,11 @@ public abstract class Tile extends BaseClass{ plan.set(tile.x, tile.y, tile); } - public boolean isFree() { - return !(disabled || isSet(route) || isSet(train)); + public boolean isFreeFor(Train newTrain) { + if (disabled) return false; + if (isSet(route)) return false; + if (isSet(train) && newTrain != train) return false; + return true; } public JSONObject json() { @@ -169,7 +173,6 @@ public abstract class Tile extends BaseClass{ if (json.has(DISABLED)) disabled = json.getBoolean(DISABLED); if (json.has(LENGTH)) length = json.getInt(LENGTH); if (json.has(ONEW_WAY)) oneWay = Direction.valueOf(json.getString(ONEW_WAY)); - if (json.has(REALM_TRAIN)) train = Train.get(json.getInt(REALM_TRAIN)); return this; } @@ -214,7 +217,7 @@ public abstract class Tile extends BaseClass{ String formId = "tile-properties-"+id(); Tag form = propForm(formId); new Tag("h4").content(t("Length")).addTo(form); - new Input(LENGTH,length).numeric().addTo(form); + new Input(LENGTH,length).numeric().addTo(new Label(t("Length")+":"+NBSP)).addTo(form); new Tag("h4").content(t("Availability")).addTo(form); new Checkbox(DISABLED, t("disabled"), disabled).addTo(form); new Button(t("Apply"),"submitForm('"+formId+"')").addTo(form); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Turnout.java b/src/main/java/de/srsoftware/web4rail/tiles/Turnout.java index be792dd..70d2825 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Turnout.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Turnout.java @@ -93,6 +93,7 @@ public abstract class Turnout extends Tile implements Device{ if (portB != 1) json.put(PORT_B, portB); if (address != 0) json.put(ADDRESS, address); json.put(PROTOCOL, protocol); + json.put(STATE, state); return json; } @@ -102,6 +103,7 @@ public abstract class Turnout extends Tile implements Device{ if (json.has(PORT_A)) portA = json.getInt(PORT_A); if (json.has(PORT_B)) portB = json.getInt(PORT_B); if (json.has(PROTOCOL)) protocol = Protocol.valueOf(json.getString(PROTOCOL)); + if (json.has(STATE)) state = State.valueOf(json.getString(STATE)); return super.load(json); } @@ -139,9 +141,9 @@ public abstract class Turnout extends Tile implements Device{ } public Reply state(State newState) throws IOException { + if (train != null && newState != state) return new Reply(415, t("{} locked by {}!",this,train)); Reply reply = init(); if (reply != null && !reply.succeeded()) return reply; - LOG.debug("Setting {} to {}",this,newState); if (address == 0) { state = newState; plan.place(this);