Browse Source

completed implementation of stopping times for trains in blocks

lookup-tables
Stephan Richter 5 years ago
parent
commit
7a0dcbb439
  1. 2
      pom.xml
  2. 6
      resources/translations/Application.de.translation
  3. 7
      src/main/java/de/srsoftware/web4rail/BaseClass.java
  4. 1
      src/main/java/de/srsoftware/web4rail/Constants.java
  5. 18
      src/main/java/de/srsoftware/web4rail/Plan.java
  6. 178
      src/main/java/de/srsoftware/web4rail/tiles/Block.java
  7. 1
      src/main/java/de/srsoftware/web4rail/tiles/Tile.java

2
pom.xml

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>de.srsoftware</groupId> <groupId>de.srsoftware</groupId>
<artifactId>web4rail</artifactId> <artifactId>web4rail</artifactId>
<version>0.11.1</version> <version>0.11.2</version>
<name>Web4Rail</name> <name>Web4Rail</name>
<packaging>jar</packaging> <packaging>jar</packaging>
<description>Java Model Railway Control</description> <description>Java Model Railway Control</description>

6
resources/translations/Application.de.translation

@ -15,6 +15,7 @@ Analyze : analysieren
Apply : Übernehmen Apply : Übernehmen
Availability : Verfügbarkeit Availability : Verfügbarkeit
Block properties : Block-Eigenschaften Block properties : Block-Eigenschaften
{}bound : nach {}
Cars\: : Waggons: Cars\: : Waggons:
ConditionalAction : bedingte Aktion ConditionalAction : bedingte Aktion
Conditions : Bedingungen Conditions : Bedingungen
@ -30,6 +31,7 @@ DelayedAction : verzögerte Aktion
delete : entfernen delete : entfernen
delete route : Route löschen delete route : Route löschen
Destination\: {} from {} : Ziel: {} von {} Destination\: {} from {} : Ziel: {} von {}
Direction : Richtung
disabled : deaktiviert disabled : deaktiviert
EAST : Osten EAST : Osten
editable train properties : veränderliche Zug-Eigenschaften editable train properties : veränderliche Zug-Eigenschaften
@ -53,9 +55,11 @@ Manage cars : Waggons verwalten
Manage locos : Lokomotiven verwalten Manage locos : Lokomotiven verwalten
Manage trains : Züge verwalten Manage trains : Züge verwalten
Maximum train length\: : maximale Zug-Länge Maximum train length\: : maximale Zug-Länge
Minimum and maximum times (in Miliseconds) trains with the respective tag have to wait in this block. : Minamle und maximale Block-Haltezeit (in Millisekunden) für Züge mit der entsprchender Markierung.
Move tiles : Kacheln verschieben Move tiles : Kacheln verschieben
name\: : Name: name\: : Name:
new locomotive : neue Lok new locomotive : neue Lok
new tag : neue Markierung
new train : neuer Zug new train : neuer Zug
No : keine No : keine
No free routes from {} : keine Route von {} frei No free routes from {} : keine Route von {} frei
@ -96,10 +100,12 @@ SOUTH : Süden
Started {} : {} gestartet Started {} : {} gestartet
StopAllTrains : Alle Züge stoppen StopAllTrains : Alle Züge stoppen
StopAuto : Automatikmodus abschalten StopAuto : Automatikmodus abschalten
Stopsettings : Halte-Einstellungen
Straight port\: : Port für gerade Straight port\: : Port für gerade
STRAIGHT : gerade STRAIGHT : gerade
Switch power off : Strom ausschalten Switch power off : Strom ausschalten
Switch power on : Strom anschalten Switch power on : Strom anschalten
Tag : Markierung
Tags : Markierungen Tags : Markierungen
Toggle : umschalten Toggle : umschalten
Toggle power : Stom umschalten Toggle power : Stom umschalten

7
src/main/java/de/srsoftware/web4rail/BaseClass.java

@ -1,5 +1,6 @@
package de.srsoftware.web4rail; package de.srsoftware.web4rail;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.json.JSONObject; import org.json.JSONObject;
@ -20,4 +21,10 @@ public class BaseClass implements Constants{
public static boolean isSet(Object o) { public static boolean isSet(Object o) {
return o != null; return o != null;
} }
public static HashMap<String, String> merged(Map<String, String> base, Map<String, String> overlay) {
HashMap<String,String> merged = new HashMap<>(base);
overlay.entrySet().stream().forEach(entry -> merged.put(entry.getKey(), entry.getValue()));
return merged;
}
} }

