From 8355489019511d3ba83ef708a0f1ab0f53f649f7 Mon Sep 17 00:00:00 2001 From: Lars Op den Kamp Date: Fri, 17 Feb 2012 11:37:20 +0100 Subject: [PATCH] cec: process messages that were received async, or all incoming requests will time out --- .../adapter/USBCECAdapterCommunication.cpp | 30 +++++++++++++++++-- src/lib/adapter/USBCECAdapterCommunication.h | 18 +++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/lib/adapter/USBCECAdapterCommunication.cpp b/src/lib/adapter/USBCECAdapterCommunication.cpp index 2d85972..1b76853 100644 --- a/src/lib/adapter/USBCECAdapterCommunication.cpp +++ b/src/lib/adapter/USBCECAdapterCommunication.cpp @@ -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,8 @@ 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_port = new PLATFORM::CSerialPort(strPort, iBaudRate); } @@ -178,6 +197,9 @@ void CUSBCECAdapterCommunication::Close(void) void *CUSBCECAdapterCommunication::Process(void) { + m_messageProcessor = new CUSBCECAdapterProcessor(m_callback); + m_messageProcessor->CreateThread(); + cec_command command; bool bCommandReceived(false); while (!IsStopped()) @@ -190,7 +212,7 @@ void *CUSBCECAdapterCommunication::Process(void) /* 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 +221,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)) diff --git a/src/lib/adapter/USBCECAdapterCommunication.h b/src/lib/adapter/USBCECAdapterCommunication.h index 22c7db9..d1f033f 100644 --- a/src/lib/adapter/USBCECAdapterCommunication.h +++ b/src/lib/adapter/USBCECAdapterCommunication.h @@ -46,6 +46,23 @@ namespace CEC { class CCECProcessor; + class CUSBCECAdapterProcessor: public PLATFORM::CThread + { + public: + CUSBCECAdapterProcessor(IAdapterCommunicationCallback *cb) : + m_callback(cb) {}; + virtual ~CUSBCECAdapterProcessor(void) + { + StopThread(); + } + + void *Process(void); + void AddCommand(cec_command command); + private: + IAdapterCommunicationCallback * m_callback; + PLATFORM::SyncedBuffer m_inBuffer; + }; + class CUSBCECAdapterCommunication : public IAdapterCommunication, private PLATFORM::CThread { public: @@ -99,5 +116,6 @@ namespace CEC bool m_bNextIsEscaped; bool m_bGotStart; IAdapterCommunicationCallback * m_callback; + CUSBCECAdapterProcessor * m_messageProcessor; }; }; -- 2.34.1