Browse Source

implemented action-based startup of routes

lookup-tables
Stephan Richter 5 years ago
parent
commit
bb983c9736
  1. 2
      pom.xml
  2. 2
      resources/js/plan.js
  3. 4
      resources/translations/Application.de.translation
  4. 37
      src/main/java/de/srsoftware/web4rail/Plan.java
  5. 35
      src/main/java/de/srsoftware/web4rail/Route.java
  6. 16
      src/main/java/de/srsoftware/web4rail/actions/Action.java
  7. 2
      src/main/java/de/srsoftware/web4rail/actions/ActionList.java
  8. 103
      src/main/java/de/srsoftware/web4rail/actions/SetSignal.java
  9. 12
      src/main/java/de/srsoftware/web4rail/actions/SetSignalsToStop.java
  10. 4
      src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java
  11. 7
      src/main/java/de/srsoftware/web4rail/moving/Train.java
  12. 7
      src/main/java/de/srsoftware/web4rail/tiles/Block.java
  13. 62
      src/main/java/de/srsoftware/web4rail/tiles/Contact.java
  14. 22
      src/main/java/de/srsoftware/web4rail/tiles/Signal.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>0.11.13</version>
<version>0.11.14</version>
<name>Web4Rail</name>
<packaging>jar</packaging>
<description>Java Model Railway Control</description>

2
resources/js/plan.js