1
src/main/java/de/srsoftware/web4rail/Constants.java

@ -28,6 +28,7 @@ public interface Constants {
public static final String ACTION_SLOWER10 = "slower10"; public static final String ACTION_SLOWER10 = "slower10";
public static final String ACTION_START = "start"; public static final String ACTION_START = "start";
public static final String ACTION_STOP = "stop"; public static final String ACTION_STOP = "stop";
public static final String ACTION_TIMES = "update_times";
public static final String ACTION_TOGGLE_F1 = "f1"; public static final String ACTION_TOGGLE_F1 = "f1";
public static final String ACTION_TOGGLE_F2 = "f2"; public static final String ACTION_TOGGLE_F2 = "f2";
public static final String ACTION_TOGGLE_F3 = "f3"; public static final String ACTION_TOGGLE_F3 = "f3";

18
src/main/java/de/srsoftware/web4rail/Plan.java

@ -148,13 +148,15 @@ public class Plan extends BaseClass{
case ACTION_ANALYZE: case ACTION_ANALYZE:
return analyze(); return analyze();
case ACTION_CLICK: case ACTION_CLICK:
return click(get(params.get(Tile.ID),true)); return click(get(params.get(ID),true));
case ACTION_MOVE: case ACTION_MOVE:
return moveTile(params.get(DIRECTION),params.get(Tile.ID)); return moveTile(params.get(DIRECTION),params.get(ID));
case ACTION_SAVE: case ACTION_SAVE:
return saveTo(DEFAULT_NAME); return saveTo(DEFAULT_NAME);
case ACTION_TIMES:
return updateTimes(params);
case ACTION_UPDATE: case ACTION_UPDATE:
return update(get(params.get(Tile.ID),true),params); return update(get(params.get(ID),true),params);
} }
return t("Unknown action: {}",params.get(ACTION)); return t("Unknown action: {}",params.get(ACTION));
} }
@ -813,6 +815,16 @@ public class Plan extends BaseClass{
return tile == null ? null : tile.update(params); return tile == null ? null : tile.update(params);
} }
private Object updateTimes(HashMap<String, String> params) throws IOException {
Tile tile = get(params.get(ID),false);
if (tile instanceof Block) {
Block block = (Block) tile;
place(block.updateTimes(params));
return tile.propMenu();
}
return t("updateTimes called on non-block tile!");
}
/** /**
* sends a Ghost train warning to the client * sends a Ghost train warning to the client
* @param contact * @param contact

178
src/main/java/de/srsoftware/web4rail/tiles/Block.java

@ -33,8 +33,9 @@ public abstract class Block extends StretchableTile{
private static final String NAME = "name"; private static final String NAME = "name";
private static final String NO_TAG = "[default]"; private static final String NO_TAG = "[default]";
private static final String NEW_TAG = "new_tag"; private static final String NEW_TAG = "new_tag";
private static final String TAG = "tag"; public static final String TAG = "tag";
private static final String WAIT_TIMES = "wait_times"; private static final String WAIT_TIMES = "wait_times";
private static final String RAISE = "raise";
public String name = "Block"; public String name = "Block";
public boolean turnAllowed = false; public boolean turnAllowed = false;
@ -123,6 +124,33 @@ public abstract class Block extends StretchableTile{
public abstract Direction directionA(); public abstract Direction directionA();
public abstract Direction directionB(); public abstract Direction directionB();
private Tile drop(String tag) {
for (int i=0; i<waitTimes.size(); i++) {
if (waitTimes.get(i).tag.equals(tag)) {
waitTimes.remove(i);
break;
}
}
return this;
}
private WaitTime getWaitTime(String tag) {
if (tag == null) return null;
for (WaitTime wt : waitTimes) {
if (wt.tag.equals(tag)) return wt;
}
return null;
}
public Range getWaitTime(Train train) {
for (WaitTime wt : waitTimes) {
if (train.tags().contains(wt.tag)) {
return wt.get(train.direction());
}
}
return getWaitTime(NO_TAG).get(train.direction());
}
@Override @Override
public JSONObject json() { public JSONObject json() {
JSONObject json = super.json(); JSONObject json = super.json();
@ -165,55 +193,86 @@ public abstract class Block extends StretchableTile{
} }
@Override @Override
public Window propMenu() { public Window propMenu() {
Window win = super.propMenu(); Window win = super.propMenu();
Form form = new Form("train-wait-form"); Form form = new Form("train-wait-form");
new Tag("h4").content(t("Stop settings")).addTo(win); new Tag("h4").content(t("Stop settings")).addTo(win);
new Input(REALM,REALM_PLAN).hideIn(form); new Input(REALM,REALM_PLAN).hideIn(form);
new Input(ID,id()).hideIn(form); new Input(ID,id()).hideIn(form);
new Input(ACTION,ACTION_UPDATE).hideIn(form); new Input(ACTION,ACTION_TIMES).hideIn(form);
Direction dA = directionA(); new Tag("div").content(t("Minimum and maximum times (in Miliseconds) trains with the respective tag have to wait in this block.")).addTo(form);
Direction dB = directionB();
Direction dA = directionA();
Tag table = new Tag("table"); Direction dB = directionB();
Tag row = new Tag("tr");
new Tag("td").content(t("Direction")).addTo(row); Tag table = new Tag("table");
new Tag("th").content(t("{}",dA)).attr("colspan", 2).addTo(row); Tag row = new Tag("tr");
new Tag("th").content(t("{}",dB)).attr("colspan", 2).addTo(row).addTo(table); new Tag("td").content(t("Direction")).addTo(row);
new Tag("th").content(t("{}bound",dA)).attr("colspan", 2).addTo(row);
new Tag("th").content(t("{}bound",dB)).attr("colspan", 2).addTo(row);
new Tag("td").content("").addTo(row).addTo(table);
row = new Tag("tr");
new Tag("th").content(t("Tag")).addTo(row);
new Tag("th").content(t("min")).addTo(row);
new Tag("th").content(t("max")).addTo(row);
new Tag("th").content(t("min")).addTo(row);
new Tag("th").content(t("max")).addTo(row);
new Tag("th").content(t("Actions")).addTo(row).addTo(table);
int count = 0;
for (WaitTime wt : waitTimes) {
count++;
row = new Tag("tr"); row = new Tag("tr");
new Tag("th").content(t("Tag")).addTo(row); new Tag("td").content(wt.tag).addTo(row);
new Tag("th").content(t("min")).addTo(row); new Input("min."+wt.tag+"."+dA,wt.get(dA).min).numeric().addTo(new Tag("td")).addTo(row);
new Tag("th").content(t("max")).addTo(row); new Input("max."+wt.tag+"."+dA,wt.get(dA).max).numeric().addTo(new Tag("td")).addTo(row);
new Tag("th").content(t("min")).addTo(row); new Input("min."+wt.tag+"."+dB,wt.get(dB).min).numeric().addTo(new Tag("td")).addTo(row);
new Tag("th").content(t("max")).addTo(row).addTo(table); new Input("max."+wt.tag+"."+dB,wt.get(dB).max).numeric().addTo(new Tag("td")).addTo(row);
Tag actions = new Tag("td");
for (WaitTime wt : waitTimes) { Map<String, String> props = Map.of(REALM,REALM_PLAN,ID,id(),ACTION,ACTION_TIMES);
row = new Tag("tr"); switch (count) {
new Tag("td").content(wt.tag).addTo(row); case 1:
new Input("min."+wt.tag+"."+dA,wt.get(dA).min).numeric().addTo(new Tag("td")).addTo(row); actions.content(""); break;
new Input("max."+wt.tag+"."+dA,wt.get(dA).max).numeric().addTo(new Tag("td")).addTo(row); case 2:
new Input("min."+wt.tag+"."+dB,wt.get(dB).min).numeric().addTo(new Tag("td")).addTo(row); new Button("-",merged(props,Map.of(ACTION_DROP,wt.tag))).addTo(actions);
new Input("max."+wt.tag+"."+dB,wt.get(dB).max).numeric().addTo(new Tag("td")).addTo(row).addTo(table); break;
default:
new Button("↑",merged(props,Map.of(RAISE,wt.tag))).addTo(actions);
new Button("-",merged(props,Map.of(ACTION_DROP,wt.tag))).addTo(actions);
} }
actions.addTo(row).addTo(table);
WaitTime defaultWT = getWaitTime(NO_TAG); }
row = new Tag("tr"); WaitTime defaultWT = getWaitTime(NO_TAG);
new Input(NEW_TAG,"").attr("placeholder", t("new tag")).addTo(new Tag("td")).addTo(row);
new Input("min."+NEW_TAG+"."+dA,defaultWT.get(dA).min).numeric().addTo(new Tag("td")).addTo(row); row = new Tag("tr");
new Input("max."+NEW_TAG+"."+dA,defaultWT.get(dA).max).numeric().addTo(new Tag("td")).addTo(row); new Input(NEW_TAG,"").attr("placeholder", t("new tag")).addTo(new Tag("td")).addTo(row);
new Input("min."+NEW_TAG+"."+dB,defaultWT.get(dB).min).numeric().addTo(new Tag("td")).addTo(row); new Input("min."+NEW_TAG+"."+dA,defaultWT.get(dA).min).numeric().addTo(new Tag("td")).addTo(row);
new Input("max."+NEW_TAG+"."+dB,defaultWT.get(dB).max).numeric().addTo(new Tag("td")).addTo(row).addTo(table); new Input("max."+NEW_TAG+"."+dA,defaultWT.get(dA).max).numeric().addTo(new Tag("td")).addTo(row);
new Input("min."+NEW_TAG+"."+dB,defaultWT.get(dB).min).numeric().addTo(new Tag("td")).addTo(row);
new Input("max."+NEW_TAG+"."+dB,defaultWT.get(dB).max).numeric().addTo(new Tag("td")).addTo(row).addTo(table);
table.addTo(form); table.addTo(form);
new Button(t("Apply"),form).addTo(form).addTo(win); new Button(t("Apply"),form).addTo(form).addTo(win);
return win; return win;
}
public Tile raise(String tag) {
for (int i=1; i<waitTimes.size(); i++) {
WaitTime wt = waitTimes.get(i);
if (wt.tag.equals(tag)) {
waitTimes.remove(i);
waitTimes.insertElementAt(wt, i-1);
break;
}
} }
return this;
}
public abstract List<Connector> startPoints(); public abstract List<Connector> startPoints();
@ -258,7 +317,20 @@ public abstract class Block extends StretchableTile{
} }
turnAllowed = params.containsKey(ALLOW_TURN) && params.get(ALLOW_TURN).equals("on"); turnAllowed = params.containsKey(ALLOW_TURN) && params.get(ALLOW_TURN).equals("on");
return super.update(params);
}
public Tile updateTimes(HashMap<String, String> params) throws IOException {
String tag = params.get(ACTION_DROP);
if (isSet(tag)) return drop(tag);
tag = params.get(RAISE);
if (isSet(tag)) return raise(tag);
String newTag = params.get(NEW_TAG); String newTag = params.get(NEW_TAG);
if (isSet(newTag)) {
newTag = newTag.replace(" ", "_").trim();
if (newTag.isEmpty()) newTag = null;
}
for (Entry<String, String> entry:params.entrySet()) { for (Entry<String, String> entry:params.entrySet()) {
String key = entry.getKey(); String key = entry.getKey();
String val = entry.getValue(); String val = entry.getValue();
@ -266,7 +338,8 @@ public abstract class Block extends StretchableTile{
if (key.startsWith("max.") || key.startsWith("min.")) { if (key.startsWith("max.") || key.startsWith("min.")) {
String[] parts = key.split("\\."); String[] parts = key.split("\\.");
boolean isMin = parts[0].equals("min"); boolean isMin = parts[0].equals("min");
String tag = parts[1].equals("new_tag") ? newTag : parts[1]; tag = parts[1].equals("new_tag") ? newTag : parts[1];
if (isNull(tag)) continue;
Direction dir = Direction.valueOf(parts[2]); Direction dir = Direction.valueOf(parts[2]);
WaitTime wt = getWaitTime(tag); WaitTime wt = getWaitTime(tag);
@ -280,23 +353,6 @@ public abstract class Block extends StretchableTile{
} }
} }
return super.update(params); return this;
}
private WaitTime getWaitTime(String tag) {
if (tag == null) return null;
for (WaitTime wt : waitTimes) {
if (wt.tag.equals(tag)) return wt;
}
return null;
}
public Range getWaitTime(Train train) {
for (WaitTime wt : waitTimes) {
if (train.tags().contains(wt.tag)) {
return wt.get(train.direction());
}
}
return getWaitTime(NO_TAG).get(train.direction());
} }
} }

1
src/main/java/de/srsoftware/web4rail/tiles/Tile.java

@ -46,7 +46,6 @@ public abstract class Tile extends BaseClass{
protected static Logger LOG = LoggerFactory.getLogger(Tile.class); protected static Logger LOG = LoggerFactory.getLogger(Tile.class);
private static int DEFAUT_LENGTH = 5; private static int DEFAUT_LENGTH = 5;
public static final String ID = "id";
private static final String LENGTH = "length"; private static final String LENGTH = "length";
private static final String LOCKED = "locked"; private static final String LOCKED = "locked";
private static final String OCCUPIED = "occupied"; private static final String OCCUPIED = "occupied";

Loading…
Cancel
Save