From 4164923ba41e816e6000f23f360c39459e2cba1d Mon Sep 17 00:00:00 2001 From: Lars Op den Kamp Date: Mon, 19 Mar 2012 14:36:52 +0100 Subject: [PATCH] cec: fix ACK handling after d297cbd4fc30bc93836532a9a31027b7e64150b3. bugzid: 591 --- .../adapter/USBCECAdapterCommunication.cpp | 27 ++++++++++++++++--- src/lib/adapter/USBCECAdapterCommunication.h | 1 + 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/lib/adapter/USBCECAdapterCommunication.cpp b/src/lib/adapter/USBCECAdapterCommunication.cpp index 28b5fee..fb91d95 100644 --- a/src/lib/adapter/USBCECAdapterCommunication.cpp +++ b/src/lib/adapter/USBCECAdapterCommunication.cpp @@ -72,6 +72,8 @@ CUSBCECAdapterCommunication::CUSBCECAdapterCommunication(CCECProcessor *processo m_messageProcessor(NULL), m_bInitialised(false) { + for (unsigned int iPtr = 0; iPtr < 15; iPtr++) + m_bWaitingForAck[iPtr] = false; m_port = new CSerialPort(strPort, iBaudRate); } @@ -303,6 +305,11 @@ cec_adapter_message_state CUSBCECAdapterCommunication::Write(const cec_command & output->retryTimeout = iRetryLineTimeout; output->tries = 0; + { + CLockObject lock(m_mutex); + m_bWaitingForAck[data.destination] = true; + } + bool bRetry(true); while (bRetry && ++output->tries < output->maxTries) { @@ -427,8 +434,15 @@ bool CUSBCECAdapterCommunication::ParseMessage(const CCECAdapterMessage &msg) if (m_currentframe.ack == 0x1) { m_lastInitiator = m_currentframe.initiator; - m_currentframe.eom = 1; - bEom = true; + if (!m_bWaitingForAck[m_currentframe.destination]) + { + m_currentframe.eom = 1; + bEom = true; + } + else + { + m_bWaitingForAck[m_currentframe.destination] = false; + } } } break; @@ -806,8 +820,13 @@ bool CUSBCECAdapterCommunication::WaitForAck(CCECAdapterMessage &message) if (msg.Message() == MSGCODE_FRAME_START && msg.IsACK()) { - m_processor->HandlePoll(msg.Initiator(), msg.Destination()); - m_lastInitiator = msg.Initiator(); + if (m_bWaitingForAck[msg.Initiator()]) + m_bWaitingForAck[msg.Initiator()] = false; + else + { + m_processor->HandlePoll(msg.Initiator(), msg.Destination()); + m_lastInitiator = msg.Initiator(); + } iNow = GetTimeMs(); continue; } diff --git a/src/lib/adapter/USBCECAdapterCommunication.h b/src/lib/adapter/USBCECAdapterCommunication.h index 3e5066b..03bc7a0 100644 --- a/src/lib/adapter/USBCECAdapterCommunication.h +++ b/src/lib/adapter/USBCECAdapterCommunication.h @@ -145,5 +145,6 @@ namespace CEC IAdapterCommunicationCallback * m_callback; CUSBCECAdapterProcessor * m_messageProcessor; bool m_bInitialised; + bool m_bWaitingForAck[15]; }; }; -- 2.34.1