- java.lang.Object
-
- java.io.OutputStream
-
- org.refcodes.serial.PacketOutputStream
-
- All Implemented Interfaces:
Closeable
,Flushable
,AutoCloseable
,org.refcodes.mixin.BlockSizeAccessor
,org.refcodes.mixin.PacketSizeAccessor
,org.refcodes.numerical.EndianessAccessor
,PacketLengthWidthAccessor
,PacketMagicBytesAccessor
,PacketSegmentPackagerAccessor
,SequenceNumberAccessor
,SequenceNumberConcatenateModeAccessor
,SequenceNumberInitValueAccessor
,SequenceNumberWidthAccessor
- Direct Known Subclasses:
StopAndWaitPacketOutputStream
public class PacketOutputStream extends OutputStream implements PacketLengthWidthAccessor, org.refcodes.mixin.PacketSizeAccessor, org.refcodes.numerical.EndianessAccessor, org.refcodes.mixin.BlockSizeAccessor, SequenceNumberInitValueAccessor, SequenceNumberConcatenateModeAccessor, SequenceNumberAccessor, SequenceNumberWidthAccessor, PacketSegmentPackagerAccessor, PacketMagicBytesAccessor
ThePacketOutputStream
wraps anOutputStream
and chunks any data to be written into packets with a sequence number, a block of data and a CRC checksum. An accordingStopAndWaitPacketInputStream
then reverts the packetised data stream while performing CRC checksum validation as well as sequence number validation. ATTENTION: In order to send the last packet (block of data), callflush()
so that it is transmitted even if the block is not completely filled with bytes.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
PacketOutputStream.Builder
Builder to buildStopAndWaitPacketInputStream
instances.-
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 Modifier and Type Field Description protected AllocSectionDecoratorSegment<SequenceSection>
_allocSegment
protected int
_blockOffset
protected Sequence
_blockSequence
protected BoundedSequenceDecorator
_boundedSequence
protected org.refcodes.numerical.Endianess
_endianess
protected OutputStream
_outputStream
protected Segment
_packetSegment
protected int
_sequenceNumber
protected NumberSegment
_sequenceNumberSegment
protected int
_sequenceNumberWidth
-
Constructor Summary
Constructors Constructor Description PacketOutputStream(OutputStream aOutputStream, int aBlockSize, int aPacketLengthWidth, byte[] aPacketMagicBytes, int aSequenceNumberInitValue, int aSequenceNumberWidth, org.refcodes.mixin.ConcatenateMode aSequenceNumberConcatenateMode, SegmentPackager aPacketSegmentPackager, org.refcodes.numerical.Endianess aEndianess)
Constructs an accordingPacketOutputStream
instance wrapping the givenOutputStream
.PacketOutputStream(OutputStream aOutputStream, TransmissionMetrics aTransmissionMetrics)
Constructs an accordingPacketOutputStream
instance wrapping the givenOutputStream
.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description static PacketOutputStream.Builder
builder()
Creates builder to buildPacketOutputStream
.void
close()
protected void
doTransmitPacket()
Do transmit packet.void
flush()
In case a packet is not complete (e.g. it's block's data did filled till thegetBlockSize()
length), then the package is sent with it's block data "as is" (a last block's data might get filled up with zeros).int
getBlockSize()
org.refcodes.numerical.Endianess
getEndianess()
int
getPacketLengthWidth()
Retrieves the packet length width (in bytes) from the packet length width (in bytes) property.byte[]
getPacketMagicBytes()
Retrieves the magic bytes from the packet magic bytes property.SegmentPackager
getPacketSegmentPackager()
Retrieves theSegmentPackager
from the packetSegmentPackager
property.int
getPacketSize()
int
getSequenceNumber()
Retrieves the sequence number from the sequence number property.org.refcodes.mixin.ConcatenateMode
getSequenceNumberConcatenateMode()
Retrieves theConcatenateMode
from the sequence numberConcatenateMode
property.int
getSequenceNumberInitValue()
Retrieves the sequence number initial value from the sequence number initial value property.int
getSequenceNumberWidth()
Retrieves the sequence number width (in bytes) from the sequence number width (in bytes) property.void
write(int b)
-
Methods inherited from class java.io.OutputStream
nullOutputStream, write, write
-
-
-
-
Field Detail
-
_blockOffset
protected int _blockOffset
-
_blockSequence
protected Sequence _blockSequence
-
_endianess
protected org.refcodes.numerical.Endianess _endianess
-
_outputStream
protected OutputStream _outputStream
-
_packetSegment
protected Segment _packetSegment
-
_sequenceNumber
protected int _sequenceNumber
-
_sequenceNumberSegment
protected NumberSegment _sequenceNumberSegment
-
_sequenceNumberWidth
protected int _sequenceNumberWidth
-
_allocSegment
protected AllocSectionDecoratorSegment<SequenceSection> _allocSegment
-
_boundedSequence
protected BoundedSequenceDecorator _boundedSequence
-
-
Constructor Detail
-
PacketOutputStream
public PacketOutputStream(OutputStream aOutputStream, TransmissionMetrics aTransmissionMetrics)
Constructs an accordingPacketOutputStream
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:
aOutputStream
- TheOutputStream
to be wrapped.aTransmissionMetrics
- TheTransmissionMetrics
to be used for configuring this instance.
-
PacketOutputStream
public PacketOutputStream(OutputStream aOutputStream, int aBlockSize, int aPacketLengthWidth, byte[] aPacketMagicBytes, int aSequenceNumberInitValue, int aSequenceNumberWidth, org.refcodes.mixin.ConcatenateMode aSequenceNumberConcatenateMode, SegmentPackager aPacketSegmentPackager, org.refcodes.numerical.Endianess aEndianess)
Constructs an accordingPacketOutputStream
instance wrapping the givenOutputStream
.- Parameters:
aOutputStream
- TheOutputStream
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.aEndianess
- TheEndianess
to use for integer (double) numbers and the like.
-
-
Method Detail
-
builder
public static PacketOutputStream.Builder builder()
Creates builder to buildPacketOutputStream
.- Returns:
- created builder
-
close
public void close() throws IOException
- Specified by:
close
in interfaceAutoCloseable
- Specified by:
close
in interfaceCloseable
- Overrides:
close
in classOutputStream
- Throws:
IOException
-
flush
public void flush() throws IOException
In case a packet is not complete (e.g. it's block's data did filled till thegetBlockSize()
length), then the package is sent with it's block data "as is" (a last block's data might get filled up with zeros).- Specified by:
flush
in interfaceFlushable
- Overrides:
flush
in classOutputStream
- Throws:
IOException
-
getBlockSize
public int getBlockSize()
- Specified by:
getBlockSize
in interfaceorg.refcodes.mixin.BlockSizeAccessor
-
getEndianess
public org.refcodes.numerical.Endianess getEndianess()
- Specified by:
getEndianess
in interfaceorg.refcodes.numerical.EndianessAccessor
-
getPacketMagicBytes
public byte[] getPacketMagicBytes()
Retrieves the magic bytes from the packet magic bytes property.- Specified by:
getPacketMagicBytes
in interfacePacketMagicBytesAccessor
- Returns:
- The magic bytes stored by the packet magic bytes property.
-
getPacketSegmentPackager
public SegmentPackager getPacketSegmentPackager()
Retrieves theSegmentPackager
from the packetSegmentPackager
property.- Specified by:
getPacketSegmentPackager
in interfacePacketSegmentPackagerAccessor
- Returns:
- The
SegmentPackager
stored by the packetSegmentPackager
property.
-
getPacketSize
public int getPacketSize()
- Specified by:
getPacketSize
in interfaceorg.refcodes.mixin.PacketSizeAccessor
-
getSequenceNumber
public int getSequenceNumber()
Retrieves the sequence number from the sequence number property.- Specified by:
getSequenceNumber
in interfaceSequenceNumberAccessor
- Returns:
- The sequence number stored by the sequence number property.
-
getSequenceNumberConcatenateMode
public org.refcodes.mixin.ConcatenateMode getSequenceNumberConcatenateMode()
Retrieves theConcatenateMode
from the sequence numberConcatenateMode
property.- Specified by:
getSequenceNumberConcatenateMode
in interfaceSequenceNumberConcatenateModeAccessor
- Returns:
- The
ConcatenateMode
stored by the sequence numberConcatenateMode
property.
-
getSequenceNumberInitValue
public int getSequenceNumberInitValue()
Retrieves the sequence number initial value from the sequence number initial value property.- Specified by:
getSequenceNumberInitValue
in interfaceSequenceNumberInitValueAccessor
- Returns:
- The sequence number initial value stored by the sequence number initial value property.
-
getSequenceNumberWidth
public int getSequenceNumberWidth()
Retrieves the sequence number width (in bytes) from the sequence number width (in bytes) property.- Specified by:
getSequenceNumberWidth
in interfaceSequenceNumberWidthAccessor
- Returns:
- The sequence number width (in bytes) stored by the sequence number width (in bytes) property.
-
getPacketLengthWidth
public int getPacketLengthWidth()
Retrieves the packet length width (in bytes) from the packet length width (in bytes) property.- Specified by:
getPacketLengthWidth
in interfacePacketLengthWidthAccessor
- Returns:
- The packet length width (in bytes) stored by the packet length width (in bytes) property.
-
write
public void write(int b) throws IOException
- Specified by:
write
in classOutputStream
- Throws:
IOException
-
doTransmitPacket
protected void doTransmitPacket() throws IOException, TransmissionSequenceException
Do transmit packet.- Throws:
IOException
- Signals that an I/O exception has occurred.TransmissionSequenceException
- the transmission sequence exception
-
-