working on new autopilot
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.3.54</version>
|
<version>1.3.55</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>
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import java.io.FileWriter;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
@@ -237,6 +236,7 @@ public class Route extends BaseClass {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void brakeTime(String brakeId, Integer newTimeStep) {
|
public void brakeTime(String brakeId, Integer newTimeStep) {
|
||||||
|
LOG.debug("new brake time for route {}: {}",this,newTimeStep);
|
||||||
brakeTimes.put(brakeId,newTimeStep);
|
brakeTimes.put(brakeId,newTimeStep);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -378,8 +378,10 @@ public class Route extends BaseClass {
|
|||||||
public void finish() {
|
public void finish() {
|
||||||
LOG.debug("{}.finish()",this);
|
LOG.debug("{}.finish()",this);
|
||||||
train.endRoute();
|
train.endRoute();
|
||||||
|
free();
|
||||||
|
train.set(endBlock);
|
||||||
|
train.heading(endDirection);
|
||||||
train = null;
|
train = null;
|
||||||
free();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void free() {
|
private void free() {
|
||||||
@@ -822,36 +824,7 @@ public class Route extends BaseClass {
|
|||||||
public String toString() {
|
public String toString() {
|
||||||
return getClass().getSimpleName()+"("+(isSet(train)?train+":":"")+name()+")";
|
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() {
|
public Train train() {
|
||||||
return train;
|
return train;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ import de.srsoftware.web4rail.tags.Window;
|
|||||||
import de.srsoftware.web4rail.threads.BrakeProcessor;
|
import de.srsoftware.web4rail.threads.BrakeProcessor;
|
||||||
import de.srsoftware.web4rail.threads.PathFinder;
|
import de.srsoftware.web4rail.threads.PathFinder;
|
||||||
import de.srsoftware.web4rail.tiles.Block;
|
import de.srsoftware.web4rail.tiles.Block;
|
||||||
|
import de.srsoftware.web4rail.tiles.BlockContact;
|
||||||
import de.srsoftware.web4rail.tiles.Contact;
|
import de.srsoftware.web4rail.tiles.Contact;
|
||||||
import de.srsoftware.web4rail.tiles.Tile;
|
import de.srsoftware.web4rail.tiles.Tile;
|
||||||
import de.srsoftware.web4rail.tiles.Tile.Status;
|
import de.srsoftware.web4rail.tiles.Tile.Status;
|
||||||
@@ -320,7 +321,11 @@ public class Train extends BaseClass implements Comparable<Train> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void contact(Contact contact) {
|
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();
|
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() {
|
public Tile traceHead() {
|
||||||
return trace == null || trace.isEmpty() ? null : trace.getFirst();
|
return trace == null || trace.isEmpty() ? null : trace.getFirst();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,27 +33,25 @@ public class BrakeProcessor extends BaseClass implements Runnable {
|
|||||||
public void end() {
|
public void end() {
|
||||||
state = State.ENDED;
|
state = State.ENDED;
|
||||||
measuredDistance += train.speed * (BaseClass.timestamp() - lastTime);
|
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;
|
int step = brakeTime;
|
||||||
for (int i=0; i<10; i++) {
|
for (int i = 0; i < 15; i++) {
|
||||||
long calculatedDistance = calculate(brakeTime,startSpeed);
|
long calculatedDistance = calculate(brakeTime, startSpeed);
|
||||||
step/=2;
|
step /= 2;
|
||||||
if (step<1) step = 1;
|
if (step < 1) step = 1;
|
||||||
LOG.debug("new brake time: {}, calculated distance: {}",brakeTime,calculatedDistance);
|
if (measuredDistance > calculatedDistance) brakeTime += step;
|
||||||
if (measuredDistance < calculatedDistance) {
|
if (measuredDistance < calculatedDistance) brakeTime -= step;
|
||||||
brakeTime -= step;
|
LOG.debug("new brake time: {}, calculated distance: {}", brakeTime, calculatedDistance);
|
||||||
}
|
|
||||||
if (measuredDistance > calculatedDistance) {
|
|
||||||
brakeTime += step;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
LOG.debug("new brake time: {}, calculated distance: {}",brakeTime,"");
|
route.brakeTime(train.brakeId(), brakeTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static long calculate(int brakeTime, int speed) {
|
private static long calculate(int brakeTime, int speed) {
|
||||||
long dist = 0;
|
long dist = 0;
|
||||||
while (speed > defaultEndSpeed) {
|
while (speed > defaultEndSpeed) {
|
||||||
dist += speed*brakeTime;
|
dist += speed * brakeTime;
|
||||||
speed -= 10;
|
speed -= 10;
|
||||||
}
|
}
|
||||||
return dist;
|
return dist;
|
||||||
|
|||||||
Reference in New Issue
Block a user