Browse Source

Code zum Reservieren der nächsten Route überarbeitet.

*Könnte* jetzt funktionieren, hatte jedoch keine Zeit zum Testen.
lookup-tables
Stephan Richter 4 years ago
parent
commit
c62f75fa02
  1. 2
      src/main/java/de/srsoftware/web4rail/actions/PreserveRoute.java
  2. 35
      src/main/java/de/srsoftware/web4rail/moving/Train.java
  3. 53
      src/main/java/de/srsoftware/web4rail/threads/RouteManager.java

2
src/main/java/de/srsoftware/web4rail/actions/PreserveRoute.java

@ -30,6 +30,6 @@ public class PreserveRoute extends Action { @@ -30,6 +30,6 @@ public class PreserveRoute extends Action {
return false; // train is expected to wait in next block.
}
return route.prepareNext(train);
return train.reserveRouteAfter(route);
}
}

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

@ -36,8 +36,8 @@ import de.srsoftware.web4rail.tags.Label; @@ -36,8 +36,8 @@ import de.srsoftware.web4rail.tags.Label;
import de.srsoftware.web4rail.tags.Select;
import de.srsoftware.web4rail.tags.Table;
import de.srsoftware.web4rail.tags.Window;
import de.srsoftware.web4rail.threads.RouteManager;
import de.srsoftware.web4rail.threads.RouteManager.Callback;
import de.srsoftware.web4rail.threads.RouteManager;
import de.srsoftware.web4rail.tiles.Block;
import de.srsoftware.web4rail.tiles.Contact;
import de.srsoftware.web4rail.tiles.Tile;
@ -460,7 +460,7 @@ public class Train extends BaseClass implements Comparable<Train> { @@ -460,7 +460,7 @@ public class Train extends BaseClass implements Comparable<Train> {
public boolean isStoppable() {
if (speed > 0) return true;
if (isSet(routeManager) && routeManager.isActive()) return true;
if (isSet(routeManager) && routeManager.isSearching()) return true;
if (isSet(route)) return true;
return false;
}
@ -724,6 +724,21 @@ public class Train extends BaseClass implements Comparable<Train> { @@ -724,6 +724,21 @@ public class Train extends BaseClass implements Comparable<Train> {
return tags().iterator();
}
public boolean reserveRouteAfter(Route r) {
LOG.debug("reserveRouteAfter({})",r);
if (isNull(routeManager)) routeManager = new RouteManager();
Context newContext = new Context(this).block(r.endBlock()).direction(r.endDirection);
if (routeManager.isSearching()) return false;
routeManager.setContext(newContext);
return (routeManager.setCallback(new Callback() {
@Override
public void routePrepared(Route route) {
r.setNextRoute(route);
}
}));
}
/**
* This turns the train as if it went through a loop. Example:
* before: CabCar MiddleCar Loco
@ -875,14 +890,24 @@ public class Train extends BaseClass implements Comparable<Train> { @@ -875,14 +890,24 @@ public class Train extends BaseClass implements Comparable<Train> {
return null;
}
if (isNull(routeManager)) routeManager = new RouteManager();
routeManager.setContext(new Context(this).block(currentBlock).direction(direction));
routeManager.start(new Callback() {
Callback callback = new Callback() {
@Override
public void routePrepared(Route route) {
route.start();
plan.stream(t("Started {}",Train.this));
}
});
};
if (routeManager.isSearching()) { // es wird bereits eine Anschlussroute gesucht
// in diesem Fall muss bloß dass Callback des Route-Managers aktualisiert werden
routeManager.setCallback(callback);
} else { // routeManager nicht aktiv →> neuen Context setzen und starten
routeManager.setContext(new Context(this).block(currentBlock).direction(direction));
routeManager.start(callback);
}
return null;
}

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

@ -25,10 +25,10 @@ public class RouteManager extends BaseClass { @@ -25,10 +25,10 @@ public class RouteManager extends BaseClass {
private static final Logger LOG = LoggerFactory.getLogger(RouteManager.class);
private Context ctx;
private Callback callback;
private boolean active;
private boolean searching;
public RouteManager() {
active = false;
searching = false;
}
private static TreeMap<Integer, List<Route>> availableRoutes(Context context, HashSet<Route> visitedRoutes) {
@ -160,40 +160,39 @@ public class RouteManager extends BaseClass { @@ -160,40 +160,39 @@ public class RouteManager extends BaseClass {
}
public Route prepareRoute(Context context) {
try {
if (isNull(context) || context.invalidated()) return null;
Route route = chooseRoute(context);
if (isNull(route)) return null;
context.route(route);
if (!route.reserveFor(context)) {
route.reset();
return null;
}
if (!route.prepareAndLock()) {
route.reset();
return null;
}
return route;
} finally {
active = false;
if (isNull(context) || context.invalidated()) return null;
Route route = chooseRoute(context);
if (isNull(route)) return null;
context.route(route);
if (!route.reserveFor(context)) {
route.reset();
return null;
}
if (!route.prepareAndLock()) {
route.reset();
return null;
}
return route;
}
public void setContext(Context context) {
ctx = context;
}
public void setCallback(Callback callback) {
if (ctx.invalidated()) return;
if (isNull(this.callback)) {
Route route = prepareRoute(ctx);
if (isSet(route) && isSet(callback)) callback.routePrepared(route);
}
public boolean setCallback(Callback callback) {
if (ctx.invalidated()) return false;
this.callback = callback;
if (searching) return false; // search already running, do not start again!
searching = true;
Route route = prepareRoute(ctx);
searching = false;
if (isNull(route) || isNull(callback)) return false;
callback.routePrepared(route);
return true;
}
public boolean isActive() {
return active;
public boolean isSearching() {
return searching;
}
public void start(Callback callback) {

Loading…
Cancel
Save