working on new autopilot
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -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>
|
||||
|
||||
@@ -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 {
|
||||
}
|
||||
|
||||
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 {
|
||||
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 {
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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> {
|
||||
}
|
||||
|
||||
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> {
|
||||
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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user