From 880ef561ddb83123ba430803693533007f00de51 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Sat, 7 Nov 2020 19:29:32 +0100 Subject: [PATCH] added non-track contact to tiles, re-implementes PowerOff to SetPower --- pom.xml | 2 +- .../translations/Application.de.translation | 9 +- .../de/srsoftware/web4rail/ControlUnit.java | 22 ++--- .../java/de/srsoftware/web4rail/Plan.java | 1 + .../srsoftware/web4rail/actions/Action.java | 2 +- .../srsoftware/web4rail/actions/PowerOff.java | 10 -- .../srsoftware/web4rail/actions/SetPower.java | 94 +++++++++++++++++++ .../srsoftware/web4rail/actions/SetSpeed.java | 3 +- .../de/srsoftware/web4rail/tags/Radio.java | 4 +- .../de/srsoftware/web4rail/tiles/Contact.java | 68 ++++++++------ .../de/srsoftware/web4rail/tiles/Tile.java | 2 +- 11 files changed, 159 insertions(+), 58 deletions(-) delete mode 100644 src/main/java/de/srsoftware/web4rail/actions/PowerOff.java create mode 100644 src/main/java/de/srsoftware/web4rail/actions/SetPower.java diff --git a/pom.xml b/pom.xml index d2145d3..f7ef3fd 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 0.10.11 + 0.10.12 Web4Rail jar Java Model Railway Control diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation index 55c6f06..12bd236 100644 --- a/resources/translations/Application.de.translation +++ b/resources/translations/Application.de.translation @@ -59,13 +59,14 @@ new train : neuer Zug No : keine No free routes from {} : keine Route von {} frei NORTH : Norden +Off : Aus +On : An One way\: : Richtung: Online Documentation : Online-Dokumentation other train properties : andere Zug-Eigenschaften Origin and destination : Start und Ziel Origin\: {} to {} : Start: {} nach {} Plan saved as "{}". : Plan als „{}“ gespeichert. -PowerOff : Strom abschalten Properties : Eigenschaften Properties of {} : Eigenschaften von {} Properties of {} @ ({},{}) : Eigenschaften von {} @ ({},{}) @@ -84,6 +85,7 @@ SetRelay : Relais schalten SetSignalsToStop : Signale auf Halt stellen SetSpeed : Geschwindigkeit ändern Set {} to {} : {} auf {} setzen +SetPower : Strom schalten Set speed to : Geschwindigkeit setzen Setup actions : Aktivierungs-Aktionen Signals : Signale @@ -92,8 +94,11 @@ Started {} : {} gestartet StopAuto : Automatikmodus abschalten Straight port\: : Port für gerade STRAIGHT : gerade +Switch power off : Strom ausschalten +Switch power on : Strom anschalten Tags : Markierungen -Toggle power : Stom an/ausschalten +Toggle : umschalten +Toggle power : Stom umschalten Train\: : Zug: train does not have tag "{}" : Zug hat keine Markierung „{}“ train has tag "{}" : Zug hat Markierung „{}“ diff --git a/src/main/java/de/srsoftware/web4rail/ControlUnit.java b/src/main/java/de/srsoftware/web4rail/ControlUnit.java index 2236fd4..c390e8f 100644 --- a/src/main/java/de/srsoftware/web4rail/ControlUnit.java +++ b/src/main/java/de/srsoftware/web4rail/ControlUnit.java @@ -157,7 +157,7 @@ public class ControlUnit extends Thread implements Constants{ restart(); return t("Control unit (re)started."); case ACTION_EMERGENCY: - return emergency(); + return set(false); case ACTION_POWER: return togglePower(); case ACTION_PROPS: @@ -169,15 +169,6 @@ public class ControlUnit extends Thread implements Constants{ return t("Unknown action: {}",params.get(ACTION)); } - /** - * turn of power immediately - * @return - */ - public Object emergency() { - power = true; - return togglePower(); - } - /** * generate a properties view for the client * @return @@ -268,6 +259,15 @@ public class ControlUnit extends Thread implements Constants{ command.readReplyFrom(commandScanner); } + /** + * set power state + * @return + */ + public Object set(boolean on) { + power = !on; + return togglePower(); + } + /** * set up the connection endpoint * @param newHost @@ -352,7 +352,7 @@ public class ControlUnit extends Thread implements Constants{ * togge power on/off at the SRCP daemon * @return */ - private Command togglePower() { + public Command togglePower() { power = !power; String PW = power?"ON":"OFF"; Command command = new Command("SET {} POWER "+PW) { diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index 66112ce..1920943 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -783,6 +783,7 @@ public class Plan extends BaseClass{ new TurnoutLE().tag(null).addTo(tiles); new Turnout3E().tag(null).addTo(tiles); new Relay().setLabel(true,"RL").tag(null).addTo(tiles); + new Contact().tag(null).addTo(tiles); new Eraser().tag(null).addTo(tiles); return tiles.addTo(tileMenu); } diff --git a/src/main/java/de/srsoftware/web4rail/actions/Action.java b/src/main/java/de/srsoftware/web4rail/actions/Action.java index 4a588dd..5cc382e 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/Action.java +++ b/src/main/java/de/srsoftware/web4rail/actions/Action.java @@ -108,7 +108,7 @@ public abstract class Action extends BaseClass { TriggerContact.class, TurnTrain.class, StopAuto.class, - PowerOff.class, + SetPower.class, SetRelay.class, DelayedAction.class ); diff --git a/src/main/java/de/srsoftware/web4rail/actions/PowerOff.java b/src/main/java/de/srsoftware/web4rail/actions/PowerOff.java deleted file mode 100644 index 8a67273..0000000 --- a/src/main/java/de/srsoftware/web4rail/actions/PowerOff.java +++ /dev/null @@ -1,10 +0,0 @@ -package de.srsoftware.web4rail.actions; - -public class PowerOff extends Action{ - - @Override - public boolean fire(Context context) { - context.contact.plan().controlUnit().emergency(); - return false; - } -} diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetPower.java b/src/main/java/de/srsoftware/web4rail/actions/SetPower.java new file mode 100644 index 0000000..353858c --- /dev/null +++ b/src/main/java/de/srsoftware/web4rail/actions/SetPower.java @@ -0,0 +1,94 @@ +package de.srsoftware.web4rail.actions; + +import java.util.HashMap; + +import org.json.JSONObject; + +import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.ControlUnit; +import de.srsoftware.web4rail.Window; +import de.srsoftware.web4rail.tags.Button; +import de.srsoftware.web4rail.tags.Form; +import de.srsoftware.web4rail.tags.Input; +import de.srsoftware.web4rail.tags.Radio; + +public class SetPower extends Action{ + + private static final String STATE = "state"; + private POWERCHANGE pc = POWERCHANGE.OFF; + + enum POWERCHANGE { + ON, OFF, TOGGLE; + } + + @Override + public boolean fire(Context context) { + ControlUnit cu = context.contact.plan().controlUnit(); + switch (pc) { + case ON: + cu.set(true); + break; + case TOGGLE: + cu.togglePower(); + break; + default: + cu.set(false); + break; + } + + return true; + } + + @Override + public JSONObject json() { + JSONObject json = super.json(); + json.put(STATE, pc); + return json; + } + + @Override + public Action load(JSONObject json) { + super.load(json); + pc = POWERCHANGE.valueOf(json.getString(STATE)); + return this; + } + + @Override + public Window properties(HashMap params) { + Window win = super.properties(params); + Form form = new Form("action-prop-form-"+id); + new Input(REALM,REALM_ACTIONS).hideIn(form); + new Input(ID,params.get(ID)).hideIn(form); + new Input(ACTION,ACTION_UPDATE).hideIn(form); + new Input(CONTEXT,params.get(CONTEXT)).hideIn(form); + + new Radio(STATE, POWERCHANGE.ON, t("On"), pc == POWERCHANGE.ON).addTo(form); + new Radio(STATE, POWERCHANGE.OFF, t("Off"), pc == POWERCHANGE.OFF).addTo(form); + new Radio(STATE, POWERCHANGE.TOGGLE, t("Toggle"), pc == POWERCHANGE.TOGGLE).addTo(form); + + new Button(t("Apply"),form).addTo(form).addTo(win); + return win; + } + + @Override + public String toString() { + switch (pc) { + case ON: + return t("Switch power on"); + case OFF: + return t("Switch power off"); + default: + return t("Toggle power"); + } + } + + @Override + protected Object update(HashMap params) { + LOG.debug("update: {}",params); + String error = null; + String newState = params.get(STATE); + if (isSet(newState)) pc = POWERCHANGE.valueOf(newState); + Window win = properties(params); + return new Tag("span").content(error).addTo(win); + } +} diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java b/src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java index 4ddcd9d..5a46ca9 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java +++ b/src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java @@ -36,8 +36,7 @@ public class SetSpeed extends Action{ public Action load(JSONObject json) { super.load(json); maxSpeed = json.getInt(MAX_SPEED); - return this; - + return this; } @Override diff --git a/src/main/java/de/srsoftware/web4rail/tags/Radio.java b/src/main/java/de/srsoftware/web4rail/tags/Radio.java index 4bac829..7693cc2 100644 --- a/src/main/java/de/srsoftware/web4rail/tags/Radio.java +++ b/src/main/java/de/srsoftware/web4rail/tags/Radio.java @@ -6,9 +6,9 @@ public class Radio extends Tag { private static final long serialVersionUID = -7291730168237304236L; - public Radio(String groupName, String value, String label, boolean preCheck) { + public Radio(String groupName, Object value, String label, boolean preCheck) { super("label"); - Tag radio = new Tag("input").attr("type", "radio").attr("name", groupName).attr("value", value); + 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/Contact.java b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java index 914cc2d..751944b 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java @@ -10,13 +10,16 @@ import java.util.TreeMap; import org.json.JSONObject; import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.Window; +import de.srsoftware.web4rail.actions.Action.Context; +import de.srsoftware.web4rail.actions.ActionList; import de.srsoftware.web4rail.tags.Button; import de.srsoftware.web4rail.tags.Form; import de.srsoftware.web4rail.tags.Input; import de.srsoftware.web4rail.tags.Label; import de.srsoftware.web4rail.tags.Select; -public abstract class Contact extends Tile{ +public class Contact extends Tile{ private static final String ADDRESS = "address"; private static final HashMap contactsById = new HashMap(); @@ -24,27 +27,17 @@ public abstract class Contact extends Tile{ private boolean active = false; private String trigger = null; private int addr = 0; - - public void trigger(int duration) throws IOException { - activate(true); - new Thread() { - public void run() { - try { - sleep(duration); - activate(false); - } catch (Exception e) {} - } - }.start(); - } + private ActionList actions = new ActionList(); public void activate(boolean active) { this.active = active; if (active) { - if (route == null) { - plan.warn(this); - } else { + if (isSet(route)) { route.contact(this); + } else if (getClass() != Contact.class) { + plan.warn(this); } + actions.fire(new Context(this)); } try { stream(); @@ -129,6 +122,26 @@ public abstract class Contact extends Tile{ return form; } + @Override + public Window propMenu() { + Window win = super.propMenu(); + new Tag("h4").content(t("Actions")).addTo(win); + actions.addTo(win, REALM_PLAN+":"+id()); + return win; + } + + public static Select selector(Contact preselect) { + TreeMap sortedSet = new TreeMap(); // Map from Name to Contact + for (Contact contact : contactsById.values()) sortedSet.put(contact.toString(), contact); + Select select = new Select(CONTACT); + for (Entry entry : sortedSet.entrySet()) { + Contact contact = entry.getValue(); + Tag option = select.addOption(contact.id(),contact); + if (contact == preselect) option.attr("selected", "selected"); + } + return select; + } + public void stream() throws IOException { Tag tag = super.tag(null); if (active) tag.clazz(tag.get("class")+" active"); @@ -146,21 +159,20 @@ public abstract class Contact extends Tile{ return trigger; } + public void trigger(int duration) throws IOException { + activate(true); + new Thread() { + public void run() { + try { + sleep(duration); + activate(false); + } catch (Exception e) {} + } + }.start(); + } @Override public Tile update(HashMap params) throws IOException { if (params.containsKey(ADDRESS)) addr(Integer.parseInt(params.get(ADDRESS))); return super.update(params); } - - public static Select selector(Contact preselect) { - TreeMap sortedSet = new TreeMap(); // Map from Name to Contact - for (Contact contact : contactsById.values()) sortedSet.put(contact.toString(), contact); - Select select = new Select(CONTACT); - for (Entry entry : sortedSet.entrySet()) { - Contact contact = entry.getValue(); - Tag option = select.addOption(contact.id(),contact); - if (contact == preselect) option.attr("selected", "selected"); - } - return select; - } } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java index 8b1dd8e..06c1b10 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java @@ -212,7 +212,7 @@ public abstract class Tile extends BaseClass{ return form; } - public Tag propMenu() { + public Window propMenu() { Window window = new Window("tile-properties",t("Properties of {} @ ({},{})",title(),x,y)); if (isSet(train)) {