001package jmri.jmrix.zimo;
002
003import java.util.Comparator;
004import java.util.ResourceBundle;
005
006import jmri.*;
007import jmri.jmrix.ConfiguringSystemConnectionMemo;
008import jmri.jmrix.DefaultSystemConnectionMemo;
009import jmri.managers.DefaultProgrammerManager;
010import jmri.util.NamedBeanComparator;
011
012/**
013 * Lightweight class to denote that a system is active, and provide general
014 * information.
015 * <p>
016 * Objects of specific subtypes are registered in the instance manager to
017 * activate their particular system.
018 *
019 * @author Kevin Dickerson Copyright (C) 2012
020 * @author Bob Jacobsen Copyright (C) 2010
021 * @author Paul Bender Copyright (C) 2020
022 */
023public class Mx1SystemConnectionMemo extends DefaultSystemConnectionMemo implements ConfiguringSystemConnectionMemo {
024
025    public Mx1SystemConnectionMemo(Mx1TrafficController st) {
026        super("Z", "MX-1");
027        this.st = st;
028        InstanceManager.store(this, Mx1SystemConnectionMemo.class);
029        // create and register the ComponentFactory
030        InstanceManager.store(componentFactory = new jmri.jmrix.zimo.swing.Mx1ComponentFactory(this),
031                jmri.jmrix.swing.ComponentFactory.class);
032    }
033
034    jmri.jmrix.swing.ComponentFactory componentFactory = null;
035
036    public Mx1SystemConnectionMemo() {
037        super("Z", "MX-1");
038        InstanceManager.store(this, Mx1SystemConnectionMemo.class);
039        // create and register the ComponentFactory
040        InstanceManager.store(componentFactory = new jmri.jmrix.zimo.swing.Mx1ComponentFactory(this),
041                jmri.jmrix.swing.ComponentFactory.class);
042    }
043
044    public final static int MX1 = 0x00;
045    public final static int MXULF = 0x01;
046    public final static int MX10 = 0x02;
047    public final static int KLUG = 0x03;
048
049    int connectionType = 0x00;
050
051    public void setConnectionType(int connection) {
052        connectionType = connection;
053    }
054
055    public int getConnectionType() {
056        return connectionType;
057    }
058
059    /**
060     * Provide access to the TrafficController for this particular connection.
061     *
062     * @return the associated traffic controller
063     */
064    public Mx1TrafficController getMx1TrafficController() {
065        return st;
066    }
067
068    /**
069     * TrafficController setter
070     * 
071     * Updates the AdapterMemo of the TC to this (but doesn't overwrite)
072     * 
073     * @param st TrafficController to use
074     */
075    public void setMx1TrafficController(Mx1TrafficController st) {
076        this.st = st;
077
078        // Update AdapterMemo in TrafficController to this (don't overwrite existing)
079        if (st.adaptermemo == null) st.adaptermemo = this; 
080    }
081    private Mx1TrafficController st;
082
083    @Override
084    public void configureManagers() {
085
086        DefaultProgrammerManager programmerManager = getProgrammerManager();
087        store(programmerManager,DefaultProgrammerManager.class);
088        if (programmerManager.isAddressedModePossible()) {
089            store(programmerManager, AddressedProgrammerManager.class);
090            InstanceManager.store(programmerManager, AddressedProgrammerManager.class);
091        }
092        if (programmerManager.isGlobalProgrammerAvailable()) {
093            store(programmerManager,GlobalProgrammerManager.class);
094            InstanceManager.store(programmerManager, GlobalProgrammerManager.class);
095        }
096
097        PowerManager powerManager = new Mx1PowerManager(this);
098        store(powerManager, PowerManager.class);
099        jmri.InstanceManager.store(powerManager, PowerManager.class);
100
101        ThrottleManager throttleManager = new jmri.jmrix.zimo.Mx1ThrottleManager(this);
102        store(throttleManager,ThrottleManager.class);
103        InstanceManager.setThrottleManager(throttleManager);
104        if (getProtocol() == Mx1Packetizer.BINARY) {
105            TurnoutManager turnoutManager = new Mx1TurnoutManager(this);
106            store(turnoutManager,TurnoutManager.class);
107            InstanceManager.setTurnoutManager(turnoutManager);
108        }
109        register(); // registers general type
110    }
111
112    boolean getProtocol() {
113        if (getMx1TrafficController() != null) {
114            return getMx1TrafficController().getProtocol();
115        }
116        return Mx1Packetizer.ASCII;
117    }
118
119    public DefaultProgrammerManager getProgrammerManager() {
120        return (DefaultProgrammerManager) classObjectMap.computeIfAbsent(DefaultProgrammerManager.class, (Class<?> c) -> {
121            return generateDefaultProgrammerManagerForConnection();
122        });
123    }
124
125    private DefaultProgrammerManager generateDefaultProgrammerManagerForConnection() {
126        DefaultProgrammerManager programmerManager;
127        if (getProtocol() == Mx1Packetizer.BINARY) {
128            programmerManager = new Mx1ProgrammerManager(new Mx1Programmer(getMx1TrafficController()), this);
129        } else {
130            programmerManager = new DefaultProgrammerManager(new Mx1Programmer(getMx1TrafficController()), this);
131        }
132        return programmerManager;
133    }
134
135    public void setProgrammerManager(DefaultProgrammerManager p) {
136        store(p,DefaultProgrammerManager.class);
137    }
138
139    public Mx1TurnoutManager getTurnoutManager() {
140        return (Mx1TurnoutManager) classObjectMap.get(TurnoutManager.class);
141    }
142
143    public Mx1PowerManager getPowerManager() {
144        return (Mx1PowerManager) classObjectMap.get(PowerManager.class);
145    }
146
147    public Mx1ThrottleManager getThrottleManager() {
148        return (Mx1ThrottleManager) classObjectMap.get(ThrottleManager.class);
149    }
150
151    @Override
152    protected ResourceBundle getActionModelResourceBundle() {
153        return ResourceBundle.getBundle("jmri.jmrix.zimo.ZimoActionListBundle");
154    }
155
156    @Override
157    public <B extends NamedBean> Comparator<B> getNamedBeanComparator(Class<B> type) {
158        return new NamedBeanComparator<>();
159    }
160
161    @Override
162    public void dispose() {
163        st = null;
164        InstanceManager.deregister(this, Mx1SystemConnectionMemo.class);
165        if (componentFactory != null) {
166            InstanceManager.deregister(componentFactory, jmri.jmrix.swing.ComponentFactory.class);
167        }
168        Mx1ThrottleManager throttleManager = (Mx1ThrottleManager) classObjectMap.get(ThrottleManager.class);
169        if (throttleManager != null) {
170            deregister(throttleManager,ThrottleManager.class);
171            InstanceManager.deregister(throttleManager, jmri.jmrix.zimo.Mx1ThrottleManager.class);
172        }
173        super.dispose();
174    }
175
176}