cec: don't retry polls
[deb_libcec.git] / src / lib / CECProcessor.cpp
index 3eb4734757da194b2539779b0c16d6b27bcc4fbb..d1d7c6d472c6d56d1fa626c17ddfbc1439f145a8 100644 (file)
@@ -240,22 +240,6 @@ bool CCECProcessor::FindLogicalAddresses(void)
   return bReturn;
 }
 
-bool CCECProcessor::SetLineTimeout(uint8_t iTimeout)
-{
-  bool bReturn(false);
-  CCECAdapterMessage *output = new CCECAdapterMessage;
-
-  output->push_back(MSGSTART);
-  output->push_escaped(MSGCODE_TRANSMIT_IDLETIME);
-  output->push_escaped(iTimeout);
-  output->push_back(MSGEND);
-
-  if ((bReturn = Transmit(output)) == false)
-    m_controller->AddLog(CEC_LOG_ERROR, "could not set the idletime");
-  delete output;
-  return bReturn;
-}
-
 void *CCECProcessor::Process(void)
 {
   bool                  bParseFrame(false);
@@ -674,28 +658,38 @@ bool CCECProcessor::Transmit(CCECAdapterMessage *output)
   bool bReturn(false);
   CLockObject lock(&m_mutex);
   {
-    CLockObject msgLock(&output->mutex);
-    if (!m_communication || !m_communication->Write(output))
-      return bReturn;
-    else
+    m_communication->SetLineTimeout(3);
+
+    do
     {
-      output->condition.Wait(&output->mutex);
-      if (output->state != ADAPTER_MESSAGE_STATE_SENT)
-      {
-        m_controller->AddLog(CEC_LOG_ERROR, "command was not sent");
+      if (output->tries > 0)
+        m_communication->SetLineTimeout(5);
+
+      CLockObject msgLock(&output->mutex);
+      if (!m_communication || !m_communication->Write(output))
         return bReturn;
+      else
+      {
+        output->condition.Wait(&output->mutex);
+        if (output->state != ADAPTER_MESSAGE_STATE_SENT)
+        {
+          m_controller->AddLog(CEC_LOG_ERROR, "command was not sent");
+          return bReturn;
+        }
       }
-    }
 
-    if (output->transmit_timeout > 0)
-    {
-      if ((bReturn = WaitForTransmitSucceeded(output->size(), output->transmit_timeout)) == false)
-        m_controller->AddLog(CEC_LOG_DEBUG, "did not receive ack");
-    }
-    else
-      bReturn = true;
+      if (output->transmit_timeout > 0)
+      {
+        if ((bReturn = WaitForTransmitSucceeded(output)) == false)
+          m_controller->AddLog(CEC_LOG_DEBUG, "did not receive ack");
+      }
+      else
+        bReturn = true;
+    }while (output->transmit_timeout > 0 && output->needs_retry() && ++output->tries <= output->maxTries);
   }
 
+  m_communication->SetLineTimeout(3);
+
   return bReturn;
 }
 
@@ -712,20 +706,20 @@ void CCECProcessor::TransmitAbort(cec_logical_address address, cec_opcode opcode
   Transmit(command);
 }
 
-bool CCECProcessor::WaitForTransmitSucceeded(uint8_t iLength, uint32_t iTimeout /* = 1000 */)
+bool CCECProcessor::WaitForTransmitSucceeded(CCECAdapterMessage *message)
 {
   bool bError(false);
   bool bTransmitSucceeded(false);
-  uint8_t iPacketsLeft(iLength / 4);
+  uint8_t iPacketsLeft(message->size() / 4);
 
   int64_t iNow = GetTimeMs();
-  int64_t iTargetTime = iNow + (uint64_t) iTimeout;
+  int64_t iTargetTime = iNow + message->transmit_timeout;
 
-  while (!bTransmitSucceeded && !bError && (iTimeout == 0 || iNow < iTargetTime))
+  while (!bTransmitSucceeded && !bError && (message->transmit_timeout == 0 || iNow < iTargetTime))
   {
     CCECAdapterMessage msg;
 
-    if (!m_communication->Read(msg, iTimeout > 0 ? (int32_t)(iTargetTime - iNow) : 1000))
+    if (!m_communication->Read(msg, message->transmit_timeout > 0 ? (int32_t)(iTargetTime - iNow) : 1000))
     {
       iNow = GetTimeMs();
       continue;
@@ -748,23 +742,29 @@ bool CCECProcessor::WaitForTransmitSucceeded(uint8_t iLength, uint32_t iTimeout
       continue;
     }
 
-    if ((bError = msg.is_error()) == false)
+    if (bError)
+    {
+      message->reply = msg.message();
+      m_controller->AddLog(CEC_LOG_DEBUG, msg.ToString());
+    }
+    else
     {
-      m_controller->AddLog(bError ? CEC_LOG_WARNING : CEC_LOG_DEBUG, msg.ToString());
-
       switch(msg.message())
       {
       case MSGCODE_COMMAND_ACCEPTED:
+        m_controller->AddLog(CEC_LOG_DEBUG, msg.ToString());
         if (iPacketsLeft > 0)
           iPacketsLeft--;
         break;
       case MSGCODE_TRANSMIT_SUCCEEDED:
+        m_controller->AddLog(CEC_LOG_DEBUG, msg.ToString());
         bTransmitSucceeded = (iPacketsLeft == 0);
         bError = !bTransmitSucceeded;
+        message->reply = MSGCODE_TRANSMIT_SUCCEEDED;
         break;
       default:
-        if (ParseMessage(msg))
-          m_commandBuffer.Push(m_currentframe);
+        // ignore other data while waiting
+        break;
       }
 
       iNow = GetTimeMs();
@@ -1261,14 +1261,6 @@ void *CCECBusScan::Process(void)
       device = m_processor->m_busDevices[iPtr];
       if (device && device->GetStatus() == CEC_DEVICE_STATUS_PRESENT)
       {
-        if (!IsStopped())
-          device->GetPhysicalAddress(false);
-        Sleep(5);
-
-        if (!IsStopped())
-          device->GetCecVersion();
-        Sleep(5);
-
         if (!IsStopped())
           device->GetVendorId();
         Sleep(5);