X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fadapter%2FUSBCECAdapterCommunication.cpp;h=2d8597205214408c5f9f8ba72aa6255dc550c3c3;hb=f9e01dac894ab26e63aaa38a8df5cba237195b76;hp=96571cc3dc52bcb5fb4df06ea55e7fdfcae4d17c;hpb=68b94c34ec2f7de6cd5db434e50242f3ebf8f65a;p=deb_libcec.git diff --git a/src/lib/adapter/USBCECAdapterCommunication.cpp b/src/lib/adapter/USBCECAdapterCommunication.cpp index 96571cc..2d85972 100644 --- a/src/lib/adapter/USBCECAdapterCommunication.cpp +++ b/src/lib/adapter/USBCECAdapterCommunication.cpp @@ -173,12 +173,6 @@ bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32 void CUSBCECAdapterCommunication::Close(void) { - { - CLockObject lock(m_mutex); - m_bHasData = true; - m_rcvCondition.Broadcast(); - } - SetAckMask(0); StopThread(); } @@ -205,10 +199,14 @@ void *CUSBCECAdapterCommunication::Process(void) } } + /* notify all threads that are waiting on messages to be sent */ CCECAdapterMessage *msg(NULL); - if (m_outBuffer.Pop(msg)) + while (m_outBuffer.Pop(msg)) msg->event.Broadcast(); + /* set the ackmask to 0 before closing the connection */ + SetAckMaskInternal(0, true); + if (m_port) { delete m_port; @@ -253,7 +251,7 @@ bool CUSBCECAdapterCommunication::Write(CCECAdapterMessage *data) { data->state = ADAPTER_MESSAGE_STATE_WAITING_TO_BE_SENT; m_outBuffer.Push(data); - data->event.Wait(); + data->event.Wait(5000); if ((data->expectControllerAck && data->state != ADAPTER_MESSAGE_STATE_SENT_ACKED) || (!data->expectControllerAck && data->state != ADAPTER_MESSAGE_STATE_SENT)) @@ -485,6 +483,11 @@ bool CUSBCECAdapterCommunication::SetLineTimeout(uint8_t iTimeout) } bool CUSBCECAdapterCommunication::SetAckMask(uint16_t iMask) +{ + return SetAckMaskInternal(iMask, false); +} + +bool CUSBCECAdapterCommunication::SetAckMaskInternal(uint16_t iMask, bool bWriteDirectly /* = false */) { bool bReturn(false); CLibCEC::AddLog(CEC_LOG_DEBUG, "setting ackmask to %2x", iMask); @@ -498,7 +501,9 @@ bool CUSBCECAdapterCommunication::SetAckMask(uint16_t iMask) output->PushBack(MSGEND); output->isTransmission = false; - if ((bReturn = Write(output)) == false) + if (bWriteDirectly) + SendMessageToAdapter(output); + else if ((bReturn = Write(output)) == false) CLibCEC::AddLog(CEC_LOG_ERROR, "could not set the ackmask"); delete output; @@ -677,6 +682,13 @@ bool CUSBCECAdapterCommunication::ReadFromDevice(uint32_t iTimeout, size_t iSize void CUSBCECAdapterCommunication::SendMessageToAdapter(CCECAdapterMessage *msg) { CLockObject adapterLock(m_mutex); + if (!m_port->IsOpen()) + { + CLibCEC::AddLog(CEC_LOG_ERROR, "error writing to serial port: the connection is closed"); + msg->state = ADAPTER_MESSAGE_STATE_ERROR; + return; + } + if (msg->tries == 1) SetLineTimeout(msg->lineTimeout); else