001package jmri.jmrit.logixng.actions;
002
003import java.util.*;
004import java.util.concurrent.atomic.AtomicReference;
005
006import jmri.*;
007import jmri.jmrit.logixng.*;
008import jmri.jmrit.logixng.util.LogixNG_SelectEnum;
009import jmri.jmrit.logixng.util.parser.ParserException;
010import jmri.util.ThreadingUtil;
011
012/**
013 * This action turns power on or off.
014 *
015 * @author Daniel Bergqvist Copyright 2021
016 */
017public class ActionPower extends AbstractDigitalAction {
018
019    private final LogixNG_SelectEnum<PowerState> _selectEnum =
020            new LogixNG_SelectEnum<>(this, PowerState.values(), PowerState.On);
021
022
023    public ActionPower(String sys, String user)
024            throws BadUserNameException, BadSystemNameException {
025        super(sys, user);
026    }
027
028    @Override
029    public Base getDeepCopy(Map<String, String> systemNames, Map<String, String> userNames) throws ParserException, ParserException {
030        DigitalActionManager manager = InstanceManager.getDefault(DigitalActionManager.class);
031        String sysName = systemNames.get(getSystemName());
032        String userName = userNames.get(getSystemName());
033        if (sysName == null) sysName = manager.getAutoSystemName();
034        ActionPower copy = new ActionPower(sysName, userName);
035        copy.setComment(getComment());
036        _selectEnum.copy(copy._selectEnum);
037        return manager.registerAction(copy);
038    }
039
040    public LogixNG_SelectEnum<PowerState> getSelectEnum() {
041        return _selectEnum;
042    }
043
044    /** {@inheritDoc} */
045    @Override
046    public LogixNG_Category getCategory() {
047        return LogixNG_Category.ITEM;
048    }
049
050    /** {@inheritDoc} */
051    @Override
052    public void execute() throws JmriException {
053        AtomicReference<JmriException> exception = new AtomicReference<>();
054        PowerState powerState = _selectEnum.evaluateEnum(getConditionalNG());
055
056        ThreadingUtil.runOnLayoutWithJmriException(() -> {
057            try {
058                InstanceManager.getDefault(PowerManager.class).setPower(powerState.getID());
059            } catch (JmriException e) {
060                exception.set(e);
061            }
062        });
063        if (exception.get() != null) throw exception.get();
064    }
065
066    @Override
067    public FemaleSocket getChild(int index) throws IllegalArgumentException, UnsupportedOperationException {
068        throw new UnsupportedOperationException("Not supported.");
069    }
070
071    @Override
072    public int getChildCount() {
073        return 0;
074    }
075
076    @Override
077    public String getShortDescription(Locale locale) {
078        return Bundle.getMessage(locale, "Power_Short");
079    }
080
081    @Override
082    public String getLongDescription(Locale locale) {
083        return Bundle.getMessage(locale, "Power_Long", _selectEnum.getDescription(locale));
084    }
085
086    /** {@inheritDoc} */
087    @Override
088    public void setup() {
089        // Do nothing
090    }
091
092    /** {@inheritDoc} */
093    @Override
094    public void disposeMe() {
095    }
096
097
098    public enum PowerState {
099        Off(PowerManager.OFF, Bundle.getMessage("PowerStateOff")),
100        On(PowerManager.ON, Bundle.getMessage("PowerStateOn"));
101
102        private final int _id;
103        private final String _text;
104
105        private PowerState(int id, String text) {
106            this._id = id;
107            this._text = text;
108        }
109
110        public static PowerState get(int id) {
111            switch (id) {
112                case PowerManager.OFF:
113                    return Off;
114
115                case PowerManager.ON:
116                    return On;
117
118                default:
119                    throw new IllegalArgumentException("invalid power state");
120            }
121        }
122
123        public int getID() {
124            return _id;
125        }
126
127        @Override
128        public String toString() {
129            return _text;
130        }
131
132    }
133
134//    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ActionPower.class);
135
136}