diff --git a/pom.xml b/pom.xml index 0545ca8..5d4ef4d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 0.10.7 + 0.10.8s Web4Rail jar Java Model Railway Control diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation index bd465c9..f69ce6e 100644 --- a/resources/translations/Application.de.translation +++ b/resources/translations/Application.de.translation @@ -21,7 +21,7 @@ Control unit : Zentrale 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 Relay einzurichten +click here to setup relay : Hier klicken, um Relais einzurichten Create action : Aktion erzeugen DelayedAction : verzögerte Aktion delete : entfernen @@ -31,11 +31,13 @@ disabled : deaktiviert EAST : Osten editable train properties : veränderliche Zug-Eigenschaften Emergency : Notfall +Firing {} : starte {} FinishRoute : Route abschließen FreeStartBlock : Start-Block freigeben Hardware settings : Hardware-Einstellungen Height : Höhe Help : Hilfe +if ({})\: {} : falls ({}): {} inverted : invertiert learn : lernen LEFT : links @@ -78,6 +80,7 @@ Select relay\: : Relais auswählen: SetRelay : Relais schalten SetSignalsToStop : Signale auf Halt stellen SetSpeed : Geschwindigkeit ändern +Set {} to {} : {} auf {} setzen Set speed to : Geschwindigkeit setzen Setup actions : Aktivierungs-Aktionen Signals : Signale @@ -100,12 +103,16 @@ Trains\: : Züge: TrainHasTag : Zug mit Tag TrainLength : Zuglänge TrainSelect : Zug-Auswahl +Trigger {} : {} betätigen TriggerContact : Kontakt auslösen +Turn : Richtung wechseln Turn allowed : Wenden erlaubt +{} turned. : {} gewendet. Turnouts : Weichen TurnTrain : Fahrtrichtung umkehren Unknown action\: {} : Unbekannte Aktion: {} unset : ungesetzt +Wait {} ms, then\: {} : {} ms warten, dann: {} Was not able to assign {} to {}! : Konnte {} nicht an {} zuweisen! Was not able to lock {} : Konnte {} nicht reservieren Was not able to set all signals! : Konnte nicht alle Signale stellen! diff --git a/src/main/java/de/srsoftware/web4rail/Plan.java b/src/main/java/de/srsoftware/web4rail/Plan.java index c21a4ba..c7d4241 100644 --- a/src/main/java/de/srsoftware/web4rail/Plan.java +++ b/src/main/java/de/srsoftware/web4rail/Plan.java @@ -70,7 +70,7 @@ import de.srsoftware.web4rail.tiles.TurnoutRW; * @author Stephan Richter, SRSoftware * */ -public class Plan implements Constants{ +public class Plan extends BaseClass{ /** * The four directions Trains can be within blocks */ @@ -240,7 +240,6 @@ public class Plan implements Constants{ for (Block block : blocks) { for (Connector con : block.startPoints()) routes.addAll(follow(new Route().begin(block,con.from.inverse()),con)); } - this.routes.clear(); for (Tile tile : tiles.values()) tile.routes().clear(); for (Route route : routes) { route.complete(); @@ -571,13 +570,16 @@ public class Plan implements Constants{ /** * adds a new route to the plan - * @param route + * @param newRoute * @return */ - Route registerRoute(Route route) { - for (Tile tile: route.path()) tile.add(route); - routes.put(route.id(), route); - return route; + Route registerRoute(Route newRoute) { + for (Tile tile: newRoute.path()) tile.add(newRoute); + int routeId = newRoute.id(); + Route existingRoute = routes.get(routeId); + if (isSet(existingRoute)) newRoute.addActionsFrom(existingRoute); + routes.put(routeId, newRoute); + return newRoute; } /** @@ -668,10 +670,8 @@ public class Plan implements Constants{ } public void sensor(int addr, boolean active) { - LOG.debug("contact({},{})",addr,active); Contact contact = Contact.get(addr); LOG.debug("contact: {}",contact); - LOG.debug("learning: {}",learningContact); if (contact != null) { contact.activate(active); } else { @@ -683,7 +683,6 @@ public class Plan implements Constants{ } } - /** * shows the properties of an entity specified in the params.context value * @param params diff --git a/src/main/java/de/srsoftware/web4rail/Route.java b/src/main/java/de/srsoftware/web4rail/Route.java index e9e22f2..32c4f22 100644 --- a/src/main/java/de/srsoftware/web4rail/Route.java +++ b/src/main/java/de/srsoftware/web4rail/Route.java @@ -6,6 +6,7 @@ import java.io.FileWriter; import java.io.IOException; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -79,6 +80,7 @@ public class Route extends BaseClass{ private ActionList setupActions = new ActionList(); private Block startBlock = null; public Direction startDirection; + private HashSet triggeredContacts = new HashSet<>(); /** * process commands from the client @@ -147,6 +149,20 @@ 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); @@ -298,8 +314,10 @@ public class Route extends BaseClass{ * @param trainHead */ public void contact(Contact contact) { - traceTrainFrom(contact); + if (triggeredContacts.contains(contact)) return; // don't trigger contact a second time + triggeredContacts.add(contact); LOG.debug("{} on {} activated {}.",train,this,contact); + traceTrainFrom(contact); ActionList actions = triggers.get(contact.trigger()); if (isNull(actions)) return; Context context = new Context(contact); @@ -314,6 +332,10 @@ public class Route extends BaseClass{ return REALM_ROUTE+":"+id(); } + public boolean isDisabled() { + return disabled; + } + private Object dropCodition(HashMap params) { String condId = params.get(REALM_CONDITION); if (isSet(condId)) { @@ -344,7 +366,7 @@ public class Route extends BaseClass{ train.heading(endDirection.inverse()); if (train.route == this) train.route = null; train = null; - + triggeredContacts.clear(); } public boolean fireSetupActions(Context context) { @@ -522,7 +544,7 @@ public class Route extends BaseClass{ name = generateName(); name(name); } - return name + (disabled?" ["+t("disabled")+"]" : ""); + return name; } public void name(String name) { @@ -559,6 +581,7 @@ public class Route extends BaseClass{ train.heading(startDirection); if (train.route == this) train.route = null; } + triggeredContacts.clear(); 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 7eb61b6..4a588dd 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/Action.java +++ b/src/main/java/de/srsoftware/web4rail/actions/Action.java @@ -80,6 +80,10 @@ public abstract class Action extends BaseClass { } return null; } + + public boolean equals(Action other) { + return this.toString().equals(other.toString()); + } public abstract boolean fire(Context context) throws IOException; diff --git a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java index ee89a55..8f13307 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/ActionList.java +++ b/src/main/java/de/srsoftware/web4rail/actions/ActionList.java @@ -74,6 +74,29 @@ public class ActionList extends Vector implements Constants{ return win; } + public void addActionsFrom(ActionList other) { + for (Action otherAction : other) { + LOG.debug("old action: {}",otherAction); + boolean exists = false; + int len = this.size(); + for (int i=0; i props = new HashMap(Map.of( REALM,REALM_ACTIONS, @@ -121,7 +144,7 @@ public class ActionList extends Vector implements Constants{ } public boolean fire(Context context) { - LOG.debug("Firing {}",this); + LOG.debug(t("Firing {}"),this); boolean success = true; for (Action action : this) { try { diff --git a/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java b/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java index a57f5d8..eed699f 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java +++ b/src/main/java/de/srsoftware/web4rail/actions/ConditionalAction.java @@ -102,7 +102,7 @@ public class ConditionalAction extends Action { if (i>0) sb.append(t(" or ")); sb.append(conditions.get(i).toString()); } - return t("if ({}):",sb); + return t("if ({}): {}",sb,actions); } @Override diff --git a/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java b/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java index 8dd23f3..d2f57c6 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java +++ b/src/main/java/de/srsoftware/web4rail/actions/DelayedAction.java @@ -41,7 +41,7 @@ public class DelayedAction extends Action { new Input(ACTION,ACTION_UPDATE).hideIn(form); new Input(CONTEXT,params.get(CONTEXT)).hideIn(form); - new Input(DELAY,delay).numeric().addTo(new Label(t("Delay")+NBSP)).content(" ms").addTo(form); + new Input(DELAY,delay).numeric().addTo(new Label(t("Delay")+NBSP)).content(NBSP+"ms").addTo(form); return new Button(t("Apply"),form).addTo(form).addTo(fieldset); } @@ -59,8 +59,6 @@ public class DelayedAction extends Action { }.start(); return true; } - - @Override public JSONObject json() { @@ -87,7 +85,7 @@ public class DelayedAction extends Action { @Override public String toString() { - return t("Wait {} ms, then:",delay); + return t("Wait {} ms, then: {}",delay,actions); } @Override diff --git a/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java b/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java index ffaf302..0b3cb5a 100644 --- a/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java +++ b/src/main/java/de/srsoftware/web4rail/actions/SetRelay.java @@ -78,7 +78,7 @@ public class SetRelay extends Action { public String toString() { if (isNull(relay)) return "["+t("click here to setup relay")+"]"; - return t("Set "+relay+" to "+(state?relay.stateLabelA:relay.stateLabelB)); + return t("Set {} to {}",relay,state?relay.stateLabelA:relay.stateLabelB); }; @Override diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java index 28640ba..0d43a83 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Train.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java @@ -335,7 +335,7 @@ public class Train extends BaseClass implements Comparable { } public Tag link(String tagClass) { - return link(tagClass, Map.of(REALM, REALM_TRAIN,ID,id,ACTION,ACTION_PROPS),name()); + return link(tagClass, Map.of(REALM, REALM_TRAIN,ID,id,ACTION,ACTION_PROPS),name()+NBSP); } public static TreeSet list() { @@ -539,7 +539,6 @@ public class Train extends BaseClass implements Comparable { } public void setSpeed(int v) { - LOG.debug("Setting speed to {} kmh.",v); for (Locomotive loco : locos) loco.setSpeed(v); this.speed = v; } diff --git a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java index cda2c0b..297cf91 100644 --- a/src/main/java/de/srsoftware/web4rail/tiles/Tile.java +++ b/src/main/java/de/srsoftware/web4rail/tiles/Tile.java @@ -241,7 +241,7 @@ public abstract class Tile extends BaseClass{ Tag routeList = new Tag("ol"); for (Route route : routes) { String json = new JSONObject(Map.of(REALM,ROUTE,ID,route.id(),ACTION,ACTION_PROPS,CONTEXT,REALM_PLAN+":"+id())).toString().replace("\"", "'"); - Tag li = new Tag("span").attr("onclick","return request("+json+");").content(route.name()+NBSP).addTo(new Tag("li").clazz("link")); + Tag li = new Tag("span").attr("onclick","return request("+json+");").content(route.name()+(route.isDisabled()?" ["+t("disabled")+"]" : "")+NBSP).addTo(new Tag("li").clazz("link")); Map params = Map.of(REALM,REALM_ROUTE,ID,route.id(),ACTION,ACTION_DROP,Tile.class.getSimpleName(),id()); new Button(t("delete route"),params).addTo(li); li.addTo(routeList);