/** * Activates a Light Control by control type. This method tests the control type, and set up a * control mechanism, appropriate for the control type. */ public void activateLightControl() { // skip if Light Control is already active if (!_active) { // activate according to control type switch (_controlType) { case Light.SENSOR_CONTROL: _namedControlSensor = null; if (_controlSensorName.length() > 0) { Sensor sen = InstanceManager.sensorManagerInstance().provideSensor(_controlSensorName); _namedControlSensor = nbhm.getNamedBeanHandle(_controlSensorName, sen); } if (_namedControlSensor != null) { // if sensor state is currently known, set light accordingly int kState = _namedControlSensor.getBean().getKnownState(); if (kState == Sensor.ACTIVE) { if (_controlSensorSense == Sensor.ACTIVE) { // Turn light on _parentLight.setState(Light.ON); } else { // Turn light off _parentLight.setState(Light.OFF); } } else if (kState == Sensor.INACTIVE) { if (_controlSensorSense == Sensor.INACTIVE) { // Turn light on _parentLight.setState(Light.ON); } else { // Turn light off _parentLight.setState(Light.OFF); } } // listen for change in sensor state _namedControlSensor .getBean() .addPropertyChangeListener( _sensorListener = new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent e) { if (!_parentLight.getEnabled()) { return; // ignore property change if user disabled Light } if (e.getPropertyName().equals("KnownState")) { int now = _namedControlSensor.getBean().getKnownState(); if (now == Sensor.ACTIVE) { if (_controlSensorSense == Sensor.ACTIVE) { // Turn light on _parentLight.setState(Light.ON); } else { // Turn light off _parentLight.setState(Light.OFF); } } else if (now == Sensor.INACTIVE) { if (_controlSensorSense == Sensor.INACTIVE) { // Turn light on _parentLight.setState(Light.ON); } else { // Turn light off _parentLight.setState(Light.OFF); } } } } }, _controlSensorName, "Light Control " + _parentLight.getDisplayName()); _active = true; } else { // control sensor does not exist log.error( "Light " + _parentLight.getSystemName() + " is linked to a Sensor that does not exist: " + _controlSensorName); return; } break; case Light.FAST_CLOCK_CONTROL: if (_clock == null) { _clock = InstanceManager.timebaseInstance(); } // set up time as minutes in a day _timeOn = _fastClockOnHour * 60 + _fastClockOnMin; _timeOff = _fastClockOffHour * 60 + _fastClockOffMin; // initialize light based on current fast time updateClockControlLight(); // set up to listen for time changes on a minute basis _clock.addMinuteChangeListener( _timebaseListener = new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent e) { if (_parentLight.getEnabled()) { // don't change light if not enabled // update control if light is enabled updateClockControlLight(); } } }); _active = true; break; case Light.TURNOUT_STATUS_CONTROL: _controlTurnout = InstanceManager.turnoutManagerInstance().provideTurnout(_controlTurnoutName); if (_controlTurnout != null) { // set light based on current turnout state if known int tState = _controlTurnout.getKnownState(); if (tState == Turnout.CLOSED) { if (_turnoutState == Turnout.CLOSED) { // Turn light on _parentLight.setState(Light.ON); } else { // Turn light off _parentLight.setState(Light.OFF); } } else if (tState == Turnout.THROWN) { if (_turnoutState == Turnout.THROWN) { // Turn light on _parentLight.setState(Light.ON); } else { // Turn light off _parentLight.setState(Light.OFF); } } // listen for change in turnout state _controlTurnout.addPropertyChangeListener( _turnoutListener = new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent e) { if (!_parentLight.getEnabled()) { return; // ignore property change if user disabled light } if (e.getPropertyName().equals("KnownState")) { int now = _controlTurnout.getKnownState(); if (now == Turnout.CLOSED) { if (_turnoutState == Turnout.CLOSED) { // Turn light on _parentLight.setState(Light.ON); } else { // Turn light off _parentLight.setState(Light.OFF); } } else if (now == Turnout.THROWN) { if (_turnoutState == Turnout.THROWN) { // Turn light on _parentLight.setState(Light.ON); } else { // Turn light off _parentLight.setState(Light.OFF); } } } } }); _active = true; } else { // control turnout does not exist log.error( "Light " + _parentLight.getSystemName() + " is linked to a Turnout that does not exist: " + _controlSensorName); return; } break; case Light.TIMED_ON_CONTROL: if (_timedSensorName.length() > 0) { Sensor sen = InstanceManager.sensorManagerInstance().provideSensor(_timedSensorName); _namedTimedControlSensor = nbhm.getNamedBeanHandle(_timedSensorName, sen); } if (_namedTimedControlSensor != null) { // set initial state off _parentLight.setState(Light.OFF); // listen for change in timed control sensor state _namedTimedControlSensor .getBean() .addPropertyChangeListener( _timedSensorListener = new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent e) { if (!_parentLight.getEnabled()) { return; // ignore property change if user disabled light } if (e.getPropertyName().equals("KnownState")) { int now = _namedTimedControlSensor.getBean().getKnownState(); if (!_lightOnTimerActive) { if (now == Sensor.ACTIVE) { // Turn light on _parentLight.setState(Light.ON); // Create a timer if one does not exist if (_timedControlTimer == null) { _timedControlListener = new TimeLight(); _timedControlTimer = new Timer(_timeOnDuration, _timedControlListener); } // Start the Timer to turn the light OFF _lightOnTimerActive = true; _timedControlTimer.start(); } } } } }, _timedSensorName, "Light Control " + _parentLight.getDisplayName()); _active = true; } else { // timed control sensor does not exist log.error( "Light " + _parentLight.getSystemName() + " is linked to a Sensor that does not exist: " + _timedSensorName); return; } break; case Light.TWO_SENSOR_CONTROL: _namedControlSensor = null; _namedControlSensor2 = null; if (_controlSensorName.length() > 0) { Sensor sen = InstanceManager.sensorManagerInstance().provideSensor(_controlSensorName); _namedControlSensor = nbhm.getNamedBeanHandle(_controlSensorName, sen); } if (_controlSensor2Name.length() > 0) { Sensor sen = InstanceManager.sensorManagerInstance().provideSensor(_controlSensor2Name); _namedControlSensor2 = nbhm.getNamedBeanHandle(_controlSensor2Name, sen); } if ((_namedControlSensor != null) && (_namedControlSensor2 != null)) { // if sensor state is currently known, set light accordingly int kState = _namedControlSensor.getBean().getKnownState(); int kState2 = _namedControlSensor2.getBean().getKnownState(); if (_controlSensorSense == Sensor.ACTIVE) { if ((kState == Sensor.ACTIVE) || (kState2 == Sensor.ACTIVE)) { // Turn light on _parentLight.setState(Light.ON); } else { // Turn light off _parentLight.setState(Light.OFF); } } else if (_controlSensorSense == Sensor.INACTIVE) { if ((kState == Sensor.INACTIVE) || (kState2 == Sensor.INACTIVE)) { // Turn light on _parentLight.setState(Light.ON); } else { // Turn light off _parentLight.setState(Light.OFF); } } // listen for change in sensor states _namedControlSensor .getBean() .addPropertyChangeListener( _sensorListener = new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent e) { twoSensorChanged(e); } }, _controlSensorName, "Light Control " + _parentLight.getDisplayName()); _namedControlSensor2 .getBean() .addPropertyChangeListener( _sensor2Listener = new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent e) { twoSensorChanged(e); } }, _controlSensor2Name, "Light Control " + _parentLight.getDisplayName()); _active = true; } else { // at least one control sensor does not exist log.error( "Light " + _parentLight.getSystemName() + " is linked to a Sensor that does not exist: "); return; } break; default: log.warn( "Unexpected control type when activating Light: " + _parentLight.getSystemName()); } } }
// start of common tests // test creation - real work is in the setup() routine public void testCreate() { // initial commanded state when created must be UNKNOWN Assert.assertEquals("initial commanded state", Turnout.UNKNOWN, t.getCommandedState()); // initial commanded state when created must be UNKNOWN Assert.assertEquals("initial known state", Turnout.UNKNOWN, t.getKnownState()); }
/** Make the OPath from the icons in the Iterator */ private OPath makeOPath(String name, ArrayList<Positionable> pathGp, boolean showMsg) { if (pathGp.size() == 0) { if (showMsg) { JOptionPane.showMessageDialog( this, Bundle.getMessage("noPathIcons"), Bundle.getMessage("makePath"), JOptionPane.INFORMATION_MESSAGE); } return null; } Iterator<Positionable> it = pathGp.iterator(); ArrayList<BeanSetting> settings = new ArrayList<BeanSetting>(); Portal fromPortal = null; Portal toPortal = null; boolean hasTrack = false; int portalIconCount = 0; while (it.hasNext()) { Positionable pos = it.next(); if (pos instanceof IndicatorTurnoutIcon) { jmri.Turnout t = ((IndicatorTurnoutIcon) pos).getTurnout(); String turnoutName = ((IndicatorTurnoutIcon) pos).getNamedTurnout().getName(); int state = t.getKnownState(); if (state != Turnout.CLOSED && state != Turnout.THROWN) { if (showMsg) { JOptionPane.showMessageDialog( this, Bundle.getMessage("turnoutNotSet", t.getDisplayName()), Bundle.getMessage("makePath"), JOptionPane.INFORMATION_MESSAGE); } return null; } settings.add(new BeanSetting(t, turnoutName, state)); hasTrack = true; } else if (pos instanceof PortalIcon) { if (toPortal == null) { toPortal = ((PortalIcon) pos).getPortal(); } else if (fromPortal == null) { fromPortal = ((PortalIcon) pos).getPortal(); } portalIconCount++; } else if (pos instanceof IndicatorTrack) { hasTrack = true; } } if (showMsg) { if (!hasTrack) { JOptionPane.showMessageDialog( this, Bundle.getMessage("noPathIcons"), Bundle.getMessage("makePath"), JOptionPane.INFORMATION_MESSAGE); return null; } if (toPortal == null && fromPortal == null) { JOptionPane.showMessageDialog( this, Bundle.getMessage("tooFewPortals"), Bundle.getMessage("makePath"), JOptionPane.INFORMATION_MESSAGE); return null; } if (portalIconCount == 0) { JOptionPane.showMessageDialog( this, Bundle.getMessage("noPortalIcons"), Bundle.getMessage("makePath"), JOptionPane.INFORMATION_MESSAGE); } if (portalIconCount > 2) { JOptionPane.showMessageDialog( this, Bundle.getMessage("tooManyPortals"), Bundle.getMessage("makePath"), JOptionPane.INFORMATION_MESSAGE); return null; } } if (hasTrack && portalIconCount > 0 && portalIconCount < 3) { return new OPath(name, _block, fromPortal, toPortal, settings); } return null; }