- java.lang.Object
-
- java.io.InputStream
-
- org.refcodes.serial.PacketInputStream
-
- org.refcodes.serial.StopAndWaitPacketInputStream
-
- All Implemented Interfaces:
Closeable
,AutoCloseable
,org.refcodes.mixin.BlockSizeAccessor
,org.refcodes.mixin.PacketSizeAccessor
,org.refcodes.numerical.EndianessAccessor
,AcknowledgeMagicBytesAccessor
,AcknowledgeRetryNumberAccessor
,AcknowledgeSegmentPackagerAccessor
,AcknowledgeTimeoutInMsAccessor
,PacketLengthWidthAccessor
,PacketMagicBytesAccessor
,PacketSegmentPackagerAccessor
,SequenceNumberAccessor
,SequenceNumberConcatenateModeAccessor
,SequenceNumberInitValueAccessor
,SequenceNumberWidthAccessor
public class StopAndWaitPacketInputStream extends PacketInputStream implements AcknowledgeRetryNumberAccessor, AcknowledgeTimeoutInMsAccessor, AcknowledgeMagicBytesAccessor, AcknowledgeSegmentPackagerAccessor
TheStopAndWaitPacketInputStream
wraps anInputStream
and chunks any data to be written into packets with a sequence number and a block of data. An accordingStopAndWaitPacketInputStream
then reverts the packetised data stream while performing sequence number validation. ASegmentPackager
can be used to add functionality such as CRC checksum support.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
StopAndWaitPacketInputStream.Builder
Builder to buildStopAndWaitPacketInputStream
instances.-
Nested classes/interfaces inherited from interface org.refcodes.serial.AcknowledgeMagicBytesAccessor
AcknowledgeMagicBytesAccessor.AcknowledgeMagicBytesBuilder<B extends AcknowledgeMagicBytesAccessor.AcknowledgeMagicBytesBuilder<B>>, AcknowledgeMagicBytesAccessor.AcknowledgeMagicBytesMutator, AcknowledgeMagicBytesAccessor.AcknowledgeMagicBytesProperty
-
Nested classes/interfaces inherited from interface org.refcodes.serial.AcknowledgeRetryNumberAccessor
AcknowledgeRetryNumberAccessor.AcknowledgeRetryNumberBuilder<B extends AcknowledgeRetryNumberAccessor.AcknowledgeRetryNumberBuilder<B>>, AcknowledgeRetryNumberAccessor.AcknowledgeRetryNumberMutator, AcknowledgeRetryNumberAccessor.AcknowledgeRetryNumberProperty
-
Nested classes/interfaces inherited from interface org.refcodes.serial.AcknowledgeSegmentPackagerAccessor
AcknowledgeSegmentPackagerAccessor.AcknowledgeSegmentPackagerBuilder<B extends AcknowledgeSegmentPackagerAccessor.AcknowledgeSegmentPackagerBuilder<B>>, AcknowledgeSegmentPackagerAccessor.AcknowledgeSegmentPackagerMutator, AcknowledgeSegmentPackagerAccessor.AcknowledgeSegmentPackagerProperty
-
Nested classes/interfaces inherited from interface org.refcodes.serial.AcknowledgeTimeoutInMsAccessor
AcknowledgeTimeoutInMsAccessor.AcknowledgeTimeoutInMsBuilder<B extends AcknowledgeTimeoutInMsAccessor.AcknowledgeTimeoutInMsBuilder<B>>, AcknowledgeTimeoutInMsAccessor.AcknowledgeTimeoutInMsMutator, AcknowledgeTimeoutInMsAccessor.AcknowledgeTimeoutInMsProperty
-
Nested classes/interfaces inherited from interface org.refcodes.mixin.BlockSizeAccessor
org.refcodes.mixin.BlockSizeAccessor.BlockSizeBuilder<B extends org.refcodes.mixin.BlockSizeAccessor.BlockSizeBuilder<B>>, org.refcodes.mixin.BlockSizeAccessor.BlockSizeMutator, org.refcodes.mixin.BlockSizeAccessor.BlockSizeProperty
-
Nested classes/interfaces inherited from interface org.refcodes.numerical.EndianessAccessor
org.refcodes.numerical.EndianessAccessor.EndianessBuilder<B extends org.refcodes.numerical.EndianessAccessor.EndianessBuilder<B>>, org.refcodes.numerical.EndianessAccessor.EndianessMutator, org.refcodes.numerical.EndianessAccessor.EndianessProperty
-
Nested classes/interfaces inherited from interface org.refcodes.serial.PacketLengthWidthAccessor
PacketLengthWidthAccessor.PacketLengthWidthBuilder<B extends PacketLengthWidthAccessor.PacketLengthWidthBuilder<B>>, PacketLengthWidthAccessor.PacketLengthWidthMutator, PacketLengthWidthAccessor.PacketLengthWidthProperty
-
Nested classes/interfaces inherited from interface org.refcodes.serial.PacketMagicBytesAccessor
PacketMagicBytesAccessor.PacketMagicBytesBuilder<B extends PacketMagicBytesAccessor.PacketMagicBytesBuilder<B>>, PacketMagicBytesAccessor.PacketMagicBytesMutator, PacketMagicBytesAccessor.PacketMagicBytesProperty
-
Nested classes/interfaces inherited from interface org.refcodes.serial.PacketSegmentPackagerAccessor
PacketSegmentPackagerAccessor.PacketSegmentPackagerBuilder<B extends PacketSegmentPackagerAccessor.PacketSegmentPackagerBuilder<B>>, PacketSegmentPackagerAccessor.PacketSegmentPackagerMutator, PacketSegmentPackagerAccessor.PacketSegmentPackagerProperty
-
Nested classes/interfaces inherited from interface org.refcodes.mixin.PacketSizeAccessor
org.refcodes.mixin.PacketSizeAccessor.PacketSizeBuilder<B extends org.refcodes.mixin.PacketSizeAccessor.PacketSizeBuilder<B>>, org.refcodes.mixin.PacketSizeAccessor.PacketSizeMutator, org.refcodes.mixin.PacketSizeAccessor.PacketSizeProperty
-
Nested classes/interfaces inherited from interface org.refcodes.serial.SequenceNumberAccessor
SequenceNumberAccessor.SequenceNumberBuilder<B extends SequenceNumberAccessor.SequenceNumberBuilder<B>>, SequenceNumberAccessor.SequenceNumberMutator, SequenceNumberAccessor.SequenceNumberProperty
-
Nested classes/interfaces inherited from interface org.refcodes.serial.SequenceNumberConcatenateModeAccessor
SequenceNumberConcatenateModeAccessor.SequenceNumberConcatenateModeBuilder<B extends SequenceNumberConcatenateModeAccessor.SequenceNumberConcatenateModeBuilder<B>>, SequenceNumberConcatenateModeAccessor.SequenceNumberConcatenateModeMutator, SequenceNumberConcatenateModeAccessor.SequenceNumberConcatenateModeProperty
-
Nested classes/interfaces inherited from interface org.refcodes.serial.SequenceNumberInitValueAccessor
SequenceNumberInitValueAccessor.SequenceNumberInitValueBuilder<B extends SequenceNumberInitValueAccessor.SequenceNumberInitValueBuilder<B>>, SequenceNumberInitValueAccessor.SequenceNumberInitValueMutator, SequenceNumberInitValueAccessor.SequenceNumberInitValueProperty
-
Nested classes/interfaces inherited from interface org.refcodes.serial.SequenceNumberWidthAccessor
SequenceNumberWidthAccessor.SequenceNumberWidthBuilder<B extends SequenceNumberWidthAccessor.SequenceNumberWidthBuilder<B>>, SequenceNumberWidthAccessor.SequenceNumberWidthMutator, SequenceNumberWidthAccessor.SequenceNumberWidthProperty
-
-
Field Summary
-
Fields inherited from class org.refcodes.serial.PacketInputStream
_allocSegment, _blockOffset, _boundedSequence, _inputStream, _packetSegment, _sequenceNumber, _sequenceNumberInitValue, _sequenceNumberSegment
-
-
Constructor Summary
Constructors Constructor Description StopAndWaitPacketInputStream(InputStream aInputStream, int aBlockSize, int aPacketLengthWidth, byte[] aPacketMagicBytes, int aSequenceNumberInitValue, int aSequenceNumberWidth, org.refcodes.mixin.ConcatenateMode aSequenceNumberConcatenateMode, SegmentPackager aPacketSegmentPackager, OutputStream aReturnStream, byte[] aAcknowledgeMagicBytes, int aAcknowledgeRetryNumber, long aAcknowledgeTimeoutInMs, SegmentPackager aAckSegmentPackager, org.refcodes.numerical.Endianess aEndianess)
Constructs an accordingStopAndWaitPacketInputStream
instance wrapping the givenOutputStream
.StopAndWaitPacketInputStream(InputStream aInputStream, OutputStream aReturnStream, TransmissionMetrics aTransmissionMetrics)
Constructs an accordingStopAndWaitPacketInputStream
instance wrapping the givenOutputStream
.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description static StopAndWaitPacketInputStream.Builder
builder()
Creates builder to buildStopAndWaitPacketInputStream
.protected void
doReceivePacket()
byte[]
getAcknowledgeMagicBytes()
Retrieves the magic bytes from the acknowledge magic bytes property.int
getAcknowledgeRetryNumber()
Retrieves the number of retries from the acknowledge retry number.SegmentPackager
getAcknowledgeSegmentPackager()
Retrieves theSegmentPackager
ACK property.long
getAcknowledgeTimeoutInMs()
The acknowledge timeout attribute in milliseconds.-
Methods inherited from class org.refcodes.serial.PacketInputStream
available, close, getBlockSize, getEndianess, getPacketLengthWidth, getPacketMagicBytes, getPacketSegmentPackager, getPacketSize, getSequenceNumber, getSequenceNumberConcatenateMode, getSequenceNumberInitValue, getSequenceNumberWidth, mark, markSupported, read, reset
-
Methods inherited from class java.io.InputStream
nullInputStream, read, read, readAllBytes, readNBytes, readNBytes, skip, transferTo
-
-
-
-
Constructor Detail
-
StopAndWaitPacketInputStream
public StopAndWaitPacketInputStream(InputStream aInputStream, OutputStream aReturnStream, TransmissionMetrics aTransmissionMetrics)
Constructs an accordingStopAndWaitPacketInputStream
instance wrapping the givenOutputStream
. The configuration attributes are taken from theTransmissionMetrics
configuration object, though only those attributes are supported which are also supported by the other constructors!- Parameters:
aInputStream
- TheInputStream
to be wrapped.aReturnStream
- TheOutputStream
for establishing a return channel (handshake with the communication partner).aTransmissionMetrics
- TheTransmissionMetrics
to be used for configuring this instance.
-
StopAndWaitPacketInputStream
public StopAndWaitPacketInputStream(InputStream aInputStream, int aBlockSize, int aPacketLengthWidth, byte[] aPacketMagicBytes, int aSequenceNumberInitValue, int aSequenceNumberWidth, org.refcodes.mixin.ConcatenateMode aSequenceNumberConcatenateMode, SegmentPackager aPacketSegmentPackager, OutputStream aReturnStream, byte[] aAcknowledgeMagicBytes, int aAcknowledgeRetryNumber, long aAcknowledgeTimeoutInMs, SegmentPackager aAckSegmentPackager, org.refcodes.numerical.Endianess aEndianess)
Constructs an accordingStopAndWaitPacketInputStream
instance wrapping the givenOutputStream
.- Parameters:
aInputStream
- TheInputStream
to be wrapped.aBlockSize
- The block size of a data block for each packet.aPacketLengthWidth
- The width (bytes) for declaring the (max) length of a package.aPacketMagicBytes
- The magic bytes identifying a packet and distinguishing a packet from a last package.aSequenceNumberInitValue
- The initial sequence number from where to start counting the blocks.aSequenceNumberWidth
- The width (in bytes) to be used for sequence number values.aSequenceNumberConcatenateMode
- The mode of concatenation to use when creating aSequence
from thisTransmission
and the decoratedTransmission
.aPacketSegmentPackager
- An (optional)SegmentPackager
used to modify a packet's data e.g. with a CRC checksum.aReturnStream
- TheOutputStream
for establishing a return channel (handshake with the communication partner).aAcknowledgeMagicBytes
- The ACK character(s) to be used by the return channel to transmit an ACK (acknowledge) response after successful receiving a transmission.aAcknowledgeRetryNumber
- The number of retries waiting for an ACK from the return channel.aAcknowledgeTimeoutInMs
- The timeout in milliseconds to pend till the next retry.aAckSegmentPackager
- An (optional)SegmentPackager
used to modify a ACK response data e.g. with a CRC checksum.aEndianess
- TheEndianess
to use for integer (double) numbers and the like.
-
-
Method Detail
-
builder
public static StopAndWaitPacketInputStream.Builder builder()
Creates builder to buildStopAndWaitPacketInputStream
.- Returns:
- created builder
-
getAcknowledgeMagicBytes
public byte[] getAcknowledgeMagicBytes()
Retrieves the magic bytes from the acknowledge magic bytes property.- Specified by:
getAcknowledgeMagicBytes
in interfaceAcknowledgeMagicBytesAccessor
- Returns:
- The magic bytes stored by the acknowledge magic bytes property.
-
getAcknowledgeRetryNumber
public int getAcknowledgeRetryNumber()
Retrieves the number of retries from the acknowledge retry number. A acknowledge retry number is the overall number of retries to use when counting retries.- Specified by:
getAcknowledgeRetryNumber
in interfaceAcknowledgeRetryNumberAccessor
- Returns:
- The number of retries stored by the acknowledge retry number.
-
getAcknowledgeSegmentPackager
public SegmentPackager getAcknowledgeSegmentPackager()
Retrieves theSegmentPackager
ACK property.- Specified by:
getAcknowledgeSegmentPackager
in interfaceAcknowledgeSegmentPackagerAccessor
- Returns:
- The
SegmentPackager
stored by the ACKSegmentPackager
property.
-
getAcknowledgeTimeoutInMs
public long getAcknowledgeTimeoutInMs()
The acknowledge timeout attribute in milliseconds.- Specified by:
getAcknowledgeTimeoutInMs
in interfaceAcknowledgeTimeoutInMsAccessor
- Returns:
- An long integer with the timeout in milliseconds.
-
doReceivePacket
protected void doReceivePacket() throws IOException
- Overrides:
doReceivePacket
in classPacketInputStream
- Throws:
IOException
-
-