package de.srsoftware.web4rail.tiles; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeoutException; import org.json.JSONObject; import de.srsoftware.tools.Tag; import de.srsoftware.web4rail.Command; import de.srsoftware.web4rail.Command.Reply; import de.srsoftware.web4rail.Device; import de.srsoftware.web4rail.Protocol; import de.srsoftware.web4rail.Window; import de.srsoftware.web4rail.tags.Fieldset; import de.srsoftware.web4rail.tags.Input; import de.srsoftware.web4rail.tags.Radio; /** * Base class for Turnouts * @author Stephan Richter, SRSoftware * */ public abstract class Turnout extends Tile implements Device{ private static final String PORT_A = "port_a"; private static final String PORT_B = "port_b"; public static final String STATE = "state"; protected static final String STRAIGHT = "straight"; protected int address = 0; protected int delay = 400; protected boolean error = false; protected boolean initialized = false; private Protocol protocol = Protocol.DCC128; protected int portA = 0, portB = 1; protected State state = State.STRAIGHT; public enum State{ LEFT,STRAIGHT,RIGHT,UNDEF; } public int address() { return address; } @Override public Object click() throws IOException { LOG.debug(getClass().getSimpleName()+".click()"); init(); return super.click(); } protected abstract String commandFor(State newState); public void error(Reply reply) { this.error = true; try { plan.stream(tag(null).toString()); } catch (IOException e) { LOG.error("Was not able to stream: ",e); } throw new RuntimeException(reply.message()); } protected Reply init() { if (address == 0) return new Reply(200,"OK"); if (!initialized) { Command command = new Command("INIT {} GA "+address+" "+proto()) { @Override public void onSuccess() { super.onSuccess(); initialized = true; } @Override public void onFailure(Reply r) { super.onSuccess(); initialized = false; } }; try { return plan.queue(command).reply(); } catch (TimeoutException e) { LOG.warn(e.getMessage()); } } return new Reply(200, "OK"); } @Override public JSONObject json() { JSONObject json = super.json(); if (portA != 0) json.put(PORT_A, portA); if (portB != 1) json.put(PORT_B, portB); if (address != 0) json.put(ADDRESS, address); json.put(PROTOCOL, protocol); json.put(STATE, state); return json; } @Override public Tile load(JSONObject json) { if (json.has(ADDRESS)) address = json.getInt(ADDRESS); if (json.has(PORT_A)) portA = json.getInt(PORT_A); if (json.has(PORT_B)) portB = json.getInt(PORT_B); if (json.has(PROTOCOL)) protocol = Protocol.valueOf(json.getString(PROTOCOL)); if (json.has(STATE)) state = State.valueOf(json.getString(STATE)); return super.load(json); } @Override protected Window properties(List