diff --git a/pom.xml b/pom.xml index 93c3e9f..19bf1fd 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 0.2.0 + 0.3.1 Web4Rail Java Model Railway Control https://github.com/StephanRichter/Web4Rail diff --git a/resources/css/style.css b/resources/css/style.css index 32d362f..6216f45 100644 --- a/resources/css/style.css +++ b/resources/css/style.css @@ -183,4 +183,9 @@ svg.straight .right{ .active circle{ fill: #ffcc88; +} + +polygon.oneway{ + fill: lime; + stroke-width:0; } \ No newline at end of file diff --git a/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java b/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java index 1fd59f4..89c4f51 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Locomotive.java @@ -5,4 +5,9 @@ public class Locomotive extends Car { public Locomotive(String name) { super(name); } + + public void setSpeed(int v) { + // TODO Auto-generated method stub + + } } diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java index 1514753..7685b5e 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Train.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java @@ -82,23 +82,25 @@ public class Train { public void setSpeed(int v) { LOG.debug("Setting speed to {} kmh.",v); + for (Locomotive loco : locos) loco.setSpeed(v); this.speed = v; } public String start() throws IOException { if (block == null) return t("{} not in a block",this); + if (route != null) route.unlock().setSignals(Signal.STOP); HashSet routes = block.routes(); Vector availableRoutes = new Vector(); - for (Route route : routes) { - if (route.path().firstElement() != block) continue; // route does not start with current location of loco - if (direction != null && route.startDirection != direction) continue; - if (!route.free()) { - LOG.debug("{} is not free!",route); + for (Route rt : routes) { + if (rt == route) continue; // andere Route als zuvor wählen + if (rt.path().firstElement() != block) continue; // keine Route wählen, die nicht vom aktuellen Block des Zuges startet + if (direction != null && rt.startDirection != direction) continue; // keine Routen entgegen der Fahrtrichtung wählen + if (!rt.free()) { // keine belegten Routen wählen + LOG.debug("{} is not free!",rt); continue; } - availableRoutes.add(route); + availableRoutes.add(rt); } - if (route != null) route.unlock().setSignals(Signal.STOP); Random rand = new Random(); if (availableRoutes.isEmpty()) return t("No free routes from {}",block); int sel = rand.nextInt(availableRoutes.size()); diff --git a/src/main/java/de/srsoftware/web4rail/tags/Radio.java b/src/main/java/de/srsoftware/web4rail/tags/Radio.java new file mode 100644 index 0000000..4bac829 --- /dev/null +++ b/src/main/java/de/srsoftware/web4rail/tags/Radio.java @@ -0,0 +1,18 @@ +package de.srsoftware.web4rail.tags; + +import de.srsoftware.tools.Tag; + +public class Radio extends Tag { + + private static final long serialVersionUID = -7291730168237304236L; + + public Radio(String groupName, String value, String label, boolean preCheck) { + super("label"); + Tag radio = new Tag("input").attr("type", "radio").attr("name", groupName).attr("value", value); + if (preCheck) radio.attr("checked", "checked"); + radio.addTo(this); + content(label); + + } + +} diff --git a/src/main/java/de/srsoftware/web4rail/tiles/ContactH.java b/src/main/java/de/srsoftware/web4rail/tiles/ContactH.java index efc167e..89e2c7d 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/ContactH.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/ContactH.java @@ -1,6 +1,7 @@ package de.srsoftware.web4rail.tiles; import java.util.HashMap; +import java.util.List; import java.util.Map; import de.srsoftware.web4rail.Connector; @@ -10,6 +11,7 @@ import de.srsoftware.web4rail.tiles.Turnout.State; public class ContactH extends Contact { @Override public Map connections(Direction from) { + if (oneWay == from) return new HashMap<>(); switch (from) { case WEST: return Map.of(new Connector(x+1,y,from),State.UNDEF); @@ -19,4 +21,9 @@ public class ContactH extends Contact { return new HashMap<>(); } } + + @Override + public List possibleDirections() { + return List.of(Direction.EAST,Direction.WEST); + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/ContactV.java b/src/main/java/de/srsoftware/web4rail/tiles/ContactV.java index 499f77e..d3782f1 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/ContactV.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/ContactV.java @@ -1,6 +1,7 @@ package de.srsoftware.web4rail.tiles; import java.util.HashMap; +import java.util.List; import java.util.Map; import de.srsoftware.web4rail.Connector; @@ -11,6 +12,7 @@ public class ContactV extends Contact { @Override public Map connections(Direction from) { + if (oneWay == from) return new HashMap<>(); switch (from) { case NORTH: return Map.of(new Connector(x,y+1,from),State.UNDEF); @@ -20,4 +22,9 @@ public class ContactV extends Contact { return new HashMap<>(); } } + + @Override + public List possibleDirections() { + return List.of(Direction.NORTH,Direction.SOUTH); + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/SignalE.java b/src/main/java/de/srsoftware/web4rail/tiles/SignalE.java index d28534f..d9c0968 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/SignalE.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/SignalE.java @@ -1,6 +1,7 @@ package de.srsoftware.web4rail.tiles; import java.util.HashMap; +import java.util.List; import java.util.Map; import de.srsoftware.web4rail.Connector; @@ -10,6 +11,7 @@ import de.srsoftware.web4rail.tiles.Turnout.State; public class SignalE extends Signal{ @Override public Map connections(Direction from) { + if (oneWay == from) return new HashMap<>(); switch (from) { case WEST: return Map.of(new Connector(x+1,y,Direction.WEST),State.UNDEF); @@ -24,4 +26,9 @@ public class SignalE extends Signal{ public boolean isAffectedFrom(Direction dir) { return dir == Direction.EAST; } + + @Override + public List possibleDirections() { + return List.of(Direction.EAST,Direction.WEST); + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/SignalN.java b/src/main/java/de/srsoftware/web4rail/tiles/SignalN.java index 82dc02d..bc9ecad 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/SignalN.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/SignalN.java @@ -1,6 +1,7 @@ package de.srsoftware.web4rail.tiles; import java.util.HashMap; +import java.util.List; import java.util.Map; import de.srsoftware.web4rail.Connector; @@ -11,6 +12,7 @@ public class SignalN extends Signal { @Override public Map connections(Direction from) { + if (oneWay == from) return new HashMap<>(); switch (from) { case NORTH: return Map.of(new Connector(x,y+1,Direction.NORTH),State.UNDEF); @@ -25,4 +27,9 @@ public class SignalN extends Signal { public boolean isAffectedFrom(Direction dir) { return dir == Direction.NORTH; } + + @Override + public List possibleDirections() { + return List.of(Direction.NORTH,Direction.SOUTH); + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/SignalS.java b/src/main/java/de/srsoftware/web4rail/tiles/SignalS.java index 86ee814..d727ce1 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/SignalS.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/SignalS.java @@ -1,6 +1,7 @@ package de.srsoftware.web4rail.tiles; import java.util.HashMap; +import java.util.List; import java.util.Map; import de.srsoftware.web4rail.Connector; @@ -11,6 +12,7 @@ public class SignalS extends Signal{ @Override public Map connections(Direction from) { + if (oneWay == from) return new HashMap<>(); switch (from) { case NORTH: return Map.of(new Connector(x,y+1,Direction.NORTH),State.UNDEF); @@ -25,4 +27,9 @@ public class SignalS extends Signal{ public boolean isAffectedFrom(Direction dir) { return dir == Direction.SOUTH; } + + @Override + public List possibleDirections() { + return List.of(Direction.NORTH,Direction.SOUTH); + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/SignalW.java b/src/main/java/de/srsoftware/web4rail/tiles/SignalW.java index 5bacd94..eb60bb7 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/SignalW.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/SignalW.java @@ -1,6 +1,7 @@ package de.srsoftware.web4rail.tiles; import java.util.HashMap; +import java.util.List; import java.util.Map; import de.srsoftware.web4rail.Connector; @@ -10,6 +11,7 @@ import de.srsoftware.web4rail.tiles.Turnout.State; public class SignalW extends Signal{ @Override public Map connections(Direction from) { + if (oneWay == from) return new HashMap<>(); switch (from) { case WEST: return Map.of(new Connector(x+1,y,Direction.WEST),State.UNDEF); @@ -24,4 +26,9 @@ public class SignalW extends Signal{ public boolean isAffectedFrom(Direction dir) { return dir == Direction.WEST; } + + @Override + public List possibleDirections() { + return List.of(Direction.EAST,Direction.WEST); + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/StraightH.java b/src/main/java/de/srsoftware/web4rail/tiles/StraightH.java index 5e92532..42b22b3 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/StraightH.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/StraightH.java @@ -1,6 +1,7 @@ package de.srsoftware.web4rail.tiles; import java.util.HashMap; +import java.util.List; import java.util.Map; import de.srsoftware.web4rail.Connector; @@ -11,6 +12,7 @@ public class StraightH extends StretchableTile{ @Override public Map connections(Direction from) { + if (oneWay == from) return new HashMap<>(); switch (from) { case WEST: return Map.of(new Connector(x+len(),y,Direction.WEST),State.UNDEF); @@ -25,4 +27,9 @@ public class StraightH extends StretchableTile{ public int len() { return length; } + + @Override + public List possibleDirections() { + return List.of(Direction.EAST,Direction.WEST); + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/StraightV.java b/src/main/java/de/srsoftware/web4rail/tiles/StraightV.java index 593948a..7eab826 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/StraightV.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/StraightV.java @@ -1,6 +1,7 @@ package de.srsoftware.web4rail.tiles; import java.util.HashMap; +import java.util.List; import java.util.Map; import de.srsoftware.web4rail.Connector; @@ -11,6 +12,7 @@ public class StraightV extends StretchableTile{ @Override public Map connections(Direction from) { + if (oneWay == from) return new HashMap<>(); switch (from) { case NORTH: return Map.of(new Connector(x,y+height(),Direction.NORTH),State.UNDEF); @@ -25,4 +27,9 @@ public class StraightV extends StretchableTile{ public int height() { return length; } + + @Override + public List possibleDirections() { + return List.of(Direction.NORTH,Direction.SOUTH); + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java index bb45360..1282137 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java @@ -5,9 +5,11 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; +import java.util.Vector; import org.json.JSONObject; import org.slf4j.Logger; @@ -22,6 +24,7 @@ import de.srsoftware.web4rail.Plan.Direction; import de.srsoftware.web4rail.Route; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.tags.Form; +import de.srsoftware.web4rail.tags.Radio; public abstract class Tile { @@ -31,6 +34,7 @@ public abstract class Tile { private HashSet routes = new HashSet<>(); protected Plan plan; protected Route route; + protected Direction oneWay = null; protected static Logger LOG = LoggerFactory.getLogger(Tile.class); @@ -97,11 +101,25 @@ public abstract class Tile { return this; } + public List possibleDirections() { + return new Vector(); + } + 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); + + List pd = possibleDirections(); + if (!pd.isEmpty()) { + new Tag("h4").content(t("One way:")).addTo(form); + new Radio("oneway","none",t("No"),oneWay == null).addTo(form); + for (Direction d:pd) { + Radio radio = new Radio("oneway",d.toString(),t(d.toString()),d == oneWay); + radio.addTo(form); + } + } return form; } @@ -115,6 +133,10 @@ public abstract class Tile { window.content(t("This tile ({}) has no properties",getClass().getSimpleName())); } + if (route != null) { + new Tag("p").content(t("Locked by {}",route)).addTo(window); + } + if (!routes.isEmpty()) { new Tag("h4").content(t("Routes using this tile:")).addTo(window); Tag routeList = new Tag("ul"); @@ -166,6 +188,7 @@ public abstract class Tile { if (x>-1) style="left: "+(30*x)+"px; top: "+(30*y)+"px;"; if (len()>1) style+=" width: "+(30*len())+"px;"; if (height()>1) style+=" height: "+(30*height())+"px;"; + if (!style.isEmpty()) svg.style(style); File file = new File(System.getProperty("user.dir")+"/resources/svg/"+getClass().getSimpleName()+".svg"); @@ -182,6 +205,17 @@ public abstract class Tile { } scanner.close(); svg.content(sb.toString()); + + if (oneWay != null) { + switch (oneWay) { + + case EAST: + new Tag("polygon").clazz("oneway").attr("points", "100,50 75,35 75,65").addTo(svg); + break; + case WEST: + new Tag("polygon").clazz("oneway").attr("points", "0,50 25,35 25,65").addTo(svg); + } + } } else { new Tag("title").content(t("No display defined for this tile ({})",getClass().getSimpleName())).addTo(svg); new Tag("text") @@ -212,6 +246,14 @@ public abstract class Tile { public Tile update(HashMap params) { LOG.debug("{}.update({})",getClass().getSimpleName(),params); + String oneWayDir = params.get("oneway"); + if (oneWayDir != null) { + try { + oneWay = Direction.valueOf(oneWayDir); + } catch (Exception e) { + oneWay = null; + } + } return this; }