Browse Source

- implemented load callback

- added waitTime field to context, wait time now determined in route.start
lookup-tables
Stephan Richter 4 years ago
parent
commit
9c86955d8d
  1. 2
      pom.xml
  2. 12
      src/main/java/de/srsoftware/web4rail/BaseClass.java
  3. 18
      src/main/java/de/srsoftware/web4rail/LoadCallback.java
  4. 19
      src/main/java/de/srsoftware/web4rail/Plan.java
  5. 6
      src/main/java/de/srsoftware/web4rail/Route.java
  6. 20
      src/main/java/de/srsoftware/web4rail/actions/AddRemoveDestination.java
  7. 19
      src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java
  8. 27
      src/main/java/de/srsoftware/web4rail/actions/DisableEnableBlock.java
  9. 56
      src/main/java/de/srsoftware/web4rail/actions/EngageDecoupler.java
  10. 7
      src/main/java/de/srsoftware/web4rail/actions/PreserveRoute.java
  11. 22
      src/main/java/de/srsoftware/web4rail/actions/SetContextTrain.java
  12. 17
      src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java
  13. 40
      src/main/java/de/srsoftware/web4rail/actions/SetRelayOrSwitch.java
  14. 23
      src/main/java/de/srsoftware/web4rail/actions/SetTurnout.java
  15. 20
      src/main/java/de/srsoftware/web4rail/actions/WaitForContact.java
  16. 21
      src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java
  17. 25
      src/main/java/de/srsoftware/web4rail/conditions/RouteEndBlock.java
  18. 21
      src/main/java/de/srsoftware/web4rail/conditions/SwitchIsOn.java
  19. 24
      src/main/java/de/srsoftware/web4rail/moving/Train.java
  20. 17
      src/main/java/de/srsoftware/web4rail/threads/RouteManager.java
  21. 83
      src/main/java/de/srsoftware/web4rail/tiles/Block.java
  22. 16
      src/main/java/de/srsoftware/web4rail/tiles/Bridge.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.67</version>
<version>1.3.68</version>
<name>Web4Rail</name>
<packaging>jar</packaging>
<description>Java Model Railway Control</description>

12
src/main/java/de/srsoftware/web4rail/BaseClass.java

@ -68,6 +68,7 @@ public abstract class BaseClass implements Constants{ @@ -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{ @@ -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{ @@ -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{ @@ -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{ @@ -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

@ -0,0 +1,18 @@ @@ -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();
}
}

19
src/main/java/de/srsoftware/web4rail/Plan.java

@ -513,25 +513,29 @@ public class Plan extends BaseClass{ @@ -513,25 +513,29 @@ public class Plan extends BaseClass{
public static void load(String name) throws IOException {
plan = new Plan();
plan.name = name;
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 {
Car.loadAll(name+".cars",plan);
} catch (Exception e) {
LOG.warn("Was not able to load cars!",e);
}
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{ @@ -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();
}
/**

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

@ -790,7 +790,7 @@ public class Route extends BaseClass { @@ -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 { @@ -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 { @@ -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;
}

20
src/main/java/de/srsoftware/web4rail/actions/AddRemoveDestination.java

@ -9,11 +9,11 @@ import org.json.JSONObject; @@ -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 { @@ -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);
}

19
src/main/java/de/srsoftware/web4rail/actions/DetermineTrainInBlock.java

@ -7,9 +7,9 @@ import java.util.Map; @@ -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 { @@ -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;
}

27
src/main/java/de/srsoftware/web4rail/actions/DisableEnableBlock.java

@ -8,10 +8,10 @@ import org.json.JSONObject; @@ -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 { @@ -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

56
src/main/java/de/srsoftware/web4rail/actions/EngageDecoupler.java

@ -7,14 +7,14 @@ import java.util.Map; @@ -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 { @@ -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 { @@ -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();
}

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

@ -1,7 +1,6 @@ @@ -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 { @@ -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();

22
src/main/java/de/srsoftware/web4rail/actions/SetContextTrain.java

@ -6,10 +6,10 @@ import java.util.List; @@ -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 { @@ -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

17
src/main/java/de/srsoftware/web4rail/actions/SetDisplayText.java

@ -7,10 +7,10 @@ import java.util.Map; @@ -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{ @@ -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);
}

40
src/main/java/de/srsoftware/web4rail/actions/SetRelayOrSwitch.java

@ -8,10 +8,10 @@ import org.json.JSONObject; @@ -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 { @@ -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(STATE)) state = json.getBoolean(STATE);
if (json.has(RELAY)) new LoadCallback() {
@Override
public void afterLoad() {
relayOrSwitch = BaseClass.get(Id.from(json, RELAY));
};
}
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(SWITCH)) new LoadCallback() {
@Override
public void afterLoad() {
relayOrSwitch = BaseClass.get(Id.from(json, SWITCH));
};
}
if (json.has(STATE)) state = json.getBoolean(STATE);
return this;
};
return super.load(json);
}
@Override

23
src/main/java/de/srsoftware/web4rail/actions/SetTurnout.java

@ -8,10 +8,10 @@ import org.json.JSONObject; @@ -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 { @@ -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

20
src/main/java/de/srsoftware/web4rail/actions/WaitForContact.java

@ -8,6 +8,7 @@ import org.json.JSONObject; @@ -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 { @@ -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);
}

21
src/main/java/de/srsoftware/web4rail/conditions/BlockFree.java

@ -7,9 +7,9 @@ import java.util.Map; @@ -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 { @@ -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

25
src/main/java/de/srsoftware/web4rail/conditions/RouteEndBlock.java

@ -7,10 +7,10 @@ import java.util.Map; @@ -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{ @@ -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

21
src/main/java/de/srsoftware/web4rail/conditions/SwitchIsOn.java

@ -8,10 +8,10 @@ import org.json.JSONObject; @@ -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 { @@ -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

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

@ -23,6 +23,7 @@ import org.slf4j.LoggerFactory; @@ -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> { @@ -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> { @@ -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;
}

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

@ -31,9 +31,6 @@ public class RouteManager extends BaseClass implements Runnable { @@ -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 { @@ -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 { @@ -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 { @@ -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();
}
}

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

@ -20,6 +20,7 @@ import org.slf4j.LoggerFactory; @@ -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{ @@ -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{ @@ -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{ @@ -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{ @@ -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{ @@ -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{ @@ -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{ @@ -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);
}

16
src/main/java/de/srsoftware/web4rail/tiles/Bridge.java

@ -9,10 +9,10 @@ import org.json.JSONObject; @@ -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 { @@ -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);
}

Loading…
Cancel
Save