|
|
@ -17,6 +17,7 @@ import de.srsoftware.web4rail.Params; |
|
|
|
import de.srsoftware.web4rail.Plan; |
|
|
|
import de.srsoftware.web4rail.Plan; |
|
|
|
import de.srsoftware.web4rail.devices.Decoder; |
|
|
|
import de.srsoftware.web4rail.devices.Decoder; |
|
|
|
import de.srsoftware.web4rail.tags.Button; |
|
|
|
import de.srsoftware.web4rail.tags.Button; |
|
|
|
|
|
|
|
import de.srsoftware.web4rail.tags.Checkbox; |
|
|
|
import de.srsoftware.web4rail.tags.Fieldset; |
|
|
|
import de.srsoftware.web4rail.tags.Fieldset; |
|
|
|
import de.srsoftware.web4rail.tags.Form; |
|
|
|
import de.srsoftware.web4rail.tags.Form; |
|
|
|
import de.srsoftware.web4rail.tags.Input; |
|
|
|
import de.srsoftware.web4rail.tags.Input; |
|
|
@ -29,6 +30,14 @@ import de.srsoftware.web4rail.tiles.Block; |
|
|
|
public class Locomotive extends Car implements Constants{ |
|
|
|
public class Locomotive extends Car implements Constants{ |
|
|
|
|
|
|
|
|
|
|
|
public static final String LOCOMOTIVE = "locomotive"; |
|
|
|
public static final String LOCOMOTIVE = "locomotive"; |
|
|
|
|
|
|
|
private static final String HEADLIGHT = "headlight"; |
|
|
|
|
|
|
|
private static final String TAILLIGHT = "taillight"; |
|
|
|
|
|
|
|
private static final String DIRECTIONAL = "directional"; |
|
|
|
|
|
|
|
private static final String INTERIOR_LIGHT = "interior"; |
|
|
|
|
|
|
|
private static final String COUPLER = "coupler"; |
|
|
|
|
|
|
|
private static final String FORWARD = "forward"; |
|
|
|
|
|
|
|
private static final String REVERSE = "reverse"; |
|
|
|
|
|
|
|
private static final String ACTION_MAPPING = "mapping"; |
|
|
|
private int speed = 0; |
|
|
|
private int speed = 0; |
|
|
|
private boolean f1,f2,f3,f4; |
|
|
|
private boolean f1,f2,f3,f4; |
|
|
|
//private TreeMap<Integer,Integer> cvs = new TreeMap<Integer, Integer>();
|
|
|
|
//private TreeMap<Integer,Integer> cvs = new TreeMap<Integer, Integer>();
|
|
|
@ -51,6 +60,8 @@ public class Locomotive extends Car implements Constants{ |
|
|
|
return Locomotive.manager(); |
|
|
|
return Locomotive.manager(); |
|
|
|
case ACTION_FASTER10: |
|
|
|
case ACTION_FASTER10: |
|
|
|
return loco.faster(Train.defaultSpeedStep); |
|
|
|
return loco.faster(Train.defaultSpeedStep); |
|
|
|
|
|
|
|
case ACTION_MAPPING: |
|
|
|
|
|
|
|
return loco.updateMapping(params); |
|
|
|
case ACTION_MOVE: |
|
|
|
case ACTION_MOVE: |
|
|
|
return loco.moveUp(); |
|
|
|
return loco.moveUp(); |
|
|
|
case ACTION_PROPS: |
|
|
|
case ACTION_PROPS: |
|
|
@ -79,6 +90,25 @@ public class Locomotive extends Car implements Constants{ |
|
|
|
return t("Unknown action: {}",params.getString(ACTION)); |
|
|
|
return t("Unknown action: {}",params.getString(ACTION)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void addDecoderButtons(Window props) { |
|
|
|
|
|
|
|
Tag basicProps = props.children().stream().filter(tag -> BaseClass.PROPS_BASIC.equals(tag.get("id"))).findFirst().get(); |
|
|
|
|
|
|
|
Tag form = basicProps.children().stream().filter(tag -> tag.is("form")).findFirst().get(); |
|
|
|
|
|
|
|
Table table = (Table) form.children().stream().filter(tag -> tag.is("table")).findFirst().get(); |
|
|
|
|
|
|
|
Tag div = new Tag("div"); |
|
|
|
|
|
|
|
if (isSet(decoder)) { |
|
|
|
|
|
|
|
decoder.button().addTo(div); |
|
|
|
|
|
|
|
decoder.button(t("dismount"), Map.of(ACTION,ACTION_DECOUPLE)).addTo(div); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
Decoder.selector(true).addTo(div); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
table.addRow(t("Decoder"),div); |
|
|
|
|
|
|
|
Vector<Tag> cols = table.children(); |
|
|
|
|
|
|
|
Tag lastRow = cols.lastElement(); |
|
|
|
|
|
|
|
cols.remove(cols.size()-1); |
|
|
|
|
|
|
|
cols.insertElementAt(lastRow, 5); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static Fieldset cockpit(BaseClass locoOrTrain) { |
|
|
|
public static Fieldset cockpit(BaseClass locoOrTrain) { |
|
|
|
int speed = 0; |
|
|
|
int speed = 0; |
|
|
|
String realm = null; |
|
|
|
String realm = null; |
|
|
@ -197,6 +227,40 @@ public class Locomotive extends Car implements Constants{ |
|
|
|
public Tag faster(int steps) { |
|
|
|
public Tag faster(int steps) { |
|
|
|
return setSpeed(speed + steps); |
|
|
|
return setSpeed(speed + steps); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Fieldset functionMapping() { |
|
|
|
|
|
|
|
Fieldset fieldset = new Fieldset(t("Function mapping")).id("props-functions"); |
|
|
|
|
|
|
|
Form form = new Form("function-mapping"); |
|
|
|
|
|
|
|
new Input(REALM, REALM_LOCO).hideIn(form); |
|
|
|
|
|
|
|
new Input(ACTION, ACTION_MAPPING).hideIn(form); |
|
|
|
|
|
|
|
new Input(ID,id()).hideIn(form); |
|
|
|
|
|
|
|
for (int i=0; i<decoder.numFunctions(); i++) functionMapping(i).addTo(form); |
|
|
|
|
|
|
|
return new Button(t("Save"), form).addTo(form).addTo(fieldset); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Tag functionMapping(int index) { |
|
|
|
|
|
|
|
Fieldset mapping = new Fieldset(t("Function {}",index)); |
|
|
|
|
|
|
|
Tag type = new Tag("div"); |
|
|
|
|
|
|
|
new Checkbox(functionName(index,HEADLIGHT), t("Headlight"), false, true).addTo(type); |
|
|
|
|
|
|
|
new Checkbox(functionName(index,TAILLIGHT), t("Tail light"), false, true).addTo(type); |
|
|
|
|
|
|
|
new Checkbox(functionName(index,INTERIOR_LIGHT),t("Interior light"),false, true).addTo(type); |
|
|
|
|
|
|
|
new Checkbox(functionName(index,COUPLER),t("Coupler"),false, true).addTo(type); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Tag dir = new Tag("div"); |
|
|
|
|
|
|
|
new Checkbox(functionName(index,DIRECTIONAL), t("directional"), false, true).addTo(dir); |
|
|
|
|
|
|
|
new Checkbox(functionName(index,FORWARD), t("forward"), false, true).addTo(dir); |
|
|
|
|
|
|
|
new Checkbox(functionName(index,REVERSE), t("reverse"), false, true).addTo(dir); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Table table = new Table(); |
|
|
|
|
|
|
|
table.addHead(t("Type"),t("Direction")); |
|
|
|
|
|
|
|
table.addRow(type,dir); |
|
|
|
|
|
|
|
return table.addTo(mapping); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static String functionName(int index,String key) { |
|
|
|
|
|
|
|
return "function["+index+"]["+key+"]"; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public JSONObject json() { |
|
|
|
public JSONObject json() { |
|
|
@ -271,22 +335,9 @@ public class Locomotive extends Car implements Constants{ |
|
|
|
@Override |
|
|
|
@Override |
|
|
|
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) { |
|
|
|
protected Window properties(List<Fieldset> preForm, FormInput formInputs, List<Fieldset> postForm,String...errors) { |
|
|
|
preForm.add(cockpit(this)); |
|
|
|
preForm.add(cockpit(this)); |
|
|
|
|
|
|
|
if (isSet(decoder) && decoder.numFunctions()>0) postForm.add(functionMapping()); |
|
|
|
Window props = super.properties(preForm, formInputs, postForm,errors); |
|
|
|
Window props = super.properties(preForm, formInputs, postForm,errors); |
|
|
|
Tag basicProps = props.children().stream().filter(tag -> BaseClass.PROPS_BASIC.equals(tag.get("id"))).findFirst().get(); |
|
|
|
addDecoderButtons(props); |
|
|
|
Tag form = basicProps.children().stream().filter(tag -> tag.is("form")).findFirst().get(); |
|
|
|
|
|
|
|
Table table = (Table) form.children().stream().filter(tag -> tag.is("table")).findFirst().get(); |
|
|
|
|
|
|
|
Tag div = new Tag("div"); |
|
|
|
|
|
|
|
if (isSet(decoder)) { |
|
|
|
|
|
|
|
decoder.button().addTo(div); |
|
|
|
|
|
|
|
decoder.button(t("dismount"), Map.of(ACTION,ACTION_DECOUPLE)).addTo(div); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
Decoder.selector(true).addTo(div); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
table.addRow(t("Decoder"),div); |
|
|
|
|
|
|
|
Vector<Tag> cols = table.children(); |
|
|
|
|
|
|
|
Tag lastRow = cols.lastElement(); |
|
|
|
|
|
|
|
cols.remove(cols.size()-1); |
|
|
|
|
|
|
|
cols.insertElementAt(lastRow, 5); |
|
|
|
|
|
|
|
return props; |
|
|
|
return props; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -302,7 +353,7 @@ public class Locomotive extends Car implements Constants{ |
|
|
|
if (isNull(decoder)) return; |
|
|
|
if (isNull(decoder)) return; |
|
|
|
int step = decoder.protocol().steps * speed / (maxSpeedForward == 0 ? 100 : maxSpeedForward); |
|
|
|
int step = decoder.protocol().steps * speed / (maxSpeedForward == 0 ? 100 : maxSpeedForward); |
|
|
|
decoder.init(); |
|
|
|
decoder.init(); |
|
|
|
plan.queue(new Command("SET {} GL "+decoder.address()+" "+(orientation == FORWARD ? 0 : 1)+" "+step+" "+decoder.protocol().steps+" "+(f1?1:0)+" "+(f2?1:0)+" "+(f3?1:0)+" "+(f4?1:0)) { |
|
|
|
plan.queue(new Command("SET {} GL "+decoder.address()+" "+(orientation == Car.FORWARD ? 0 : 1)+" "+step+" "+decoder.protocol().steps+" "+(f1?1:0)+" "+(f2?1:0)+" "+(f3?1:0)+" "+(f4?1:0)) { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void onFailure(Reply reply) { |
|
|
|
public void onFailure(Reply reply) { |
|
|
@ -404,4 +455,9 @@ public class Locomotive extends Car implements Constants{ |
|
|
|
} |
|
|
|
} |
|
|
|
return properties(); |
|
|
|
return properties(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Object updateMapping(Params params) { |
|
|
|
|
|
|
|
// TODO Auto-generated method stub
|
|
|
|
|
|
|
|
return properties(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|