Class LnTurnoutManager
- java.lang.Object
-
- jmri.beans.PropertyChangeSupport
-
- jmri.beans.VetoableChangeSupport
-
- jmri.managers.AbstractManager<Turnout>
-
- jmri.managers.AbstractTurnoutManager
-
- jmri.jmrix.loconet.LnTurnoutManager
-
- All Implemented Interfaces:
java.beans.PropertyChangeListener
,java.beans.VetoableChangeListener
,java.util.EventListener
,PropertyChangeFirer
,PropertyChangeProvider
,SilenceablePropertyChangeProvider
,VetoableChangeFirer
,VetoableChangeProvider
,LocoNetListener
,Manager<Turnout>
,NameIncrementingManager
,ProvidingManager<Turnout>
,TurnoutManager
public class LnTurnoutManager extends AbstractTurnoutManager implements LocoNetListener
Manage the LocoNet-specific Turnout implementation. System names are "LTnnn", where L is the user configurable system prefix, nnn is the turnout number without padding.Some of the message formats used in this class are Copyright Digitrax, Inc. and used with permission as part of the JMRI project. That permission does not extend to uses in other software products. If you wish to use this code, algorithm or these message formats outside of JMRI, please contact Digitrax Inc for separate permission.
Since LocoNet messages requesting turnout operations can arrive faster than the command station can send them on the rails, the command station has a short queue of messages. When that gets full, it sends a LACK, indicating that the request was not forwarded on the rails. In that case, this class goes into a tight loop, resending the last turnout message seen until it's received without a LACK reply. Note two things about this:
- We provide this service for any turnout request, whether or not it came from JMRI. (This might be a problem if more than one computer is executing this algorithm)
- By sending the message as fast as we can, we tie up the LocoNet during the recovery. This is a mixed bag; delaying can cause messages to get out of sequence on the rails. But not delaying takes up a lot of LocoNet bandwidth.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface jmri.Manager
Manager.ManagerDataEvent<E extends NamedBean>, Manager.ManagerDataListener<E extends NamedBean>, Manager.NameValidity
-
-
Field Summary
Fields Modifier and Type Field Description protected boolean
_binaryOutput
protected boolean
_useOffSwReqAsConfirmation
static java.lang.String
BYPASSBUSHBYBITKEY
(package private) LocoNetInterface
fastcontroller
(package private) LocoNetMessage
lastSWREQ
(package private) boolean
mTurnoutNoRetry
static java.lang.String
SENDONANDOFFKEY
(package private) LocoNetInterface
throttledcontroller
-
Fields inherited from class jmri.managers.AbstractManager
_beans, _tsys, _tuser, memo, silenceableProperties, silencedProperties
-
Fields inherited from class jmri.beans.VetoableChangeSupport
vetoableChangeSupport
-
Fields inherited from class jmri.beans.PropertyChangeSupport
propertyChangeSupport
-
Fields inherited from interface jmri.Manager
ANALOGIOS, AUDIO, BLOCKBOSS, BLOCKS, CONDITIONALS, CTCDATA, ENTRYEXIT, IDTAGS, LAYOUTBLOCKS, LIGHTS, LOGIXNG_ANALOG_ACTIONS, LOGIXNG_ANALOG_EXPRESSIONS, LOGIXNG_CONDITIONALNGS, LOGIXNG_DIGITAL_ACTIONS, LOGIXNG_DIGITAL_BOOLEAN_ACTIONS, LOGIXNG_DIGITAL_EXPRESSIONS, LOGIXNG_GLOBAL_VARIABLES, LOGIXNG_MODULES, LOGIXNG_STRING_ACTIONS, LOGIXNG_STRING_EXPRESSIONS, LOGIXNG_TABLES, LOGIXNGS, LOGIXS, MEMORIES, METERFRAMES, METERS, OBLOCKS, PANELFILES, REPORTERS, ROUTES, SECTIONS, SENSORGROUPS, SENSORS, SIGNALGROUPS, SIGNALHEADS, SIGNALMASTLOGICS, SIGNALMASTS, STRINGIOS, TIMEBASE, TRANSITS, TURNOUTS, WARRANTS
-
-
Constructor Summary
Constructors Constructor Description LnTurnoutManager(LocoNetSystemConnectionMemo memo, LocoNetInterface throttledController, boolean mTurnoutNoRetry)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description boolean
allowMultipleAdditions(java.lang.String systemName)
Determines if it is possible to add a range of NamedBeans in numerical order for a particular system implementation.protected Turnout
createNewTurnout(java.lang.String systemName, java.lang.String userName)
Internal method to invoke the factory, after all the logic for returning an existing Turnout has been invoked.void
dispose()
Removes SensorManager and SystemConnectionMemo change listeners.int
getBitFromSystemName(java.lang.String systemName)
Get the bit address from the system name.java.lang.String
getEntryToolTip()
Get a manager-specific tool tip for adding an entry to the manager.java.util.List<NamedBeanPropertyDescriptor<?>>
getKnownBeanProperties()
By default there are no custom properties.LocoNetSystemConnectionMemo
getMemo()
Get the system connection for this manager.void
message(LocoNetMessage l)
Listen for turnouts, creating them as needed.void
setUhlenbrockMonitoring()
java.lang.String
validateSystemNameFormat(java.lang.String systemName, java.util.Locale locale)
Validate the format of name, returning it unchanged if valid.Manager.NameValidity
validSystemNameFormat(java.lang.String systemName)
Test if parameter is a properly formatted system name.-
Methods inherited from class jmri.managers.AbstractTurnoutManager
askControlType, askNumControlBits, createSystemName, getBeanTypeHandled, getClosedText, getDefaultClosedSpeed, getDefaultThrownSpeed, getNamedBeanClass, getOutputInterval, getThrownText, getTurnout, getValidOperationTypes, getXMLOrder, isControlTypeSupported, isNumControlBitsSupported, newTurnout, outputIntervalEnds, provideTurnout, setDefaultClosedSpeed, setDefaultThrownSpeed, setOutputInterval, typeLetter
-
Methods inherited from class jmri.managers.AbstractManager
addDataListener, checkNumeric, deleteBean, deregister, fireDataListenersAdded, fireDataListenersRemoved, fireVetoableChange, getAutoSystemName, getBySystemName, getBySystemName, getByUserName, getNamedBean, getNamedBeanSet, getObjectCount, getOuterBean, getSystemPrefix, handleUserNameUniqueness, makeSystemName, propertyChange, register, registerSelf, registerUserName, removeDataListener, setDataListenerMute, setPropertyChangesSilenced, updateAutoNumber, vetoableChange
-
Methods inherited from class jmri.beans.VetoableChangeSupport
addVetoableChangeListener, addVetoableChangeListener, fireVetoableChange, fireVetoableChange, fireVetoableChange, getVetoableChangeListeners, getVetoableChangeListeners, removeVetoableChangeListener, removeVetoableChangeListener
-
Methods inherited from class jmri.beans.PropertyChangeSupport
addPropertyChangeListener, addPropertyChangeListener, fireIndexedPropertyChange, fireIndexedPropertyChange, fireIndexedPropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getPropertyChangeListeners, getPropertyChangeListeners, removePropertyChangeListener, removePropertyChangeListener
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface jmri.Manager
addDataListener, deleteBean, deregister, getBeanTypeHandled, getNamedBean, getNamedBeanSet, getObjectCount, getSubSystemNamePrefix, getSystemNamePrefix, getSystemPrefix, isValidSystemNameFormat, makeSystemName, makeSystemName, makeSystemName, register, removeDataListener, setDataListenerMute, validateBadCharsInSystemNameFormat, validateIntegerSystemNameFormat, validateNmraAccessorySystemNameFormat, validateSystemNameFormat, validateSystemNameFormatOnlyNumeric, validateSystemNamePrefix, validateTrimmedMin1NumberSystemNameFormat, validateTrimmedSystemNameFormat, validateUppercaseTrimmedSystemNameFormat
-
Methods inherited from interface jmri.NameIncrementingManager
getNextValidSystemName
-
Methods inherited from interface jmri.beans.PropertyChangeProvider
addPropertyChangeListener, addPropertyChangeListener, getPropertyChangeListeners, getPropertyChangeListeners, removePropertyChangeListener, removePropertyChangeListener
-
Methods inherited from interface jmri.beans.SilenceablePropertyChangeProvider
setPropertyChangesSilenced
-
Methods inherited from interface jmri.TurnoutManager
getBySystemName, getByUserName, provide
-
Methods inherited from interface jmri.beans.VetoableChangeProvider
addVetoableChangeListener, addVetoableChangeListener, getVetoableChangeListeners, getVetoableChangeListeners, removeVetoableChangeListener, removeVetoableChangeListener
-
-
-
-
Field Detail
-
fastcontroller
LocoNetInterface fastcontroller
-
throttledcontroller
LocoNetInterface throttledcontroller
-
mTurnoutNoRetry
boolean mTurnoutNoRetry
-
_binaryOutput
protected boolean _binaryOutput
-
_useOffSwReqAsConfirmation
protected boolean _useOffSwReqAsConfirmation
-
lastSWREQ
LocoNetMessage lastSWREQ
-
BYPASSBUSHBYBITKEY
public static final java.lang.String BYPASSBUSHBYBITKEY
- See Also:
- Constant Field Values
-
SENDONANDOFFKEY
public static final java.lang.String SENDONANDOFFKEY
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
LnTurnoutManager
public LnTurnoutManager(LocoNetSystemConnectionMemo memo, LocoNetInterface throttledController, boolean mTurnoutNoRetry)
-
-
Method Detail
-
getMemo
@Nonnull public LocoNetSystemConnectionMemo getMemo()
Get the system connection for this manager.
-
dispose
public void dispose()
Description copied from class:AbstractTurnoutManager
Removes SensorManager and SystemConnectionMemo change listeners. Free resources when no longer used. Specifically, remove all references to and from this object, so it can be garbage-collected.- Specified by:
dispose
in interfaceManager<Turnout>
- Overrides:
dispose
in classAbstractTurnoutManager
-
setUhlenbrockMonitoring
public void setUhlenbrockMonitoring()
-
createNewTurnout
@Nonnull protected Turnout createNewTurnout(@Nonnull java.lang.String systemName, java.lang.String userName) throws java.lang.IllegalArgumentException
Internal method to invoke the factory, after all the logic for returning an existing Turnout has been invoked.- Specified by:
createNewTurnout
in classAbstractTurnoutManager
- Parameters:
systemName
- the system name to use for the new TurnoutuserName
- the user name to use for the new Turnout- Returns:
- the new Turnout or
- Throws:
java.lang.IllegalArgumentException
- if unsuccessful
-
message
public void message(LocoNetMessage l)
Listen for turnouts, creating them as needed.- Specified by:
message
in interfaceLocoNetListener
- Parameters:
l
- The received LocoNet message. Note that this same object may be presented to multiple users. It should not be modified here.
-
allowMultipleAdditions
public boolean allowMultipleAdditions(@Nonnull java.lang.String systemName)
Description copied from interface:NameIncrementingManager
Determines if it is possible to add a range of NamedBeans in numerical order for a particular system implementation.Default is not providing this service. Systems should override this method if they do provide the service.
- Specified by:
allowMultipleAdditions
in interfaceNameIncrementingManager
- Parameters:
systemName
- the system name to check against; appears to be ignored in all implementations- Returns:
- true if possible; false otherwise
-
validSystemNameFormat
public Manager.NameValidity validSystemNameFormat(@Nonnull java.lang.String systemName)
Test if parameter is a properly formatted system name. Implementations of this method must not throw an exception, log an error, or otherwise disrupt the user.- Specified by:
validSystemNameFormat
in interfaceManager<Turnout>
- Overrides:
validSystemNameFormat
in classAbstractManager<Turnout>
- Parameters:
systemName
- the system name- Returns:
Manager.NameValidity.INVALID
if system name does not start withManager.getSystemNamePrefix()
;Manager.NameValidity.VALID_AS_PREFIX_ONLY
if system name equalsManager.getSystemNamePrefix()
; otherwiseManager.NameValidity.VALID
to allow Managers that do not perform more specific validation to be considered valid.
-
validateSystemNameFormat
@Nonnull public java.lang.String validateSystemNameFormat(@Nonnull java.lang.String systemName, @Nonnull java.util.Locale locale)
Validate the format of name, returning it unchanged if valid.Although further restrictions may be added by system-specific implementations, at a minimum, the implementation must consider a name that does not start with the System Name prefix for this manager to be invalid, and must consider a name that is the same as the System Name prefix to be invalid.
Overriding implementations may rely on
Manager.validSystemNameFormat(java.lang.String)
, however they must provide an actionable message in the thrown exception if that method does not returnManager.NameValidity.VALID
. When overriding implementations of this method rely on validSystemNameFormat(), implementations of that method must not throw an exception, log an error, or otherwise disrupt the user.- Specified by:
validateSystemNameFormat
in interfaceManager<Turnout>
- Parameters:
systemName
- the system name to validatelocale
- the locale for a localized exception; this is needed for the JMRI web server, which supports multiple locales- Returns:
- the unchanged value of the name parameter
-
getBitFromSystemName
public int getBitFromSystemName(java.lang.String systemName)
Get the bit address from the system name.- Parameters:
systemName
- a valid LocoNet-based Turnout System Name- Returns:
- the turnout number extracted from the system name
-
getEntryToolTip
public java.lang.String getEntryToolTip()
Get a manager-specific tool tip for adding an entry to the manager.- Specified by:
getEntryToolTip
in interfaceManager<Turnout>
- Overrides:
getEntryToolTip
in classAbstractTurnoutManager
- Returns:
- the tool tip or null to disable the tool tip
-
getKnownBeanProperties
@Nonnull public java.util.List<NamedBeanPropertyDescriptor<?>> getKnownBeanProperties()
By default there are no custom properties.- Specified by:
getKnownBeanProperties
in interfaceManager<Turnout>
- Overrides:
getKnownBeanProperties
in classAbstractManager<Turnout>
- Returns:
- empty list
-
-