001package jmri.jmrix.mqtt;
002
003import java.util.Comparator;
004import java.util.ResourceBundle;
005import javax.annotation.Nonnull;
006
007import jmri.*;
008import jmri.jmrix.ConfiguringSystemConnectionMemo;
009import jmri.jmrix.DefaultSystemConnectionMemo;
010import jmri.util.NamedBeanComparator;
011
012/**
013 *
014 * @author Lionel Jeanson
015 * @author Dean Cording (c) 2023
016 */
017public class MqttSystemConnectionMemo extends DefaultSystemConnectionMemo implements ConfiguringSystemConnectionMemo {
018
019    private MqttAdapter mqttAdapter;
020
021    public MqttSystemConnectionMemo() {
022        super("M", "MQTT");
023        InstanceManager.store(MqttSystemConnectionMemo.this, MqttSystemConnectionMemo.class);
024    }
025
026    @Override
027    public void configureManagers() {
028
029        InstanceManager.setTurnoutManager(getTurnoutManager());
030        InstanceManager.setSensorManager(getSensorManager());
031        InstanceManager.setLightManager(getLightManager());
032        InstanceManager.setReporterManager(getReporterManager());
033        InstanceManager.setThrottleManager(getThrottleManager());
034        InstanceManager.store(getPowerManager(), PowerManager.class);
035        InstanceManager.store(getConsistManager(), ConsistManager.class);
036
037        // prefix for MqttSignalMasts
038        MqttSignalMast.setSendTopicPrefix(getMqttAdapter().getOptionState("15"));
039
040        register();
041    }
042
043    @Override
044    protected ResourceBundle getActionModelResourceBundle() {
045        return null;
046    }
047
048    @Override
049    public <B extends NamedBean> Comparator<B> getNamedBeanComparator(Class<B> type) {
050        return new NamedBeanComparator<>();
051    }
052
053    public MqttTurnoutManager getTurnoutManager() {
054        if (getDisabled()) {
055            return null;
056        }
057        return (MqttTurnoutManager) classObjectMap.computeIfAbsent(TurnoutManager.class,(Class<?> c) -> {
058                    MqttTurnoutManager t = new MqttTurnoutManager(this);
059                    t.setSendTopicPrefix(getMqttAdapter().getOptionState("10.3"));
060                    t.setRcvTopicPrefix(getMqttAdapter().getOptionState("10.5"));
061                    return t;
062                });
063
064    }
065
066    public MqttSensorManager getSensorManager() {
067        if (getDisabled()) {
068            return null;
069        }
070        return (MqttSensorManager) classObjectMap.computeIfAbsent(SensorManager.class,(Class<?> c) -> {
071                    MqttSensorManager t = new MqttSensorManager(this);
072                    t.setSendTopicPrefix(getMqttAdapter().getOptionState("11.3"));
073                    t.setRcvTopicPrefix(getMqttAdapter().getOptionState("11.5"));
074                    return t;
075                });
076    }
077
078    public MqttLightManager getLightManager() {
079        if (getDisabled()) {
080            return null;
081        }
082        return (MqttLightManager) classObjectMap.computeIfAbsent(LightManager.class,(Class<?> c) -> {
083                    MqttLightManager t = new MqttLightManager(this);
084                    t.setSendTopicPrefix(getMqttAdapter().getOptionState("12.3"));
085                    t.setRcvTopicPrefix(getMqttAdapter().getOptionState("12.5"));
086                    return t;
087                });
088    }
089
090    public MqttReporterManager getReporterManager() {
091        if (getDisabled()) {
092            return null;
093        }
094        return (MqttReporterManager) classObjectMap.computeIfAbsent(ReporterManager.class,(Class<?> c) -> {
095                    MqttReporterManager t = new MqttReporterManager(this);
096                    t.setRcvTopicPrefix(getMqttAdapter().getOptionState("13"));
097                    return t;
098                });
099    }
100
101    public MqttThrottleManager getThrottleManager() {
102        if (getDisabled()) {
103            return null;
104        }
105        return (MqttThrottleManager) classObjectMap.computeIfAbsent(ThrottleManager.class,(Class<?> c) -> {
106                    MqttThrottleManager t = new MqttThrottleManager(this);
107                    t.setSendThrottleTopic(getMqttAdapter().getOptionState("16.3"));
108                    t.setRcvThrottleTopic(getMqttAdapter().getOptionState("16.5"));
109                    t.setSendDirectionTopic(getMqttAdapter().getOptionState("17.3"));
110                    t.setRcvDirectionTopic(getMqttAdapter().getOptionState("17.5"));
111                    t.setSendFunctionTopic(getMqttAdapter().getOptionState("18.3"));
112                    t.setRcvFunctionTopic(getMqttAdapter().getOptionState("18.5"));
113                    return t;
114                });
115    }
116
117    public MqttPowerManager getPowerManager() {
118        if (getDisabled()) {
119            return null;
120        }
121        return (MqttPowerManager) classObjectMap.computeIfAbsent(PowerManager.class,(Class<?> c) -> {
122                    MqttPowerManager t = new MqttPowerManager(this);
123                    t.setSendTopic(getMqttAdapter().getOptionState("20.3"));
124                    t.setRcvTopic(getMqttAdapter().getOptionState("20.5"));
125                    return t;
126                });
127    }
128
129    @Override
130    public MqttConsistManager getConsistManager() {
131        if (getDisabled()) {
132            return null;
133        }
134        return (MqttConsistManager) classObjectMap.computeIfAbsent(ConsistManager.class,(Class<?> c) -> {
135                    MqttConsistManager t = new MqttConsistManager(this);
136                    t.setSendTopic(getMqttAdapter().getOptionState("19.3"));
137                    return t;
138                });
139    }
140
141    public void setPowerManager(@Nonnull PowerManager p) {
142        store(p,PowerManager.class);
143    }
144
145    @Override
146    public void setConsistManager(@Nonnull ConsistManager c) {
147        store(c,ConsistManager.class);
148    }
149
150    void setMqttAdapter(MqttAdapter ma) {
151        mqttAdapter = ma;
152    }
153
154    public MqttAdapter getMqttAdapter() {
155        return mqttAdapter;
156    }
157}