001package jmri.jmrix.can.adapters.gridconnect.net;
002
003import jmri.jmrix.can.CanSystemConnectionMemo;
004import jmri.jmrix.can.ConfigurationManager;
005import jmri.jmrix.can.TrafficController;
006import jmri.jmrix.can.adapters.gridconnect.GcTrafficController;
007import jmri.jmrix.can.adapters.gridconnect.canrs.MergTrafficController;
008
009/**
010 * Implements SerialPortAdapter for the OpenLCB system network connection.
011 * <p>
012 * This connects via a telnet connection. Normally controlled by the
013 * NetworkDriverFrame class.
014 *
015 * @author Bob Jacobsen Copyright (C) 2010
016 */
017public class NetworkDriverAdapter extends jmri.jmrix.AbstractNetworkPortController {
018
019    public NetworkDriverAdapter() {
020        super(new CanSystemConnectionMemo());
021        option1Name = "Gateway"; // NOI18N
022        options.put(option1Name, new Option(Bundle.getMessage("ConnectionGateway"), new String[]{"Pass All", "Filtering"}));
023        option2Name = "Protocol"; // NOI18N
024        options.put(option2Name, new Option(Bundle.getMessage("ConnectionProtocol"), jmri.jmrix.can.ConfigurationManager.getSystemOptions(), false));
025        super.setManufacturer(jmri.jmrix.openlcb.OlcbConnectionTypeList.OPENLCB); // overriden by MERG Connections.
026        allowConnectionRecovery = true;
027    }
028
029    /**
030     * Set up all of the other objects to operate with the CAN bus connected via
031     * this TCP/IP link.
032     */
033    @Override
034    public void configure() {
035        TrafficController tc;
036        switch (getOptionState(option2Name)) {
037            case ConfigurationManager.MERGCBUS:
038            case ConfigurationManager.SPROGCBUS:
039                // Register the CAN traffic controller being used for this connection
040                tc = new MergTrafficController();
041                tc.setCanId(getOptionState("CANID"));
042                break;
043            default:
044                tc = new GcTrafficController();
045                break;
046        }
047        this.getSystemConnectionMemo().setTrafficController(tc);
048
049        // Now connect to the traffic controller
050        log.debug("Connecting port");
051        tc.connectPort(this);
052        this.getSystemConnectionMemo().setProtocol(getOptionState(option2Name));
053
054        // do central protocol-specific configuration
055        this.getSystemConnectionMemo().configureManagers();
056        if (socketConn != null) {
057            log.info("{} Connection via {} complete with {}",
058                this.getSystemConnectionMemo().getUserName(),
059                getOptionState(option2Name), socketConn.getInetAddress());
060        }
061    }
062
063    @Override
064    public boolean status() {
065        return opened;
066    }
067
068    @Override
069    public CanSystemConnectionMemo getSystemConnectionMemo() {
070        return (CanSystemConnectionMemo) super.getSystemConnectionMemo();
071    }
072
073    /**
074     * {@inheritDoc}
075     */
076    @Override
077    protected void resetupConnection() {
078        log.info("reconnected to Network after lost connection");
079        if (opened) {
080            this.getSystemConnectionMemo().getTrafficController().connectPort(this);
081        }
082    }
083
084    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(NetworkDriverAdapter.class);
085
086}