Code zum Reservieren der nächsten Route überarbeitet.
*Könnte* jetzt funktionieren, hatte jedoch keine Zeit zum Testen.
This commit is contained in:
@@ -30,6 +30,6 @@ public class PreserveRoute extends Action {
|
|||||||
return false; // train is expected to wait in next block.
|
return false; // train is expected to wait in next block.
|
||||||
}
|
}
|
||||||
|
|
||||||
return route.prepareNext(train);
|
return train.reserveRouteAfter(route);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,8 +36,8 @@ import de.srsoftware.web4rail.tags.Label;
|
|||||||
import de.srsoftware.web4rail.tags.Select;
|
import de.srsoftware.web4rail.tags.Select;
|
||||||
import de.srsoftware.web4rail.tags.Table;
|
import de.srsoftware.web4rail.tags.Table;
|
||||||
import de.srsoftware.web4rail.tags.Window;
|
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.Callback;
|
||||||
|
import de.srsoftware.web4rail.threads.RouteManager;
|
||||||
import de.srsoftware.web4rail.tiles.Block;
|
import de.srsoftware.web4rail.tiles.Block;
|
||||||
import de.srsoftware.web4rail.tiles.Contact;
|
import de.srsoftware.web4rail.tiles.Contact;
|
||||||
import de.srsoftware.web4rail.tiles.Tile;
|
import de.srsoftware.web4rail.tiles.Tile;
|
||||||
@@ -460,7 +460,7 @@ public class Train extends BaseClass implements Comparable<Train> {
|
|||||||
|
|
||||||
public boolean isStoppable() {
|
public boolean isStoppable() {
|
||||||
if (speed > 0) return true;
|
if (speed > 0) return true;
|
||||||
if (isSet(routeManager) && routeManager.isActive()) return true;
|
if (isSet(routeManager) && routeManager.isSearching()) return true;
|
||||||
if (isSet(route)) return true;
|
if (isSet(route)) return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -724,6 +724,21 @@ public class Train extends BaseClass implements Comparable<Train> {
|
|||||||
return tags().iterator();
|
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:
|
* This turns the train as if it went through a loop. Example:
|
||||||
* before: CabCar→ MiddleCar→ Loco→
|
* before: CabCar→ MiddleCar→ Loco→
|
||||||
@@ -875,14 +890,24 @@ public class Train extends BaseClass implements Comparable<Train> {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (isNull(routeManager)) routeManager = new RouteManager();
|
if (isNull(routeManager)) routeManager = new RouteManager();
|
||||||
routeManager.setContext(new Context(this).block(currentBlock).direction(direction));
|
|
||||||
routeManager.start(new Callback() {
|
Callback callback = new Callback() {
|
||||||
@Override
|
@Override
|
||||||
public void routePrepared(Route route) {
|
public void routePrepared(Route route) {
|
||||||
route.start();
|
route.start();
|
||||||
plan.stream(t("Started {}",Train.this));
|
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;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,10 +25,10 @@ public class RouteManager extends BaseClass {
|
|||||||
private static final Logger LOG = LoggerFactory.getLogger(RouteManager.class);
|
private static final Logger LOG = LoggerFactory.getLogger(RouteManager.class);
|
||||||
private Context ctx;
|
private Context ctx;
|
||||||
private Callback callback;
|
private Callback callback;
|
||||||
private boolean active;
|
private boolean searching;
|
||||||
|
|
||||||
public RouteManager() {
|
public RouteManager() {
|
||||||
active = false;
|
searching = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static TreeMap<Integer, List<Route>> availableRoutes(Context context, HashSet<Route> visitedRoutes) {
|
private static TreeMap<Integer, List<Route>> availableRoutes(Context context, HashSet<Route> visitedRoutes) {
|
||||||
@@ -160,40 +160,39 @@ public class RouteManager extends BaseClass {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Route prepareRoute(Context context) {
|
public Route prepareRoute(Context context) {
|
||||||
try {
|
if (isNull(context) || context.invalidated()) return null;
|
||||||
if (isNull(context) || context.invalidated()) return null;
|
Route route = chooseRoute(context);
|
||||||
Route route = chooseRoute(context);
|
if (isNull(route)) return null;
|
||||||
if (isNull(route)) return null;
|
context.route(route);
|
||||||
context.route(route);
|
if (!route.reserveFor(context)) {
|
||||||
if (!route.reserveFor(context)) {
|
route.reset();
|
||||||
route.reset();
|
return null;
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (!route.prepareAndLock()) {
|
|
||||||
route.reset();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return route;
|
|
||||||
} finally {
|
|
||||||
active = false;
|
|
||||||
}
|
}
|
||||||
|
if (!route.prepareAndLock()) {
|
||||||
|
route.reset();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return route;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setContext(Context context) {
|
public void setContext(Context context) {
|
||||||
ctx = context;
|
ctx = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCallback(Callback callback) {
|
public boolean setCallback(Callback callback) {
|
||||||
if (ctx.invalidated()) return;
|
if (ctx.invalidated()) return false;
|
||||||
if (isNull(this.callback)) {
|
this.callback = callback;
|
||||||
Route route = prepareRoute(ctx);
|
if (searching) return false; // search already running, do not start again!
|
||||||
if (isSet(route) && isSet(callback)) callback.routePrepared(route);
|
searching = true;
|
||||||
}
|
Route route = prepareRoute(ctx);
|
||||||
|
searching = false;
|
||||||
|
if (isNull(route) || isNull(callback)) return false;
|
||||||
|
callback.routePrepared(route);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isActive() {
|
public boolean isSearching() {
|
||||||
return active;
|
return searching;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void start(Callback callback) {
|
public void start(Callback callback) {
|
||||||
|
|||||||
Reference in New Issue
Block a user