- implemented load callback
- added waitTime field to context, wait time now determined in route.start
This commit is contained in:
@@ -68,6 +68,7 @@ public abstract class BaseClass implements Constants{
|
||||
private Car car;
|
||||
private Contact contact;
|
||||
private Direction direction;
|
||||
private Integer waitTime;
|
||||
|
||||
public Context(BaseClass object) {
|
||||
setMain(object);
|
||||
@@ -102,6 +103,7 @@ public abstract class BaseClass implements Constants{
|
||||
route = null;
|
||||
tile = null;
|
||||
train = null;
|
||||
waitTime = null;
|
||||
}
|
||||
|
||||
public Context clone() {
|
||||
@@ -115,6 +117,7 @@ public abstract class BaseClass implements Constants{
|
||||
clone.route = route;
|
||||
clone.tile = tile;
|
||||
clone.train = train;
|
||||
clone.waitTime = waitTime;
|
||||
return clone;
|
||||
}
|
||||
|
||||
@@ -187,6 +190,7 @@ public abstract class BaseClass implements Constants{
|
||||
if (isSet(block)) sb.append(", "+t("Block: {}",block));
|
||||
if (isSet(route)) sb.append(", "+t("Route: {}",route));
|
||||
if (isSet(contact)) sb.append(", "+t("Contact: {}",contact));
|
||||
if (isSet(waitTime)) sb.append(", "+t("Wait time: {} ms",waitTime));
|
||||
sb.append(")");
|
||||
return sb.toString();
|
||||
}
|
||||
@@ -200,6 +204,14 @@ public abstract class BaseClass implements Constants{
|
||||
train = newTrain;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Integer waitTime() {
|
||||
return waitTime;
|
||||
}
|
||||
|
||||
public void waitTime(int ms) {
|
||||
waitTime = ms;
|
||||
}
|
||||
}
|
||||
|
||||
public class FormInput extends ArrayList<Map.Entry<String, Tag>>{
|
||||
|
||||
18
src/main/java/de/srsoftware/web4rail/LoadCallback.java
Normal file
18
src/main/java/de/srsoftware/web4rail/LoadCallback.java
Normal file
@@ -0,0 +1,18 @@
|
||||
package de.srsoftware.web4rail;
|
||||
|
||||
import java.util.LinkedList;
|
||||
|
||||
public abstract class LoadCallback {
|
||||
|
||||
private static LinkedList<LoadCallback> callbacks = new LinkedList<LoadCallback>();
|
||||
|
||||
public LoadCallback() {
|
||||
callbacks.add(this);
|
||||
}
|
||||
|
||||
public abstract void afterLoad();
|
||||
|
||||
public static void fire() {
|
||||
for (LoadCallback callback : callbacks) callback.afterLoad();
|
||||
}
|
||||
}
|
||||
@@ -513,25 +513,29 @@ public class Plan extends BaseClass{
|
||||
public static void load(String name) throws IOException {
|
||||
plan = new Plan();
|
||||
plan.name = name;
|
||||
|
||||
String content = new String(Files.readAllBytes(new File(name+".plan").toPath()),UTF8);
|
||||
JSONObject json = new JSONObject(content);
|
||||
|
||||
if (json.has(LENGTH_UNIT)) lengthUnit = json.getString(LENGTH_UNIT);
|
||||
if (json.has(SPEED_UNIT)) speedUnit = json.getString(SPEED_UNIT);
|
||||
if (json.has(FINAL_SPEED)) Train.defaultEndSpeed = json.getInt(FINAL_SPEED);
|
||||
if (json.has(FREE_BEHIND_TRAIN)) Route.freeBehindTrain = json.getBoolean(FREE_BEHIND_TRAIN);
|
||||
|
||||
try {
|
||||
Car.loadAll(name+".cars",plan);
|
||||
} catch (Exception e) {
|
||||
LOG.warn("Was not able to load cars!",e);
|
||||
}
|
||||
|
||||
String content = new String(Files.readAllBytes(new File(name+".plan").toPath()),UTF8);
|
||||
JSONObject json = new JSONObject(content);
|
||||
if (json.has(TILE)) json.getJSONArray(TILE).forEach(object -> Tile.load(object, plan));
|
||||
if (json.has(LENGTH_UNIT)) lengthUnit = json.getString(LENGTH_UNIT);
|
||||
if (json.has(SPEED_UNIT)) speedUnit = json.getString(SPEED_UNIT);
|
||||
if (json.has(FINAL_SPEED)) Train.defaultEndSpeed = json.getInt(FINAL_SPEED);
|
||||
if (json.has(FREE_BEHIND_TRAIN)) Route.freeBehindTrain = json.getBoolean(FREE_BEHIND_TRAIN);
|
||||
|
||||
try {
|
||||
Train.loadAll(name+".trains",plan);
|
||||
} catch (Exception e) {
|
||||
LOG.warn("Was not able to load trains!",e);
|
||||
}
|
||||
|
||||
if (json.has(TILE)) json.getJSONArray(TILE).forEach(object -> Tile.load(object, plan));
|
||||
|
||||
try {
|
||||
Route.loadAll(name+".routes",plan);
|
||||
} catch (Exception e) {
|
||||
@@ -547,6 +551,7 @@ public class Plan extends BaseClass{
|
||||
} catch (Exception e) {
|
||||
LOG.warn("Was not able to establish connection to control unit!");
|
||||
}
|
||||
LoadCallback.fire();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -790,7 +790,7 @@ public class Route extends BaseClass {
|
||||
|
||||
public Route simplyfyName() {
|
||||
String[] parts = name().split("-");
|
||||
if (parts.length>1) name(parts[0]+" - "+parts[parts.length-1]);
|
||||
if (parts.length>1) name(parts[0].trim()+" - "+parts[parts.length-1].trim());
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -802,6 +802,8 @@ public class Route extends BaseClass {
|
||||
if (isNull(train)) return false; // can't set route's train to null
|
||||
train.setRoute(this); // set new train
|
||||
|
||||
triggeredContacts.clear();
|
||||
|
||||
ActionList startActions = triggeredActions.get(ROUTE_START);
|
||||
|
||||
if (isSet(startActions)) {
|
||||
@@ -810,7 +812,7 @@ public class Route extends BaseClass {
|
||||
if (!startActions.fire(context,cause)) return false; // start actions failed
|
||||
}
|
||||
|
||||
triggeredContacts.clear();
|
||||
context.waitTime(endBlock.getWaitTime(train, endDirection).random());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,11 +9,11 @@ import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.LoadCallback;
|
||||
import de.srsoftware.web4rail.moving.Train;
|
||||
import de.srsoftware.web4rail.tags.Checkbox;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Window;
|
||||
import de.srsoftware.web4rail.threads.DelayedExecution;
|
||||
import de.srsoftware.web4rail.tiles.Block;
|
||||
import de.srsoftware.web4rail.tiles.Tile;
|
||||
|
||||
@@ -69,19 +69,13 @@ public class AddRemoveDestination extends Action {
|
||||
public Action load(JSONObject json) {
|
||||
if (json.has(TURN)) turnAtDestination = json.getBoolean(TURN);
|
||||
if (json.has(SHUNTING)) shunting = json.getBoolean(SHUNTING);
|
||||
if (json.has(Train.DESTINATION)) {
|
||||
Id blockId = new Id(json.getString(Train.DESTINATION));
|
||||
destination = BaseClass.get(blockId);
|
||||
if (isNull(destination)) {
|
||||
new DelayedExecution(this) {
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
destination = BaseClass.get(blockId);
|
||||
}
|
||||
};
|
||||
if (json.has(Train.DESTINATION)) new LoadCallback() {
|
||||
@Override
|
||||
public void afterLoad() {
|
||||
destination = BaseClass.get(Id.from(json, Train.DESTINATION));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return super.load(json);
|
||||
}
|
||||
|
||||
|
||||
@@ -7,9 +7,9 @@ import java.util.Map;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.LoadCallback;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Window;
|
||||
import de.srsoftware.web4rail.threads.DelayedExecution;
|
||||
import de.srsoftware.web4rail.tiles.Block;
|
||||
import de.srsoftware.web4rail.tiles.Tile;
|
||||
|
||||
@@ -39,18 +39,13 @@ public class DetermineTrainInBlock extends Action {
|
||||
public Action load(JSONObject json) {
|
||||
super.load(json);
|
||||
Id blockId = Id.from(json,BLOCK);
|
||||
if (isSet(blockId)) {
|
||||
block = Block.get(blockId);
|
||||
if (isNull(block)) {
|
||||
new DelayedExecution(this) {
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
block = Block.get(blockId);
|
||||
}
|
||||
};
|
||||
if (isSet(blockId)) new LoadCallback() {
|
||||
|
||||
@Override
|
||||
public void afterLoad() {
|
||||
block = Block.get(blockId);
|
||||
}
|
||||
}
|
||||
};
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,10 +8,10 @@ import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.LoadCallback;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Radio;
|
||||
import de.srsoftware.web4rail.tags.Window;
|
||||
import de.srsoftware.web4rail.threads.DelayedExecution;
|
||||
import de.srsoftware.web4rail.tiles.Block;
|
||||
import de.srsoftware.web4rail.tiles.Shadow;
|
||||
import de.srsoftware.web4rail.tiles.Tile;
|
||||
@@ -43,24 +43,15 @@ public class DisableEnableBlock extends Action {
|
||||
|
||||
@Override
|
||||
public Action load(JSONObject json) {
|
||||
super.load(json);
|
||||
Id blockId = Id.from(json,BLOCK);
|
||||
if (isSet(blockId)) {
|
||||
block = Block.get(blockId);
|
||||
if (isNull(block)) {
|
||||
new DelayedExecution(this) {
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
block = Block.get(blockId);
|
||||
}
|
||||
};
|
||||
if (json.has(STATE)) disable = !json.getBoolean(STATE);
|
||||
if (json.has(BLOCK)) new LoadCallback() {
|
||||
@Override
|
||||
public void afterLoad() {
|
||||
block = Block.get(Id.from(json,BLOCK));
|
||||
}
|
||||
}
|
||||
if (json.has(STATE)) {
|
||||
disable = !json.getBoolean(STATE);
|
||||
}
|
||||
return this;
|
||||
};
|
||||
return super.load(json);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -7,14 +7,14 @@ import java.util.Map;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.LoadCallback;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Window;
|
||||
import de.srsoftware.web4rail.threads.DelayedExecution;
|
||||
import de.srsoftware.web4rail.tiles.Decoupler;
|
||||
import de.srsoftware.web4rail.tiles.Tile;
|
||||
|
||||
public class EngageDecoupler extends Action {
|
||||
|
||||
|
||||
private static final String DECOUPLER = Decoupler.class.getSimpleName();
|
||||
|
||||
public EngageDecoupler(BaseClass parent) {
|
||||
@@ -24,12 +24,12 @@ public class EngageDecoupler extends Action {
|
||||
private Decoupler decoupler = null;
|
||||
|
||||
@Override
|
||||
public boolean fire(Context context,Object cause) {
|
||||
public boolean fire(Context context, Object cause) {
|
||||
if (isNull(decoupler)) return false;
|
||||
decoupler.engage();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public JSONObject json() {
|
||||
JSONObject json = super.json();
|
||||
@@ -38,50 +38,44 @@ public class EngageDecoupler extends Action {
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Action load(JSONObject json) {
|
||||
super.load(json);
|
||||
if (json.has(DECOUPLER)) {
|
||||
String decouplerId = json.getString(DECOUPLER);
|
||||
decoupler = BaseClass.get(new Id(decouplerId));
|
||||
if (isNull(decoupler)) new DelayedExecution(this) {
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
decoupler = BaseClass.get(new Id(decouplerId));
|
||||
}
|
||||
};
|
||||
}
|
||||
return this;
|
||||
if (json.has(DECOUPLER)) new LoadCallback() {
|
||||
@Override
|
||||
public void afterLoad() {
|
||||
decoupler = BaseClass.get(Id.from(json, DECOUPLER));
|
||||
}
|
||||
};
|
||||
return super.load(json);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Decoupler")+": "+(isNull(decoupler) ? t("unset") : decoupler),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,DECOUPLER)));
|
||||
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm, String... errors) {
|
||||
formInputs.add(t("Decoupler") + ": " + (isNull(decoupler) ? t("unset") : decoupler), button(t("Select from plan"), Map.of(ACTION, ACTION_UPDATE, ASSIGN, DECOUPLER)));
|
||||
|
||||
return super.properties(preForm, formInputs, postForm, errors);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void removeChild(BaseClass child) {
|
||||
if (child == decoupler) decoupler = null;
|
||||
super.removeChild(child);
|
||||
}
|
||||
|
||||
|
||||
public String toString() {
|
||||
if (isNull(decoupler)) return "["+t("Click here to setup decoupler")+"]";
|
||||
return t("Engage {}",decoupler);
|
||||
if (isNull(decoupler)) return "[" + t("Click here to setup decoupler") + "]";
|
||||
return t("Engage {}", decoupler);
|
||||
};
|
||||
|
||||
|
||||
@Override
|
||||
protected Object update(HashMap<String, String> params) {
|
||||
LOG.debug("update: {}",params);
|
||||
LOG.debug("update: {}", params);
|
||||
if (params.containsKey(DECOUPLER)) {
|
||||
Tile tile = BaseClass.get(new Id(params.get(DECOUPLER)));
|
||||
if (tile instanceof Decoupler) {
|
||||
decoupler = (Decoupler) tile;
|
||||
} else return t("Clicked tile is not a {}!",t("decoupler"));
|
||||
decoupler = (Decoupler) tile;
|
||||
} else return t("Clicked tile is not a {}!", t("decoupler"));
|
||||
}
|
||||
return context().properties();
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package de.srsoftware.web4rail.actions;
|
||||
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.Range;
|
||||
import de.srsoftware.web4rail.Route;
|
||||
import de.srsoftware.web4rail.moving.Train;
|
||||
import de.srsoftware.web4rail.tiles.Block;
|
||||
@@ -25,10 +24,10 @@ public class PreserveRoute extends Action {
|
||||
Block endBlock = route.endBlock();
|
||||
if (train.destination() == endBlock) return true; // do not reserve routes, when destination has been reached
|
||||
|
||||
Range waitTime = endBlock.getWaitTime(train,route.endDirection);
|
||||
if (waitTime.max > 0) {
|
||||
Integer waitTime = context.waitTime();
|
||||
if (isSet(waitTime) && waitTime > 0) {
|
||||
LOG.debug("Not preserving route, as train needs to stop for {} ms at {}!",waitTime,endBlock);
|
||||
return true; // train is expected to wait in next block.
|
||||
return false; // train is expected to wait in next block.
|
||||
}
|
||||
|
||||
train.reserveNext();
|
||||
|
||||
@@ -6,10 +6,10 @@ import java.util.List;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.LoadCallback;
|
||||
import de.srsoftware.web4rail.moving.Train;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Window;
|
||||
import de.srsoftware.web4rail.threads.DelayedExecution;
|
||||
|
||||
public class SetContextTrain extends Action {
|
||||
|
||||
@@ -34,21 +34,13 @@ public class SetContextTrain extends Action {
|
||||
|
||||
@Override
|
||||
public Action load(JSONObject json) {
|
||||
super.load(json);
|
||||
if (json.has(REALM_TRAIN)) {
|
||||
Id trainId = Id.from(json,REALM_TRAIN);
|
||||
if (isSet(trainId)) {
|
||||
train = Train.get(trainId);
|
||||
if (isNull(train)) new DelayedExecution(this) {
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
train = Train.get(trainId);
|
||||
}
|
||||
};
|
||||
if (json.has(REALM_TRAIN)) new LoadCallback() {
|
||||
@Override
|
||||
public void afterLoad() {
|
||||
train = Train.get(Id.from(json,REALM_TRAIN));
|
||||
}
|
||||
}
|
||||
return this;
|
||||
};
|
||||
return super.load(json);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -7,10 +7,10 @@ import java.util.Map;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.LoadCallback;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Label;
|
||||
import de.srsoftware.web4rail.tags.Window;
|
||||
import de.srsoftware.web4rail.threads.DelayedExecution;
|
||||
import de.srsoftware.web4rail.tiles.TextDisplay;
|
||||
import de.srsoftware.web4rail.tiles.Tile;
|
||||
|
||||
@@ -43,15 +43,12 @@ public class SetDisplayText extends TextAction{
|
||||
|
||||
@Override
|
||||
public Action load(JSONObject json) {
|
||||
if (json.has(DISPLAY)) {
|
||||
new DelayedExecution(this) {
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
display = (TextDisplay) plan.get(Id.from(json,DISPLAY), false);
|
||||
};
|
||||
};
|
||||
}
|
||||
if (json.has(DISPLAY)) new LoadCallback() {
|
||||
@Override
|
||||
public void afterLoad() {
|
||||
display = (TextDisplay) plan.get(Id.from(json,DISPLAY), false);
|
||||
}
|
||||
};
|
||||
return super.load(json);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,10 +8,10 @@ import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.LoadCallback;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Select;
|
||||
import de.srsoftware.web4rail.tags.Window;
|
||||
import de.srsoftware.web4rail.threads.DelayedExecution;
|
||||
import de.srsoftware.web4rail.tiles.Relay;
|
||||
import de.srsoftware.web4rail.tiles.Switch;
|
||||
import de.srsoftware.web4rail.tiles.Tile;
|
||||
@@ -51,31 +51,23 @@ public class SetRelayOrSwitch extends Action {
|
||||
|
||||
@Override
|
||||
public Action load(JSONObject json) {
|
||||
super.load(json);
|
||||
if (json.has(RELAY)) {
|
||||
String relayId = json.getString(RELAY);
|
||||
relayOrSwitch = BaseClass.get(new Id(relayId));
|
||||
if (isNull(relayOrSwitch)) new DelayedExecution(this) {
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
relayOrSwitch = BaseClass.get(new Id(relayId));
|
||||
};
|
||||
};
|
||||
}
|
||||
if (json.has(SWITCH)) {
|
||||
String relayId = json.getString(SWITCH);
|
||||
relayOrSwitch = BaseClass.get(new Id(relayId));
|
||||
if (isNull(relayOrSwitch)) new DelayedExecution(this) {
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
relayOrSwitch = BaseClass.get(new Id(relayId));
|
||||
}
|
||||
};
|
||||
}
|
||||
if (json.has(STATE)) state = json.getBoolean(STATE);
|
||||
return this;
|
||||
|
||||
if (json.has(RELAY)) new LoadCallback() {
|
||||
@Override
|
||||
public void afterLoad() {
|
||||
relayOrSwitch = BaseClass.get(Id.from(json, RELAY));
|
||||
};
|
||||
};
|
||||
|
||||
if (json.has(SWITCH)) new LoadCallback() {
|
||||
@Override
|
||||
public void afterLoad() {
|
||||
relayOrSwitch = BaseClass.get(Id.from(json, SWITCH));
|
||||
};
|
||||
};
|
||||
|
||||
return super.load(json);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -8,10 +8,10 @@ import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.LoadCallback;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Select;
|
||||
import de.srsoftware.web4rail.tags.Window;
|
||||
import de.srsoftware.web4rail.threads.DelayedExecution;
|
||||
import de.srsoftware.web4rail.tiles.Turnout;
|
||||
import de.srsoftware.web4rail.tiles.Turnout.State;
|
||||
|
||||
@@ -49,20 +49,15 @@ public class SetTurnout extends Action {
|
||||
|
||||
@Override
|
||||
public Action load(JSONObject json) {
|
||||
super.load(json);
|
||||
Id turnoutId = json.has(TURNOUT) ? new Id(json.getString(TURNOUT)) : null;
|
||||
if (isSet(turnoutId)) {
|
||||
turnout = BaseClass.get(turnoutId);
|
||||
if (isNull(turnout)) new DelayedExecution(this) {
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
turnout = BaseClass.get(turnoutId);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (json.has(Turnout.STATE)) state = Turnout.State.valueOf(json.getString(Turnout.STATE));
|
||||
return this;
|
||||
if (json.has(TURNOUT)) new LoadCallback() {
|
||||
|
||||
@Override
|
||||
public void afterLoad() {
|
||||
turnout = BaseClass.get(Id.from(json, TURNOUT));
|
||||
}
|
||||
};
|
||||
return super.load(json);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -8,6 +8,7 @@ import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.LoadCallback;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Input;
|
||||
import de.srsoftware.web4rail.tags.Window;
|
||||
@@ -82,19 +83,16 @@ public class WaitForContact extends ActionList {
|
||||
|
||||
@Override
|
||||
public Action load(JSONObject json) {
|
||||
if (json.has(CONTACT)) {
|
||||
String cid = json.getString(CONTACT);
|
||||
contact = BaseClass.get(new Id(cid));
|
||||
if (isNull(contact)) new DelayedExecution(this) {
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
contact = BaseClass.get(new Id(cid));
|
||||
}
|
||||
};
|
||||
}
|
||||
if (json.has(TIMEOUT)) timeout = json.getInt(TIMEOUT);
|
||||
if (json.has(TIMEOUT_ACTIONS)) timeoutActions.load(json.getJSONObject(TIMEOUT_ACTIONS));
|
||||
|
||||
if (json.has(CONTACT)) new LoadCallback() {
|
||||
|
||||
@Override
|
||||
public void afterLoad() {
|
||||
contact = BaseClass.get(Id.from(json, CONTACT));
|
||||
}
|
||||
};
|
||||
return super.load(json);
|
||||
}
|
||||
|
||||
|
||||
@@ -7,9 +7,9 @@ import java.util.Map;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.LoadCallback;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Window;
|
||||
import de.srsoftware.web4rail.threads.DelayedExecution;
|
||||
import de.srsoftware.web4rail.tiles.Block;
|
||||
import de.srsoftware.web4rail.tiles.Tile;
|
||||
|
||||
@@ -34,20 +34,13 @@ public class BlockFree extends Condition {
|
||||
}
|
||||
|
||||
public Condition load(JSONObject json) {
|
||||
super.load(json);
|
||||
if (json.has(BLOCK)) {
|
||||
Id bid = new Id(json.getString(BLOCK));
|
||||
block(BaseClass.get(bid));
|
||||
if (isNull(block)) {
|
||||
new DelayedExecution(this) {
|
||||
@Override
|
||||
public void execute() {
|
||||
block(BaseClass.get(bid));
|
||||
}
|
||||
};
|
||||
if (json.has(BLOCK)) new LoadCallback() {
|
||||
@Override
|
||||
public void afterLoad() {
|
||||
block(BaseClass.get(Id.from(json, BLOCK)));
|
||||
}
|
||||
}
|
||||
return this;
|
||||
};
|
||||
return super.load(json);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -7,10 +7,10 @@ import java.util.Map;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.LoadCallback;
|
||||
import de.srsoftware.web4rail.Route;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Window;
|
||||
import de.srsoftware.web4rail.threads.DelayedExecution;
|
||||
import de.srsoftware.web4rail.tiles.Block;
|
||||
import de.srsoftware.web4rail.tiles.Tile;
|
||||
|
||||
@@ -38,22 +38,15 @@ public class RouteEndBlock extends Condition{
|
||||
}
|
||||
|
||||
public Condition load(JSONObject json) {
|
||||
super.load(json);
|
||||
Id bid = new Id(json.getString(BLOCK));
|
||||
Block block = BaseClass.get(bid);
|
||||
if (isSet(block)) {
|
||||
block(block);
|
||||
} else {
|
||||
new DelayedExecution(this) {
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
block(BaseClass.get(bid));
|
||||
}
|
||||
};
|
||||
}
|
||||
new LoadCallback() {
|
||||
|
||||
@Override
|
||||
public void afterLoad() {
|
||||
block(BaseClass.get(Id.from(json, BLOCK)));
|
||||
}
|
||||
};
|
||||
|
||||
return this;
|
||||
return super.load(json);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -8,10 +8,10 @@ import org.json.JSONObject;
|
||||
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.LoadCallback;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Radio;
|
||||
import de.srsoftware.web4rail.tags.Window;
|
||||
import de.srsoftware.web4rail.threads.DelayedExecution;
|
||||
import de.srsoftware.web4rail.tiles.Switch;
|
||||
import de.srsoftware.web4rail.tiles.Tile;
|
||||
|
||||
@@ -44,20 +44,13 @@ public class SwitchIsOn extends Condition {
|
||||
}
|
||||
|
||||
public Condition load(JSONObject json) {
|
||||
super.load(json);
|
||||
if (json.has(SWITCH)) {
|
||||
swtch = BaseClass.get(new Id(json.getString(SWITCH)));
|
||||
if (isNull(swtch)) {
|
||||
new DelayedExecution(this) {
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
swtch = BaseClass.get(new Id(json.getString(SWITCH)));
|
||||
}
|
||||
};
|
||||
if (json.has(SWITCH)) new LoadCallback() {
|
||||
@Override
|
||||
public void afterLoad() {
|
||||
swtch = BaseClass.get(Id.from(json,SWITCH));
|
||||
}
|
||||
}
|
||||
return this;
|
||||
};
|
||||
return super.load(json);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -23,6 +23,7 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.LoadCallback;
|
||||
import de.srsoftware.web4rail.Plan;
|
||||
import de.srsoftware.web4rail.Plan.Direction;
|
||||
import de.srsoftware.web4rail.Route;
|
||||
@@ -514,18 +515,23 @@ public class Train extends BaseClass implements Comparable<Train> {
|
||||
if (json.has(DIRECTION)) direction = Direction.valueOf(json.getString(DIRECTION));
|
||||
if (json.has(NAME)) name = json.getString(NAME);
|
||||
if (json.has(TAGS)) json.getJSONArray(TAGS ).forEach(elem -> { tags.add(elem.toString()); });
|
||||
if (json.has(TRACE)) json.getJSONArray(TRACE).forEach(elem -> {
|
||||
Tile tile = plan.get(new Id(elem.toString()), false);
|
||||
if (tile.setTrain(this)) trace.add(tile);
|
||||
});
|
||||
if (json.has(BLOCK)) {// do not move this up! during set, other fields will be referenced!
|
||||
currentBlock = (Block) plan.get(new Id(json.getString(BLOCK)), false);
|
||||
currentBlock.add(this, direction);
|
||||
}
|
||||
if (json.has(LOCOS)) { // for downward compatibility
|
||||
for (Object id : json.getJSONArray(LOCOS)) add(BaseClass.get(new Id(""+id)));
|
||||
}
|
||||
for (Object id : json.getJSONArray(CARS)) add(BaseClass.get(new Id(""+id)));
|
||||
new LoadCallback() {
|
||||
@Override
|
||||
public void afterLoad() {
|
||||
if (json.has(TRACE)) json.getJSONArray(TRACE).forEach(elem -> {
|
||||
Tile tile = plan.get(new Id(elem.toString()), false);
|
||||
if (tile.setTrain(Train.this)) trace.add(tile);
|
||||
});
|
||||
if (json.has(BLOCK)) {// do not move this up! during set, other fields will be referenced!
|
||||
currentBlock = (Block) plan.get(Id.from(json, BLOCK), false);
|
||||
if (isSet(currentBlock)) currentBlock.add(Train.this, direction);
|
||||
}
|
||||
}
|
||||
};
|
||||
super.load(json);
|
||||
return this;
|
||||
}
|
||||
@@ -853,7 +859,7 @@ public class Train extends BaseClass implements Comparable<Train> {
|
||||
|
||||
public String start(boolean auto) {
|
||||
if (isNull(routeManager)) routeManager = new RouteManager(this);
|
||||
routeManager.setAuto(auto);
|
||||
routeManager.setAuto(auto).start();
|
||||
plan.stream(t("Started {}",this));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -31,9 +31,6 @@ public class RouteManager extends BaseClass implements Runnable {
|
||||
public RouteManager(Train train) {
|
||||
context = new Context(train);
|
||||
state = State.STARTED;
|
||||
Thread thread = new Thread(this);
|
||||
thread.setName(train.name());
|
||||
thread.start();
|
||||
}
|
||||
|
||||
private static TreeMap<Integer,List<Route>> availableRoutes(Context context,HashSet<Route> visitedRoutes){
|
||||
@@ -61,7 +58,7 @@ public class RouteManager extends BaseClass implements Runnable {
|
||||
|
||||
if (isSet(destination) && visitedRoutes.isEmpty()) LOG.debug("{}- Destination: {}",inset,destination);
|
||||
|
||||
for (Route routeCandidate : block.routes(startDirection)) {
|
||||
for (Route routeCandidate : block.leavingRoutes()) {
|
||||
if (context.invalidated()) return availableRoutes;
|
||||
if (visitedRoutes.contains(routeCandidate)) {
|
||||
LOG.debug("{}→ Candidate {} would create loop, skipping",inset,routeCandidate.shortName());
|
||||
@@ -179,7 +176,8 @@ public class RouteManager extends BaseClass implements Runnable {
|
||||
try {
|
||||
do {
|
||||
pause();
|
||||
if (context.invalidated()) return;
|
||||
if (isSet(train.route())) continue;
|
||||
if (context.invalidated()) return;
|
||||
context.block(train.currentBlock()).direction(train.direction());
|
||||
Route route = chooseRoute(context);
|
||||
if (isNull(route)) continue;
|
||||
@@ -205,8 +203,15 @@ public class RouteManager extends BaseClass implements Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
public void setAuto(boolean auto) {
|
||||
public RouteManager setAuto(boolean auto) {
|
||||
LOG.debug("{}abled autopilot of {}",auto?"En":"Dis");
|
||||
autopilot = auto;
|
||||
return this;
|
||||
}
|
||||
|
||||
public void start() {
|
||||
Thread thread = new Thread(this);
|
||||
thread.setName(context.train().name());
|
||||
thread.start();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ import org.slf4j.LoggerFactory;
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.Connector;
|
||||
import de.srsoftware.web4rail.LoadCallback;
|
||||
import de.srsoftware.web4rail.Plan.Direction;
|
||||
import de.srsoftware.web4rail.Range;
|
||||
import de.srsoftware.web4rail.Route;
|
||||
@@ -99,7 +100,7 @@ public abstract class Block extends StretchableTile{
|
||||
private static final String RAISE = "raise";
|
||||
public static final String ACTION_ADD_CONTACT = "add_contact";
|
||||
private static final String PARKED_TRAINS = "parked_trains";
|
||||
private static final String TRAINS = "parked_trains";
|
||||
private static final String TRAINS = "trains";
|
||||
|
||||
public String name = "Block";
|
||||
public boolean turnAllowed = false;
|
||||
@@ -202,15 +203,6 @@ public abstract class Block extends StretchableTile{
|
||||
return t("Trigger contact to learn new contact");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFreeFor(Context context) {
|
||||
Train train = context.train();
|
||||
if (is(Status.DISABLED)) return false;
|
||||
if (trains.isEmpty()) return true;
|
||||
if (trains.first() == train) return true;
|
||||
return train.isShunting(); // block contains train(s), thus it is only free for shunting train
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object click(boolean shift) throws IOException {
|
||||
if (!trains.isEmpty() && !shift) return trains.first().properties();
|
||||
@@ -309,6 +301,15 @@ public abstract class Block extends StretchableTile{
|
||||
return 1+internalContacts.indexOf(contact);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFreeFor(Context context) {
|
||||
Train train = context.train();
|
||||
if (is(Status.DISABLED)) return false;
|
||||
if (trains.isEmpty()) return true;
|
||||
if (trains.first() == train) return true;
|
||||
return train.isShunting(); // block contains train(s), thus it is only free for shunting train
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONObject json() {
|
||||
JSONObject json = super.json();
|
||||
@@ -325,12 +326,17 @@ public abstract class Block extends StretchableTile{
|
||||
}
|
||||
}
|
||||
if (isSet(jContacts)) json.put(CONTACT, jContacts);
|
||||
json.remove(REALM_TRAIN); // is set by TRAINS field for blocks
|
||||
if (!trains.isEmpty()) {
|
||||
JSONArray ptids = new JSONArray();
|
||||
for (Train parked : trains) {
|
||||
if (isSet(parked)) ptids.put(parked.id().toString());
|
||||
JSONArray jTrains = new JSONArray();
|
||||
for (Train train : trains) {
|
||||
JSONObject to = new JSONObject();
|
||||
to.put(ID, train.id());
|
||||
Direction dir = trains.directionOf(train);
|
||||
if (isSet(dir)) to.put(DIRECTION, dir.toString());
|
||||
jTrains.put(to);
|
||||
}
|
||||
json.put(PARKED_TRAINS, ptids);
|
||||
json.put(TRAINS, jTrains);
|
||||
}
|
||||
return json;
|
||||
}
|
||||
@@ -339,6 +345,10 @@ public abstract class Block extends StretchableTile{
|
||||
return trains.last();
|
||||
}
|
||||
|
||||
public List<Route> leavingRoutes() {
|
||||
return routes().stream().filter(route -> route.startBlock() == Block.this).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* If arguments are given, the first is taken as content, the second as tag type.
|
||||
@@ -372,24 +382,33 @@ public abstract class Block extends StretchableTile{
|
||||
} catch (JSONException e) {}
|
||||
}
|
||||
}
|
||||
if (json.has(TRAINS)) {
|
||||
JSONArray jTrains = json.getJSONArray(TRAINS);
|
||||
for (Object o : jTrains) {
|
||||
if (o instanceof JSONObject) {
|
||||
JSONObject to = (JSONObject) o;
|
||||
Train train = BaseClass.get(new Id(to.getString(ID)));
|
||||
Direction direction = to.has(DIRECTION) ? Direction.valueOf(to.getString(DIRECTION)) : null;
|
||||
if (isSet(train)) trains.add(train, direction);
|
||||
|
||||
new LoadCallback() {
|
||||
@Override
|
||||
public void afterLoad() {
|
||||
if (json.has(TRAINS)) {
|
||||
JSONArray jTrains = json.getJSONArray(TRAINS);
|
||||
for (Object o : jTrains) {
|
||||
if (o instanceof JSONObject) {
|
||||
JSONObject to = (JSONObject) o;
|
||||
Id tID = new Id(to.getString(ID));
|
||||
Train train = BaseClass.get(tID);
|
||||
Direction direction = to.has(DIRECTION) ? Direction.valueOf(to.getString(DIRECTION)) : null;
|
||||
if (isSet(train)) {
|
||||
trains.add(train, direction);
|
||||
train.set(Block.this);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (json.has(PARKED_TRAINS)) { // legacy
|
||||
for (Object id : json.getJSONArray(PARKED_TRAINS)) {
|
||||
Train train = BaseClass.get(new Id(id.toString()));
|
||||
if (isSet(train)) trains.add(train,null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (json.has(PARKED_TRAINS)) { // legacy
|
||||
JSONArray ptids = json.getJSONArray(PARKED_TRAINS);
|
||||
for (Object id : ptids) {
|
||||
Train train = BaseClass.get(new Id(id.toString()));
|
||||
if (isSet(train)) trains.add(train,null);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return super.load(json);
|
||||
}
|
||||
|
||||
@@ -485,10 +504,6 @@ public abstract class Block extends StretchableTile{
|
||||
internalContacts.remove(blockContact);
|
||||
}
|
||||
|
||||
public List<Route> routes(Direction direction) {
|
||||
return routes().stream().filter(route -> route.startBlock() == Block.this).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public void set(Train train, Direction direction) {
|
||||
trains.set(train,direction);
|
||||
}
|
||||
|
||||
@@ -9,10 +9,10 @@ import org.json.JSONObject;
|
||||
import de.srsoftware.tools.Tag;
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.Connector;
|
||||
import de.srsoftware.web4rail.LoadCallback;
|
||||
import de.srsoftware.web4rail.moving.Train;
|
||||
import de.srsoftware.web4rail.tags.Fieldset;
|
||||
import de.srsoftware.web4rail.tags.Window;
|
||||
import de.srsoftware.web4rail.threads.DelayedExecution;
|
||||
|
||||
public abstract class Bridge extends Tile {
|
||||
private static final String COUNTERPART = "counterpart";
|
||||
@@ -56,14 +56,12 @@ public abstract class Bridge extends Tile {
|
||||
|
||||
@Override
|
||||
public Tile load(JSONObject json) {
|
||||
if (json.has(COUNTERPART)) {
|
||||
new DelayedExecution(this) {
|
||||
@Override
|
||||
public void execute() {
|
||||
counterpart = (Bridge) plan.get(Id.from(json, COUNTERPART), false);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (json.has(COUNTERPART)) new LoadCallback() {
|
||||
@Override
|
||||
public void afterLoad() {
|
||||
counterpart = (Bridge) plan.get(Id.from(json, COUNTERPART), false);
|
||||
}
|
||||
};
|
||||
return super.load(json);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user