From 3cd72cffb6d950f5fc2f2209391d5d6361eb31aa Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 12 Jan 2021 00:53:25 +0100 Subject: [PATCH] bugfixes + added new condition TrainWasInBlock --- pom.xml | 2 +- .../translations/Application.de.translation | 6 ++ .../web4rail/conditions/BlockFree.java | 4 +- .../web4rail/conditions/Condition.java | 3 +- .../web4rail/conditions/TrainWasInBlock.java | 77 +++++++++++++++++++ .../de/srsoftware/web4rail/moving/Train.java | 25 +++++- 6 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 src/main/java/de/srsoftware/web4rail/conditions/TrainWasInBlock.java diff --git a/pom.xml b/pom.xml index 0e6b35c..de614be 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 de.srsoftware web4rail - 1.3.11 + 1.3.12 Web4Rail jar Java Model Railway Control diff --git a/resources/translations/Application.de.translation b/resources/translations/Application.de.translation index 335ca3c..3276d18 100644 --- a/resources/translations/Application.de.translation +++ b/resources/translations/Application.de.translation @@ -46,6 +46,7 @@ BlockFree : Blockbelegung Block {} is free : Block {} ist frei Block {} is occupied : Block {} ist belegt Block properties : Block-Eigenschaften +blocks of train : Blöcke des Zugs {}bound : nach {} BrakeCancel : Bremsvorgang abbrechen BrakeStart : Bremsvorgang starten @@ -139,6 +140,7 @@ known cars : bekannte Waggons known locomotives : bekannte Lokomotiven known trains : bekannte Züge Label for state {} : Beschriftung für Status {} +Last blocks : Letzte Blöcke learn : lernen LEFT : links Left port\: : Port für links @@ -173,6 +175,7 @@ NORTH : Norden Not connected to other bridge part! : Nicht mit anderem Brücken-Teil verbunden! Notes : Notizen No tile moved. : keine Kachel verschoben. +{} not within last {} blocks of train : {} ist nicht in den letzten {} Blöcken des Zugs {} now heading for {} : {} ist nun unterwegs nach {} {} now in auto-mode : {} ist nun im Automatikmodus Occupied area\: : Belegte Abschnitte: @@ -221,6 +224,7 @@ Route will only be available, if all conditions are fulfilled. : Route ist nur v Save "{}" : „{}“ speichern Save : speichern SavePlan : Plan speichern +Seek in last : Durchsuche letzte Select block : Block auswählen Select car : Fahrzeug auswählen Select contact\: : Kotakt auswählen: @@ -304,6 +308,7 @@ Trains\: : Züge: TrainSelect : Zug-Auswahl TrainSpeed : Zug-Geschwindigkeit Train speed : Zug-Geschwindigkeit +TrainWasInBlock : Zug war im Block Trigger {} : {} betätigen Trigger a feedback sensor to assign it with this contact! : Rückmeldekontakt auslösen, um ihn diesem Kontakt zuzuweisen! TriggerContact : Kontakt auslösen @@ -335,4 +340,5 @@ Was not able to set all signals! : Konnte nicht alle Signale stellen! Was not able to set all turnouts! : Konnte nicht alle Weichen stellen! WEST : Westen Width : Breite +{} within last {} blocks of train : {} ist in den letzten {} Blöcken des Zugs Your plan currently has {} routes. : Ihr Plan hat im Moment {} Fahrstraßen. \ No newline at end of file diff --git a/src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java b/src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java index b6bca3b..eb24962 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java @@ -32,7 +32,7 @@ public class BlockFree extends Condition { public Condition load(JSONObject json) { super.load(json); - block(Block.get(new Id(json.getString(BLOCK)))); + if (json.has(BLOCK)) block(Block.get(new Id(json.getString(BLOCK)))); return this; } @@ -60,7 +60,7 @@ public class BlockFree extends Condition { if (!params.containsKey(BLOCK)) return t("No block id passed to BlockFree.update()!"); Id bid = new Id(params.get(BLOCK)); Block block = Block.get(bid); - if (block == null) return t("No block with id {} found!",bid); + if (isNull(block)) return t("No block with id {} found!",bid); this.block = block; return super.update(params); } diff --git a/src/main/java/de/srsoftware/web4rail/conditions/Condition.java b/src/main/java/de/srsoftware/web4rail/conditions/Condition.java index 4d79843..57eb3ed 100644 --- a/src/main/java/de/srsoftware/web4rail/conditions/Condition.java +++ b/src/main/java/de/srsoftware/web4rail/conditions/Condition.java @@ -125,7 +125,8 @@ public abstract class Condition extends BaseClass { TrainHasTag.class, TrainLength.class, TrainSelect.class, - TrainSpeed.class); + TrainSpeed.class, + TrainWasInBlock.class); } public Condition load(JSONObject json) { diff --git a/src/main/java/de/srsoftware/web4rail/conditions/TrainWasInBlock.java b/src/main/java/de/srsoftware/web4rail/conditions/TrainWasInBlock.java new file mode 100644 index 0000000..a861ee7 --- /dev/null +++ b/src/main/java/de/srsoftware/web4rail/conditions/TrainWasInBlock.java @@ -0,0 +1,77 @@ +package de.srsoftware.web4rail.conditions; + +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.moving.Train; +import de.srsoftware.web4rail.tags.Fieldset; +import de.srsoftware.web4rail.tags.Input; +import de.srsoftware.web4rail.tiles.Block; + +public class TrainWasInBlock extends Condition { + + private static final String BLOCK = Block.class.getSimpleName(); + private static final String COUNT = "count"; + private Block block; + private int count = 5; + + private TrainWasInBlock block(Block block) { + this.block = block; + return this; + } + + @Override + public boolean fulfilledBy(Context context) { + Train train = context.train(); + if (isNull(train)) return false; + return train.lastBlocks(count).contains(block) != inverted; + } + + @Override + public JSONObject json() { + return super.json().put(BLOCK, block.id()).put(COUNT, count); + } + + public Condition load(JSONObject json) { + super.load(json); + if (json.has(BLOCK)) block(Block.get(new Id(json.getString(BLOCK)))); + if (json.has(COUNT)) count = json.getInt(COUNT); + return this; + } + + @Override + protected Window properties(List
preForm, FormInput formInputs, List
postForm) { + formInputs.add(t("Select block"), Block.selector(block, null)); + formInputs.add(t("Seek in last"), new Input(COUNT, count).numeric().addTo(new Tag("span")).content(NBSP+t("blocks of train"))); + return super.properties(preForm, formInputs, postForm); + } + + @Override + protected void removeChild(BaseClass child) { + if (child == block) block = null; + super.removeChild(child); + } + + @Override + public String toString() { + if (block == null) return "["+t("Click here to select block!")+"]"; + return t(inverted ? "{} not within last {} blocks of train":"{} within last {} blocks of train",block,count); + } + + + @Override + protected Object update(HashMap params) { + if (!params.containsKey(BLOCK)) return t("No block id passed to TrainWasInBlock.update()!"); + Id bid = new Id(params.get(BLOCK)); + Block block = Block.get(bid); + if (isNull(block)) return t("No block with id {} found!",bid); + this.block = block; + if (params.containsKey(COUNT)) count=Integer.parseInt(params.get(COUNT)); + return super.update(params); + } +} diff --git a/src/main/java/de/srsoftware/web4rail/moving/Train.java b/src/main/java/de/srsoftware/web4rail/moving/Train.java index 4c8dfd2..59ee7fc 100644 --- a/src/main/java/de/srsoftware/web4rail/moving/Train.java +++ b/src/main/java/de/srsoftware/web4rail/moving/Train.java @@ -80,6 +80,7 @@ public class Train extends BaseClass implements Comparable { private Block currentBlock,destination = null; LinkedList trace = new LinkedList(); + private Vector lastBlocks = new Vector(); public int speed = 0; private Autopilot autopilot = null; @@ -227,6 +228,16 @@ public class Train extends BaseClass implements Comparable { return t("{} now in auto-mode",this); } + private Fieldset blockHistory() { + Fieldset fieldset = new Fieldset(t("Last blocks")); + Tag list = new Tag("ol"); + for (int i=lastBlocks.size(); i>0; i--) { + lastBlocks.get(i-1).link().addTo(new Tag("li")).addTo(list); + } + return list.addTo(fieldset); + } + + public String brakeId() { return brakeId(false); } @@ -405,6 +416,12 @@ public class Train extends BaseClass implements Comparable { if (!tags.isEmpty()) json.put(TAGS, tags); return json; } + + public Collection lastBlocks(int count) { + Vector blocks = new Vector(count); + for (int i=0; i { preForm.add(Locomotive.cockpit(this)); postForm.add(otherTrainProps); postForm.add(brakeTimes()); + postForm.add(blockHistory()); + return super.properties(preForm, formInputs, postForm); } @@ -700,7 +719,11 @@ public class Train extends BaseClass implements Comparable { public void set(Block newBlock) { LOG.debug("{}.set({})",this,newBlock); currentBlock = newBlock; - if (isSet(currentBlock)) currentBlock.setTrain(this); + if (isSet(currentBlock)) { + currentBlock.setTrain(this); + lastBlocks.add(newBlock); + if (lastBlocks.size()>32) lastBlocks.remove(0); + } } private String setDestination(HashMap params) {