001package jmri.jmrit.logixng.actions;
002
003import java.util.*;
004
005import jmri.*;
006import jmri.jmrit.logixng.*;
007import jmri.jmrit.logixng.util.*;
008import jmri.jmrit.logixng.util.parser.*;
009import jmri.util.ThreadingUtil;
010
011/**
012 * This action sets the state of a sensor.
013 *
014 * @author Daniel Bergqvist Copyright 2018
015 */
016public class ActionSensor extends AbstractDigitalAction {
017
018    private final LogixNG_SelectNamedBean<Sensor> _selectNamedBean =
019            new LogixNG_SelectNamedBean<>(
020                    this, Sensor.class, InstanceManager.getDefault(SensorManager.class));
021
022    private final LogixNG_SelectEnum<SensorState> _selectEnum =
023            new LogixNG_SelectEnum<>(this, SensorState.values(), SensorState.Active);
024
025
026    public ActionSensor(String sys, String user)
027            throws BadUserNameException, BadSystemNameException {
028        super(sys, user);
029    }
030
031    @Override
032    public Base getDeepCopy(Map<String, String> systemNames, Map<String, String> userNames) throws ParserException {
033        DigitalActionManager manager = InstanceManager.getDefault(DigitalActionManager.class);
034        String sysName = systemNames.get(getSystemName());
035        String userName = userNames.get(getSystemName());
036        if (sysName == null) sysName = manager.getAutoSystemName();
037        ActionSensor copy = new ActionSensor(sysName, userName);
038        copy.setComment(getComment());
039        _selectNamedBean.copy(copy._selectNamedBean);
040        _selectEnum.copy(copy._selectEnum);
041        return manager.registerAction(copy);
042    }
043
044    public LogixNG_SelectNamedBean<Sensor> getSelectNamedBean() {
045        return _selectNamedBean;
046    }
047
048    public LogixNG_SelectEnum<SensorState> getSelectEnum() {
049        return _selectEnum;
050    }
051
052    /** {@inheritDoc} */
053    @Override
054    public LogixNG_Category getCategory() {
055        return LogixNG_Category.ITEM;
056    }
057
058    /** {@inheritDoc} */
059    @Override
060    public void execute() throws JmriException {
061        Sensor sensor = _selectNamedBean.evaluateNamedBean(getConditionalNG());
062
063        if (sensor == null) return;
064
065        SensorState state = _selectEnum.evaluateEnum(getConditionalNG());
066
067        ThreadingUtil.runOnLayoutWithJmriException(() -> {
068            if (state == SensorState.Toggle) {
069                if (sensor.getKnownState() == Sensor.INACTIVE) {
070                    sensor.setCommandedState(Sensor.ACTIVE);
071                } else {
072                    sensor.setCommandedState(Sensor.INACTIVE);
073                }
074            } else {
075                sensor.setCommandedState(state.getID());
076            }
077        });
078    }
079
080    @Override
081    public FemaleSocket getChild(int index) throws IllegalArgumentException, UnsupportedOperationException {
082        throw new UnsupportedOperationException("Not supported.");
083    }
084
085    @Override
086    public int getChildCount() {
087        return 0;
088    }
089
090    @Override
091    public String getShortDescription(Locale locale) {
092        return Bundle.getMessage(locale, "Sensor_Short");
093    }
094
095    @Override
096    public String getLongDescription(Locale locale) {
097        String namedBean = _selectNamedBean.getDescription(locale);
098        String state = _selectEnum.getDescription(locale);
099
100        return Bundle.getMessage(locale, "Sensor_Long", namedBean, state);
101    }
102
103    /** {@inheritDoc} */
104    @Override
105    public void setup() {
106        // Do nothing
107    }
108
109    /** {@inheritDoc} */
110    @Override
111    public void disposeMe() {
112    }
113
114
115    // This constant is only used internally in SensorState but must be outside
116    // the enum.
117    private static final int TOGGLE_ID = -1;
118
119
120    public enum SensorState {
121        Inactive(Sensor.INACTIVE, Bundle.getMessage("SensorStateInactive")),
122        Active(Sensor.ACTIVE, Bundle.getMessage("SensorStateActive")),
123        Toggle(TOGGLE_ID, Bundle.getMessage("SensorToggleStatus")),
124        Unknown(Sensor.UNKNOWN, Bundle.getMessage("BeanStateUnknown")),
125        Inconsistent(Sensor.INCONSISTENT, Bundle.getMessage("BeanStateInconsistent"));
126
127        private final int _id;
128        private final String _text;
129
130        private SensorState(int id, String text) {
131            this._id = id;
132            this._text = text;
133        }
134
135        public static SensorState get(int id) {
136            switch (id) {
137                case Sensor.UNKNOWN:
138                    return Unknown;
139
140                case Sensor.INCONSISTENT:
141                    return Inconsistent;
142
143                case Sensor.INACTIVE:
144                    return Inactive;
145
146                case Sensor.ACTIVE:
147                    return Active;
148
149                case TOGGLE_ID:
150                    return Toggle;
151
152                default:
153                    throw new IllegalArgumentException("invalid sensor state");
154            }
155        }
156
157        public int getID() {
158            return _id;
159        }
160
161        @Override
162        public String toString() {
163            return _text;
164        }
165
166    }
167
168    /** {@inheritDoc} */
169    @Override
170    public void getUsageDetail(int level, NamedBean bean, List<NamedBeanUsageReport> report, NamedBean cdl) {
171        _selectNamedBean.getUsageDetail(level, bean, report, cdl, this, LogixNG_SelectNamedBean.Type.Action);
172    }
173
174//    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ActionSensor.class);
175}