improved error messages
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -4,7 +4,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>de.srsoftware</groupId>
|
||||
<artifactId>web4rail</artifactId>
|
||||
<version>1.3.56</version>
|
||||
<version>1.3.57</version>
|
||||
<name>Web4Rail</name>
|
||||
<packaging>jar</packaging>
|
||||
<description>Java Model Railway Control</description>
|
||||
|
||||
@@ -256,7 +256,14 @@ fieldset{
|
||||
border-radius: 5px;
|
||||
}
|
||||
.error{
|
||||
background: red;
|
||||
background: orange;
|
||||
margin: 30px 10px 5px;
|
||||
padding: 0;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.error p{
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
h4,ul{
|
||||
|
||||
@@ -37,7 +37,7 @@ function arrangeTabs(){
|
||||
var tabs = $('<div/>',{'class':'tabs'});
|
||||
var winId = $('.window').attr('id')+"-";
|
||||
|
||||
tabs.insertAfter($('.swapbtn'));
|
||||
tabs.insertAfter($('.error'));
|
||||
var target = null;
|
||||
var index = null;
|
||||
$('.window > fieldset > legend').each(function(){
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
abort : abbrechen
|
||||
Aborting route allocation... : Routen-Reservierung wird abgebrochen...
|
||||
Accessory : Zubehör
|
||||
Action : Aktion
|
||||
Actions : Aktionen
|
||||
|
||||
@@ -423,13 +423,21 @@ public abstract class BaseClass implements Constants{
|
||||
return (T) this;
|
||||
}
|
||||
|
||||
public Window properties() {
|
||||
return properties(new ArrayList<>(), new FormInput(), new ArrayList<>());
|
||||
public Window properties(String...error) {
|
||||
return properties(new ArrayList<>(), new FormInput(), new ArrayList<>(),error);
|
||||
}
|
||||
|
||||
|
||||
protected Window properties(List<Fieldset> preForm,FormInput formInputs,List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm,FormInput formInputs,List<Fieldset> postForm, String...errorMessages) {
|
||||
Window win = new Window(getClass().getSimpleName()+"-properties", t("Properties of {}",this.title()));
|
||||
|
||||
Tag errorDiv = new Tag("div").clazz("error").content("");
|
||||
if (errorMessages != null && errorMessages.length > 0) {
|
||||
for (String errorMessage : errorMessages) {
|
||||
if (isSet(errorMessage)) new Tag("p").content(errorMessage).addTo(errorDiv);
|
||||
}
|
||||
}
|
||||
errorDiv.addTo(win);
|
||||
|
||||
preForm.forEach(fieldset -> fieldset.addTo(win));
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@ public class Route extends BaseClass {
|
||||
public Direction endDirection;
|
||||
private Vector<Tile> path;
|
||||
private Vector<Signal> signals;
|
||||
private Train train;
|
||||
//private Train train;
|
||||
private HashMap<String,ActionList> triggeredActions = new HashMap<String, ActionList>();
|
||||
private HashMap<Turnout,Turnout.State> turnouts;
|
||||
private Block startBlock = null;
|
||||
@@ -214,7 +214,7 @@ public class Route extends BaseClass {
|
||||
private Fieldset basicProperties() {
|
||||
Fieldset fieldset = new Fieldset(t("Route properties"));
|
||||
|
||||
if (isSet(train)) train.link("span",t("Train")+": "+train).addTo(fieldset);
|
||||
// if (isSet(train)) train.link("span",t("Train")+": "+train).addTo(fieldset);
|
||||
Tag list = new Tag("ul");
|
||||
startBlock.link("li",t("Origin: {} to {}",startBlock.name,startDirection)).addTo(list);
|
||||
endBlock.link("li",t("Destination: {} from {}",endBlock.name,endDirection.inverse())).addTo(list);
|
||||
@@ -319,15 +319,16 @@ public class Route extends BaseClass {
|
||||
* @param contact
|
||||
* @param trainHead
|
||||
*/
|
||||
public void contact(Contact contact) {
|
||||
public void contact(Context context) {
|
||||
Contact contact = context.contact();
|
||||
if (triggeredContacts.contains(contact)) return; // don't trigger contact a second time
|
||||
triggeredContacts.add(contact);
|
||||
LOG.debug("{} on {} activated {}.",train,this,contact);
|
||||
LOG.debug("{} on {} activated {}.",context.train(),this,contact);
|
||||
ActionList actions = triggeredActions.get(contact.trigger());
|
||||
LOG.debug("Contact has id {} / trigger {} and is assigned with {}",contact.id(),contact.trigger(),isNull(actions)?t("nothing"):actions);
|
||||
if (isNull(actions)) return;
|
||||
Context context = new Context(this).train(train).contact(contact);
|
||||
actions.fire(context,"Route.Contact("+contact.addr()+")");
|
||||
//Context context = new Context(this).train(train).contact(contact);
|
||||
actions.fire(context.route(this),"Route.Contact("+contact.addr()+")");
|
||||
}
|
||||
|
||||
public Vector<Contact> contacts() {
|
||||
@@ -375,7 +376,7 @@ public class Route extends BaseClass {
|
||||
return endBlock;
|
||||
}
|
||||
|
||||
public void finish() {
|
||||
public void finish(Train train) {
|
||||
LOG.debug("{}.finish()",this);
|
||||
train.endRoute();
|
||||
free();
|
||||
@@ -386,6 +387,7 @@ public class Route extends BaseClass {
|
||||
|
||||
private void free() {
|
||||
for (Tile tile : path) {
|
||||
Train train = tile.train();
|
||||
if (isSet(train) && train.onTrace(tile)) {
|
||||
tile.setState(Status.OCCUPIED, train);
|
||||
} else tile.free();
|
||||
@@ -687,7 +689,7 @@ public class Route extends BaseClass {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
|
||||
preForm.add(conditions.list(t("Route will only be available, if all conditions are fulfilled.")));
|
||||
preForm.add(contactsAndActions());
|
||||
@@ -703,7 +705,7 @@ public class Route extends BaseClass {
|
||||
postForm.add(basicProperties());
|
||||
if (!turnouts.isEmpty()) postForm.add(turnouts());
|
||||
postForm.add(brakeTimes());
|
||||
Window win = super.properties(preForm, formInputs, postForm);
|
||||
Window win = super.properties(preForm, formInputs, postForm,errors);
|
||||
previewScript().addTo(win);
|
||||
return win;
|
||||
}
|
||||
@@ -715,7 +717,7 @@ public class Route extends BaseClass {
|
||||
@Override
|
||||
public BaseClass remove() {
|
||||
LOG.debug("Removing route ({}) {}",id(),this);
|
||||
if (isSet(train)) train.removeChild(this);
|
||||
// if (isSet(train)) train.removeChild(this);
|
||||
for (Tile tile : path) {
|
||||
tile.removeChild(this);
|
||||
}
|
||||
@@ -734,7 +736,7 @@ public class Route extends BaseClass {
|
||||
if (child == endBlock) endBlock = null;
|
||||
path.remove(child);
|
||||
signals.remove(child);
|
||||
if (child == train) train = null;
|
||||
// if (child == train) train = null;
|
||||
for (ActionList list : triggeredActions.values()) {
|
||||
list.removeChild(child);
|
||||
}
|
||||
@@ -746,8 +748,9 @@ public class Route extends BaseClass {
|
||||
|
||||
public boolean reset() {
|
||||
LOG.debug("{}.reset()",this);
|
||||
setSignals(Signal.RED);
|
||||
free();
|
||||
train = null;
|
||||
// train = null;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -794,15 +797,15 @@ public class Route extends BaseClass {
|
||||
// if (state == State.STARTED) return true;
|
||||
LOG.debug("{}.start()",this);
|
||||
if (isNull(newTrain)) return false; // can't set route's train to null
|
||||
if (isSet(train)) {
|
||||
/* if (isSet(train)) {
|
||||
if (newTrain != train) return false; // can't alter route's train
|
||||
} else train = newTrain.setRoute(this); // set new train
|
||||
} else train = */newTrain.setRoute(this); // set new train
|
||||
|
||||
ActionList startActions = triggeredActions.get(ROUTE_START);
|
||||
|
||||
if (isSet(startActions)) {
|
||||
Context context = new Context(train).route(this);
|
||||
if (!startActions.fire(context,this+".start("+train.name()+")")) return false; // start actions failed
|
||||
Context context = new Context(newTrain).route(this);
|
||||
if (!startActions.fire(context,this+".start("+newTrain.name()+")")) return false; // start actions failed
|
||||
}
|
||||
// state = State.STARTED;
|
||||
triggeredContacts.clear();
|
||||
@@ -822,12 +825,12 @@ public class Route extends BaseClass {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getClass().getSimpleName()+"("+(isSet(train)?train+":":"")+name()+")";
|
||||
return getClass().getSimpleName()+"("+name()+")";
|
||||
}
|
||||
|
||||
public Train train() {
|
||||
/* public Train train() {
|
||||
return train;
|
||||
}
|
||||
}*/
|
||||
|
||||
private Fieldset turnouts() {
|
||||
Fieldset win = new Fieldset(t("Turnouts"));
|
||||
|
||||
@@ -138,10 +138,10 @@ public abstract class Action extends BaseClass {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Edit json"),button(t("export"), Map.of(ACTION, ACTION_SAVE)));
|
||||
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
public static Tag selector() {
|
||||
|
||||
@@ -252,11 +252,11 @@ public class ActionList extends Action implements Iterable<Action>{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
Fieldset fieldset = new Fieldset(t("Actions"));
|
||||
list().addTo(fieldset);
|
||||
postForm.add(fieldset);
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -86,14 +86,14 @@ public class AddRemoveDestination extends Action {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
Tag span = new Tag("span");
|
||||
button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,Train.DESTINATION)).addTo(span);
|
||||
button(t("Clear destinations"),Map.of(ACTION,ACTION_UPDATE,Train.DESTINATION,"0")).addTo(span);
|
||||
formInputs.add(t("Destination")+": "+(isNull(destination) ? t("Clear destinations") : destination),span);
|
||||
formInputs.add(t("Turn at destination"),new Checkbox(TURN, t("Turn"), turnAtDestination));
|
||||
formInputs.add(t("Shunting"),new Checkbox(SHUNTING, t("Shunting"), shunting));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -51,13 +51,13 @@ public class AddRemoveTag extends Action{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Tag"),new Input(TAG, tag));
|
||||
Tag div = new Tag("div");
|
||||
new Radio(TYPE, ACTION_ADD, t("add"), !remove).addTo(div);
|
||||
new Radio(TYPE, ACTION_DROP, t("delete"), remove).addTo(div);
|
||||
formInputs.add(t("Action"),div);
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -77,14 +77,14 @@ public class AlterDirection extends Action{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
Tag radios = new Tag("div");
|
||||
for (NEWDIR d : NEWDIR.values()) {
|
||||
new Radio(NEW_DIRECTION, d, t("{}",d), newDir == d).addTo(radios);
|
||||
}
|
||||
|
||||
formInputs.add(t("new direction"),radios);
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@SuppressWarnings("incomplete-switch")
|
||||
|
||||
@@ -70,9 +70,9 @@ public class ConditionalAction extends ActionList {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
preForm.add(conditions.list());
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -56,10 +56,10 @@ public class CoupleTrain extends Action {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Couple"),new Checkbox(LAST, t("last parked train"), last));
|
||||
formInputs.add(t("Swap order"),new Checkbox(SWAP, t("Swap order of trains"), swap));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -61,10 +61,10 @@ public class DelayedAction extends ActionList {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Minimum delay"),new Input(MIN_DELAY,min_delay).numeric().addTo(new Tag("span")).content(NBSP+"ms"));
|
||||
formInputs.add(t("Maximum delay"),new Input(MAX_DELAY,max_delay).numeric().addTo(new Tag("span")).content(NBSP+"ms"));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
public DelayedAction setMaxDelay(int max_delay) {
|
||||
|
||||
@@ -55,9 +55,9 @@ public class DetermineTrainInBlock extends Action {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Block")+": "+(isNull(block) ? t("unset") : block),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,BLOCK)));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -64,13 +64,13 @@ public class DisableEnableBlock extends Action {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Block")+": "+(isNull(block) ? t("block from context") : block),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,Block.class.getSimpleName())));
|
||||
Tag radios = new Tag("p");
|
||||
new Radio(STATE, "enable", t("enable"), !disable).addTo(radios);
|
||||
new Radio(STATE, "disable", t("disable"), disable).addTo(radios);
|
||||
formInputs.add(t("Action"),radios);
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -57,10 +57,10 @@ public class EngageDecoupler extends Action {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
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);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -2,6 +2,7 @@ package de.srsoftware.web4rail.actions;
|
||||
|
||||
import de.srsoftware.web4rail.BaseClass;
|
||||
import de.srsoftware.web4rail.Route;
|
||||
import de.srsoftware.web4rail.moving.Train;
|
||||
|
||||
public class FinishRoute extends Action {
|
||||
|
||||
@@ -12,7 +13,9 @@ public class FinishRoute extends Action {
|
||||
@Override
|
||||
public boolean fire(Context context,Object cause) {
|
||||
Route route = context.route();
|
||||
if (isSet(route)) route.finish();
|
||||
Train train = context.train();
|
||||
if (isNull(train)) return false;
|
||||
if (isSet(route)) route.finish(train);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,9 +73,9 @@ public class Loop extends ActionList {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Select object"),typeSelector());
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
|
||||
@@ -71,13 +71,13 @@ public class SendCommand extends Action{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Command to send"),new Input(COMMAND, command));
|
||||
Tag div = new Tag("div");
|
||||
new Radio(TARGET, Target.SYSTEM, t("Operating System"), target == Target.SYSTEM).addTo(div);
|
||||
new Radio(TARGET, Target.SRCP, t("SRCP daemon"), target == Target.SRCP).addTo(div);
|
||||
formInputs.add(t("Send command to"),div);
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -52,9 +52,9 @@ public class SetContextTrain extends Action {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Select train"),Train.selector(train, null));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -62,9 +62,9 @@ public class SetDisplayText extends TextAction{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Display")+": "+(isNull(display) ? t("unset") : display),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,DISPLAY)));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -58,14 +58,14 @@ public class SetPower extends Action{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
Tag div = new Tag("div");
|
||||
new Radio(STATE, POWERCHANGE.ON, t("On"), pc == POWERCHANGE.ON).addTo(div);
|
||||
new Radio(STATE, POWERCHANGE.OFF, t("Off"), pc == POWERCHANGE.OFF).addTo(div);
|
||||
new Radio(STATE, POWERCHANGE.TOGGLE, t("Toggle"), pc == POWERCHANGE.TOGGLE).addTo(div);
|
||||
formInputs.add(t("Set state to"),div);
|
||||
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -79,7 +79,7 @@ public class SetRelayOrSwitch extends Action {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
Tag span = new Tag("span");
|
||||
if (isSet(relayOrSwitch)) span.content(relayOrSwitch+NBSP);
|
||||
button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,Relay.class.getSimpleName())).addTo(span);
|
||||
@@ -96,7 +96,7 @@ public class SetRelayOrSwitch extends Action {
|
||||
}
|
||||
formInputs.add(t("Select state"),state);
|
||||
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -59,7 +59,7 @@ public class SetSignal extends Action {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Signal")+": "+(isNull(signal) ? t("unset") : signal),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,SIGNAL)));
|
||||
Select state = new Select(Signal.STATE);
|
||||
for (String st:Signal.knownStates) {
|
||||
@@ -68,7 +68,7 @@ public class SetSignal extends Action {
|
||||
}
|
||||
formInputs.add(t("Select state"),state);
|
||||
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -47,9 +47,9 @@ public class SetSpeed extends Action{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Set speed to"),new Input(MAX_SPEED, speed).numeric().addTo(new Tag("span")).content(NBSP+speedUnit));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
public int getSpeed() {
|
||||
|
||||
@@ -66,7 +66,7 @@ public class SetTurnout extends Action {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
|
||||
formInputs.add(t("Turnout")+": "+(isNull(turnout) ? t("unset") : turnout),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,TURNOUT)));
|
||||
if (isSet(turnout)) {
|
||||
@@ -79,7 +79,7 @@ public class SetTurnout extends Action {
|
||||
formInputs.add(t("Select state"),select);
|
||||
}
|
||||
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -47,9 +47,9 @@ public class SplitTrain extends Action {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Split behind"),new Input(POSITION, position).numeric().addTo(new Tag("span")).content(t(" cars")));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -41,13 +41,13 @@ public class StartStopAuto extends Action {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
Tag radios = new Tag("div");
|
||||
new Radio(INVERTED, "on", t("Start autopilot"), inverted).addTo(radios);
|
||||
new Radio(INVERTED, "off", t("Stop autopilot"), !inverted).addTo(radios);
|
||||
formInputs.add(t("Action"), radios);
|
||||
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -61,7 +61,7 @@ public class SwitchFunction extends Action {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
|
||||
Select selector = new Select(FUNCTION);
|
||||
for (int i=1; i<5;i++) {
|
||||
@@ -76,7 +76,7 @@ public class SwitchFunction extends Action {
|
||||
new Radio(EFFECT, OFF, t("Off"), effect == OFF).addTo(radioGroup);
|
||||
formInputs.add(t("Effect"),radioGroup);
|
||||
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -46,9 +46,9 @@ public abstract class TextAction extends Action {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Text"),new Input(TEXT, text));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -41,9 +41,9 @@ public class TriggerContact extends Action {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Select contact")+": "+(isNull(contact) ? t("unset") : contact),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,CONTACT)));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -99,7 +99,7 @@ public class WaitForContact extends ActionList {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Contact")+": "+(isNull(contact) ? t("unset") : contact),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,CONTACT)));
|
||||
formInputs.add(t("Timeout"),new Input(TIMEOUT,timeout).numeric().addTo(new Tag("span")).content(NBSP+"ms"));
|
||||
|
||||
@@ -108,7 +108,7 @@ public class WaitForContact extends ActionList {
|
||||
timeoutActions.list().addTo(fieldset);
|
||||
postForm.add(fieldset);
|
||||
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -51,9 +51,9 @@ public class BlockFree extends Condition {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Block")+": "+(isNull(block) ? t("unset") : block),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,BLOCK)));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -38,10 +38,10 @@ public class CarInTrain extends Condition {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Select car"),Car.selector(car, null));
|
||||
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -59,7 +59,7 @@ public class CarOrientation extends Condition {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Select car"),Car.selector(isSet(car) ? car : t("Car of train"), null));
|
||||
formInputs.add(t("If car of train: inspect car number"),new Input(POSITION, position).numeric().addTo(new Tag("span")).content(NBSP+"("+t("Use negative number to count from end.")+")"));
|
||||
|
||||
@@ -67,7 +67,7 @@ public class CarOrientation extends Condition {
|
||||
new Radio(ORIENTATION, "f", t("forward"), orientation).addTo(radioGroup);
|
||||
new Radio(ORIENTATION, "r", t("revers"), !orientation).addTo(radioGroup);
|
||||
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -142,9 +142,9 @@ public abstract class Condition extends BaseClass {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
inversionOption(formInputs);
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
public static Select selector() {
|
||||
|
||||
@@ -114,10 +114,10 @@ public class ConditionList extends Condition implements Iterable<Condition>{
|
||||
}
|
||||
|
||||
@Override
|
||||
public Window properties() {
|
||||
public Window properties(String...errors) {
|
||||
BaseClass parent = parent();
|
||||
if (isSet(parent)) return parent.properties();
|
||||
return super.properties();
|
||||
if (isSet(parent)) return parent.properties(errors);
|
||||
return super.properties(errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -57,9 +57,9 @@ public class RouteEndBlock extends Condition{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Block")+": "+(isNull(block) ? t("unset") : block),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,BLOCK)));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -61,10 +61,10 @@ public class SwitchIsOn extends Condition {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Select switch")+": "+(isNull(swtch) ? t("unset") : swtch),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,SWITCH)));
|
||||
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -46,9 +46,9 @@ public class TrainHasTag extends Condition {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Tag"),new Input(TAG, tag == null ? "" : tag));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -34,9 +34,9 @@ public class TrainLength extends Condition {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Maximum train length"),new Input(LENGTH, treshold).numeric().addTo(new Tag("span")).content(lengthUnit));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -34,9 +34,9 @@ public class TrainSelect extends Condition {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Select train")+":",Train.selector(train, null));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -33,9 +33,9 @@ public class TrainSpeed extends Condition {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Train speed"),new Input(SPEED, treshold).numeric().addTo(new Tag("span")).content(speedUnit));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -48,10 +48,10 @@ public class TrainWasInBlock extends Condition {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Block")+": "+(isNull(block) ? t("block from context") : block),button(t("Select from plan"),Map.of(ACTION,ACTION_UPDATE,ASSIGN,BLOCK)));
|
||||
formInputs.add(t("Seek in last"), new Input(COUNT, count).numeric().addTo(new Tag("span")).content(NBSP+t("blocks of train")));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -243,7 +243,7 @@ public class Car extends BaseClass implements Comparable<Car>{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Name"),new Input(NAME,name));
|
||||
formInputs.add(t("Stock ID"),new Input(STOCK_ID,stockId));
|
||||
formInputs.add(t("Length"),new Input(LENGTH,length).attr("type", "number").addTo(new Tag("span")).content(NBSP+lengthUnit));
|
||||
@@ -255,7 +255,7 @@ public class Car extends BaseClass implements Comparable<Car>{
|
||||
if (train != null) formInputs.add(t("Train"), train.link());
|
||||
formInputs.add(t("Current orientation"),new Tag("span").content(orientation ? t("forward") : t("reverse")));
|
||||
|
||||
return super.properties(preForm,formInputs,postForm);
|
||||
return super.properties(preForm,formInputs,postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -142,7 +142,7 @@ public class Locomotive extends Car implements Constants,Device{
|
||||
par.addTo(fieldset);
|
||||
|
||||
Tag direction = new Tag("p");
|
||||
if ((isSet(train) && (train.speed > 0 || isSet(train.route()))) || (isSet(loco) && loco.speed > 0)) {
|
||||
if ((isSet(train) && train.isStoppable()) || (isSet(loco) && loco.speed > 0)) {
|
||||
params.put(ACTION, ACTION_STOP);
|
||||
new Button(t("Stop"),params).clazz(ACTION_STOP).addTo(direction);
|
||||
}
|
||||
@@ -338,7 +338,7 @@ public class Locomotive extends Car implements Constants,Device{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
preForm.add(cockpit(this));
|
||||
Tag div = new Tag("div");
|
||||
for (Protocol proto : Protocol.values()) {
|
||||
@@ -347,7 +347,7 @@ public class Locomotive extends Car implements Constants,Device{
|
||||
formInputs.add(t("Protocol"),div);
|
||||
formInputs.add(t("Address"),new Input(ADDRESS, address).numeric());
|
||||
postForm.add(programming());
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
private void queue() {
|
||||
|
||||
@@ -48,15 +48,6 @@ import de.srsoftware.web4rail.tiles.Tile.Status;
|
||||
* @author Stephan Richter, SRSoftware 2020-2021 *
|
||||
*/
|
||||
public class Train extends BaseClass implements Comparable<Train> {
|
||||
|
||||
public interface Listener {
|
||||
enum Signal {
|
||||
STOP
|
||||
}
|
||||
|
||||
public void on(Signal signal);
|
||||
}
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(Train.class);
|
||||
|
||||
private static final String CAR_ID = "carId";
|
||||
@@ -101,10 +92,10 @@ public class Train extends BaseClass implements Comparable<Train> {
|
||||
private static final String SHUNTING = "shunting";
|
||||
private boolean shunting = false;
|
||||
|
||||
private HashSet<Listener> listeners = new HashSet<Train.Listener>();
|
||||
|
||||
private BrakeProcessor brakeProcessor;
|
||||
|
||||
private PathFinder pathFinder;
|
||||
|
||||
public static Object action(HashMap<String, String> params, Plan plan) throws IOException {
|
||||
String action = params.get(ACTION);
|
||||
if (isNull(action)) return t("No action passed to Train.action!");
|
||||
@@ -150,8 +141,8 @@ public class Train extends BaseClass implements Comparable<Train> {
|
||||
case ACTION_SLOWER10:
|
||||
return train.slower(10);
|
||||
case ACTION_START:
|
||||
train.start();
|
||||
return train.properties();
|
||||
String error = train.start();
|
||||
return train.properties(error);
|
||||
case ACTION_STOP:
|
||||
return train.stopNow();
|
||||
case ACTION_TIMES:
|
||||
@@ -186,10 +177,6 @@ public class Train extends BaseClass implements Comparable<Train> {
|
||||
return properties();
|
||||
}
|
||||
|
||||
public void addListener(Listener listener) {
|
||||
listeners.add(listener);
|
||||
}
|
||||
|
||||
public boolean automatic() {
|
||||
return false;
|
||||
}
|
||||
@@ -323,7 +310,7 @@ public class Train extends BaseClass implements Comparable<Train> {
|
||||
public void contact(Contact contact) {
|
||||
if (isSet(route)) {
|
||||
Route lastRoute = route; // route field might be set to null during route.contact(...)!
|
||||
route.contact(contact);
|
||||
route.contact(new Context(contact).train(this));
|
||||
traceFrom(contact,lastRoute);
|
||||
}
|
||||
}
|
||||
@@ -625,7 +612,7 @@ public class Train extends BaseClass implements Comparable<Train> {
|
||||
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
Tag propList = new Tag("ul").clazz("proplist");
|
||||
|
||||
if (isSet(currentBlock)) currentBlock.button(currentBlock.toString()).addTo(new Tag("li").content(t("Current location")+COL)).addTo(propList);
|
||||
@@ -675,7 +662,7 @@ public class Train extends BaseClass implements Comparable<Train> {
|
||||
postForm.add(blockHistory());
|
||||
|
||||
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
public Object quitAutopilot() {
|
||||
@@ -878,34 +865,37 @@ public class Train extends BaseClass implements Comparable<Train> {
|
||||
}
|
||||
|
||||
|
||||
public void start() {
|
||||
new PathFinder(this,currentBlock,direction) {
|
||||
public String start() {
|
||||
if (isSet(pathFinder)) return t("Pathfinder already active for {}!",this);
|
||||
pathFinder = new PathFinder(this,currentBlock,direction) {
|
||||
|
||||
@Override
|
||||
public void aborted() {
|
||||
LOG.debug("Aborted");
|
||||
plan.stream(t("Aborting route allocation..."));
|
||||
LOG.debug("{} aborted",this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void found(Route newRoute) {
|
||||
// TODO Auto-generated method stub
|
||||
LOG.debug("Found route {} for {}",newRoute,Train.this);
|
||||
LOG.debug("Found route {} for {}",newRoute,Train.this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void locked(Route newRoute) {
|
||||
// TODO Auto-generated method stub
|
||||
LOG.debug("Locked route {} for {}",newRoute,Train.this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void prepared(Route newRoute) {
|
||||
LOG.debug("Prepared route {} for {}",newRoute,Train.this);
|
||||
newRoute.start(Train.this);
|
||||
route = newRoute;
|
||||
pathFinder = null;
|
||||
route.start(Train.this);
|
||||
}
|
||||
|
||||
|
||||
}.start();
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void startAll() {
|
||||
@@ -930,9 +920,12 @@ public class Train extends BaseClass implements Comparable<Train> {
|
||||
brakeProcessor = new BrakeProcessor(this).start();
|
||||
}
|
||||
|
||||
public Object stopNow() {
|
||||
public Window stopNow() {
|
||||
setSpeed(0);
|
||||
listeners.forEach(listener -> listener.on(Listener.Signal.STOP)); // abort PathFinder
|
||||
if (isSet(pathFinder)) {
|
||||
pathFinder.abort();
|
||||
pathFinder = null;
|
||||
}
|
||||
if (isSet(route)) {
|
||||
route.reset();
|
||||
route = null;
|
||||
@@ -986,8 +979,7 @@ public class Train extends BaseClass implements Comparable<Train> {
|
||||
newTrace.add(tile);
|
||||
remainingLength -= tile.length();
|
||||
} else if (Route.freeBehindTrain) {
|
||||
|
||||
// TODO
|
||||
tile.free();
|
||||
} else break;
|
||||
}
|
||||
}
|
||||
@@ -1031,4 +1023,11 @@ public class Train extends BaseClass implements Comparable<Train> {
|
||||
public boolean usesAutopilot() {
|
||||
return false; // TODO
|
||||
}
|
||||
|
||||
public boolean isStoppable() {
|
||||
if (speed > 0) return true;
|
||||
if (isSet(pathFinder)) return true;
|
||||
if (isSet(route)) return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,10 +39,12 @@ public class BrakeProcessor extends BaseClass implements Runnable {
|
||||
int step = brakeTime;
|
||||
for (int i = 0; i < 15; i++) {
|
||||
long calculatedDistance = calculate(brakeTime, startSpeed);
|
||||
step /= 2;
|
||||
if (step < 1) step = 1;
|
||||
if (measuredDistance > calculatedDistance) brakeTime += step;
|
||||
if (measuredDistance < calculatedDistance) brakeTime -= step;
|
||||
if (measuredDistance > calculatedDistance) brakeTime += brakeTime/2;
|
||||
if (measuredDistance < calculatedDistance) {
|
||||
step /= 2;
|
||||
if (step < 1) step = 1;
|
||||
brakeTime -= step;
|
||||
}
|
||||
LOG.debug("new brake time: {}, calculated distance: {}", brakeTime, calculatedDistance);
|
||||
}
|
||||
route.brakeTime(train.brakeId(), brakeTime);
|
||||
|
||||
@@ -18,7 +18,7 @@ import de.srsoftware.web4rail.tiles.Block;
|
||||
/**
|
||||
* @author Stephan Richter, SRSoftware 2020-2021
|
||||
*/
|
||||
public abstract class PathFinder extends BaseClass implements Runnable, Train.Listener{
|
||||
public abstract class PathFinder extends BaseClass implements Runnable{
|
||||
public static final Logger LOG = LoggerFactory.getLogger(PathFinder.class);
|
||||
// private Context context;
|
||||
private boolean aborted = false;
|
||||
@@ -150,14 +150,21 @@ public abstract class PathFinder extends BaseClass implements Runnable, Train.Li
|
||||
public void run() {
|
||||
while (true) {
|
||||
if (aborted) return;
|
||||
Route route = chooseRoute();
|
||||
Route route = chooseRoute();
|
||||
if (isSet(route)) {
|
||||
found(route);
|
||||
if (aborted) return;
|
||||
found(route);
|
||||
if (route.allocateFor(train)) {
|
||||
if (aborted) {
|
||||
route.reset();
|
||||
return;
|
||||
}
|
||||
locked(route);
|
||||
if (aborted) return;
|
||||
if (route.prepareFor(train)) {
|
||||
if (aborted) {
|
||||
route.reset();
|
||||
return;
|
||||
}
|
||||
prepared(route);
|
||||
return;
|
||||
}
|
||||
@@ -172,19 +179,10 @@ public abstract class PathFinder extends BaseClass implements Runnable, Train.Li
|
||||
public abstract void found(Route r);
|
||||
public abstract void prepared(Route r);
|
||||
|
||||
@Override
|
||||
public void on(Signal signal) {
|
||||
switch (signal) {
|
||||
case STOP:
|
||||
abort();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void start() {
|
||||
train.addListener(this);
|
||||
public PathFinder start() {
|
||||
Thread thread = new Thread(this);
|
||||
thread.setName("Pathfinder("+train+")");
|
||||
thread.start();
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -325,14 +325,14 @@ public abstract class Block extends StretchableTile{
|
||||
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Name"),new Input(NAME, name));
|
||||
formInputs.add("",new Checkbox(ALLOW_TURN,t("Turn allowed"),turnAllowed));
|
||||
formInputs.add(t("Train"),Train.selector(train, null));
|
||||
postForm.add(contactForm());
|
||||
postForm.add(waitTimeForm());
|
||||
if (!parkedTrains.isEmpty()) postForm.add(parkedTrainList());
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
public Tile raise(String tag) {
|
||||
|
||||
@@ -75,12 +75,12 @@ public abstract class Bridge extends Tile {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
Fieldset fieldset = new Fieldset(t("Counterpart"));
|
||||
new Tag("p").content(isSet(counterpart) ? t("Connected to {}.",counterpart) : t("Not connected to other bridge part!")).addTo(fieldset);
|
||||
button(t("Select counterpart"),Map.of(ACTION,ACTION_CONNECT)).addTo(fieldset);
|
||||
preForm.add(fieldset);
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
public Window propMenu() {
|
||||
|
||||
@@ -190,7 +190,7 @@ public class Contact extends Tile{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
Tag span = new Tag("span");
|
||||
new Input(ADDRESS, addr).numeric().addTo(span).content(NBSP);
|
||||
button(t("learn"),Map.of(ACTION,ACTION_ANALYZE)).addTo(span);
|
||||
@@ -199,7 +199,7 @@ public class Contact extends Tile{
|
||||
Fieldset fieldset = new Fieldset(t("Actions")).id("props-actions");
|
||||
actions.list().addTo(fieldset);
|
||||
postForm.add(fieldset);
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -111,7 +111,7 @@ public abstract class Decoupler extends Tile implements Device{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
Tag div = new Tag("div");
|
||||
for (Protocol proto : Protocol.values()) {
|
||||
new Radio(PROTOCOL, proto.toString(), t(proto.toString()), proto == protocol).addTo(div);
|
||||
@@ -120,7 +120,7 @@ public abstract class Decoupler extends Tile implements Device{
|
||||
formInputs.add(t("Address"),new Input(ADDRESS, address).numeric());
|
||||
formInputs.add(t("Port"),new Input(PORT, port).numeric());
|
||||
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
private char proto() {
|
||||
|
||||
@@ -124,7 +124,7 @@ public class Relay extends Tile implements Device{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Name"),new Input(NAME,name));
|
||||
Tag div = new Tag("div");
|
||||
for (Protocol proto : Protocol.values()) {
|
||||
@@ -136,7 +136,7 @@ public class Relay extends Tile implements Device{
|
||||
formInputs.add(t("Label for state {}","B"),new Input(LABEL_B, stateLabelB));
|
||||
formInputs.add(t("Port for state {}",stateLabelA),new Input(PORT_A, portA).numeric());
|
||||
formInputs.add(t("Port for state {}",stateLabelB),new Input(PORT_B, portB).numeric());
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
private char proto() {
|
||||
|
||||
@@ -127,7 +127,7 @@ public abstract class Signal extends Tile {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
Fieldset aspectEditor = new Fieldset(t("Aspects")).id("props-aspects");
|
||||
Form form = new Form("aspect-form");
|
||||
new Input(REALM,REALM_PLAN).hideIn(form);
|
||||
@@ -158,7 +158,7 @@ public abstract class Signal extends Tile {
|
||||
form.addTo(aspectEditor);
|
||||
|
||||
postForm.add(aspectEditor);
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
public boolean state(String aspect) {
|
||||
|
||||
@@ -56,9 +56,9 @@ public abstract class StretchableTile extends TileWithShadow {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(stretchType(),new Input(STRETCH_LENGTH, stretch).numeric().addTo(new Tag("span")).content(NBSP+t("Tile(s)")));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -126,7 +126,7 @@ public class Switch extends Tile{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
Fieldset fieldset = new Fieldset(t("Actions (On)"));
|
||||
fieldset.id("actionsOn");
|
||||
actionsOn.list().addTo(fieldset);
|
||||
@@ -135,7 +135,7 @@ public class Switch extends Tile{
|
||||
fieldset.id("actionsOff");
|
||||
actionsOff.list().addTo(fieldset);
|
||||
postForm.add(fieldset);
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -33,9 +33,9 @@ public class TextDisplay extends StretchableTile {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Text"),new Input(TEXT, text));
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
public static Select selector(TextDisplay preselected,Collection<TextDisplay> exclude) {
|
||||
|
||||
@@ -260,7 +260,7 @@ public abstract class Tile extends BaseClass implements Comparable<Tile>{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
Fieldset fieldset = null;
|
||||
|
||||
if (isSet(train)) {
|
||||
@@ -332,7 +332,7 @@ public abstract class Tile extends BaseClass implements Comparable<Tile>{
|
||||
}
|
||||
}
|
||||
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
private static String replace(String line, Entry<String, Object> replacement) {
|
||||
|
||||
@@ -116,14 +116,14 @@ public abstract class Turnout extends Tile implements Device{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
Tag div = new Tag("div");
|
||||
for (Protocol proto : Protocol.values()) {
|
||||
new Radio(PROTOCOL, proto.toString(), t(proto.toString()), proto == protocol).addTo(div);
|
||||
}
|
||||
formInputs.add(t("Protocol"),div);
|
||||
formInputs.add(t("Address"),new Input(ADDRESS, address).numeric());
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
private char proto() {
|
||||
|
||||
@@ -36,10 +36,10 @@ public abstract class TurnoutL extends Turnout {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Straight port")+COL,new Input(STRAIGHT, portA).numeric());
|
||||
formInputs.add(t("Left port")+COL,new Input(LEFT, portB).numeric());
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -37,10 +37,10 @@ public abstract class TurnoutR extends Turnout {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm) {
|
||||
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) {
|
||||
formInputs.add(t("Straight port")+COL,new Input(STRAIGHT, portA).numeric());
|
||||
formInputs.add(t("Right port")+COL,new Input(RIGHT, portB).numeric());
|
||||
return super.properties(preForm, formInputs, postForm);
|
||||
return super.properties(preForm, formInputs, postForm,errors);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user