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. 33
      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. 58
      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 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>de.srsoftware</groupId> <groupId>de.srsoftware</groupId>
<artifactId>web4rail</artifactId> <artifactId>web4rail</artifactId>
<version>0.11.13</version> <version>0.11.14</version>
<name>Web4Rail</name> <name>Web4Rail</name>
<packaging>jar</packaging> <packaging>jar</packaging>
<description>Java Model Railway Control</description> <description>Java Model Railway Control</description>

2
resources/js/plan.js

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

4
resources/translations/Application.de.translation

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

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

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

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

@ -25,7 +25,7 @@ import de.srsoftware.web4rail.actions.Action;
import de.srsoftware.web4rail.actions.Action.Context; import de.srsoftware.web4rail.actions.Action.Context;
import de.srsoftware.web4rail.actions.ActionList; import de.srsoftware.web4rail.actions.ActionList;
import de.srsoftware.web4rail.actions.FinishRoute; 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.actions.SetSpeed;
import de.srsoftware.web4rail.conditions.Condition; import de.srsoftware.web4rail.conditions.Condition;
import de.srsoftware.web4rail.moving.Train; import de.srsoftware.web4rail.moving.Train;
@ -51,12 +51,14 @@ import de.srsoftware.web4rail.tiles.Turnout.State;
public class Route extends BaseClass implements Comparable<Route>{ public class Route extends BaseClass implements Comparable<Route>{
private static final Logger LOG = LoggerFactory.getLogger(Route.class); 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 ACTIONS = "actions";
private static final String ACTION_LISTS = "action_lists";
private static final String CONDITIONS = "conditions"; private static final String CONDITIONS = "conditions";
private static final String DROP_CONDITION = "drop_condition"; private static final String DROP_CONDITION = "drop_condition";
private static final String END_DIRECTION = "direction_end"; private static final String END_DIRECTION = "direction_end";
private static final String ROUTES = "routes"; 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 START_DIRECTION = "direction_start";
private static final String TRIGGER = "trigger"; private static final String TRIGGER = "trigger";
static final String NAME = "name"; static final String NAME = "name";
@ -78,6 +80,7 @@ public class Route extends BaseClass implements Comparable<Route>{
private HashMap<String,ActionList> triggers = new HashMap<String, ActionList>(); private HashMap<String,ActionList> triggers = new HashMap<String, ActionList>();
private HashMap<Turnout,Turnout.State> turnouts; private HashMap<Turnout,Turnout.State> turnouts;
private ActionList setupActions = new ActionList(); private ActionList setupActions = new ActionList();
private ActionList startActions = new ActionList();
private Block startBlock = null; private Block startBlock = null;
public Direction startDirection; public Direction startDirection;
private HashSet<Contact> triggeredContacts = new HashSet<>(); private HashSet<Contact> triggeredContacts = new HashSet<>();
@ -195,11 +198,16 @@ public class Route extends BaseClass implements Comparable<Route>{
new Tag("h4").content(t("Actions and contacts")).addTo(win); new Tag("h4").content(t("Actions and contacts")).addTo(win);
Tag list = new Tag("ol"); 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()); setupActions.addTo(setup, context());
setup.addTo(list); setup.addTo(list);
Tag start = new Tag("li").content(t("Start actions")+NBSP);
startActions.addTo(start, context());
start.addTo(list);
for (Contact c : contacts) { 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()); ActionList actions = triggers.get(c.trigger());
if (isNull(actions)) { if (isNull(actions)) {
actions = new ActionList(); actions = new ActionList();
@ -304,14 +312,17 @@ public class Route extends BaseClass implements Comparable<Route>{
public void complete() { public void complete() {
if (contacts.size()>1) { // mindestens 2 Kontakte: erster Kontakt aktiviert Block, vorletzter Kontakt leitet Bremsung ein if (contacts.size()>1) { // mindestens 2 Kontakte: erster Kontakt aktiviert Block, vorletzter Kontakt leitet Bremsung ein
Contact nextToLastContact = contacts.get(contacts.size()-2); Contact nextToLastContact = contacts.get(contacts.size()-2);
add(nextToLastContact.trigger(),new SetSpeed().speed(30)); String trigger = nextToLastContact.trigger();
add(nextToLastContact.trigger(),new SetSignalsToStop()); add(trigger,new SetSpeed().to(30));
for (Signal signal : signals) add(trigger,new SetSignal().set(signal).to(Signal.STOP));
} }
if (!contacts.isEmpty()) { if (!contacts.isEmpty()) {
Contact lastContact = contacts.lastElement(); Contact lastContact = contacts.lastElement();
add(lastContact.trigger(), new SetSpeed()); add(lastContact.trigger(), new SetSpeed());
add(lastContact.trigger(), new FinishRoute()); 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>{
} }
if (!jTriggers.isEmpty()) json.put(ACTION_LISTS, jTriggers); 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(); String name = name();
if (isSet(name)) json.put(NAME, name); if (isSet(name)) json.put(NAME, name);
@ -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(ACTION_LISTS)) loadActions(json.getJSONArray(ACTION_LISTS));
if (json.has(CONDITIONS)) loadConditions(json.getJSONArray(CONDITIONS)); if (json.has(CONDITIONS)) loadConditions(json.getJSONArray(CONDITIONS));
if (json.has(ACTIONS)) { if (json.has(SETUP_ACTIONS)) setupActions = ActionList.load(json.getJSONArray(SETUP_ACTIONS));
setupActions = ActionList.load(json.getJSONArray(ACTIONS)); if (json.has(START_ACTIONS)) startActions = ActionList.load(json.getJSONArray(START_ACTIONS));
}
if (json.has(DISABLED)) disabled = json.getBoolean(DISABLED); if (json.has(DISABLED)) disabled = json.getBoolean(DISABLED);
return plan.registerRoute(this); return plan.registerRoute(this);
} }
@ -678,7 +689,7 @@ public class Route extends BaseClass implements Comparable<Route>{
public boolean train(Train newTrain) { public boolean train(Train newTrain) {
if (isSet(train) && newTrain != train) return false; if (isSet(train) && newTrain != train) return false;
train = newTrain; train = newTrain;
return true; return isSet(train) ? startActions.fire(new Context(this)) : true;
} }
public Route unlock() throws IOException { 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 {
public static List<Class<? extends Action>> list() { public static List<Class<? extends Action>> list() {
return List.of( return List.of(
SendCommand.class,
ConditionalAction.class, ConditionalAction.class,
SetSpeed.class, DelayedAction.class,
SetSignalsToStop.class,
FinishRoute.class, FinishRoute.class,
TriggerContact.class, SendCommand.class,
TurnTrain.class,
StopAllTrains.class,
StopAuto.class,
SetPower.class, SetPower.class,
SetRelay.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{
} }
public boolean fire(Context context) { public boolean fire(Context context) {
LOG.debug(t("Firing {}"),this); if (!isEmpty()) LOG.debug(t("Firing {}"),this);
boolean success = true; boolean success = true;
for (Action action : this) { for (Action action : this) {
try { try {

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

@ -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 @@
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{
@Override @Override
public String toString() { 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; maxSpeed = kmh;
return this; return this;
} }

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

@ -587,13 +587,16 @@ public class Train extends BaseClass implements Comparable<Train> {
public void setSpeed(int v) { public void setSpeed(int v) {
for (Locomotive loco : locos) loco.setSpeed(v); for (Locomotive loco : locos) loco.setSpeed(v);
plan.stream(t("Set {} to {} km/h",this,v));
this.speed = v; this.speed = v;
} }
public void setWaitTime(Range waitTime) { public void setWaitTime(Range waitTime) {
if (isNull(autopilot)) return; if (isNull(autopilot)) return;
autopilot.waitTime = waitTime.random(); 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> {
String error = null; String error = null;
if (!route.setTurnouts()) error = t("Was not able to set all turnouts!"); 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.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 (isNull(error) && !route.train(this)) error = t("Was not able to assign {} to {}!",this,route);
if (isSet(error)) { if (isSet(error)) {
route.reset(); route.reset();
route = null; route = null;
return error; return error;
} }
setSpeed(128);
return t("Started {}",this); return t("Started {}",this);
} }

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

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

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

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

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

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

Loading…
Cancel
Save