@ -23,7 +23,7 @@ function addClass(data){ @@ -23,7 +23,7 @@ function addClass(data){
function addMessage(txt){
$('#messages').html(txt);
if (messageTimer != null) window.clearInterval(messageTimer);
messageOpacity = 300;
messageOpacity = 3000;
messageTimer = setInterval(fadeMessage,100);
}

4
resources/translations/Application.de.translation

@ -92,7 +92,6 @@ PushPullTrain : Wendezug @@ -92,7 +92,6 @@ PushPullTrain : Wendezug
Push-pull train : Wendezug
quit autopilot : Autopilot beenden
{} reached it`s destination! : {} ist am Ziel angekommen!
Reduce speed to {} km/h : Geschwindigkeit auf {} km/h reduzieren
Report Issue : Problem melden
RIGHT : rechts
Right port\: : Port für rechts
@ -107,14 +106,17 @@ Select train\: : Zug auswählen: @@ -107,14 +106,17 @@ Select train\: : Zug auswählen:
SendCommand : Kommando senden
Send command \"{}\" to control unit : Kommando „{}“ an Zentrale senden
SetRelay : Relais schalten
SetSignal : Signal stellen
SetSignalsToStop : Signale auf Halt stellen
SetSpeed : Geschwindigkeit ändern
Set speed to {} km/h : Geschwindigkeit auf {} km/h setzen
Set {} to {} : {} auf {} setzen
SetPower : Strom schalten
Set speed to : Geschwindigkeit setzen
Setup actions : Aktivierungs-Aktionen
Signals : Signale
SOUTH : Süden
Start actions : Start-Aktionen
Started {} : {} gestartet
StopAllTrains : Alle Züge stoppen
StopAuto : Automatikmodus abschalten

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

@ -11,7 +11,9 @@ import java.util.HashSet; @@ -11,7 +11,9 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.SortedSet;
import java.util.Stack;
import java.util.TreeSet;
import java.util.Vector;
import org.slf4j.Logger;
@ -41,6 +43,7 @@ import de.srsoftware.web4rail.tiles.EndW; @@ -41,6 +43,7 @@ import de.srsoftware.web4rail.tiles.EndW;
import de.srsoftware.web4rail.tiles.Eraser;
import de.srsoftware.web4rail.tiles.Relay;
import de.srsoftware.web4rail.tiles.Shadow;
import de.srsoftware.web4rail.tiles.Signal;
import de.srsoftware.web4rail.tiles.SignalE;
import de.srsoftware.web4rail.tiles.SignalN;
import de.srsoftware.web4rail.tiles.SignalS;
@ -117,6 +120,7 @@ public class Plan extends BaseClass{ @@ -117,6 +120,7 @@ public class Plan extends BaseClass{
public HashMap<String,Tile> tiles = new HashMap<String,Tile>(); // The list of tiles of this plan, i.e. the Track layout
private HashSet<Block> blocks = new HashSet<Block>(); // the list of tiles, that are blocks
private HashSet<Signal> signals = new HashSet<Signal>(); // the list of tiles, that are signals
private HashMap<Integer, Route> routes = new HashMap<Integer, Route>(); // the list of routes of the track layout
private ControlUnit controlUnit = new ControlUnit(this); // the control unit, to which the plan is connected
private Contact learningContact;
@ -235,10 +239,10 @@ public class Plan extends BaseClass{ @@ -235,10 +239,10 @@ public class Plan extends BaseClass{
}
/**
* @return the list of blocks known to the plan
* @return the list of blocks known to the plan, ordered by name
*/
public Collection<Block> blocks() {
return blocks;
return new TreeSet<Block>(blocks);
}
/**
@ -307,6 +311,7 @@ public class Plan extends BaseClass{ @@ -307,6 +311,7 @@ public class Plan extends BaseClass{
* @return the tile belonging to the id, or the overlaying tile if the respective tile is a shadow tile.
*/
public Tile get(String tileId,boolean resolveShadows) {
if (isNull(tileId)) return null;
Tile tile = tiles.get(tileId);
if (resolveShadows && tile instanceof Shadow) tile = ((Shadow)tile).overlay();
return tile;
@ -371,6 +376,11 @@ public class Plan extends BaseClass{ @@ -371,6 +376,11 @@ public class Plan extends BaseClass{
.js("js/plan.js");
}
public void learn(Contact contact) {
learningContact = contact;
LOG.debug("learning contact {}",learningContact);
}
/**
* loads a track layout from a file, along with its assigned cars, trains, routes and control unit settings
* @param filename
@ -576,10 +586,7 @@ public class Plan extends BaseClass{ @@ -576,10 +586,7 @@ public class Plan extends BaseClass{
*/
Route registerRoute(Route newRoute) {
for (Tile tile: newRoute.path()) {
if (isNull(tile)) {
System.err.println("--");
}
tile.add(newRoute);
if (isSet(tile)) tile.add(newRoute);
}
int routeId = newRoute.id();
Route existingRoute = routes.get(routeId);
@ -659,6 +666,7 @@ public class Plan extends BaseClass{ @@ -659,6 +666,7 @@ public class Plan extends BaseClass{
public void set(int x,int y,Tile tile) throws IOException {
if (tile == null) return;
if (tile instanceof Block) blocks.add((Block) tile);
if (tile instanceof Signal) signals .add((Signal) tile);
for (int i=1; i<tile.width(); i++) set(x+i,y,new Shadow(tile));
for (int i=1; i<tile.height(); i++) set(x,y+i,new Shadow(tile));
setIntern(x,y,tile);
@ -678,10 +686,11 @@ public class Plan extends BaseClass{ @@ -678,10 +686,11 @@ public class Plan extends BaseClass{
public void sensor(int addr, boolean active) {
Contact contact = Contact.get(addr);
LOG.debug("contact: {}",isSet(contact) ? addr+" / "+contact : addr);
if (contact != null) {
if (isSet(contact)) {
contact.activate(active);
} else {
LOG.debug("contact: {}", addr);
if (active && learningContact != null) {
LOG.debug("learned: {} = {}",addr,learningContact);
stream(learningContact.addr(addr).propMenu().toString());
@ -710,6 +719,10 @@ public class Plan extends BaseClass{ @@ -710,6 +719,10 @@ public class Plan extends BaseClass{
return null;
}
public SortedSet<Signal> signals() {
return new TreeSet<Signal>(signals);
}
/**
* sends some data to the clients
* @param data
@ -728,7 +741,7 @@ public class Plan extends BaseClass{ @@ -728,7 +741,7 @@ public class Plan extends BaseClass{
int errorCount = entry.getValue()+1;
LOG.info("Error #{} on client: {}",errorCount,e.getMessage());
if (errorCount > 4) {
if (badClients == null) badClients = new Vector<OutputStreamWriter>();
if (isNull(badClients)) badClients = new Vector<OutputStreamWriter>();
try {
client.close();
} catch (IOException e1) {}
@ -838,10 +851,4 @@ public class Plan extends BaseClass{ @@ -838,10 +851,4 @@ public class Plan extends BaseClass{
public void warn(Contact contact) {
stream(t("Warning: {}",t("Ghost train @ {}",contact)));
}
public void learn(Contact contact) {
learningContact = contact;
LOG.debug("learning contact {}",learningContact);
}
}

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

@ -25,7 +25,7 @@ import de.srsoftware.web4rail.actions.Action; @@ -25,7 +25,7 @@ import de.srsoftware.web4rail.actions.Action;
import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.actions.ActionList;
import de.srsoftware.web4rail.actions.FinishRoute;
import de.srsoftware.web4rail.actions.SetSignalsToStop;
import de.srsoftware.web4rail.actions.SetSignal;
import de.srsoftware.web4rail.actions.SetSpeed;
import de.srsoftware.web4rail.conditions.Condition;
import de.srsoftware.web4rail.moving.Train;
@ -51,12 +51,14 @@ import de.srsoftware.web4rail.tiles.Turnout.State; @@ -51,12 +51,14 @@ import de.srsoftware.web4rail.tiles.Turnout.State;
public class Route extends BaseClass implements Comparable<Route>{
private static final Logger LOG = LoggerFactory.getLogger(Route.class);
private static final String ACTION_LISTS = "action_lists";
private static final String ACTIONS = "actions";
private static final String ACTION_LISTS = "action_lists";
private static final String CONDITIONS = "conditions";
private static final String DROP_CONDITION = "drop_condition";
private static final String END_DIRECTION = "direction_end";
private static final String ROUTES = "routes";
private static final String SETUP_ACTIONS = "setup_actions";
private static final String START_ACTIONS = "start_actions";
private static final String START_DIRECTION = "direction_start";
private static final String TRIGGER = "trigger";
static final String NAME = "name";
@ -78,6 +80,7 @@ public class Route extends BaseClass implements Comparable<Route>{ @@ -78,6 +80,7 @@ public class Route extends BaseClass implements Comparable<Route>{
private HashMap<String,ActionList> triggers = new HashMap<String, ActionList>();
private HashMap<Turnout,Turnout.State> turnouts;
private ActionList setupActions = new ActionList();
private ActionList startActions = new ActionList();
private Block startBlock = null;
public Direction startDirection;
private HashSet<Contact> triggeredContacts = new HashSet<>();
@ -195,11 +198,16 @@ public class Route extends BaseClass implements Comparable<Route>{ @@ -195,11 +198,16 @@ public class Route extends BaseClass implements Comparable<Route>{
new Tag("h4").content(t("Actions and contacts")).addTo(win);
Tag list = new Tag("ol");
Tag setup = new Tag("li").content(t("Setup actions"));
Tag setup = new Tag("li").content(t("Setup actions")+NBSP);
setupActions.addTo(setup, context());
setup.addTo(list);
Tag start = new Tag("li").content(t("Start actions")+NBSP);
startActions.addTo(start, context());
start.addTo(list);
for (Contact c : contacts) {
Tag link = Plan.addLink(c,c.toString(),list);
Tag link = Plan.addLink(c,c+NBSP,list);
ActionList actions = triggers.get(c.trigger());
if (isNull(actions)) {
actions = new ActionList();
@ -303,15 +311,18 @@ public class Route extends BaseClass implements Comparable<Route>{ @@ -303,15 +311,18 @@ public class Route extends BaseClass implements Comparable<Route>{
public void complete() {
if (contacts.size()>1) { // mindestens 2 Kontakte: erster Kontakt aktiviert Block, vorletzter Kontakt leitet Bremsung ein
Contact nextToLastContact = contacts.get(contacts.size()-2);
add(nextToLastContact.trigger(),new SetSpeed().speed(30));
add(nextToLastContact.trigger(),new SetSignalsToStop());
Contact nextToLastContact = contacts.get(contacts.size()-2);
String trigger = nextToLastContact.trigger();
add(trigger,new SetSpeed().to(30));
for (Signal signal : signals) add(trigger,new SetSignal().set(signal).to(Signal.STOP));
}
if (!contacts.isEmpty()) {
Contact lastContact = contacts.lastElement();
add(lastContact.trigger(), new SetSpeed());
add(lastContact.trigger(), new FinishRoute());
}
for (Signal signal : signals) setupActions.add(new SetSignal().set(signal).to(Signal.GO));
startActions.add(new SetSpeed().to(100));
}
/**
@ -454,7 +465,8 @@ public class Route extends BaseClass implements Comparable<Route>{ @@ -454,7 +465,8 @@ public class Route extends BaseClass implements Comparable<Route>{
}
if (!jTriggers.isEmpty()) json.put(ACTION_LISTS, jTriggers);
if (!setupActions.isEmpty()) json.put(ACTIONS, setupActions.json());
if (!setupActions.isEmpty()) json.put(SETUP_ACTIONS, setupActions.json());
if (!startActions.isEmpty()) json.put(START_ACTIONS, startActions.json());
String name = name();
if (isSet(name)) json.put(NAME, name);
@ -500,9 +512,8 @@ public class Route extends BaseClass implements Comparable<Route>{ @@ -500,9 +512,8 @@ public class Route extends BaseClass implements Comparable<Route>{
}
if (json.has(ACTION_LISTS)) loadActions(json.getJSONArray(ACTION_LISTS));
if (json.has(CONDITIONS)) loadConditions(json.getJSONArray(CONDITIONS));
if (json.has(ACTIONS)) {
setupActions = ActionList.load(json.getJSONArray(ACTIONS));
}
if (json.has(SETUP_ACTIONS)) setupActions = ActionList.load(json.getJSONArray(SETUP_ACTIONS));
if (json.has(START_ACTIONS)) startActions = ActionList.load(json.getJSONArray(START_ACTIONS));
if (json.has(DISABLED)) disabled = json.getBoolean(DISABLED);
return plan.registerRoute(this);
}
@ -678,7 +689,7 @@ public class Route extends BaseClass implements Comparable<Route>{ @@ -678,7 +689,7 @@ public class Route extends BaseClass implements Comparable<Route>{
public boolean train(Train newTrain) {
if (isSet(train) && newTrain != train) return false;
train = newTrain;
return true;
return isSet(train) ? startActions.fire(new Context(this)) : true;
}
public Route unlock() throws IOException {

16
src/main/java/de/srsoftware/web4rail/actions/Action.java

@ -123,18 +123,18 @@ public abstract class Action extends BaseClass { @@ -123,18 +123,18 @@ public abstract class Action extends BaseClass {
public static List<Class<? extends Action>> list() {
return List.of(
SendCommand.class,
ConditionalAction.class,
SetSpeed.class,
SetSignalsToStop.class,
DelayedAction.class,
FinishRoute.class,
TriggerContact.class,
TurnTrain.class,
StopAllTrains.class,
StopAuto.class,
SendCommand.class,
SetPower.class,
SetRelay.class,
DelayedAction.class
SetSignal.class,
SetSpeed.class,
StopAllTrains.class,
StopAuto.class,
TriggerContact.class,
TurnTrain.class
);
}

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

@ -144,7 +144,7 @@ public class ActionList extends Vector<Action> implements Constants{ @@ -144,7 +144,7 @@ public class ActionList extends Vector<Action> implements Constants{
}
public boolean fire(Context context) {
LOG.debug(t("Firing {}"),this);
if (!isEmpty()) LOG.debug(t("Firing {}"),this);
boolean success = true;
for (Action action : this) {
try {

103
src/main/java/de/srsoftware/web4rail/actions/SetSignal.java

@ -0,0 +1,103 @@ @@ -0,0 +1,103 @@
package de.srsoftware.web4rail.actions;
import java.io.IOException;
import java.util.HashMap;
import org.json.JSONObject;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Window;
import de.srsoftware.web4rail.tags.Button;
import de.srsoftware.web4rail.tags.Form;
import de.srsoftware.web4rail.tags.Input;
import de.srsoftware.web4rail.tags.Label;
import de.srsoftware.web4rail.tags.Select;
import de.srsoftware.web4rail.tiles.Signal;
import de.srsoftware.web4rail.tiles.Tile;
public class SetSignal extends Action {
private static final String SIGNAL = "signal";
private Signal signal = null;
private String state = Signal.STOP;
@Override
public boolean fire(Context context) throws IOException {
if (isNull(signal)) return false;
return signal.state(state);
}
@Override
public JSONObject json() {
JSONObject json = super.json();
if (isSet(signal)) {
json.put(SIGNAL, signal.id());
json.put(Signal.STATE, state);
}
return json;
}
@Override
public Action load(JSONObject json) {
super.load(json);
Tile tile = plan.get(json.getString(SIGNAL), false);
if (tile instanceof Signal) signal = (Signal) tile;
state = json.getString(Signal.STATE);
return this;
}
@Override
public Window properties(HashMap<String, String> params) {
Window win = super.properties(params);
Form form = new Form("action-prop-form-"+id);
new Input(REALM,REALM_ACTIONS).hideIn(form);
new Input(ID,params.get(ID)).hideIn(form);
new Input(ACTION,ACTION_UPDATE).hideIn(form);
new Input(CONTEXT,params.get(CONTEXT)).hideIn(form);
Select select = new Select(SIGNAL);
for (Signal signal : plan.signals()) {
Tag option = select.addOption(signal.id(),signal.title());
if (signal == this.signal) option.attr("selected", "selected");
}
select.addTo(new Label(t("Select signal:")+NBSP)).addTo(form);
Select state = new Select(Signal.STATE);
for (String st:Signal.knownStates) {
Tag option = state.addOption(st);
if (st.equals(this.state)) option.attr("selected", "selected");
}
state.addTo(new Label(t("Select state:")+NBSP)).addTo(form);
new Button(t("Apply"),form).addTo(form).addTo(win);
return win;
}
public SetSignal set(Signal sig) {
signal = sig;
return this;
}
public SetSignal to(String state) {
this.state = state;
return this;
}
public String toString() {
if (isNull(signal)) return "["+t("click here to setup signal")+"]";
return t("Set {} to {}",signal,state);
};
@Override
protected Object update(HashMap<String, String> params) {
LOG.debug("update: {}",params);
Tile tile = plan.get(params.get(SIGNAL), false);
if (tile instanceof Signal) signal = (Signal) tile;
String st = params.get(Signal.STATE);
if (isSet(st)) state = st;
return properties(params);
}
}

12
src/main/java/de/srsoftware/web4rail/actions/SetSignalsToStop.java

@ -1,12 +0,0 @@ @@ -1,12 +0,0 @@
package de.srsoftware.web4rail.actions;
import de.srsoftware.web4rail.tiles.Signal;
public class SetSignalsToStop extends Action {
@Override
public boolean fire(Context context) {
context.route.setSignals(Signal.STOP);
return true;
}
}

4
src/main/java/de/srsoftware/web4rail/actions/SetSpeed.java

@ -54,10 +54,10 @@ public class SetSpeed extends Action{ @@ -54,10 +54,10 @@ public class SetSpeed extends Action{
@Override
public String toString() {
return t("Reduce speed to {} km/h",maxSpeed);
return t("Set speed to {} km/h",maxSpeed);
}
public SetSpeed speed(int kmh) {
public SetSpeed to(int kmh) {
maxSpeed = kmh;
return this;
}

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

@ -587,13 +587,16 @@ public class Train extends BaseClass implements Comparable<Train> { @@ -587,13 +587,16 @@ public class Train extends BaseClass implements Comparable<Train> {
public void setSpeed(int v) {
for (Locomotive loco : locos) loco.setSpeed(v);
plan.stream(t("Set {} to {} km/h",this,v));
this.speed = v;
}
public void setWaitTime(Range waitTime) {
if (isNull(autopilot)) return;
autopilot.waitTime = waitTime.random();
LOG.debug("{} waiting {} secs...",this,autopilot.waitTime/1000d);
String msg = t("{} waiting {} secs...",this,autopilot.waitTime/1000d);
LOG.debug(msg);
plan.stream(msg);
}
@ -627,14 +630,12 @@ public class Train extends BaseClass implements Comparable<Train> { @@ -627,14 +630,12 @@ public class Train extends BaseClass implements Comparable<Train> {
String error = null;
if (!route.setTurnouts()) error = t("Was not able to set all turnouts!");
if (isNull(error) && !route.fireSetupActions(context)) error = t("Was not able to fire all setup actions of route!");
if (isNull(error) && !route.setSignals(null)) error = t("Was not able to set all signals!");
if (isNull(error) && !route.train(this)) error = t("Was not able to assign {} to {}!",this,route);
if (isSet(error)) {
route.reset();
route = null;
return error;
}
setSpeed(128);
return t("Started {}",this);
}

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

@ -6,7 +6,6 @@ import java.util.HashMap; @@ -6,7 +6,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeSet;
import java.util.Vector;
import org.json.JSONArray;
@ -291,11 +290,7 @@ public abstract class Block extends StretchableTile implements Comparable<Block> @@ -291,11 +290,7 @@ public abstract class Block extends StretchableTile implements Comparable<Block>
if (isNull(exclude)) exclude = new Vector<Block>();
Select select = new Select(Block.class.getSimpleName());
new Tag("option").attr("value","0").content(t("unset")).addTo(select);
TreeSet<Block> blocks = new TreeSet<Block>();
for (Tile tile : plan.tiles.values()) {
if (tile instanceof Block) blocks.add((Block) tile);
}
for (Block block : blocks) {
for (Block block : plan.blocks()) {
if (exclude.contains(block)) continue;
Tag opt = select.addOption(block.id(), block);
if (block == preselected) opt.attr("selected", "selected");

62
src/main/java/de/srsoftware/web4rail/tiles/Contact.java

@ -24,25 +24,59 @@ public class Contact extends Tile{ @@ -24,25 +24,59 @@ public class Contact extends Tile{
private static final String ADDRESS = "address";
private static final HashMap<String, Contact> contactsById = new HashMap<String, Contact>();
private static final HashMap<Integer, Contact> contactsByAddr = new HashMap<Integer, Contact>();
private boolean active = false;
private boolean state = false;
private String trigger = null;
private int addr = 0;
private ActionList actions = new ActionList();
private OffTimer timer = null;
public void activate(boolean active) {
this.active = active;
if (active) {
/**
* Dieser Timer dient dazu, Merhfachauslösungen eines Kontakes innerhalb einer Sekunde zu unterbinden
*
*/
private class OffTimer extends Thread {
boolean aborted = false;
public OffTimer() {
start();
}
@Override
public void run() {
try {
for (int ticks = 0; ticks<10; ticks++) {
if (!aborted) sleep(100);
}
timer = null;
if (aborted) return;
state = false;
stream();
} catch (InterruptedException e) {}
}
private void abort() {
aborted = true;
}
}
public void activate(boolean newState) {
if (newState == state) return;
if (newState == false) {
if (isSet(timer)) return;
timer = new OffTimer();
} else {
LOG.debug("{} activated.",this);
state = true;
if (isSet(timer)) timer.abort();
if (isSet(route)) {
route.contact(this);
} else if (getClass() != Contact.class) {
plan.warn(this);
}
actions.fire(new Context(this));
}
try {
stream();
} catch (IOException e) {
e.printStackTrace();
}
}
@ -145,10 +179,14 @@ public class Contact extends Tile{ @@ -145,10 +179,14 @@ public class Contact extends Tile{
return select;
}
public void stream() throws IOException {
Tag tag = super.tag(null);
if (active) tag.clazz(tag.get("class")+" active");
plan.stream("place "+tag);
public void stream() {
try {
Tag tag = super.tag(null);
if (state) tag.clazz(tag.get("class")+" active");
plan.stream("place "+tag);
} catch (IOException e) {
e.printStackTrace();
}
}

22
src/main/java/de/srsoftware/web4rail/tiles/Signal.java

@ -1,16 +1,21 @@ @@ -1,16 +1,21 @@
package de.srsoftware.web4rail.tiles;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import java.util.Vector;
import de.srsoftware.tools.Tag;
import de.srsoftware.web4rail.Plan.Direction;
public abstract class Signal extends Tile{
public abstract class Signal extends Tile implements Comparable<Signal>{
public static final String STATE = "state";
public static final String STOP = "stop";
public static final String GO = "go";
public static final TreeSet<String> knownStates = new TreeSet<String>(List.of(STOP, GO));
private String state = STOP;
public Signal() {
@ -24,15 +29,18 @@ public abstract class Signal extends Tile{ @@ -24,15 +29,18 @@ public abstract class Signal extends Tile{
return classes;
}
@Override
public int compareTo(Signal other) {
String tid = this.id();
String oid = other.id();
return tid.compareTo(oid);
}
public abstract boolean isAffectedFrom(Direction dir);
public boolean state(String state) {
this.state = state;
try {
plan.stream("place "+tag(null));
} catch (IOException e) {
e.printStackTrace();
}
plan.place(this);
return true;
}

Loading…
Cancel
Save