cec: use the given timeout when trying to open a connection to the CEC adapter
authorLars Op den Kamp <lars@opdenkamp.eu>
Wed, 11 Jan 2012 01:18:34 +0000 (02:18 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Wed, 11 Jan 2012 01:18:34 +0000 (02:18 +0100)
src/lib/AdapterCommunication.cpp

index 93648742825ce3f089013615d119afae827bf114..d33ad2f84165b1fb52ddede687487430cf158ee9 100644 (file)
@@ -265,7 +265,11 @@ CAdapterCommunication::~CAdapterCommunication(void)
 
 bool CAdapterCommunication::Open(const char *strPort, uint16_t iBaudRate /* = 38400 */, uint32_t iTimeoutMs /* = 10000 */)
 {
+  uint64_t iNow = GetTimeMs();
+  uint64_t iTimeout = iNow + iTimeoutMs;
+
   CLockObject lock(&m_mutex);
+
   if (!m_port)
   {
     m_processor->AddLog(CEC_LOG_ERROR, "port is NULL");
@@ -275,12 +279,23 @@ bool CAdapterCommunication::Open(const char *strPort, uint16_t iBaudRate /* = 38
   if (IsOpen())
   {
     m_processor->AddLog(CEC_LOG_ERROR, "port is already open");
+    return true;
   }
 
-  if (!m_port->Open(strPort, iBaudRate))
+  CStdString strError;
+  bool bConnected(false);
+  while (!bConnected && iNow < iTimeout)
+  {
+    if (!(bConnected = m_port->Open(strPort, iBaudRate)))
+    {
+      strError.Format("error opening serial port '%s': %s", strPort, m_port->GetError().c_str());
+      Sleep(250);
+      iNow = GetTimeMs();
+    }
+  }
+
+  if (!bConnected)
   {
-    CStdString strError;
-    strError.Format("error opening serial port '%s': %s", strPort, m_port->GetError().c_str());
     m_processor->AddLog(CEC_LOG_ERROR, strError);
     return false;
   }
@@ -302,9 +317,6 @@ bool CAdapterCommunication::Open(const char *strPort, uint16_t iBaudRate /* = 38
     m_processor->AddLog(CEC_LOG_DEBUG, "could not create a communication thread");
   }
 
-  //TODO implement the timeout. use the variable for now to silence the compiler warning
-  iTimeoutMs = 0;
-
   return false;
 }