X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fadapter%2FUSBCECAdapterMessageQueue.cpp;h=64f9f00de0f6bf0dcd8bce9aa1c2166b9070f575;hb=a8559e01ffc0239556097fbbe99f88f663f3fd6f;hp=9c66051f5e368640e27bc128e5185b55839dd77a;hpb=64d46f80cc6f34f531ae26e8677f2f0b0c1f74bb;p=deb_libcec.git diff --git a/src/lib/adapter/USBCECAdapterMessageQueue.cpp b/src/lib/adapter/USBCECAdapterMessageQueue.cpp index 9c66051..64f9f00 100644 --- a/src/lib/adapter/USBCECAdapterMessageQueue.cpp +++ b/src/lib/adapter/USBCECAdapterMessageQueue.cpp @@ -196,7 +196,7 @@ bool CCECAdapterMessageQueueEntry::MessageReceivedResponse(const CCECAdapterMess { { CLockObject lock(m_mutex); - CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - received response", ToString()); + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - received response - %s", ToString(), message.ToString().c_str()); m_message->response = message.packet; if (m_message->IsTranmission()) m_message->state = message.Message() == MSGCODE_TRANSMIT_SUCCEEDED ? ADAPTER_MESSAGE_STATE_SENT_ACKED : ADAPTER_MESSAGE_STATE_SENT_NOT_ACKED; @@ -213,14 +213,38 @@ bool CCECAdapterMessageQueueEntry::MessageReceivedResponse(const CCECAdapterMess CCECAdapterMessageQueue::~CCECAdapterMessageQueue(void) { Clear(); + StopThread(0); } void CCECAdapterMessageQueue::Clear(void) { + StopThread(5); CLockObject lock(m_mutex); + m_writeQueue.Clear(); m_messages.clear(); } +void *CCECAdapterMessageQueue::Process(void) +{ + CCECAdapterMessageQueueEntry *message(NULL); + while (!IsStopped()) + { + /* wait for a new message */ + if (m_writeQueue.Pop(message, 1000)) + { + /* write this message */ + m_com->WriteToDevice(message->m_message); + if (message->m_message->state == ADAPTER_MESSAGE_STATE_ERROR) + { + message->Signal(); + Clear(); + break; + } + } + } + return NULL; +} + void CCECAdapterMessageQueue::MessageReceived(const CCECAdapterMessage &msg) { bool bHandled(false); @@ -279,10 +303,7 @@ bool CCECAdapterMessageQueue::Write(CCECAdapterMessage *msg) /* set the correct line timeout */ if (msg->IsTranmission()) { - if (msg->tries == 1) - m_com->SetLineTimeout(msg->lineTimeout); - else - m_com->SetLineTimeout(msg->retryTimeout); + m_com->SetLineTimeout(msg->lineTimeout); } CCECAdapterMessageQueueEntry *entry(NULL); @@ -296,13 +317,8 @@ bool CCECAdapterMessageQueue::Write(CCECAdapterMessage *msg) m_messages.insert(make_pair(iEntryId, entry)); } - /* TODO write the message async */ - if (!m_com->WriteToDevice(msg)) - { - /* error! */ - Clear(); - return false; - } + /* add the message to the write queue */ + m_writeQueue.Push(entry); bool bReturn(true); if (entry) @@ -316,6 +332,7 @@ bool CCECAdapterMessageQueue::Write(CCECAdapterMessage *msg) CLockObject lock(m_mutex); m_messages.erase(iEntryId); + delete entry; } return bReturn;