improved brake time learning, added time table to routes
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -4,7 +4,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>de.srsoftware</groupId>
|
<groupId>de.srsoftware</groupId>
|
||||||
<artifactId>web4rail</artifactId>
|
<artifactId>web4rail</artifactId>
|
||||||
<version>1.1.6</version>
|
<version>1.1.7</version>
|
||||||
<name>Web4Rail</name>
|
<name>Web4Rail</name>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<description>Java Model Railway Control</description>
|
<description>Java Model Railway Control</description>
|
||||||
|
|||||||
@@ -286,4 +286,20 @@ fieldset.notes{
|
|||||||
}
|
}
|
||||||
fieldset.notes textarea{
|
fieldset.notes textarea{
|
||||||
min-width: 100%;
|
min-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.brake-times{
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.brake-times tr > *{
|
||||||
|
border-style: solid;
|
||||||
|
border-color: black;
|
||||||
|
border-width: 0 1px;
|
||||||
|
text-align: center;
|
||||||
|
padding: 2px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.brake-times th{
|
||||||
|
border-width: 0 1px 1px;
|
||||||
}
|
}
|
||||||
@@ -29,6 +29,9 @@ Block properties : Block-Eigenschaften
|
|||||||
BrakeCancel : Bremsvorgang abbrechen
|
BrakeCancel : Bremsvorgang abbrechen
|
||||||
BrakeStart : Bremsvorgang starten
|
BrakeStart : Bremsvorgang starten
|
||||||
BrakeStop : Zug anhalten
|
BrakeStop : Zug anhalten
|
||||||
|
Brake time¹, forward : Bremszeit¹, vorwärts
|
||||||
|
Brake time¹, reverse : Bremszeit¹, rückwärts
|
||||||
|
Brake time table : Bremszeit-Tabelle
|
||||||
Car manager : Waggon-Verwaltung
|
Car manager : Waggon-Verwaltung
|
||||||
Cars\: : Waggons:
|
Cars\: : Waggons:
|
||||||
Click here to select train! : HIer klicken, um Zug auszuwählen!
|
Click here to select train! : HIer klicken, um Zug auszuwählen!
|
||||||
@@ -65,6 +68,7 @@ disabled : deaktiviert
|
|||||||
Display "{}" on clients. : „{}“ auf den Clients anzeigen.
|
Display "{}" on clients. : „{}“ auf den Clients anzeigen.
|
||||||
Drop : Verwerfen
|
Drop : Verwerfen
|
||||||
Dropped destination of {}. : Ziel von {} verworfen.
|
Dropped destination of {}. : Ziel von {} verworfen.
|
||||||
|
1) Duration between 5 {} steps during brake process. : 1) Zeit zwischen 5 {}-Schritten beim Bremsvorgang.
|
||||||
EAST : Osten
|
EAST : Osten
|
||||||
editable train properties : veränderliche Zug-Eigenschaften
|
editable train properties : veränderliche Zug-Eigenschaften
|
||||||
Emergency : Notfall
|
Emergency : Notfall
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ import de.srsoftware.web4rail.tags.Fieldset;
|
|||||||
import de.srsoftware.web4rail.tags.Form;
|
import de.srsoftware.web4rail.tags.Form;
|
||||||
import de.srsoftware.web4rail.tags.Input;
|
import de.srsoftware.web4rail.tags.Input;
|
||||||
import de.srsoftware.web4rail.tags.Label;
|
import de.srsoftware.web4rail.tags.Label;
|
||||||
|
import de.srsoftware.web4rail.tags.Table;
|
||||||
import de.srsoftware.web4rail.tiles.Block;
|
import de.srsoftware.web4rail.tiles.Block;
|
||||||
import de.srsoftware.web4rail.tiles.Contact;
|
import de.srsoftware.web4rail.tiles.Contact;
|
||||||
import de.srsoftware.web4rail.tiles.Shadow;
|
import de.srsoftware.web4rail.tiles.Shadow;
|
||||||
@@ -76,17 +77,23 @@ public class Route extends BaseClass implements Comparable<Route>{
|
|||||||
private class BrakeProcessor extends Thread {
|
private class BrakeProcessor extends Thread {
|
||||||
private int startSpeed;
|
private int startSpeed;
|
||||||
private long timestamp;
|
private long timestamp;
|
||||||
private int timeStep;
|
private Integer timeStep;
|
||||||
private Route route;
|
private Route route;
|
||||||
private Train train;
|
private Train train;
|
||||||
private boolean aborted = false;
|
private boolean aborted = false;
|
||||||
|
private String brakeId;
|
||||||
private static final int ENDSPEED = 5;
|
private static final int ENDSPEED = 5;
|
||||||
|
|
||||||
public BrakeProcessor(Route route, Train train, Integer timestep) {
|
public BrakeProcessor(Route route, Train train) {
|
||||||
startSpeed = train.speed;
|
|
||||||
this.timeStep = isNull(timestep) ? 100 : timestep;
|
|
||||||
this.route = route;
|
|
||||||
this.train = train;
|
this.train = train;
|
||||||
|
this.route = route;
|
||||||
|
|
||||||
|
startSpeed = train.speed;
|
||||||
|
brakeId = train.brakeId();
|
||||||
|
|
||||||
|
timeStep = brakeTimes.get(brakeId);
|
||||||
|
// if no brake time is available for this train, use the fastest brake time already known for this route:
|
||||||
|
if (isNull(timeStep)) timeStep = route.brakeTimes.values().stream().min(Integer::compare).orElse(100);
|
||||||
start();
|
start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,7 +116,7 @@ public class Route extends BaseClass implements Comparable<Route>{
|
|||||||
newTimeStep = diff < 0 ? timeStep - absDiff : timeStep + absDiff;
|
newTimeStep = diff < 0 ? timeStep - absDiff : timeStep + absDiff;
|
||||||
|
|
||||||
if (newTimeStep != timeStep) {
|
if (newTimeStep != timeStep) {
|
||||||
route.brakeTimes.put(train.brakeId(),newTimeStep);
|
route.brakeTimes.put(brakeId,newTimeStep);
|
||||||
LOG.debug("Corrected brake timestep for {} @ {} from {} to {} ms.",train,route,timeStep,newTimeStep);
|
LOG.debug("Corrected brake timestep for {} @ {} from {} to {} ms.",train,route,timeStep,newTimeStep);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -233,6 +240,19 @@ public class Route extends BaseClass implements Comparable<Route>{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addBraketimesTo(Window win) {
|
||||||
|
new Tag("h4").content(t("Brake time table")).addTo(win);
|
||||||
|
Table table = new Table();
|
||||||
|
table.addHead(t("Train"),t("Brake time¹, forward"),t("Brake time¹, reverse"));
|
||||||
|
for (Train t : Train.list()) {
|
||||||
|
Integer fTime = brakeTimes.get(t.brakeId());
|
||||||
|
Integer rTime = brakeTimes.get(t.brakeId(true));
|
||||||
|
table.addRow(t,isSet(fTime)? fTime+NBSP+"ms" : "–",isSet(rTime)? fTime+NBSP+"ms" : "–");
|
||||||
|
}
|
||||||
|
table.clazz("brake-times").addTo(win);
|
||||||
|
new Tag("p").content(t("1) Duration between 5 {} steps during brake process.",speedUnit)).addTo(win);
|
||||||
|
}
|
||||||
|
|
||||||
private void addConditionsTo(Window win) {
|
private void addConditionsTo(Window win) {
|
||||||
new Tag("h4").content(t("Conditions")).addTo(win);
|
new Tag("h4").content(t("Conditions")).addTo(win);
|
||||||
if (!conditions.isEmpty()) {
|
if (!conditions.isEmpty()) {
|
||||||
@@ -365,8 +385,7 @@ public class Route extends BaseClass implements Comparable<Route>{
|
|||||||
|
|
||||||
public void brakeStart() {
|
public void brakeStart() {
|
||||||
if (isNull(train)) return;
|
if (isNull(train)) return;
|
||||||
Integer brakeTime = brakeTimes.get(train.brakeId());
|
brakeProcessor = new BrakeProcessor(this,train);
|
||||||
brakeProcessor = new BrakeProcessor(this,train,brakeTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void brakeStop() {
|
public void brakeStop() {
|
||||||
@@ -695,7 +714,7 @@ public class Route extends BaseClass implements Comparable<Route>{
|
|||||||
addTurnoutsTo(win);
|
addTurnoutsTo(win);
|
||||||
addConditionsTo(win);
|
addConditionsTo(win);
|
||||||
addContactsTo(win);
|
addContactsTo(win);
|
||||||
|
addBraketimesTo(win);
|
||||||
return win;
|
return win;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ public class Locomotive extends Car implements Constants,Device{
|
|||||||
|
|
||||||
private static final String REVERSE = "reverse";
|
private static final String REVERSE = "reverse";
|
||||||
public static final String LOCOMOTIVE = "locomotive";
|
public static final String LOCOMOTIVE = "locomotive";
|
||||||
private boolean reverse = false;
|
boolean reverse = false;
|
||||||
private Protocol proto = Protocol.DCC128;
|
private Protocol proto = Protocol.DCC128;
|
||||||
private int address = 3;
|
private int address = 3;
|
||||||
private int speed = 0;
|
private int speed = 0;
|
||||||
|
|||||||
@@ -80,9 +80,7 @@ public class Train extends BaseClass implements Comparable<Train> {
|
|||||||
|
|
||||||
private Block currentBlock,destination = null;
|
private Block currentBlock,destination = null;
|
||||||
LinkedList<Tile> trace = new LinkedList<Tile>();
|
LinkedList<Tile> trace = new LinkedList<Tile>();
|
||||||
|
|
||||||
private String brakeId = null;
|
|
||||||
|
|
||||||
private class Autopilot extends Thread{
|
private class Autopilot extends Thread{
|
||||||
boolean stop = false;
|
boolean stop = false;
|
||||||
int waitTime = 100;
|
int waitTime = 100;
|
||||||
@@ -197,7 +195,6 @@ public class Train extends BaseClass implements Comparable<Train> {
|
|||||||
if (car instanceof Locomotive) {
|
if (car instanceof Locomotive) {
|
||||||
locos.add((Locomotive) car);
|
locos.add((Locomotive) car);
|
||||||
} else cars.add(car);
|
} else cars.add(car);
|
||||||
brakeId = null;
|
|
||||||
car.train(this);
|
car.train(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,13 +207,15 @@ public class Train extends BaseClass implements Comparable<Train> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String brakeId() {
|
public String brakeId() {
|
||||||
if (isNull(brakeId)) {
|
return brakeId(false);
|
||||||
TreeSet<Integer> carIds = new TreeSet<Integer>();
|
}
|
||||||
locos.stream().map(loco -> loco.id()).forEach(carIds::add);
|
|
||||||
cars.stream().map(car -> car.id()).forEach(carIds::add);
|
public String brakeId(boolean reversed) {
|
||||||
brakeId = md5sum(carIds+":"+direction);
|
TreeSet<String> carIds = new TreeSet<String>();
|
||||||
LOG.debug("generated new brake id for {}: {}",brakeId,this);
|
locos.stream().map(loco -> loco.id()+":"+(reversed != loco.reverse?"r":"f")).forEach(carIds::add);
|
||||||
}
|
cars.stream().map(car -> ""+car.id()).forEach(carIds::add);
|
||||||
|
String brakeId = md5sum(carIds);
|
||||||
|
LOG.debug("generated new brake id for {}: {}",this,brakeId);
|
||||||
return brakeId;
|
return brakeId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -309,7 +308,6 @@ public class Train extends BaseClass implements Comparable<Train> {
|
|||||||
locos.remove(loco);
|
locos.remove(loco);
|
||||||
loco.train(null);
|
loco.train(null);
|
||||||
}
|
}
|
||||||
brakeId = null;
|
|
||||||
return properties();
|
return properties();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user