42 ProtocolState::ProtocolState(std::shared_ptr<ISerialPortHandler> a_SerialPortHandler, boost::asio::io_service& a_IOService): m_SerialPortHandler(a_SerialPortHandler), m_FrameParser(*this), m_Timer(a_IOService) {
44 m_AliveState = std::make_shared<AliveState>(a_IOService);
45 m_AliveState->SetSendProbeCallback([
this]() {
47 if (m_SerialPortHandler) {
48 OpportunityForTransmission();
53 m_AliveState->SetChangeBaudrateCallback([
this]() {
54 if (m_SerialPortHandler) {
55 m_SerialPortHandler->ChangeBaudRate();
56 m_SerialPortHandler->PropagateSerialPortState();
65 void ProtocolState::Reset() {
69 m_bAwaitsNextHDLCFrame =
true;
73 m_bPeerStoppedFlow =
false;
74 m_bPeerStoppedFlowNew =
false;
75 m_bPeerStoppedFlowQueried =
false;
76 m_bPeerRequiresAck =
false;
77 m_bWaitForAck =
false;
79 m_FrameParser.
Reset();
86 m_AliveState->Start();
87 OpportunityForTransmission();
94 m_SerialPortHandler->PropagateSerialPortState();
102 m_SerialPortHandler.reset();
110 m_WaitQueueReliable.emplace_back(std::move(a_Payload));
113 m_WaitQueueUnreliable.emplace_back(std::move(a_Payload));
116 bool l_bSendReliableFrames = m_bStarted;
117 l_bSendReliableFrames |= (m_bPeerStoppedFlow ==
false);
118 l_bSendReliableFrames |= (m_WaitQueueReliable.empty() ==
false);
119 bool l_bSendUnreliableFrames = m_bStarted;
120 l_bSendUnreliableFrames |= (m_WaitQueueUnreliable.empty() ==
false);
121 if ((m_bAwaitsNextHDLCFrame) && ((l_bSendReliableFrames) || (l_bSendUnreliableFrames))) {
122 OpportunityForTransmission();
133 m_bAwaitsNextHDLCFrame =
true;
134 OpportunityForTransmission();
154 m_SerialPortHandler->DeliverBufferToClients(
BUFFER_TYPE_RAW, a_Payload,
false, a_bMessageInvalid,
false);
162 if (a_bMessageInvalid) {
167 if (m_AliveState->OnFrameReceived()) {
168 m_SerialPortHandler->PropagateSerialPortState();
180 if (m_RSeqIncoming != a_HdlcFrame.
GetSSeq()) {
182 for (
unsigned char it = m_RSeqIncoming; (it & 0x07) != a_HdlcFrame.
GetSSeq(); ++it) {
183 m_SREJs.emplace_back(it);
187 m_RSeqIncoming = ((a_HdlcFrame.
GetSSeq() + 1) & 0x07);
188 m_bPeerRequiresAck =
true;
197 m_bPeerStoppedFlow =
false;
198 m_bWaitForAck =
false;
203 if ((m_bWaitForAck) && (a_HdlcFrame.
GetRSeq() == ((m_SSeqOutgoing + 1) & 0x07))) {
205 m_bWaitForAck =
false;
207 m_WaitQueueReliable.pop_front();
210 m_SSeqOutgoing = a_HdlcFrame.
GetRSeq();
213 if (!m_bPeerStoppedFlow) {
215 m_bPeerStoppedFlow =
true;
216 m_bPeerStoppedFlowNew =
true;
217 m_bPeerStoppedFlowQueried =
false;
221 m_bWaitForAck =
false;
223 if (a_HdlcFrame.
GetRSeq() == ((m_SSeqOutgoing + 1) & 0x07)) {
225 m_WaitQueueReliable.pop_front();
230 m_SSeqOutgoing = a_HdlcFrame.
GetRSeq();
232 if (m_bPeerStoppedFlow) {
234 m_bPeerStoppedFlow =
false;
235 m_bWaitForAck =
false;
240 if (a_HdlcFrame.
GetRSeq() == m_SSeqOutgoing) {
242 m_bWaitForAck =
false;
246 m_SSeqOutgoing = ((a_HdlcFrame.
GetRSeq() + 0x07) & 0x07);
249 if (m_bPeerStoppedFlow) {
251 m_bPeerStoppedFlow =
false;
252 m_bWaitForAck =
false;
258 if ((m_bWaitForAck) && (a_HdlcFrame.
GetRSeq() == m_SSeqOutgoing)) {
261 m_bWaitForAck =
false;
267 if (m_bAwaitsNextHDLCFrame) {
269 OpportunityForTransmission();
273 void ProtocolState::OpportunityForTransmission() {
275 if (!m_bAwaitsNextHDLCFrame) {
282 m_bSendProbe =
false;
283 l_HdlcFrame = PrepareUFrameTEST();
286 if (l_HdlcFrame.
IsEmpty() && m_AliveState->IsAlive()) {
288 if (m_SREJs.empty() ==
false) {
290 l_HdlcFrame = PrepareSFrameSREJ();
294 if (l_HdlcFrame.
IsEmpty() && (m_WaitQueueReliable.empty() ==
false) && (!m_bWaitForAck) && (!m_bPeerStoppedFlow)) {
296 l_HdlcFrame = PrepareIFrame();
297 m_bWaitForAck =
true;
300 m_bPeerRequiresAck =
false;
303 auto self(shared_from_this());
304 m_Timer.expires_from_now(boost::posix_time::milliseconds(500));
305 m_Timer.async_wait([
this,
self](
const boost::system::error_code& ec) {
308 m_bWaitForAck =
false;
309 OpportunityForTransmission();
315 if (l_HdlcFrame.
IsEmpty() && ((m_bPeerRequiresAck) || m_bPeerStoppedFlowNew)) {
316 bool l_bStartTimer =
false;
317 if (m_bPeerStoppedFlowNew) {
318 m_bPeerStoppedFlowNew =
false;
319 l_bStartTimer =
true;
322 l_HdlcFrame = PrepareSFrameRR();
323 m_bPeerRequiresAck =
false;
324 if (m_bPeerStoppedFlow && !m_bPeerStoppedFlowQueried) {
326 l_HdlcFrame.
SetPF(
true);
327 m_bPeerStoppedFlowQueried =
true;
328 l_bStartTimer =
true;
334 auto self(shared_from_this());
335 m_Timer.expires_from_now(boost::posix_time::milliseconds(500));
336 m_Timer.async_wait([
this,
self](
const boost::system::error_code& ec) {
338 if (m_bPeerStoppedFlow) {
339 m_bPeerRequiresAck =
true;
340 m_bPeerStoppedFlowQueried =
false;
341 OpportunityForTransmission();
349 if (l_HdlcFrame.
IsEmpty() && (m_WaitQueueUnreliable.empty() ==
false)) {
350 l_HdlcFrame = PrepareUFrameUI();
351 m_WaitQueueUnreliable.pop_front();
357 bool l_bQueryReliable = (m_WaitQueueUnreliable.empty() && m_WaitQueueReliable.empty() && (!m_bPeerStoppedFlow));
358 bool l_bQueryUnreliable = (m_WaitQueueUnreliable.empty() && (m_WaitQueueReliable.empty() || m_bPeerStoppedFlow));
359 if (l_bQueryReliable || l_bQueryUnreliable) {
360 m_SerialPortHandler->QueryForPayload(l_bQueryReliable, l_bQueryUnreliable);
365 if (l_HdlcFrame.
IsEmpty() ==
false) {
367 m_bAwaitsNextHDLCFrame =
false;
370 m_SerialPortHandler->DeliverBufferToClients(
BUFFER_TYPE_RAW, l_HDLCFrameBuffer, l_HdlcFrame.
IsIFrame(),
false,
true);
381 HdlcFrame ProtocolState::PrepareIFrame() {
383 assert(m_WaitQueueReliable.empty() ==
false);
385 m_SerialPortHandler->DeliverBufferToClients(
BUFFER_TYPE_PAYLOAD, m_WaitQueueReliable.front(),
true,
false,
true);
392 l_HdlcFrame.
SetPF(
false);
393 l_HdlcFrame.
SetSSeq(m_SSeqOutgoing);
394 l_HdlcFrame.
SetRSeq(m_RSeqIncoming);
395 l_HdlcFrame.
SetPayload(m_WaitQueueReliable.front());
399 HdlcFrame ProtocolState::PrepareSFrameRR() {
403 l_HdlcFrame.
SetPF(
false);
404 l_HdlcFrame.
SetRSeq(m_RSeqIncoming);
408 HdlcFrame ProtocolState::PrepareSFrameSREJ() {
412 l_HdlcFrame.
SetPF(
false);
413 l_HdlcFrame.
SetRSeq(m_SREJs.front());
418 HdlcFrame ProtocolState::PrepareUFrameUI() {
419 assert(m_WaitQueueUnreliable.empty() ==
false);
420 m_SerialPortHandler->DeliverBufferToClients(
BUFFER_TYPE_PAYLOAD, m_WaitQueueUnreliable.front(),
false,
false,
true);
426 l_HdlcFrame.
SetPF(
false);
427 l_HdlcFrame.
SetPayload(m_WaitQueueUnreliable.front());
431 HdlcFrame ProtocolState::PrepareUFrameTEST() {
435 l_HdlcFrame.
SetPF(
false);
static std::vector< unsigned char > EscapeFrame(const std::vector< unsigned char > &a_HDLCFrame)
void SetRSeq(unsigned char a_RSeq)
static const std::vector< unsigned char > SerializeFrame(const HdlcFrame &a_HdlcFrame)
const std::vector< unsigned char > Dissect() const
void SetHDLCFrameType(E_HDLC_FRAMETYPE a_eHDLCFrameType)
void SetPayload(const std::vector< unsigned char > &a_Payload)
E_HDLC_FRAMETYPE GetHDLCFrameType() const
Copyright (c) 2016, Florian Evers, florian-evers@gmx.de All rights reserved.
void TriggerNextHDLCFrame()
unsigned char GetSSeq() const
unsigned char GetRSeq() const
void AddReceivedRawBytes(const unsigned char *a_Buffer, size_t a_Bytes)
void SetAddress(unsigned char a_Address)
void InterpretDeserializedFrame(const std::vector< unsigned char > &a_Payload, const HdlcFrame &a_HdlcFrame, bool a_bMessageInvalid)
ProtocolState(std::shared_ptr< ISerialPortHandler > a_SerialPortHandler, boost::asio::io_service &a_IOService)
void SendPayload(const std::vector< unsigned char > &a_Payload, bool a_bReliable)
Copyright (c) 2016, Florian Evers, florian-evers@gmx.de All rights reserved.
void SetSSeq(unsigned char a_SSeq)
const std::vector< unsigned char > & GetPayload() const
void AddReceivedRawBytes(const unsigned char *a_Buffer, size_t a_Bytes)
Copyright (c) 2016, Florian Evers, florian-evers@gmx.de All rights reserved.