Package jmri.jmrix.maple
Class SerialTrafficController
java.lang.Object
jmri.jmrix.AbstractMRTrafficController
jmri.jmrix.AbstractMRNodeTrafficController
jmri.jmrix.maple.SerialTrafficController
- All Implemented Interfaces:
SerialInterface
public class SerialTrafficController extends AbstractMRNodeTrafficController implements SerialInterface
Converts Stream-based I/O to/from Maple serial messages.
The "SerialInterface" side sends/receives message objects.
The connection to a SerialPortController is via a pair of *Streams, which then carry sequences of characters for transmission. Note that this processing is handled in an independent thread.
This handles the state transitions, based on the necessary state in each message.
Handles initialization, polling, output, and input for multiple Serial Nodes.
- Since:
- 2.3.7
-
Nested Class Summary
Nested classes/interfaces inherited from class jmri.jmrix.AbstractMRTrafficController
AbstractMRTrafficController.RcvNotifier, AbstractMRTrafficController.XmtNotifier
-
Field Summary
Fields Modifier and Type Field Description (package private) SerialSensorManager
mSensorManager
protected int
wrTimeoutCount
Fields inherited from class jmri.jmrix.AbstractMRNodeTrafficController
curSerialNodeIndex, maxNode, minNode, nodeArray, numNodes
Fields inherited from class jmri.jmrix.AbstractMRTrafficController
allowUnexpectedReply, AUTORETRYSTATE, cmdListeners, connectionError, controller, flushReceiveChars, IDLESTATE, istream, listenerQueue, maxRcvExceptionCount, mCurrentMode, mCurrentState, mLastSender, msgQueue, mWaitBeforePoll, NORMALMODE, NOTIFIEDSTATE, OKSENDMSGSTATE, ostream, POLLSTATE, PROGRAMINGMODE, rcvException, rcvThread, replyInDispatch, threadStopRequest, WAITMSGREPLYSTATE, WAITREPLYINNORMMODESTATE, WAITREPLYINPROGMODESTATE, waitTimePoll, xmtException, xmtRunnable, xmtThread
-
Constructor Summary
Constructors Constructor Description SerialTrafficController()
Create a new Maple SerialTrafficController instance. -
Method Summary
Modifier and Type Method Description protected int
addHeaderToOutput(byte[] msg, AbstractMRMessage m)
Add header to the outgoing byte stream.void
addSerialListener(SerialListener l)
protected void
addTrailerToOutput(byte[] msg, int offset, AbstractMRMessage m)
Add trailer to the outgoing byte stream.protected boolean
endOfMessage(AbstractMRReply msg)
protected AbstractMRMessage
enterNormalMode()
Sets the system to normal mode during programming while in IDLESTATE.protected AbstractMRMessage
enterProgMode()
Set the system to programming mode.protected void
forwardMessage(AbstractMRListener client, AbstractMRMessage m)
Forward a SerialMessage to all registered SerialInterface listeners.protected void
forwardReply(AbstractMRListener client, AbstractMRReply m)
Forward a SerialReply to all registered SerialInterface listeners.protected boolean
getMustInit(int i)
Does a given node need to have initialization data sent?int
getSavedPollAddress()
int
getWrTimeoutCount()
protected void
handleTimeout(AbstractMRMessage m, AbstractMRListener l)
void
initializeSerialNode(SerialNode node)
Public method to set up for initialization of a Serial node.InputBits
inputBits()
static SerialTrafficController
instance()
Deprecated.protected int
lengthOfByteStream(AbstractMRMessage m)
Determine how much many bytes the entire message will take, including space for header and trailer.void
loadChars(AbstractMRReply msg, DataInputStream istream)
Get characters from the input source, and file a message.protected AbstractMRReply
newReply()
OutputBits
outputBits()
protected AbstractMRMessage
pollMessage()
Handle output and polling for Maple Serial Nodes from within the running thread.protected AbstractMRListener
pollReplyHandler()
void
removeSerialListener(SerialListener l)
protected void
resetTimeout(AbstractMRMessage m)
void
resetWrTimeoutCount()
void
sendSerialMessage(SerialMessage m, SerialListener reply)
Forward a preformatted message to the actual interface.void
setSensorManager(SerialSensorManager m)
protected void
waitForStartOfReply(DataInputStream istream)
Dummy routine, to be filled by protocols that have to skip some start-of-message characters.Methods inherited from class jmri.jmrix.AbstractMRNodeTrafficController
deleteNode, getNode, getNodeFromAddress, getNumNodes, init, registerNode, setMustInit, setMustInit
Methods inherited from class jmri.jmrix.AbstractMRTrafficController
addListener, canReceive, connectionWarn, connectPort, disconnectPort, distributeReply, enterProgModeDelayTime, finalize, forwardToPort, getLastSender, getPortName, getSynchronizeRx, handleOneIncomingReply, hasTimeouts, newRcvNotifier, notifyMessage, notifyReply, portReadyToSend, portWarn, portWarnTCP, programmerIdle, readByteProtected, receiveLoop, recovery, removeListener, reportReceiveLoopException, sendMessage, setAllowUnexpectedReply, setSynchronizeRx, status, terminate, terminateThreads, transmitLoop, transmitWait, unexpectedReplyStateError
-
Field Details
-
Constructor Details
-
SerialTrafficController
public SerialTrafficController()Create a new Maple SerialTrafficController instance.
-
-
Method Details
-
inputBits
-
outputBits
-
addSerialListener
- Specified by:
addSerialListener
in interfaceSerialInterface
-
removeSerialListener
- Specified by:
removeSerialListener
in interfaceSerialInterface
-
initializeSerialNode
Public method to set up for initialization of a Serial node.- Parameters:
node
- unused.
-
enterProgMode
Description copied from class:AbstractMRTrafficController
Set the system to programming mode.- Specified by:
enterProgMode
in classAbstractMRTrafficController
- Returns:
- any message that needs to be returned to the Command Station to change modes. If no message is needed, returns null.
- See Also:
AbstractMRTrafficController.enterNormalMode()
-
enterNormalMode
Description copied from class:AbstractMRTrafficController
Sets the system to normal mode during programming while in IDLESTATE. IfAbstractMRTrafficController.programmerIdle()
returns true, enterNormalMode() is called after a timeout.- Specified by:
enterNormalMode
in classAbstractMRTrafficController
- Returns:
- any message that needs to be returned to the Command Station to change modes. If no message is needed, returns null.
- See Also:
AbstractMRTrafficController.enterProgMode()
-
forwardMessage
Forward a SerialMessage to all registered SerialInterface listeners.- Specified by:
forwardMessage
in classAbstractMRTrafficController
- Parameters:
client
- abstract listener.m
- message to forward.
-
forwardReply
Forward a SerialReply to all registered SerialInterface listeners.- Specified by:
forwardReply
in classAbstractMRTrafficController
-
setSensorManager
-
getMustInit
Description copied from class:AbstractMRNodeTrafficController
Does a given node need to have initialization data sent?- Overrides:
getMustInit
in classAbstractMRNodeTrafficController
- Parameters:
i
- the node address (number)- Returns:
- true if initialization data is required
-
getSavedPollAddress
-
pollMessage
Handle output and polling for Maple Serial Nodes from within the running thread.- Specified by:
pollMessage
in classAbstractMRTrafficController
- Returns:
- Formatted poll message
-
getWrTimeoutCount
-
resetWrTimeoutCount
-
handleTimeout
- Overrides:
handleTimeout
in classAbstractMRTrafficController
-
resetTimeout
- Overrides:
resetTimeout
in classAbstractMRTrafficController
-
pollReplyHandler
- Specified by:
pollReplyHandler
in classAbstractMRTrafficController
-
sendSerialMessage
Forward a preformatted message to the actual interface.- Specified by:
sendSerialMessage
in interfaceSerialInterface
-
instance
Deprecated.Static function returning the SerialTrafficController instance to use.- Returns:
- The registered SerialTrafficController instance for general use, if need be creating one.
-
newReply
- Specified by:
newReply
in classAbstractMRTrafficController
-
endOfMessage
- Specified by:
endOfMessage
in classAbstractMRTrafficController
-
loadChars
Description copied from class:AbstractMRTrafficController
Get characters from the input source, and file a message.Returns only when the message is complete.
Only used in the Receive thread.
Handles timeouts on read by ignoring zero-length reads.
- Overrides:
loadChars
in classAbstractMRTrafficController
- Parameters:
msg
- message to fillistream
- character source.- Throws:
IOException
- when presented by the input source.
-
waitForStartOfReply
Description copied from class:AbstractMRTrafficController
Dummy routine, to be filled by protocols that have to skip some start-of-message characters.- Overrides:
waitForStartOfReply
in classAbstractMRTrafficController
- Parameters:
istream
- input source- Throws:
IOException
- from underlying operations
-
addHeaderToOutput
Add header to the outgoing byte stream.- Overrides:
addHeaderToOutput
in classAbstractMRTrafficController
- Parameters:
msg
- the output byte streamm
- the message to add the header to- Returns:
- next location in the stream to fill
-
addTrailerToOutput
Add trailer to the outgoing byte stream.- Overrides:
addTrailerToOutput
in classAbstractMRTrafficController
- Parameters:
msg
- The output byte streamoffset
- the first byte not yet usedm
- output message to extend
-
lengthOfByteStream
Determine how much many bytes the entire message will take, including space for header and trailer.- Overrides:
lengthOfByteStream
in classAbstractMRTrafficController
- Parameters:
m
- the message to be sent- Returns:
- Number of bytes
-