diff --git a/pom.xml b/pom.xml
index 1377c14..524e03d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
de.srsoftware
web4rail
- 1.4.34
+ 1.4.35
Web4Rail
jar
Java Model Railway Control
diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation
index be099de..339aebe 100644
--- a/resources/translations/Application.de.translation
+++ b/resources/translations/Application.de.translation
@@ -136,6 +136,7 @@ disabled : deaktiviert
disable {} : {} deaktivieren
disabled routes : deaktivierte Fahrstraßen
DisableEnableBlock : Block (de)aktivieren
+dismount : ausbauen
Display "{}" on {}. : „{}“ auf {} anzeigen.
Do you know, what you are doing? : Weißt du, was du da tust?
driven distance : zurückgelegte Strecke
@@ -227,16 +228,20 @@ mileage : Laufleistung
Minimum delay : minimale Verzögerung
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.
minimum starting voltage vmin : Mindestanfahrspannung vmin
+Mounted into "{}". : In "{}" eingebaut.
+Mounted decoder "{}". : Decoder "{}" eingebaut.
Move tiles : Kacheln verschieben
move up : nach oben schieben
name : Name
new car : neuer Waggon
new contact : neuer Kontakt
+new decoder : neuer Decoder
new direction : neue Fahrtrichtung
new locomotive : neue Lok
new tag : neue Markierung
new train : neuer Zug
No : keine
+no decoder : kein Decoder
No direct route from {} to {} : keine direkte Verbindung von {} zu {}
No free routes from {} : keine Route von {} frei
NORTH : Norden
@@ -272,6 +277,8 @@ Plan updated. : Plan aktualisiert.
Port for state {} : Anschluss für Status {}
PreserveRoute : Anschlußroute vorwählen
Programming : Programmierung
+prgramming track : Programmier-Gleis
+program on main : Hauptgleis-Programmierung
Properties : Eigenschaften
Properties of {} : Eigenschaften von {}
Properties of {} @ ({},{}) : Eigenschaften von {} @ ({},{})
@@ -285,6 +292,8 @@ Relay : Relais
Relay/Signal/Turnout : Relais/Signal/Weiche
Remove tag "{}" from train : Markierung "{}" von Zug entfernen
Removed {} : {} gelöscht
+Removed decoder "{}". : Decoder „{}“ ausgebaut.
+Removed decoder from "{}". : Decoder aus „{}“ entfernt.
Removed train "{}" : Zug „{}“ gelöscht
rename : umbenennen
Rename plan : Plan umbenennen
@@ -436,8 +445,10 @@ TurnoutRS : WeicheRS
TurnoutRW : WeicheRW
Turnouts : Weichen
turn within train : innerhalb des Zugs drehen
-Turns the train, as if it went through a loop. : Dreht den ZUg, als wenn er eine Wendeschleife passiert hätte.
+Turns the train, as if it went through a loop. : Dreht den ZUg, als wenn er eine Wendeschleife passiert hätte.
+Type : Typ
Unknown action\: {} : Unbekannte Aktion: {}
+Unknown decoder type : Unbekannter Decoder-Typ
Use negative number to count from end. : Nutze negative Nummern, um von Ende zu zählen.
unset : ungesetzt
update : aktualisieren
diff --git a/src/main/java/de/srsoftware/web4rail/Application.java b/src/main/java/de/srsoftware/web4rail/Application.java
index c525e6e..51a76da 100644
--- a/src/main/java/de/srsoftware/web4rail/Application.java
+++ b/src/main/java/de/srsoftware/web4rail/Application.java
@@ -25,6 +25,7 @@ import de.srsoftware.localconfig.Configuration;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.actions.ActionList;
import de.srsoftware.web4rail.conditions.Condition;
+import de.srsoftware.web4rail.devices.Decoder;
import de.srsoftware.web4rail.moving.Car;
import de.srsoftware.web4rail.moving.Locomotive;
import de.srsoftware.web4rail.moving.Train;
@@ -124,8 +125,10 @@ public class Application extends BaseClass{
return Contact.process(params);
case REALM_CONDITION:
return Condition.action(params,plan);
- case REALM_CU:
+ case REALM_CU:
return plan.controlUnit().process(params);
+ case REALM_DECODER:
+ return Decoder.action(params);
case REALM_HISTORY:
return History.action(params);
case REALM_LOCO:
diff --git a/src/main/java/de/srsoftware/web4rail/BaseClass.java b/src/main/java/de/srsoftware/web4rail/BaseClass.java
index ddfa88a..b47b40f 100644
--- a/src/main/java/de/srsoftware/web4rail/BaseClass.java
+++ b/src/main/java/de/srsoftware/web4rail/BaseClass.java
@@ -24,6 +24,7 @@ import de.srsoftware.web4rail.History.LogEntry;
import de.srsoftware.web4rail.Plan.Direction;
import de.srsoftware.web4rail.actions.Action;
import de.srsoftware.web4rail.conditions.Condition;
+import de.srsoftware.web4rail.devices.Decoder;
import de.srsoftware.web4rail.moving.Car;
import de.srsoftware.web4rail.moving.Locomotive;
import de.srsoftware.web4rail.moving.Train;
@@ -566,6 +567,7 @@ public abstract class BaseClass implements Constants{
public String realm() {
if (this instanceof Contact) return REALM_CONTACT;
+ if (this instanceof Decoder) return REALM_DECODER;
if (this instanceof Tile) return REALM_PLAN;
if (this instanceof Locomotive) return REALM_LOCO;
@@ -588,9 +590,10 @@ public abstract class BaseClass implements Constants{
return props;
}
- public BaseClass register() {
+ @SuppressWarnings("unchecked")
+ public T register() {
registry.put(id(),this);
- return this;
+ return (T) this;
}
public BaseClass remove() {
diff --git a/src/main/java/de/srsoftware/web4rail/Constants.java b/src/main/java/de/srsoftware/web4rail/Constants.java
index a9d2921..4ab1a12 100644
--- a/src/main/java/de/srsoftware/web4rail/Constants.java
+++ b/src/main/java/de/srsoftware/web4rail/Constants.java
@@ -48,6 +48,7 @@ public interface Constants {
public static final String REALM_CONDITION = "condition";
public static final String REALM_CONTACT = "contact";
public static final String REALM_CU = "cu";
+ public static final String REALM_DECODER = "decoder";
public static final String REALM_HISTORY = "history";
public static final String REALM_LOCO = "loco";
public static final String REALM_MAINTENANCE = "maintenance";
diff --git a/src/main/java/de/srsoftware/web4rail/devices/Decoder.java b/src/main/java/de/srsoftware/web4rail/devices/Decoder.java
index 24a7b6c..1927ad7 100644
--- a/src/main/java/de/srsoftware/web4rail/devices/Decoder.java
+++ b/src/main/java/de/srsoftware/web4rail/devices/Decoder.java
@@ -1,27 +1,30 @@
package de.srsoftware.web4rail.devices;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
-import java.util.Map.Entry;
import java.util.concurrent.TimeoutException;
import org.json.JSONObject;
import de.srsoftware.tools.Tag;
-import de.srsoftware.tools.Tools;
import de.srsoftware.web4rail.BaseClass;
import de.srsoftware.web4rail.Command;
import de.srsoftware.web4rail.Command.Reply;
+import de.srsoftware.web4rail.Constants;
+import de.srsoftware.web4rail.Protocol;
+import de.srsoftware.web4rail.moving.Locomotive;
import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tags.Fieldset;
import de.srsoftware.web4rail.tags.Form;
import de.srsoftware.web4rail.tags.Input;
import de.srsoftware.web4rail.tags.Radio;
+import de.srsoftware.web4rail.tags.Select;
import de.srsoftware.web4rail.tags.Table;
import de.srsoftware.web4rail.tags.Window;
-import de.srsoftware.web4rail.Constants;
-import de.srsoftware.web4rail.Protocol;
public class Decoder extends BaseClass implements Constants, Device {
@@ -38,12 +41,43 @@ public class Decoder extends BaseClass implements Constants, Device {
private static final String TRACK = "track";
private static final String VALUE = "val";
private static final String CV = "cv";
+ private String type;
+ private Locomotive loco;
+ public static Object action(HashMap params) {
+ Decoder decoder = BaseClass.get(Id.from(params));
+ switch (params.get(Constants.ACTION)) {
+ case ACTION_DECOUPLE:
+ return decoder.dismount();
+ case ACTION_PROGRAM:
+ return decoder.program(params);
+ case ACTION_PROPS:
+ return decoder.properties();
+ case ACTION_UPDATE:
+ return decoder.update(params);
+ }
+
+ String message = BaseClass.t("Unknown action: {}",params.get(Constants.ACTION));
+ return (BaseClass.isNull(decoder)) ? message : decoder.properties(message);
+ }
+
+ private Window dismount() {
+ if (isNull(loco)) return properties();
+ Locomotive locomotive = loco;
+ locomotive.removeDecoder(this);
+ loco = null;
+ addLogEntry(t("Removed decoder from \"{}\".",locomotive));
+ return locomotive.properties();
+ }
@Override
public int address() {
if (isNull(address)) address = cvs.get(CV_ADDR);
- return address;
+ return isNull(address) ? 3 : address;
+ }
+
+ public Button button() {
+ return super.button(type(),Map.of(REALM,REALM_DECODER));
}
public void init() {
@@ -84,13 +118,14 @@ public class Decoder extends BaseClass implements Constants, Device {
JSONObject json = super.json();
json.put(CVS, cvs);
json.put(PROTOCOL, proto);
+ json.put(TYPE, type);
return json;
}
-
+
@Override
public Tag link(String... args) {
- Tools.notImplemented("Decoder.link(…)");
- return new Tag("span").content("[[Decoder.link() not implemented]]");
+ // TODO Auto-generated method stub
+ return null;
}
@Override
@@ -101,9 +136,21 @@ public class Decoder extends BaseClass implements Constants, Device {
JSONObject jCvs = json.getJSONObject(CVS);
for (String key : jCvs.keySet()) cvs.put(Integer.parseInt(key),jCvs.getInt(key));
}
+ if (json.has(TYPE)) type = json.getString(TYPE);
return this;
}
+ private Window program(HashMap params) {
+ String error = null;
+ if (params.get(ACTION).equals(ACTION_PROGRAM)) try {
+ int cv = Integer.parseInt(params.get(CV));
+ int val = Integer.parseInt(params.get(VALUE));
+ boolean pom = !params.get(MODE).equals(TRACK);
+ error = program(cv,val,pom);
+ } catch (NumberFormatException e) {}
+ return properties(error);
+ }
+
private String program(int cv,int val,boolean pom) {
if (cv != 0) {
if (val < 0) {
@@ -132,7 +179,7 @@ public class Decoder extends BaseClass implements Constants, Device {
Fieldset fieldset = new Fieldset(t("Programming")).id("props-cv");
Form form = new Form("cv-form");
- new Input(REALM,REALM_LOCO).hideIn(form);
+ new Input(REALM,REALM_DECODER).hideIn(form);
new Input(ID,id()).hideIn(form);
new Input(ACTION,ACTION_PROGRAM).hideIn(form);
@@ -161,12 +208,14 @@ public class Decoder extends BaseClass implements Constants, Device {
@Override
protected Window properties(List