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}