Browse Source

implemented handling of stuck trains during route search

lookup-tables
Stephan Richter 4 years ago
parent
commit
d86b6dcbcc
  1. 2
      pom.xml
  2. 4
      src/main/java/de/srsoftware/web4rail/Route.java
  3. 12
      src/main/java/de/srsoftware/web4rail/moving/Train.java
  4. 8
      src/main/java/de/srsoftware/web4rail/threads/RouteManager.java
  5. 5
      src/main/java/de/srsoftware/web4rail/tiles/Block.java
  6. 2
      src/main/java/de/srsoftware/web4rail/tiles/Tile.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.66</version>
<version>1.3.67</version>
<name>Web4Rail</name>
<packaging>jar</packaging>
<description>Java Model Railway Control</description>

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

@ -380,7 +380,8 @@ public class Route extends BaseClass { @@ -380,7 +380,8 @@ public class Route extends BaseClass {
}
private void free() {
context.invalidate();
context.invalidate(); // do not set to null:
// this action may be called from route.contact → finishRoute, which calls train.updateTrace afterwards, which in turn requires context
Train train = context.train();
Vector<Tile> reversedPath = reverse(path());
for (Tile tile : reversedPath) {
@ -750,6 +751,7 @@ public class Route extends BaseClass { @@ -750,6 +751,7 @@ public class Route extends BaseClass {
Train train = context.train();
free();
train.drop(this);
context = null;
return true;
}

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

@ -90,6 +90,8 @@ public class Train extends BaseClass implements Comparable<Train> { @@ -90,6 +90,8 @@ public class Train extends BaseClass implements Comparable<Train> {
private boolean shunting = false;
private RouteManager routeManager = null;
private HashSet<Tile> stuckTrace = null;
public static Object action(HashMap<String, String> params, Plan plan) throws IOException {
String action = params.get(ACTION);
if (isNull(action)) return t("No action passed to Train.action!");
@ -405,6 +407,7 @@ public class Train extends BaseClass implements Comparable<Train> { @@ -405,6 +407,7 @@ public class Train extends BaseClass implements Comparable<Train> {
endBlock.add(this, direction);
currentBlock = endBlock;
trace.add(endBlock);
stuckTrace = null;
}
private Tag faster(int steps) {
@ -866,10 +869,19 @@ public class Train extends BaseClass implements Comparable<Train> { @@ -866,10 +869,19 @@ public class Train extends BaseClass implements Comparable<Train> {
setSpeed(0);
quitAutopilot();
if (isSet(route)) {
stuckTrace = new HashSet<Tile>();
for (Tile tile : route.path()) { // collect occupied tiles of route. stuckTrace is considered during next route search
if (trace.contains(tile)) stuckTrace.add(tile);
}
route.reset();
}
return properties();
}
public HashSet<Tile> stuckTrace() {
return stuckTrace;
}
public SortedSet<String> tags() {
TreeSet<String> list = new TreeSet<String>(tags);

8
src/main/java/de/srsoftware/web4rail/threads/RouteManager.java

@ -14,6 +14,7 @@ import de.srsoftware.web4rail.Plan.Direction; @@ -14,6 +14,7 @@ import de.srsoftware.web4rail.Plan.Direction;
import de.srsoftware.web4rail.Route;
import de.srsoftware.web4rail.moving.Train;
import de.srsoftware.web4rail.tiles.Block;
import de.srsoftware.web4rail.tiles.Tile;
public class RouteManager extends BaseClass implements Runnable {
@ -66,6 +67,13 @@ public class RouteManager extends BaseClass implements Runnable { @@ -66,6 +67,13 @@ public class RouteManager extends BaseClass implements Runnable {
LOG.debug("{}→ Candidate {} would create loop, skipping",inset,routeCandidate.shortName());
continue;
}
HashSet<Tile> stuckTrace = train.stuckTrace(); // if train has been stopped in between two blocks lastly: only allow routes that do not conflict with current train position
if (isSet(stuckTrace) && !routeCandidate.path().containsAll(stuckTrace)) {
LOG.debug("Stuck train occupies tiles ({}) outside of {} – not allowed.",stuckTrace,routeCandidate);
continue;
}
if (!routeCandidate.allowed(context)) {
if (routeCandidate.endBlock() != destination) { // allowance may be overridden by destination
LOG.debug("{} not allowed for {}",routeCandidate,context);

5
src/main/java/de/srsoftware/web4rail/tiles/Block.java

@ -278,8 +278,9 @@ public abstract class Block extends StretchableTile{ @@ -278,8 +278,9 @@ public abstract class Block extends StretchableTile{
if (isNull(firstTrain)) return true;
if (firstTrain != train) return false;
trains.remove(train);
status = trains.isEmpty() ? Status.FREE : Status.OCCUPIED;
plan.place(this);
if (isSet(firstTrain)) {
super.free(train);
} else super.setTrain(firstTrain);
return true;
}

2
src/main/java/de/srsoftware/web4rail/tiles/Tile.java

@ -106,7 +106,7 @@ public abstract class Tile extends BaseClass implements Comparable<Tile> { @@ -106,7 +106,7 @@ public abstract class Tile extends BaseClass implements Comparable<Tile> {
}
public boolean free(Train t) {
if (t != train) return false;
if (isSet(train) && t != train) return false;
train = null;
status = Status.FREE;
plan.place(this);

Loading…
Cancel
Save