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),
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);
}
void *CUSBCECAdapterCommunication::Process(void)
{
+ m_messageProcessor = new CUSBCECAdapterProcessor(m_callback);
+ m_messageProcessor->CreateThread();
+
cec_command command;
bool bCommandReceived(false);
while (!IsStopped())
/* 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())
{
}
}
+ /* 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))
{
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<cec_command> m_inBuffer;
+ };
+
class CUSBCECAdapterCommunication : public IAdapterCommunication, private PLATFORM::CThread
{
public:
bool m_bNextIsEscaped;
bool m_bGotStart;
IAdapterCommunicationCallback * m_callback;
+ CUSBCECAdapterProcessor * m_messageProcessor;
};
};