From b899572f553602949eef0c3a13fd4e06957d4304 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Sat, 7 Nov 2020 19:50:30 +0100 Subject: [PATCH] added SendCommand action --- pom.xml | 2 +- .../translations/Application.de.translation | 3 + .../java/de/srsoftware/web4rail/Plan.java | 2 +- .../java/de/srsoftware/web4rail/Route.java | 29 +++---- .../srsoftware/web4rail/actions/Action.java | 4 + .../web4rail/actions/SendCommand.java | 75 +++++++++++++++++++ .../de/srsoftware/web4rail/moving/Car.java | 4 + .../de/srsoftware/web4rail/moving/Train.java | 10 +++ .../de/srsoftware/web4rail/tiles/Contact.java | 2 + 9 files changed, 115 insertions(+), 16 deletions(-) create mode 100644 src/main/java/de/srsoftware/web4rail/actions/SendCommand.java diff --git a/pom.xml b/pom.xml index f7ef3fd..7376a3d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 0.10.12 + 0.10.13 Web4Rail jar Java Model Railway Control diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation index 12bd236..81c1f2d 100644 --- a/resources/translations/Application.de.translation +++ b/resources/translations/Application.de.translation @@ -24,6 +24,7 @@ Current location\: : Aktueller Ort: Actions and contacts : Aktionen und Kontakte click here to setup contact : Hier klicken, um Kontakt auszuwählen click here to setup relay : Hier klicken, um Relais einzurichten +Command to send to control unit\: : Kommando, welches zur Zentrale gesendet werden soll: Create action : Aktion erzeugen DelayedAction : verzögerte Aktion delete : entfernen @@ -81,6 +82,8 @@ Route will only be available to trains fulfilling all conditions. : Route ist nu Save : speichern Select contact\: : Kotakt auswählen: Select relay\: : Relais auswählen: +SendCommand : Kommando senden +Send command \"{}\" to control unit : Kommando „{}“ an Zentrale senden SetRelay : Relais schalten SetSignalsToStop : Signale auf Halt stellen SetSpeed : Geschwindigkeit ändern diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index 1920943..af89397 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -576,7 +576,7 @@ public class Plan extends BaseClass{ for (Tile tile: newRoute.path()) tile.add(newRoute); int routeId = newRoute.id(); Route existingRoute = routes.get(routeId); - if (isSet(existingRoute)) newRoute.addActionsFrom(existingRoute); + if (isSet(existingRoute)) newRoute.addPropertiesFrom(existingRoute); routes.put(routeId, newRoute); return newRoute; } diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java index 96f8942..1da4152 100644 --- a/src/main/java/de/srsoftware/web4rail/Route.java +++ b/src/main/java/de/srsoftware/web4rail/Route.java @@ -149,20 +149,6 @@ public class Route extends BaseClass{ actions.add(action); } - public void addActionsFrom(Route existingRoute) { - LOG.debug("addActionsFrom({})",existingRoute); - setupActions.addActionsFrom(existingRoute.setupActions); - for (Entry entry : triggers.entrySet()) { - String trigger = entry.getKey(); - ActionList existingActionList = existingRoute.triggers.get(trigger); - if (isSet(existingActionList)) { - LOG.debug("found action list for {} on existing route {}: {}",trigger,existingRoute,existingActionList); - ActionList newActionList = entry.getValue(); - newActionList.addActionsFrom(existingActionList); - } - } - } - private void addBasicPropertiesTo(Window win) { if (isSet(train)) link("span",Map.of(REALM,REALM_TRAIN,ID,train.id,ACTION,ACTION_PROPS),t("Train: {}",train)).addTo(win); new Tag("h4").content(t("Origin and destination")).addTo(win); @@ -237,6 +223,21 @@ public class Route extends BaseClass{ new Button(t("Apply"),form).addTo(form).addTo(win); } + public void addPropertiesFrom(Route existingRoute) { + LOG.debug("addPropertiesFrom({})",existingRoute); + disabled = existingRoute.disabled; + setupActions.addActionsFrom(existingRoute.setupActions); + for (Entry entry : triggers.entrySet()) { + String trigger = entry.getKey(); + ActionList existingActionList = existingRoute.triggers.get(trigger); + if (isSet(existingActionList)) { + LOG.debug("found action list for {} on existing route {}: {}",trigger,existingRoute,existingActionList); + ActionList newActionList = entry.getValue(); + newActionList.addActionsFrom(existingActionList); + } + } + } + void addSignal(Signal signal) { signals.add(signal); } diff --git a/src/main/java/de/srsoftware/web4rail/actions/Action.java b/src/main/java/de/srsoftware/web4rail/actions/Action.java index 5cc382e..7af4e71 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/Action.java +++ b/src/main/java/de/srsoftware/web4rail/actions/Action.java @@ -41,6 +41,7 @@ public abstract class Action extends BaseClass { public Context(Contact c) { contact = c; + plan = contact.plan(); route = contact.route(); if (route == null) return; train = route.train; @@ -48,10 +49,12 @@ public abstract class Action extends BaseClass { public Context(Train train) { this.train = train; + if (isSet(train)) plan = train.locos().get(0).plan(); } public Context(Route route) { this.route = route; + if (isSet(route)) plan = route.path().firstElement().plan(); train = route.train; } @@ -101,6 +104,7 @@ public abstract class Action extends BaseClass { public static List> list() { return List.of( + SendCommand.class, ConditionalAction.class, SetSpeed.class, SetSignalsToStop.class, diff --git a/src/main/java/de/srsoftware/web4rail/actions/SendCommand.java b/src/main/java/de/srsoftware/web4rail/actions/SendCommand.java new file mode 100644 index 0000000..29269c8 --- /dev/null +++ b/src/main/java/de/srsoftware/web4rail/actions/SendCommand.java @@ -0,0 +1,75 @@ +package de.srsoftware.web4rail.actions; + +import java.util.HashMap; + +import org.json.JSONObject; + +import de.srsoftware.tools.Tag; +import de.srsoftware.web4rail.Command; +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.Label; + +public class SendCommand extends Action{ + + public static final String COMMAND = "command"; + private String command = "SET 1 POWER OFF"; + + @Override + public boolean fire(Context context) { + context.plan.queue(new Command(command) { + + @Override + public void onResponse(Reply reply) { + super.onResponse(reply); + context.plan.stream(reply.message()); + } + }); + + return false; + } + + @Override + public JSONObject json() { + JSONObject json = super.json(); + json.put(COMMAND, command); + return json; + } + + @Override + public Action load(JSONObject json) { + super.load(json); + command = json.getString(COMMAND); + 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); + Label label = new Label(t("Command to send to control unit:")+NBSP); + new Input(COMMAND, command).addTo(label).addTo(form); + new Button(t("Apply"),form).addTo(form).addTo(win); + return win; + } + + @Override + public String toString() { + return t("Send command \"{}\" to control unit",command); + } + + @Override + protected Object update(HashMap params) { + LOG.debug("update: {}",params); + String error = null; + command = params.get(COMMAND); + Window win = properties(params); + return new Tag("span").content(error).addTo(win); + } +} diff --git a/src/main/java/de/srsoftware/web4rail/moving/Car.java b/src/main/java/de/srsoftware/web4rail/moving/Car.java index fc05ec9..759fd33 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Car.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Car.java @@ -162,6 +162,10 @@ public class Car extends BaseClass { return name; } + public Plan plan() { + return plan; + } + public Car plan(Plan plan) { this.plan = plan; return this; diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java index 072c45e..e33fb4f 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Train.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java @@ -9,6 +9,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Random; @@ -263,6 +264,10 @@ public class Train extends BaseClass implements Comparable { return locoList.addTo(locoProp); } + public List cars(){ + return new Vector(cars); + } + private static Object create(HashMap params, Plan plan) { Locomotive loco = (Locomotive) Locomotive.get(params.get(Train.LOCO_ID)); if (isNull(loco)) return t("unknown locomotive: {}",params.get(ID)); @@ -400,6 +405,11 @@ public class Train extends BaseClass implements Comparable { return locoList.addTo(locoProp); } + public List locos(){ + return new Vector(locos); + } + + public static Object manager() { Window win = new Window("train-manager", t("Train manager")); new Tag("h4").content(t("known trains")).addTo(win); diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java index 751944b..6a6b160 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Contact.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Contact.java @@ -70,6 +70,7 @@ public class Contact extends Tile{ public JSONObject json() { JSONObject json = super.json(); if (addr > 0) json.put(ADDRESS, addr); + if (!actions.isEmpty()) json.put(REALM_ACTIONS, actions.json()); return json; } @@ -82,6 +83,7 @@ public class Contact extends Tile{ protected Tile load(JSONObject json) throws IOException { super.load(json); if (json.has(ADDRESS)) addr(json.getInt(ADDRESS)); + if (json.has(REALM_ACTIONS)) actions = ActionList.load(json.getJSONArray(REALM_ACTIONS)); return this; }