cec: fixed return value of CUSBCECAdapterCommunication::ParseMessage(). fixes message...
[deb_libcec.git] / src / lib / adapter / USBCECAdapterCommunication.cpp
index 2d8597205214408c5f9f8ba72aa6255dc550c3c3..c858d87132ec1a2601f92235733466a0651b4ac2 100644 (file)
@@ -40,6 +40,24 @@ using namespace std;
 using namespace CEC;
 using namespace PLATFORM;
 
+void *CUSBCECAdapterProcessor::Process(void)
+{
+  cec_command command;
+  while (!IsStopped())
+  {
+    if (m_inBuffer.Pop(command))
+      m_callback->OnCommandReceived(command);
+    Sleep(5);
+  }
+
+  return NULL;
+}
+
+void CUSBCECAdapterProcessor::AddCommand(cec_command command)
+{
+  m_inBuffer.Push(command);
+}
+
 CUSBCECAdapterCommunication::CUSBCECAdapterCommunication(CCECProcessor *processor, const char *strPort, uint16_t iBaudRate /* = 38400 */) :
     m_port(NULL),
     m_processor(processor),
@@ -48,7 +66,9 @@ CUSBCECAdapterCommunication::CUSBCECAdapterCommunication(CCECProcessor *processo
     m_iFirmwareVersion(CEC_FW_VERSION_UNKNOWN),
     m_lastInitiator(CECDEVICE_UNKNOWN),
     m_bNextIsEscaped(false),
-    m_bGotStart(false)
+    m_bGotStart(false),
+    m_messageProcessor(NULL),
+    m_bInitialised(false)
 {
   m_port = new PLATFORM::CSerialPort(strPort, iBaudRate);
 }
@@ -100,6 +120,11 @@ bool CUSBCECAdapterCommunication::CheckAdapter(uint32_t iTimeoutMs /* = 10000 */
   else
     bReturn = true;
 
+  {
+    CLockObject lock(m_mutex);
+    m_bInitialised = bReturn;
+  }
+
   return bReturn;
 }
 
@@ -178,19 +203,23 @@ void CUSBCECAdapterCommunication::Close(void)
 
 void *CUSBCECAdapterCommunication::Process(void)
 {
+  m_messageProcessor = new CUSBCECAdapterProcessor(m_callback);
+  m_messageProcessor->CreateThread();
+
   cec_command command;
+  command.Clear();
   bool bCommandReceived(false);
   while (!IsStopped())
   {
     {
       CLockObject lock(m_mutex);
       ReadFromDevice(50);
-      bCommandReceived = m_callback && Read(command, 0);
+      bCommandReceived = m_callback && Read(command, 0) && m_bInitialised;
     }
 
     /* push the next command to the callback method if there is one */
     if (!IsStopped() && bCommandReceived)
-      m_callback->OnCommandReceived(command);
+      m_messageProcessor->AddCommand(command);
 
     if (!IsStopped())
     {
@@ -199,6 +228,10 @@ void *CUSBCECAdapterCommunication::Process(void)
     }
   }
 
+  /* stop the message processor */
+  m_messageProcessor->StopThread();
+  delete m_messageProcessor;
+
   /* notify all threads that are waiting on messages to be sent */
   CCECAdapterMessage *msg(NULL);
   while (m_outBuffer.Pop(msg))
@@ -293,7 +326,7 @@ bool CUSBCECAdapterCommunication::Read(CCECAdapterMessage &msg, uint32_t iTimeou
     if (iTimeout == 0 || !m_rcvCondition.Wait(m_mutex, m_bHasData, iTimeout))
       return false;
     m_inBuffer.Pop(buf);
-    m_bHasData = m_inBuffer.Size() > 0;
+    m_bHasData = !m_inBuffer.IsEmpty();
   }
 
   if (buf)
@@ -364,6 +397,7 @@ bool CUSBCECAdapterCommunication::ParseMessage(const CCECAdapterMessage &msg)
   if (msg.IsEmpty())
     return bEom;
 
+  CLockObject adapterLock(m_mutex);
   switch(msg.Message())
   {
   case MSGCODE_FRAME_START:
@@ -397,7 +431,6 @@ bool CUSBCECAdapterCommunication::ParseMessage(const CCECAdapterMessage &msg)
         m_currentframe.PushBack(msg[1]);
         m_currentframe.eom = msg.IsEOM();
       }
-      bEom = msg.IsEOM();
     }
     break;
   default:
@@ -405,7 +438,7 @@ bool CUSBCECAdapterCommunication::ParseMessage(const CCECAdapterMessage &msg)
   }
 
   CLibCEC::AddLog(bIsError ? CEC_LOG_WARNING : CEC_LOG_DEBUG, msg.ToString());
-  return bEom;
+  return bEom = msg.IsEOM();;
 }
 
 uint16_t CUSBCECAdapterCommunication::GetFirmwareVersion(void)
@@ -636,7 +669,7 @@ void CUSBCECAdapterCommunication::AddData(uint8_t *data, size_t iLen)
       m_bGotStart = false;
       m_bNextIsEscaped = false;
       m_bHasData = true;
-      m_rcvCondition.Signal();
+      m_rcvCondition.Broadcast();
     }
     else if (m_bNextIsEscaped)
     {