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;
}