Package jmri.jmrix.grapevine
Class SerialTrafficController
- java.lang.Object
-
- jmri.jmrix.AbstractMRTrafficController
-
- jmri.jmrix.AbstractMRNodeTrafficController
-
- jmri.jmrix.grapevine.SerialTrafficController
-
- All Implemented Interfaces:
SerialInterface
public class SerialTrafficController extends AbstractMRNodeTrafficController implements SerialInterface
Convert Stream-based I/O to/from Grapevine 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 SerialNodes.
-
-
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) byte[]bufferprotected intcurrentAddr(package private) booleanlogDebug(package private) GrapevineSystemConnectionMemomMemoReference to the system connection memo.(package private) SerialSensorManagermSensorManager(package private) intnextReplyLen(package private) intstate-
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, timeoutFlag, timeouts, WAITMSGREPLYSTATE, WAITREPLYINNORMMODESTATE, WAITREPLYINPROGMODESTATE, waitTimePoll, xmtException, xmtRunnable, xmtThread
-
-
Constructor Summary
Constructors Constructor Description SerialTrafficController(GrapevineSystemConnectionMemo adaptermemo)Create a new TrafficController instance.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected intaddHeaderToOutput(byte[] msg, AbstractMRMessage m)Add header to the outgoing byte stream.voidaddSerialListener(SerialListener l)protected voidaddTrailerToOutput(byte[] msg, int offset, AbstractMRMessage m)Although this protocol doesn't use a trailer, we implement this method to set the expected reply address for this message.voidconnectPort(SerialPortController p)Make connection to existing PortController (adapter) object.(package private) booleandoNextStep(AbstractMRReply msg, java.io.DataInputStream istream)Execute a state machine to parse messages from the input characters.protected booleanendOfMessage(AbstractMRReply msg)protected AbstractMRMessageenterNormalMode()Sets the system to normal mode during programming while in IDLESTATE.protected AbstractMRMessageenterProgMode()Set the system to programming mode.protected voidforwardMessage(AbstractMRListener client, AbstractMRMessage m)Forward a SerialMessage to all registered SerialInterface listeners.protected voidforwardReply(AbstractMRListener client, AbstractMRReply m)Forward a SerialReply to all registered SerialInterface listeners.protected voidforwardToPort(AbstractMRMessage m, AbstractMRListener reply)Actually transmit the next message to the port.intgetMinimumNodeAddress()Get minimum address of an Grapevine node as set on this TrafficController.GrapevineSystemConnectionMemogetSystemConnectionMemo()Get access to the system connection memo associated with this traffic controller.protected voidhandleTimeout(AbstractMRMessage m, AbstractMRListener l)voidinitializeSerialNode(SerialNode node)Set up for initialization of a Serial node.protected intlengthOfByteStream(AbstractMRMessage m)Determine how much many bytes the entire message will take, including space for header and trailerprotected voidloadBuffer(AbstractMRReply msg)protected voidloadChars(AbstractMRReply msg, java.io.DataInputStream istream)Get characters from the input source, and file a message.protected AbstractMRReplynewReply()protected AbstractMRMessagepollMessage()Handle initialization, output and polling for Grapevine from within the running thread.protected AbstractMRListenerpollReplyHandler()voidremoveSerialListener(SerialListener l)protected voidresetTimeout(AbstractMRMessage m)voidsendSerialMessage(SerialMessage m, SerialListener reply)Forward a preformatted message to the actual interface.voidsetSensorManager(SerialSensorManager m)voidsetSystemConnectionMemo(GrapevineSystemConnectionMemo m)Set the system connection memo associated with this traffic controller.protected voidwaitForStartOfReply(java.io.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, getMustInit, getNode, getNodeFromAddress, getNumNodes, init, registerNode, setMustInit, setMustInit
-
Methods inherited from class jmri.jmrix.AbstractMRTrafficController
addConsoleListener, addListener, canReceive, connectionWarn, connectPort, disconnectPort, distributeReply, enterProgModeDelayTime, 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, warnOnTimeout
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface jmri.jmrix.grapevine.SerialInterface
status
-
-
-
-
Field Detail
-
logDebug
boolean logDebug
-
mSensorManager
SerialSensorManager mSensorManager
-
mMemo
GrapevineSystemConnectionMemo mMemo
Reference to the system connection memo.
-
currentAddr
protected int currentAddr
-
nextReplyLen
int nextReplyLen
-
buffer
byte[] buffer
-
state
int state
-
-
Constructor Detail
-
SerialTrafficController
public SerialTrafficController(GrapevineSystemConnectionMemo adaptermemo)
Create a new TrafficController instance.- Parameters:
adaptermemo- the associated SystemConnectionMemo
-
-
Method Detail
-
getMinimumNodeAddress
public int getMinimumNodeAddress()
Get minimum address of an Grapevine node as set on this TrafficController.- Returns:
- minimum node address.
-
connectPort
public void connectPort(SerialPortController p)
Make connection to existing PortController (adapter) object.- Parameters:
p- the Adapter we're connecting to
-
addSerialListener
public void addSerialListener(SerialListener l)
- Specified by:
addSerialListenerin interfaceSerialInterface
-
removeSerialListener
public void removeSerialListener(SerialListener l)
- Specified by:
removeSerialListenerin interfaceSerialInterface
-
initializeSerialNode
public void initializeSerialNode(SerialNode node)
Set up for initialization of a Serial node.- Parameters:
node- node to initialize.
-
enterProgMode
protected AbstractMRMessage enterProgMode()
Description copied from class:AbstractMRTrafficControllerSet the system to programming mode.- Specified by:
enterProgModein 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
protected AbstractMRMessage enterNormalMode()
Description copied from class:AbstractMRTrafficControllerSets the system to normal mode during programming while in IDLESTATE. IfAbstractMRTrafficController.programmerIdle()returns true, enterNormalMode() is called after a timeout.- Specified by:
enterNormalModein 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
protected void forwardMessage(AbstractMRListener client, AbstractMRMessage m)
Forward a SerialMessage to all registered SerialInterface listeners.- Specified by:
forwardMessagein classAbstractMRTrafficController- Parameters:
client- abstract listener.m- message to forward.
-
forwardReply
protected void forwardReply(AbstractMRListener client, AbstractMRReply m)
Forward a SerialReply to all registered SerialInterface listeners.- Specified by:
forwardReplyin classAbstractMRTrafficController
-
setSensorManager
public void setSensorManager(SerialSensorManager m)
-
pollMessage
protected AbstractMRMessage pollMessage()
Handle initialization, output and polling for Grapevine from within the running thread.- Specified by:
pollMessagein classAbstractMRTrafficController- Returns:
- Formatted poll message
-
handleTimeout
protected void handleTimeout(AbstractMRMessage m, AbstractMRListener l)
- Overrides:
handleTimeoutin classAbstractMRTrafficController
-
resetTimeout
protected void resetTimeout(AbstractMRMessage m)
- Overrides:
resetTimeoutin classAbstractMRTrafficController
-
pollReplyHandler
protected AbstractMRListener pollReplyHandler()
- Specified by:
pollReplyHandlerin classAbstractMRTrafficController
-
sendSerialMessage
public void sendSerialMessage(SerialMessage m, SerialListener reply)
Forward a preformatted message to the actual interface.- Specified by:
sendSerialMessagein interfaceSerialInterface
-
getSystemConnectionMemo
public GrapevineSystemConnectionMemo getSystemConnectionMemo()
Get access to the system connection memo associated with this traffic controller.- Returns:
- associated systemConnectionMemo object
-
setSystemConnectionMemo
public void setSystemConnectionMemo(GrapevineSystemConnectionMemo m)
Set the system connection memo associated with this traffic controller.- Parameters:
m- associated systemConnectionMemo object
-
newReply
protected AbstractMRReply newReply()
- Specified by:
newReplyin classAbstractMRTrafficController
-
endOfMessage
protected boolean endOfMessage(AbstractMRReply msg)
- Specified by:
endOfMessagein classAbstractMRTrafficController
-
forwardToPort
protected void forwardToPort(AbstractMRMessage m, AbstractMRListener reply)
Description copied from class:AbstractMRTrafficControllerActually transmit the next message to the port.- Overrides:
forwardToPortin classAbstractMRTrafficController- Parameters:
m- the message to sendreply- the Listener sending the message, often provided as 'this'- See Also:
AbstractMRTrafficController.sendMessage(AbstractMRMessage, AbstractMRListener)
-
loadChars
protected void loadChars(AbstractMRReply msg, java.io.DataInputStream istream) throws java.io.IOException
Description copied from class:AbstractMRTrafficControllerGet 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:
loadCharsin classAbstractMRTrafficController- Parameters:
msg- message to fillistream- character source.- Throws:
java.io.IOException- when presented by the input source.
-
doNextStep
boolean doNextStep(AbstractMRReply msg, java.io.DataInputStream istream) throws java.io.IOException
Execute a state machine to parse messages from the input characters. May consume one or more than one character.- Parameters:
msg- Message to parseistream- Source of data- Returns:
- true when the message has been completely loaded
- Throws:
java.io.IOException- from underlying operation
-
loadBuffer
protected void loadBuffer(AbstractMRReply msg)
-
waitForStartOfReply
protected void waitForStartOfReply(java.io.DataInputStream istream) throws java.io.IOException
Description copied from class:AbstractMRTrafficControllerDummy routine, to be filled by protocols that have to skip some start-of-message characters.- Overrides:
waitForStartOfReplyin classAbstractMRTrafficController- Parameters:
istream- input source- Throws:
java.io.IOException- from underlying operations
-
addHeaderToOutput
protected int addHeaderToOutput(byte[] msg, AbstractMRMessage m)
Add header to the outgoing byte stream.- Overrides:
addHeaderToOutputin classAbstractMRTrafficController- Parameters:
msg- The output byte streamm- Message results- Returns:
- next location in the stream to fill
-
addTrailerToOutput
protected void addTrailerToOutput(byte[] msg, int offset, AbstractMRMessage m)
Although this protocol doesn't use a trailer, we implement this method to set the expected reply address for this message.- Overrides:
addTrailerToOutputin classAbstractMRTrafficController- Parameters:
msg- The output byte streamoffset- the first byte not yet usedm- the original message
-
lengthOfByteStream
protected int lengthOfByteStream(AbstractMRMessage m)
Determine how much many bytes the entire message will take, including space for header and trailer- Overrides:
lengthOfByteStreamin classAbstractMRTrafficController- Parameters:
m- The message to be sent- Returns:
- Number of bytes
-
-