|
|
@ -42,7 +42,6 @@ import de.srsoftware.web4rail.tiles.Shadow; |
|
|
|
import de.srsoftware.web4rail.tiles.Signal; |
|
|
|
import de.srsoftware.web4rail.tiles.Signal; |
|
|
|
import de.srsoftware.web4rail.tiles.Tile; |
|
|
|
import de.srsoftware.web4rail.tiles.Tile; |
|
|
|
import de.srsoftware.web4rail.tiles.Turnout; |
|
|
|
import de.srsoftware.web4rail.tiles.Turnout; |
|
|
|
import de.srsoftware.web4rail.tiles.Turnout.State; |
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* A route is a vector of tiles that leads from one block to another. |
|
|
|
* A route is a vector of tiles that leads from one block to another. |
|
|
|
* |
|
|
|
* |
|
|
@ -50,6 +49,10 @@ import de.srsoftware.web4rail.tiles.Turnout.State; |
|
|
|
* |
|
|
|
* |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public class Route extends BaseClass implements Comparable<Route>{ |
|
|
|
public class Route extends BaseClass implements Comparable<Route>{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public enum State { |
|
|
|
|
|
|
|
FREE, LOCKED, PREPARED, STARTED; |
|
|
|
|
|
|
|
} |
|
|
|
private static final Logger LOG = LoggerFactory.getLogger(Route.class); |
|
|
|
private static final Logger LOG = LoggerFactory.getLogger(Route.class); |
|
|
|
|
|
|
|
|
|
|
|
private static final String ACTIONS = "actions"; |
|
|
|
private static final String ACTIONS = "actions"; |
|
|
@ -64,6 +67,7 @@ public class Route extends BaseClass implements Comparable<Route>{ |
|
|
|
static final String PATH = "path"; |
|
|
|
static final String PATH = "path"; |
|
|
|
static final String SIGNALS = "signals"; |
|
|
|
static final String SIGNALS = "signals"; |
|
|
|
static final String TURNOUTS = "turnouts"; |
|
|
|
static final String TURNOUTS = "turnouts"; |
|
|
|
|
|
|
|
private State state = State.FREE; |
|
|
|
|
|
|
|
|
|
|
|
private static final String ROUTE_START = "route_start"; |
|
|
|
private static final String ROUTE_START = "route_start"; |
|
|
|
|
|
|
|
|
|
|
@ -125,7 +129,7 @@ public class Route extends BaseClass implements Comparable<Route>{ |
|
|
|
timestamp = new Date().getTime(); |
|
|
|
timestamp = new Date().getTime(); |
|
|
|
if (train.speed == 0) aborted = true; |
|
|
|
if (train.speed == 0) aborted = true; |
|
|
|
while (train.speed > ENDSPEED) { |
|
|
|
while (train.speed > ENDSPEED) { |
|
|
|
if (aborted) break; |
|
|
|
if (aborted || train.nextRoutePrepared()) break; |
|
|
|
train.setSpeed(train.speed - 5); |
|
|
|
train.setSpeed(train.speed - 5); |
|
|
|
try { |
|
|
|
try { |
|
|
|
sleep(timeStep); |
|
|
|
sleep(timeStep); |
|
|
@ -145,7 +149,7 @@ public class Route extends BaseClass implements Comparable<Route>{ |
|
|
|
public Direction endDirection; |
|
|
|
public Direction endDirection; |
|
|
|
private Vector<Tile> path; |
|
|
|
private Vector<Tile> path; |
|
|
|
private Vector<Signal> signals; |
|
|
|
private Vector<Signal> signals; |
|
|
|
public Train train; |
|
|
|
private Train train; |
|
|
|
private HashMap<String,ActionList> triggeredActions = new HashMap<String, ActionList>(); |
|
|
|
private HashMap<String,ActionList> triggeredActions = new HashMap<String, ActionList>(); |
|
|
|
private HashMap<Turnout,Turnout.State> turnouts; |
|
|
|
private HashMap<Turnout,Turnout.State> turnouts; |
|
|
|
private Block startBlock = null; |
|
|
|
private Block startBlock = null; |
|
|
@ -309,14 +313,14 @@ public class Route extends BaseClass implements Comparable<Route>{ |
|
|
|
signals.add(signal); |
|
|
|
signals.add(signal); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void addTurnout(Turnout t, State s) { |
|
|
|
void addTurnout(Turnout t, Turnout.State s) { |
|
|
|
turnouts.put(t, s); |
|
|
|
turnouts.put(t, s); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private Fieldset turnouts() { |
|
|
|
private Fieldset turnouts() { |
|
|
|
Fieldset win = new Fieldset(t("Turnouts")); |
|
|
|
Fieldset win = new Fieldset(t("Turnouts")); |
|
|
|
Tag list = new Tag("ul"); |
|
|
|
Tag list = new Tag("ul"); |
|
|
|
for (Entry<Turnout, State> entry : turnouts.entrySet()) { |
|
|
|
for (Entry<Turnout, Turnout.State> entry : turnouts.entrySet()) { |
|
|
|
Turnout turnout = entry.getKey(); |
|
|
|
Turnout turnout = entry.getKey(); |
|
|
|
Plan.addLink(turnout, turnout+": "+t(entry.getValue().toString()), list); |
|
|
|
Plan.addLink(turnout, turnout+": "+t(entry.getValue().toString()), list); |
|
|
|
} |
|
|
|
} |
|
|
@ -453,8 +457,9 @@ public class Route extends BaseClass implements Comparable<Route>{ |
|
|
|
|
|
|
|
|
|
|
|
public boolean fireSetupActions(Context context) { |
|
|
|
public boolean fireSetupActions(Context context) { |
|
|
|
ActionList setupActions = triggeredActions.get(ROUTE_SETUP); |
|
|
|
ActionList setupActions = triggeredActions.get(ROUTE_SETUP); |
|
|
|
if (isNull(setupActions)) return true; |
|
|
|
if (isSet(setupActions) && !setupActions.fire(context)) return false; |
|
|
|
return setupActions.fire(context); |
|
|
|
state = State.PREPARED; |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private String generateName() { |
|
|
|
private String generateName() { |
|
|
@ -499,7 +504,7 @@ public class Route extends BaseClass implements Comparable<Route>{ |
|
|
|
json.put(SIGNALS, signalIds); |
|
|
|
json.put(SIGNALS, signalIds); |
|
|
|
|
|
|
|
|
|
|
|
JSONArray turnouts = new JSONArray(); |
|
|
|
JSONArray turnouts = new JSONArray(); |
|
|
|
for (Entry<Turnout, State> entry : this.turnouts.entrySet()) { |
|
|
|
for (Entry<Turnout, Turnout.State> entry : this.turnouts.entrySet()) { |
|
|
|
Turnout t = entry.getKey(); |
|
|
|
Turnout t = entry.getKey(); |
|
|
|
turnouts.put(new JSONObject(Map.of(Turnout.ID,t.id().toString(),Turnout.STATE,entry.getValue()))); |
|
|
|
turnouts.put(new JSONObject(Map.of(Turnout.ID,t.id().toString(),Turnout.STATE,entry.getValue()))); |
|
|
|
} |
|
|
|
} |
|
|
@ -703,9 +708,9 @@ public class Route extends BaseClass implements Comparable<Route>{ |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if (!success) for (Tile tile :alreadyLocked) { |
|
|
|
if (success) { |
|
|
|
tile.setRoute(null); |
|
|
|
state = State.LOCKED; |
|
|
|
} |
|
|
|
} else for (Tile tile :alreadyLocked) tile.setRoute(null); |
|
|
|
return success; |
|
|
|
return success; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -801,6 +806,7 @@ public class Route extends BaseClass implements Comparable<Route>{ |
|
|
|
train = null; |
|
|
|
train = null; |
|
|
|
} |
|
|
|
} |
|
|
|
triggeredContacts.clear(); |
|
|
|
triggeredContacts.clear(); |
|
|
|
|
|
|
|
state = State.FREE; |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -818,8 +824,8 @@ public class Route extends BaseClass implements Comparable<Route>{ |
|
|
|
file.close(); |
|
|
|
file.close(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void setLast(State state) { |
|
|
|
public void setLast(Turnout.State state) { |
|
|
|
if (isNull(state) || state == State.UNDEF) return; |
|
|
|
if (isNull(state) || state == Turnout.State.UNDEF) return; |
|
|
|
Tile lastTile = path.lastElement(); |
|
|
|
Tile lastTile = path.lastElement(); |
|
|
|
if (lastTile instanceof Turnout) addTurnout((Turnout) lastTile,state); |
|
|
|
if (lastTile instanceof Turnout) addTurnout((Turnout) lastTile,state); |
|
|
|
} |
|
|
|
} |
|
|
@ -833,9 +839,9 @@ public class Route extends BaseClass implements Comparable<Route>{ |
|
|
|
|
|
|
|
|
|
|
|
public boolean setTurnouts() { |
|
|
|
public boolean setTurnouts() { |
|
|
|
Turnout turnout = null; |
|
|
|
Turnout turnout = null; |
|
|
|
for (Entry<Turnout, State> entry : turnouts.entrySet()) try { |
|
|
|
for (Entry<Turnout, Turnout.State> entry : turnouts.entrySet()) try { |
|
|
|
turnout = entry.getKey(); |
|
|
|
turnout = entry.getKey(); |
|
|
|
State targetVal = entry.getValue(); |
|
|
|
Turnout.State targetVal = entry.getValue(); |
|
|
|
if (!turnout.state(targetVal).succeeded()) return false; |
|
|
|
if (!turnout.state(targetVal).succeeded()) return false; |
|
|
|
try { |
|
|
|
try { |
|
|
|
Thread.sleep(500); |
|
|
|
Thread.sleep(500); |
|
|
@ -852,6 +858,21 @@ public class Route extends BaseClass implements Comparable<Route>{ |
|
|
|
return parts[0].trim()+"–"+parts[parts.length-1].trim(); |
|
|
|
return parts[0].trim()+"–"+parts[parts.length-1].trim(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Route.State state(){ |
|
|
|
|
|
|
|
return state; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public boolean start(Train newTrain) { |
|
|
|
|
|
|
|
if (isNull(newTrain)) return false; // can't set route's train to null
|
|
|
|
|
|
|
|
if (isSet(train)) { |
|
|
|
|
|
|
|
if (newTrain != train) return false; // can't alter route's train
|
|
|
|
|
|
|
|
} else train = newTrain; // set new train
|
|
|
|
|
|
|
|
ActionList startActions = triggeredActions.get(ROUTE_START); |
|
|
|
|
|
|
|
if (isSet(startActions) && !startActions.fire(new Context(this).train(train))) return false; // start actions failed
|
|
|
|
|
|
|
|
state = State.STARTED; |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public Block startBlock() { |
|
|
|
public Block startBlock() { |
|
|
|
return startBlock; |
|
|
|
return startBlock; |
|
|
|
} |
|
|
|
} |
|
|
@ -874,15 +895,8 @@ public class Route extends BaseClass implements Comparable<Route>{ |
|
|
|
if (isSet(train)) train.addToTrace(trace); |
|
|
|
if (isSet(train)) train.addToTrace(trace); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public boolean train(Train newTrain) { |
|
|
|
public Train train() { |
|
|
|
if (isSet(train) && newTrain != train) return false; |
|
|
|
return train; |
|
|
|
train = newTrain; |
|
|
|
|
|
|
|
if (isSet(train)) { |
|
|
|
|
|
|
|
ActionList startActions = triggeredActions.get(ROUTE_START); |
|
|
|
|
|
|
|
if (isNull(startActions)) return true; |
|
|
|
|
|
|
|
return startActions.fire(new Context(this).train(train)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public Route unlock() throws IOException { |
|
|
|
public Route unlock() throws IOException { |
|
|
|