diff --git a/pom.xml b/pom.xml
index 435ed9f..91dadb4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0de.srsoftwareweb4rail
- 1.3.14
+ 1.3.15Web4RailjarJava Model Railway Control
diff --git a/resources/svg/DecouplerH.svg b/resources/svg/DecouplerH.svg
new file mode 100644
index 0000000..28bd712
--- /dev/null
+++ b/resources/svg/DecouplerH.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/resources/svg/DecouplerV.svg b/resources/svg/DecouplerV.svg
new file mode 100644
index 0000000..2a04410
--- /dev/null
+++ b/resources/svg/DecouplerV.svg
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation
index 3276d18..9d3770b 100644
--- a/resources/translations/Application.de.translation
+++ b/resources/translations/Application.de.translation
@@ -29,6 +29,7 @@ Analyze : analysieren
Analyze may overwrite these routes! : Durch die Analyse können diese Fahrstraßen überschrieben werden!
Analyzing plan... : Plan wird analysiert...
and : und
+AlterDirection : Fahrtrichtung ändern
AndCondition : Und-Bedingung
Application will load "{}" on next launch and will now quit! : Anwendung wird beim nächsten Start „{}“ laden und wird jetzt beendet.
Apply : Übernehmen
@@ -64,6 +65,7 @@ Click here to select car! : Hier klicken, um Fahrzeug auszuwählen!
Click here to select display! : Hier klicken, um Anzeige auszuwählen!
Click here to select train! : Hier klicken, um Zug auszuwählen!
click here to setup contact : Hier klicken, um Kontakt auszuwählen
+Click here to setup decoupler : Hier klicken, um Entkuppler einzurichten
click here to setup relay : Hier klicken, um Relais einzurichten
click here to setup signal : Hier klicken, um Signal einzurichten
Click here to setup tag : Hier klicken, um Markierung anzugeben
@@ -111,6 +113,8 @@ Edit json : JSON bearbeiten
Effect : Effekt
Emergency : Notfall
enable {} : {} aktivieren
+Engage {} : {} aktivieren
+EngageDecoupler : Entkuppler aktivieren
Enter new name for plan : Neuen Namen für den Plan eingeben
export : exportieren
Faster (10 {}) : 10 {} schneller
@@ -166,6 +170,7 @@ Move tiles : Kacheln verschieben
name\: : Name:
new car : neuer Waggon
new contact : neuer Kontakt
+new direction : neue Fahrtrichtung
new locomotive : neue Lok
new tag : neue Markierung
new train : neuer Zug
@@ -211,6 +216,7 @@ rename : umbenennen
Rename plan : Plan umbenennen
Report Issue : Problem melden
reverse : wenden
+reverse train : Zug wenden
Reversed {}. : {} umgedreht.
RIGHT : rechts
Right port\: : Port für rechts
@@ -240,6 +246,7 @@ Send command "{}" to {} : Kommando „{}“ an {} senden
Send command to : Kommando senden an
Set {} as context : {} als Kontext setzen
SetContextTrain : Zug für Folgeaktionen festlegen
+Set direction of train to {} : Setze Richtung des Zugs auf {}
SetDisplayText : Anzeige-Text setzen
SetRelay : Relais schalten
SetSignal : Signal stellen
@@ -314,6 +321,7 @@ Trigger a feedback sensor to assign it with this contact! : Rückmeldekontakt au
TriggerContact : Kontakt auslösen
Trigger contact to learn new contact : Kontakt auslösen, um neuen Kontakt zu lernen
Turn : Richtung wechseln
+turn train : Richtung des zuges Wechseln
Turn allowed : Wenden erlaubt
{} turned. : {} gewendet.
Turnout : Weiche
diff --git a/src/main/java/de/srsoftware/web4rail/Device.java b/src/main/java/de/srsoftware/web4rail/Device.java
index 978b206..787a273 100644
--- a/src/main/java/de/srsoftware/web4rail/Device.java
+++ b/src/main/java/de/srsoftware/web4rail/Device.java
@@ -4,7 +4,6 @@ import de.srsoftware.tools.Tag;
public interface Device {
public static final String ADDRESS = "address";
- public static final String PORT = "port";
public static final String PROTOCOL = "proto";
public int address();
diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java
index 39fb400..b80f954 100644
--- a/src/main/java/de/srsoftware/web4rail/Plan.java
+++ b/src/main/java/de/srsoftware/web4rail/Plan.java
@@ -50,6 +50,8 @@ import de.srsoftware.web4rail.tiles.ContactV;
import de.srsoftware.web4rail.tiles.CrossH;
import de.srsoftware.web4rail.tiles.CrossPlus;
import de.srsoftware.web4rail.tiles.CrossV;
+import de.srsoftware.web4rail.tiles.DecouplerH;
+import de.srsoftware.web4rail.tiles.DecouplerV;
import de.srsoftware.web4rail.tiles.DiagES;
import de.srsoftware.web4rail.tiles.DiagNE;
import de.srsoftware.web4rail.tiles.DiagSW;
@@ -931,6 +933,8 @@ public class Plan extends BaseClass{
new TurnoutLW().tag(null).addTo(tiles);
new TurnoutLE().tag(null).addTo(tiles);
new Turnout3E().tag(null).addTo(tiles);
+ new DecouplerH().tag(null).addTo(tiles);
+ new DecouplerV().tag(null).addTo(tiles);
new Relay().setLabel(true,"RL").tag(null).addTo(tiles);
new Contact().tag(null).addTo(tiles);
new TextDisplay().text("tx").tag(null).addTo(tiles);
diff --git a/src/main/java/de/srsoftware/web4rail/actions/Action.java b/src/main/java/de/srsoftware/web4rail/actions/Action.java
index f09751c..1be5db9 100644
--- a/src/main/java/de/srsoftware/web4rail/actions/Action.java
+++ b/src/main/java/de/srsoftware/web4rail/actions/Action.java
@@ -48,6 +48,7 @@ public abstract class Action extends BaseClass {
ConditionalAction.class,
DelayedAction.class,
DetermineTrainInBlock.class,
+ EngageDecoupler.class,
FinishRoute.class,
Loop.class,
PreserveRoute.class,
diff --git a/src/main/java/de/srsoftware/web4rail/actions/EngageDecoupler.java b/src/main/java/de/srsoftware/web4rail/actions/EngageDecoupler.java
new file mode 100644
index 0000000..cf0d6f8
--- /dev/null
+++ b/src/main/java/de/srsoftware/web4rail/actions/EngageDecoupler.java
@@ -0,0 +1,84 @@
+package de.srsoftware.web4rail.actions;
+
+import java.util.HashMap;
+import java.util.List;
+
+import org.json.JSONObject;
+
+import de.srsoftware.web4rail.Application;
+import de.srsoftware.web4rail.BaseClass;
+import de.srsoftware.web4rail.Window;
+import de.srsoftware.web4rail.tags.Fieldset;
+import de.srsoftware.web4rail.tiles.Decoupler;
+
+public class EngageDecoupler extends Action {
+
+ private static final String DECOUPLER = Decoupler.class.getSimpleName();
+
+ public EngageDecoupler(BaseClass parent) {
+ super(parent);
+ }
+
+ private Decoupler decoupler = null;
+
+ @Override
+ public boolean fire(Context context) {
+ if (isNull(decoupler)) return false;
+ decoupler.engage();
+ return true;
+ }
+
+ @Override
+ public JSONObject json() {
+ JSONObject json = super.json();
+ if (isSet(decoupler)) {
+ json.put(Decoupler.class.getSimpleName(), decoupler.id());
+ }
+ return json;
+ }
+
+ @Override
+ public Action load(JSONObject json) {
+ super.load(json);
+ if (json.has(DECOUPLER)) {
+ String decouplerId = json.getString(DECOUPLER);
+ decoupler = BaseClass.get(new Id(decouplerId));
+ if (isNull(decoupler)) Application.threadPool.execute(new Thread() { // if relay not loaded, yet: wait one sec and try again
+ public void run() {
+ try {
+ sleep(1000);
+ } catch (InterruptedException e) {}
+ decoupler = BaseClass.get(new Id(decouplerId));
+ };
+ });
+ }
+ return this;
+ }
+
+ @Override
+ protected Window properties(List