cec: fix ACK handling after d297cbd4fc30bc93836532a9a31027b7e64150b3. bugzid: 591
authorLars Op den Kamp <lars@opdenkamp.eu>
Mon, 19 Mar 2012 13:36:52 +0000 (14:36 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Mon, 19 Mar 2012 13:37:03 +0000 (14:37 +0100)
src/lib/adapter/USBCECAdapterCommunication.cpp
src/lib/adapter/USBCECAdapterCommunication.h

index 28b5fee1588e31a1040d47de7bfe83af5b00603a..fb91d957c2244afb425fb56d3fe30c4aeaf9a3ca 100644 (file)
@@ -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;
     }
index 3e5066b9843caba6d47d86881f490da957eff14c..03bc7a054cfb11751f8ae71267d90fde5a6d8b88 100644 (file)
@@ -145,5 +145,6 @@ namespace CEC
     IAdapterCommunicationCallback *              m_callback;
     CUSBCECAdapterProcessor *                    m_messageProcessor;
     bool                                         m_bInitialised;
+    bool                                         m_bWaitingForAck[15];
   };
 };