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}