Browse Source

working on new autopilot

lookup-tables
Stephan Richter 4 years ago
parent
commit
a60e766dac
  1. 2
      pom.xml
  2. 35
      src/main/java/de/srsoftware/web4rail/Route.java
  3. 35
      src/main/java/de/srsoftware/web4rail/moving/Train.java
  4. 26
      src/main/java/de/srsoftware/web4rail/threads/BrakeProcessor.java

2
pom.xml

@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>de.srsoftware</groupId>
<artifactId>web4rail</artifactId>
<version>1.3.54</version>
<version>1.3.55</version>
<name>Web4Rail</name>
<packaging>jar</packaging>
<description>Java Model Railway Control</description>

35
src/main/java/de/srsoftware/web4rail/Route.java

@ -6,7 +6,6 @@ import java.io.FileWriter; @@ -6,7 +6,6 @@ import java.io.FileWriter;
import java.io.IOException;
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;
@ -237,6 +236,7 @@ public class Route extends BaseClass { @@ -237,6 +236,7 @@ public class Route extends BaseClass {
}
public void brakeTime(String brakeId, Integer newTimeStep) {
LOG.debug("new brake time for route {}: {}",this,newTimeStep);
brakeTimes.put(brakeId,newTimeStep);
}
@ -378,8 +378,10 @@ public class Route extends BaseClass { @@ -378,8 +378,10 @@ public class Route extends BaseClass {
public void finish() {
LOG.debug("{}.finish()",this);
train.endRoute();
free();
train.set(endBlock);
train.heading(endDirection);
train = null;
free();
}
private void free() {
@ -822,36 +824,7 @@ public class Route extends BaseClass { @@ -822,36 +824,7 @@ public class Route extends BaseClass {
public String toString() {
return getClass().getSimpleName()+"("+(isSet(train)?train+":":"")+name()+")";
}
public void traceTrainFrom(Tile newHead) {
LOG.debug("{}.traceTrainFrom({})",this,newHead);
if (isNull(train)) return;
if (newHead instanceof BlockContact) newHead = (Tile) ((BlockContact)newHead).parent();
Tile traceHead = train.traceHead();
Integer remainingLength = null;
LinkedList<Tile> newTrace = new LinkedList<Tile>();
for (int i=path.size(); i>0; i--) { // pfad rückwärts ablaufen
Tile tile = path.elementAt(i-1);
if (isNull(remainingLength)) {
if (tile == newHead) traceHead = newHead; // wenn wir zuerst newHead finden: newHead als neuen traceHead übernehmen
if (tile == traceHead) {
remainingLength = train.length(); // sobald wir auf den traceHead stoßen: suche beenden
}
}
if (isSet(remainingLength)) {
if (remainingLength>=0) {
newTrace.add(tile);
remainingLength -= tile.length();
} else if (Route.freeBehindTrain) {
// TODO
} else break;
}
}
train.setTrace(newTrace);
}
public Train train() {
return train;
}

35
src/main/java/de/srsoftware/web4rail/moving/Train.java

@ -39,6 +39,7 @@ import de.srsoftware.web4rail.tags.Window; @@ -39,6 +39,7 @@ import de.srsoftware.web4rail.tags.Window;
import de.srsoftware.web4rail.threads.BrakeProcessor;
import de.srsoftware.web4rail.threads.PathFinder;
import de.srsoftware.web4rail.tiles.Block;
import de.srsoftware.web4rail.tiles.BlockContact;
import de.srsoftware.web4rail.tiles.Contact;
import de.srsoftware.web4rail.tiles.Tile;
import de.srsoftware.web4rail.tiles.Tile.Status;
@ -320,7 +321,11 @@ public class Train extends BaseClass implements Comparable<Train> { @@ -320,7 +321,11 @@ public class Train extends BaseClass implements Comparable<Train> {
}
public void contact(Contact contact) {
if (isSet(route)) route.contact(contact);
if (isSet(route)) {
Route lastRoute = route; // route field might be set to null during route.contact(...)!
route.contact(contact);
traceFrom(contact,lastRoute);
}
}
@ -957,6 +962,34 @@ public class Train extends BaseClass implements Comparable<Train> { @@ -957,6 +962,34 @@ public class Train extends BaseClass implements Comparable<Train> {
return name();
}
public void traceFrom(Tile newHead,Route route) {
LOG.debug("{}.traceTrainFrom({})",this,newHead);
if (isNull(route)) return;
if (newHead instanceof BlockContact) newHead = (Tile) ((BlockContact)newHead).parent();
Tile traceHead = traceHead();
Integer remainingLength = null;
LinkedList<Tile> newTrace = new LinkedList<Tile>();
Vector<Tile> path = route.path();
for (int i=path.size(); i>0; i--) { // pfad rückwärts ablaufen
Tile tile = path.elementAt(i-1);
if (isNull(remainingLength)) {
if (tile == newHead) traceHead = newHead; // wenn wir zuerst newHead finden: newHead als neuen traceHead übernehmen
if (tile == traceHead) remainingLength = length(); // sobald wir auf den traceHead stoßen: Suche beenden
}
if (isSet(remainingLength)) {
if (remainingLength>=0) {
newTrace.add(tile);
remainingLength -= tile.length();
} else if (Route.freeBehindTrain) {
// TODO
} else break;
}
}
setTrace(newTrace);
}
public Tile traceHead() {
return trace == null || trace.isEmpty() ? null : trace.getFirst();
}

26
src/main/java/de/srsoftware/web4rail/threads/BrakeProcessor.java

@ -33,27 +33,25 @@ public class BrakeProcessor extends BaseClass implements Runnable { @@ -33,27 +33,25 @@ public class BrakeProcessor extends BaseClass implements Runnable {
public void end() {
state = State.ENDED;
measuredDistance += train.speed * (BaseClass.timestamp() - lastTime);
LOG.debug("old brake time: {}, measured distance: {}",brakeTime,measuredDistance);
Route route = train.route();
if (isNull(route)) return;
LOG.debug("old brake time: {}, measured distance: {}", brakeTime, measuredDistance);
int step = brakeTime;
for (int i=0; i<10; i++) {
long calculatedDistance = calculate(brakeTime,startSpeed);
step/=2;
if (step<1) step = 1;
LOG.debug("new brake time: {}, calculated distance: {}",brakeTime,calculatedDistance);
if (measuredDistance < calculatedDistance) {
brakeTime -= step;
}
if (measuredDistance > calculatedDistance) {
brakeTime += step;
}
for (int i = 0; i < 15; i++) {
long calculatedDistance = calculate(brakeTime, startSpeed);
step /= 2;
if (step < 1) step = 1;
if (measuredDistance > calculatedDistance) brakeTime += step;
if (measuredDistance < calculatedDistance) brakeTime -= step;
LOG.debug("new brake time: {}, calculated distance: {}", brakeTime, calculatedDistance);
}
LOG.debug("new brake time: {}, calculated distance: {}",brakeTime,"");
route.brakeTime(train.brakeId(), brakeTime);
}
private static long calculate(int brakeTime, int speed) {
long dist = 0;
while (speed > defaultEndSpeed) {
dist += speed*brakeTime;
dist += speed * brakeTime;
speed -= 10;
}
return dist;

Loading…
Cancel
Save