cec: set line timeout when (re)transmitting. don't sleep after transmitting
[deb_libcec.git] / src / lib / CECProcessor.cpp
index 23bf4c7459c9ed40964730b632304d0190ddcc2f..f8ea3bc871f9eee71c4e2fe33fd7ff753708ca52 100644 (file)
@@ -55,7 +55,8 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, const char *strDeviceName, cec
     m_strDeviceName(strDeviceName),
     m_controller(controller),
     m_bMonitor(false),
-    m_busScan(NULL)
+    m_busScan(NULL),
+    m_iLineTimeout(0)
 {
   m_communication = new CAdapterCommunication(this);
   m_logicalAddresses.Clear();
@@ -72,7 +73,8 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, const char *strDeviceName, con
     m_strDeviceName(strDeviceName),
     m_types(types),
     m_controller(controller),
-    m_bMonitor(false)
+    m_bMonitor(false),
+    m_iLineTimeout(0)
 {
   m_communication = new CAdapterCommunication(this);
   m_logicalAddresses.Clear();
@@ -242,17 +244,22 @@ bool CCECProcessor::FindLogicalAddresses(void)
 
 bool CCECProcessor::SetLineTimeout(uint8_t iTimeout)
 {
-  bool bReturn(false);
-  CCECAdapterMessage *output = new CCECAdapterMessage;
+  bool bReturn(m_iLineTimeout != iTimeout);
 
-  output->push_back(MSGSTART);
-  output->push_escaped(MSGCODE_TRANSMIT_IDLETIME);
-  output->push_escaped(iTimeout);
-  output->push_back(MSGEND);
+  if (!bReturn)
+  {
+    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;
+  }
 
-  if ((bReturn = Transmit(output)) == false)
-    m_controller->AddLog(CEC_LOG_ERROR, "could not set the idletime");
-  delete output;
   return bReturn;
 }
 
@@ -674,8 +681,13 @@ bool CCECProcessor::Transmit(CCECAdapterMessage *output)
   bool bReturn(false);
   CLockObject lock(&m_mutex);
   {
+    SetLineTimeout(3);
+
     do
     {
+      if (output->tries > 0)
+        SetLineTimeout(5);
+
       CLockObject msgLock(&output->mutex);
       if (!m_communication || !m_communication->Write(output))
         return bReturn;
@@ -699,6 +711,8 @@ bool CCECProcessor::Transmit(CCECAdapterMessage *output)
     }while (output->transmit_timeout > 0 && output->needs_retry() && ++output->tries <= output->maxTries);
   }
 
+  SetLineTimeout(3);
+
   return bReturn;
 }
 
@@ -772,8 +786,8 @@ bool CCECProcessor::WaitForTransmitSucceeded(CCECAdapterMessage *message)
         message->reply = MSGCODE_TRANSMIT_SUCCEEDED;
         break;
       default:
-        if (ParseMessage(msg))
-          m_commandBuffer.Push(m_currentframe);
+        // ignore other data while waiting
+        break;
       }
 
       iNow = GetTimeMs();
@@ -1270,14 +1284,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);