Class LnTurnoutManager
- All Implemented Interfaces:
PropertyChangeListener
,VetoableChangeListener
,EventListener
,PropertyChangeFirer
,PropertyChangeProvider
,SilenceablePropertyChangeProvider
,VetoableChangeFirer
,VetoableChangeProvider
,LocoNetListener
,Manager<Turnout>
,ProvidingManager<Turnout>
,TurnoutManager
public class LnTurnoutManager extends AbstractTurnoutManager implements LocoNetListener
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 String
BYPASSBUSHBYBITKEY
(package private) LocoNetInterface
fastcontroller
(package private) LocoNetMessage
lastSWREQ
(package private) boolean
mTurnoutNoRetry
static String
SENDONANDOFFKEY
(package private) LocoNetInterface
throttledcontroller
Fields inherited from class jmri.managers.AbstractManager
_beans, _tsys, _tuser, memo, silenceableProperties, silencedProperties
Fields inherited from interface jmri.Manager
ANALOGIOS, AUDIO, BLOCKBOSS, BLOCKS, CONDITIONALS, CTCDATA, deprecatedManagerLogger, ENTRYEXIT, IDTAGS, LAYOUTBLOCKS, LIGHTS, LOGIXNG_ANALOG_ACTIONS, LOGIXNG_ANALOG_EXPRESSIONS, LOGIXNG_CONDITIONALNGS, LOGIXNG_DIGITAL_ACTIONS, LOGIXNG_DIGITAL_BOOLEAN_ACTIONS, LOGIXNG_DIGITAL_EXPRESSIONS, 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
Modifier and Type Method Description boolean
allowMultipleAdditions(String systemName)
A temporary method that determines if it is possible to add a range of turnouts in numerical order eg 10 to 30, primarily used to enable/disable the Add range box in the Add new turnout panel.protected Turnout
createNewTurnout(String systemName, String userName)
Internal method to invoke the factory, after all the logic for returning an existing Turnout has been invoked.void
dispose()
Free resources when no longer used.int
getBitFromSystemName(String systemName)
Get the bit address from the system name.String
getEntryToolTip()
Get a manager-specific tool tip for adding an entry to the manager.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()
String
validateSystemNameFormat(String systemName, Locale locale)
Validate the format of name, returning it unchanged if valid.Manager.NameValidity
validSystemNameFormat(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, getIncrement, getIncrementFromExistingNumber, getInstanceBySystemName, getInstanceByUserName, getNamedBean, getNamedBeanList, getNamedBeanSet, getNextValidAddress, getNextValidAddress, getObjectCount, getSystemNameList, 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, getBeanBySystemName, getBeanByUserName, getBeanTypeHandled, getNamedBean, getNamedBeanList, getNamedBeanSet, getObjectCount, getSubSystemNamePrefix, getSystemNameList, getSystemNamePrefix, getSystemPrefix, isValidSystemNameFormat, makeSystemName, makeSystemName, makeSystemName, register, removeDataListener, setDataListenerMute, setPropertyChangesMuted, validateBadCharsInSystemNameFormat, validateIntegerSystemNameFormat, validateNmraAccessorySystemNameFormat, validateSystemNameFormat, validateSystemNameFormatOnlyNumeric, validateSystemNamePrefix, validateTrimmedMin1NumberSystemNameFormat, validateTrimmedSystemNameFormat, validateUppercaseTrimmedSystemNameFormat
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, getNextValidAddress, getNextValidAddress, provide
Methods inherited from interface jmri.beans.VetoableChangeProvider
addVetoableChangeListener, addVetoableChangeListener, getVetoableChangeListeners, getVetoableChangeListeners, removeVetoableChangeListener, removeVetoableChangeListener
-
Field Details
-
Constructor Details
-
LnTurnoutManager
public LnTurnoutManager(LocoNetSystemConnectionMemo memo, LocoNetInterface throttledController, boolean mTurnoutNoRetry)
-
-
Method Details
-
getMemo
Get the system connection for this manager. -
dispose
Description copied from class:AbstractManager
Free resources when no longer used. Specifically, remove all references to and from this object, so it can be garbage-collected. -
setUhlenbrockMonitoring
-
createNewTurnout
@Nonnull protected Turnout createNewTurnout(@Nonnull String systemName, String userName) throws IllegalArgumentExceptionInternal 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:
IllegalArgumentException
- if unsuccessful
-
message
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
Description copied from class:AbstractTurnoutManager
A temporary method that determines if it is possible to add a range of turnouts in numerical order eg 10 to 30, primarily used to enable/disable the Add range box in the Add new turnout panel.- Specified by:
allowMultipleAdditions
in interfaceTurnoutManager
- Overrides:
allowMultipleAdditions
in classAbstractTurnoutManager
- Parameters:
systemName
- configured system connection name- Returns:
- false as default, unless overridden by implementations as supported
-
validSystemNameFormat
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 String validateSystemNameFormat(@Nonnull String systemName, @Nonnull 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
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
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
By default there are no custom properties.- Specified by:
getKnownBeanProperties
in interfaceManager<Turnout>
- Overrides:
getKnownBeanProperties
in classAbstractManager<Turnout>
- Returns:
- empty list
-