diff --git a/pom.xml b/pom.xml index 6251c89..34ee0af 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 1.2.22 + 1.2.23 Web4Rail jar Java Model Railway Control diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation index 2c3ecfd..d35ca68 100644 --- a/resources/translations/Application.de.translation +++ b/resources/translations/Application.de.translation @@ -44,6 +44,7 @@ Click here to add conditions : Hier klicken, um Bedingungen hinzuzufügen 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 relay : Hier klicken, um Relais einzurichten +click here to setup turnout : Hier klicken, um Weiche einzurichten Click on a name to edit the entry. : Klicke auf einen Namen, um einen Eintrag zu bearbeiten. Command to send to control unit\: : Kommando, welches zur Zentrale gesendet werden soll: ConditionalAction : bedingte Aktion @@ -156,6 +157,7 @@ Select display : Anzeige auswählen Select from plan : Auf Plan auswählen Select relay\: : Relais auswählen: Select train : Zug auswählen +Select turnout : Weiche wählen SendCommand : Kommando senden Send command "{}" to control unit : Kommando „{}“ an Zentrale senden Set {} as context : {} als Kontext setzen @@ -170,6 +172,7 @@ Set speed to {} {} : Geschwindigkeit auf {} {} setzen Set {} to {} : {} auf {} setzen SetPower : Strom schalten Set speed to : Geschwindigkeit setzen +SetTurnout : Weiche stellen Setup actions : Vorbereitung-Aktionen ShowText : Text anzeigen Signals : Signale diff --git a/src/main/java/de/srsoftware/web4rail/BaseClass.java b/src/main/java/de/srsoftware/web4rail/BaseClass.java index 4210cbc..c654a3d 100644 --- a/src/main/java/de/srsoftware/web4rail/BaseClass.java +++ b/src/main/java/de/srsoftware/web4rail/BaseClass.java @@ -247,20 +247,6 @@ public abstract class BaseClass implements Constants{ public Button button(String text) { return button(text,null); } - - public String realm() { - if (this instanceof Tile) return REALM_PLAN; - if (this instanceof Contact) return REALM_CONTACT; - - if (this instanceof Car) return REALM_CAR; - if (this instanceof Locomotive) return REALM_LOCO; - - if (this instanceof Action) return REALM_ACTIONS; - if (this instanceof Condition) return REALM_CONDITION; - if (this instanceof Route) return REALM_ROUTE; - if (this instanceof Train) return REALM_TRAIN; - return REALM_PLAN; - } public Form form(String id,List> elements) { Form form = new Form(id); @@ -280,14 +266,8 @@ public abstract class BaseClass implements Constants{ } @SuppressWarnings("unchecked") - public static T get(Id id) { - BaseClass element = registry.get(id); - if (isNull(element)) return null; - try { - return (T) element; - } catch (ClassCastException e) { - return null; - } + public static T get(Id id) { + return (T) registry.get(id); } public Id id() { @@ -394,6 +374,20 @@ public abstract class BaseClass implements Constants{ return win; } + public String realm() { + if (this instanceof Tile) return REALM_PLAN; + if (this instanceof Contact) return REALM_CONTACT; + + if (this instanceof Car) return REALM_CAR; + if (this instanceof Locomotive) return REALM_LOCO; + + if (this instanceof Action) return REALM_ACTIONS; + if (this instanceof Condition) return REALM_CONDITION; + if (this instanceof Route) return REALM_ROUTE; + if (this instanceof Train) return REALM_TRAIN; + return REALM_PLAN; + } + private String title() { return toString(); } diff --git a/src/main/java/de/srsoftware/web4rail/Constants.java b/src/main/java/de/srsoftware/web4rail/Constants.java index ef474f7..aaf714d 100644 --- a/src/main/java/de/srsoftware/web4rail/Constants.java +++ b/src/main/java/de/srsoftware/web4rail/Constants.java @@ -61,6 +61,7 @@ public interface Constants { public static final String PARENT = "parent"; public static final String PORT = "port"; public static final String RELAY = "relay"; + public static final String TURNOUT = "turnout"; public static final String TYPE = "type"; public static final Charset UTF8 = StandardCharsets.UTF_8; } diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java index c004f74..c942196 100644 --- a/src/main/java/de/srsoftware/web4rail/Route.java +++ b/src/main/java/de/srsoftware/web4rail/Route.java @@ -702,7 +702,7 @@ public class Route extends BaseClass implements Comparable{ for (Tile tile : path) { if (ignoredPath.contains(tile)) continue; try { - tile.setRoute(this); + alreadyLocked.add(tile.setRoute(this)); } catch (IllegalStateException e) { success = false; break; @@ -839,16 +839,13 @@ public class Route extends BaseClass implements Comparable{ public boolean setTurnouts() { Turnout turnout = null; - for (Entry entry : turnouts.entrySet()) try { + for (Entry entry : turnouts.entrySet()) { turnout = entry.getKey(); Turnout.State targetVal = entry.getValue(); if (!turnout.state(targetVal).succeeded()) return false; try { Thread.sleep(500); } catch (InterruptedException e) {} - } catch (IOException e) { - LOG.warn("Was not able to switch turnout {}!",turnout,e); - return false; } return true; } diff --git a/src/main/java/de/srsoftware/web4rail/actions/Action.java b/src/main/java/de/srsoftware/web4rail/actions/Action.java index ce58d21..f4b080d 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/Action.java +++ b/src/main/java/de/srsoftware/web4rail/actions/Action.java @@ -78,6 +78,7 @@ public abstract class Action extends BaseClass { SetRelay.class, SetSignal.class, SetSpeed.class, + SetTurnout.class, ShowText.class, StopAllTrains.class, StopAuto.class, diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java b/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java index 070b0cf..f36945d 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java +++ b/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java @@ -42,7 +42,7 @@ public class SetRelay extends Action { super.load(json); String relayId = json.getString(RELAY); if (isSet(relayId)) { - relay = Relay.get(new Id(relayId)); + relay = BaseClass.get(new Id(relayId)); state = json.getBoolean(Relay.STATE); } return this; diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetTurnout.java b/src/main/java/de/srsoftware/web4rail/actions/SetTurnout.java new file mode 100644 index 0000000..1898e4f --- /dev/null +++ b/src/main/java/de/srsoftware/web4rail/actions/SetTurnout.java @@ -0,0 +1,90 @@ +package de.srsoftware.web4rail.actions; + +import java.util.HashMap; +import java.util.List; + +import org.json.JSONObject; + +import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.BaseClass; +import de.srsoftware.web4rail.Window; +import de.srsoftware.web4rail.tags.Fieldset; +import de.srsoftware.web4rail.tags.Select; +import de.srsoftware.web4rail.tiles.Turnout; +import de.srsoftware.web4rail.tiles.Turnout.State; + +public class SetTurnout extends Action { + + public SetTurnout(BaseClass parent) { + super(parent); + } + + private Turnout turnout = null; + private Turnout.State state = State.STRAIGHT; + + @Override + public boolean fire(Context context) { + if (isNull(turnout)) return false; + return turnout.state(state).succeeded(); + } + + @Override + public JSONObject json() { + JSONObject json = super.json(); + if (isSet(turnout)) { + json.put(TURNOUT, turnout.id()); + json.put(Turnout.STATE, state); + } + return json; + } + + @Override + public Action load(JSONObject json) { + super.load(json); + String turnoutId = json.getString(TURNOUT); + if (isSet(turnoutId)) { + turnout = BaseClass.get(new Id(turnoutId)); + state = Turnout.State.valueOf(json.getString(Turnout.STATE)); + } + return this; + } + + @Override + protected Window properties(List
preForm, FormInput formInputs, List
postForm) { + + formInputs.add(t("Select turnout"),Turnout.selector(turnout,null)); + + if (isSet(turnout)) { + Select select = new Select(Turnout.STATE); + + for (Turnout.State st : turnout.states()) { + Tag option = select.addOption(st,t(st.toString())); + if (st == state) option.attr("selected", "selected"); + } + formInputs.add(t("Select state"),select); + } + + return super.properties(preForm, formInputs, postForm); + } + + @Override + protected void removeChild(BaseClass child) { + if (child == turnout) turnout = null; + super.removeChild(child); + } + + public String toString() { + if (isNull(turnout)) return "["+t("click here to setup turnout")+"]"; + return t("Set {} to {}",turnout,state); + }; + + @Override + protected Object update(HashMap params) { + LOG.debug("update: {}",params); + Id turnoutId = new Id(params.get(TURNOUT)); + turnout = BaseClass.get(turnoutId); + String st = params.get(Turnout.STATE); + if (isSet(st)) state = Turnout.State.valueOf(st); + return super.update(params); + } +} diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Turnout.java b/src/main/java/de/srsoftware/web4rail/tiles/Turnout.java index 2576dea..f3706a0 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Turnout.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Turnout.java @@ -1,6 +1,7 @@ package de.srsoftware.web4rail.tiles; import java.io.IOException; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -9,6 +10,7 @@ import java.util.concurrent.TimeoutException; import org.json.JSONObject; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.BaseClass; import de.srsoftware.web4rail.Command; import de.srsoftware.web4rail.Command.Reply; import de.srsoftware.web4rail.Device; @@ -17,6 +19,7 @@ import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Input; import de.srsoftware.web4rail.tags.Radio; +import de.srsoftware.web4rail.tags.Select; /** * Base class for Turnouts @@ -139,11 +142,23 @@ public abstract class Turnout extends Tile implements Device{ } } + public static Select selector(Turnout preselect, Collection exclude) { + Select selector = new Select(TURNOUT); + List turnouts = BaseClass.listElements(Turnout.class); + turnouts.sort((t1,t2) -> t1.x == t2.x ? t1.y - t2.y : t1.x - t2.x); + for (Turnout turnout : turnouts) { + if (isSet(exclude) && exclude.contains(turnout)) continue; + Tag option = selector.addOption(turnout.id(), turnout); + if (turnout == preselect) option.attr("selected", "selected"); + } + return selector; + } + public State state() { return state; } - public Reply state(State newState) throws IOException { + public Reply state(State newState) { if (train != null && newState != state) return new Reply(415, t("{} locked by {}!",this,train)); if (address == 0) { state = newState; @@ -173,10 +188,10 @@ public abstract class Turnout extends Tile implements Device{ LOG.warn(e.getMessage()); } return new Reply(417,t("Timeout while trying to switch {}.",this)); - - } + public abstract List states(); + public void success() { this.error = false; try { diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Turnout3E.java b/src/main/java/de/srsoftware/web4rail/tiles/Turnout3E.java index c3ae382..0da1195 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Turnout3E.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Turnout3E.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; @@ -33,4 +34,9 @@ public class Turnout3E extends Turnout{ return new HashMap<>(); } } + + @Override + public List states() { + return List.of(State.STRAIGHT,State.RIGHT,State.LEFT); + } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/TurnoutL.java b/src/main/java/de/srsoftware/web4rail/tiles/TurnoutL.java index 7a6988c..e8b48b3 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/TurnoutL.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/TurnoutL.java @@ -40,6 +40,11 @@ public abstract class TurnoutL extends Turnout { return super.properties(preForm, formInputs, postForm); } + @Override + public List states() { + return List.of(State.STRAIGHT,State.LEFT); + } + @Override public Tile update(HashMap params) { if (params.containsKey(STRAIGHT)) portA = Integer.parseInt(params.get(STRAIGHT)); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/TurnoutR.java b/src/main/java/de/srsoftware/web4rail/tiles/TurnoutR.java index 35ad15b..863ce30 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/TurnoutR.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/TurnoutR.java @@ -41,6 +41,11 @@ public abstract class TurnoutR extends Turnout { return super.properties(preForm, formInputs, postForm); } + @Override + public List states() { + return List.of(State.STRAIGHT,State.RIGHT); + } + @Override public Tile update(HashMap params) { if (params.containsKey(STRAIGHT)) portA = Integer.parseInt(params.get(STRAIGHT));