private void ProcessSegment(BacnetAddress adr, BacnetPduTypes type, BacnetConfirmedServices service, byte invoke_id, BacnetMaxSegments max_segments, BacnetMaxAdpu max_adpu, bool server, byte sequence_number, byte proposed_window_number, byte[] buffer, int offset, int length)
{
bool first = false;
if (sequence_number == 0 && m_last_sequence_number == 0)
{
first = true;
}
else
{
//send negative ack
if (sequence_number != (m_last_sequence_number + 1))
{
SegmentAckResponse(adr, true, server, invoke_id, m_last_sequence_number, proposed_window_number);
Trace.WriteLine("Segment sequence out of order", null);
return;
}
}
m_last_sequence_number = sequence_number;
bool more_follows = (type & BacnetPduTypes.MORE_FOLLOWS) == BacnetPduTypes.MORE_FOLLOWS;
if (!more_follows) m_last_sequence_number = 0; //reset last sequence_number
//send ACK
if ((sequence_number % proposed_window_number) == 0 || !more_follows)
{
if (m_force_window_size) proposed_window_number = m_proposed_window_size;
SegmentAckResponse(adr, false, server, invoke_id, sequence_number, proposed_window_number);
}
//Send on
if (OnSegment != null)
OnSegment(this, adr, type, service, invoke_id, max_segments, max_adpu, sequence_number, first, more_follows, buffer, offset, length);
//default segment assembly. We run this seperately from the above handler, to make sure that it comes after!
if (m_default_segmentation_handling)
PerformDefaultSegmentHandling(this, adr, type, service, invoke_id, max_segments, max_adpu, sequence_number, first, more_follows, buffer, offset, length);
}