X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fadapter%2FUSBCECAdapterCommunication.cpp;h=7037c78eff960357f2842e3f8cd5a154dfcb61cb;hb=cba904a6dc0be488b9e761861f752653ec5e6801;hp=01bf303b45f9a65b16601dd9be9f03aa3b46775c;hpb=ef5836621411aa39169f9c8c2fc8a7f3038dbb15;p=deb_libcec.git diff --git a/src/lib/adapter/USBCECAdapterCommunication.cpp b/src/lib/adapter/USBCECAdapterCommunication.cpp index 01bf303..7037c78 100644 --- a/src/lib/adapter/USBCECAdapterCommunication.cpp +++ b/src/lib/adapter/USBCECAdapterCommunication.cpp @@ -43,6 +43,7 @@ using namespace PLATFORM; CUSBCECAdapterCommunication::CUSBCECAdapterCommunication(CCECProcessor *processor, const char *strPort, uint16_t iBaudRate /* = 38400 */) : m_port(NULL), m_processor(processor), + m_bHasData(false), m_iLineTimeout(0), m_iFirmwareVersion(CEC_FW_VERSION_UNKNOWN), m_lastInitiator(CECDEVICE_UNKNOWN), @@ -172,8 +173,12 @@ bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32 void CUSBCECAdapterCommunication::Close(void) { - CLockObject lock(m_mutex); - m_rcvCondition.Broadcast(); + SetAckMask(0); + { + CLockObject lock(m_mutex); + m_bHasData = true; + m_rcvCondition.Broadcast(); + } StopThread(); } @@ -202,7 +207,7 @@ void *CUSBCECAdapterCommunication::Process(void) CCECAdapterMessage *msg(NULL); if (m_outBuffer.Pop(msg)) - msg->condition.Broadcast(); + msg->event.Broadcast(); if (m_port) { @@ -216,6 +221,8 @@ void *CUSBCECAdapterCommunication::Process(void) cec_adapter_message_state CUSBCECAdapterCommunication::Write(const cec_command &data, uint8_t iMaxTries, uint8_t iLineTimeout /* = 3 */, uint8_t iRetryLineTimeout /* = 3 */) { cec_adapter_message_state retVal(ADAPTER_MESSAGE_STATE_UNKNOWN); + if (!IsRunning()) + return retVal; CCECAdapterMessage *output = new CCECAdapterMessage(data); @@ -244,10 +251,9 @@ cec_adapter_message_state CUSBCECAdapterCommunication::Write(const cec_command & bool CUSBCECAdapterCommunication::Write(CCECAdapterMessage *data) { - CLockObject lock(data->mutex); data->state = ADAPTER_MESSAGE_STATE_WAITING_TO_BE_SENT; m_outBuffer.Push(data); - data->condition.Wait(data->mutex); + data->event.Wait(); if ((data->expectControllerAck && data->state != ADAPTER_MESSAGE_STATE_SENT_ACKED) || (!data->expectControllerAck && data->state != ADAPTER_MESSAGE_STATE_SENT)) @@ -261,6 +267,9 @@ bool CUSBCECAdapterCommunication::Write(CCECAdapterMessage *data) bool CUSBCECAdapterCommunication::Read(cec_command &command, uint32_t iTimeout) { + if (!IsRunning()) + return false; + CCECAdapterMessage msg; if (Read(msg, iTimeout)) { @@ -283,15 +292,16 @@ bool CUSBCECAdapterCommunication::Read(CCECAdapterMessage &msg, uint32_t iTimeou if (!m_inBuffer.Pop(buf)) { - if (iTimeout == 0 || !m_rcvCondition.Wait(m_mutex, iTimeout)) + if (iTimeout == 0 || !m_rcvCondition.Wait(m_mutex, m_bHasData, iTimeout)) return false; m_inBuffer.Pop(buf); + m_bHasData = m_inBuffer.Size() > 0; } if (buf) { msg.packet = buf->packet; - msg.state = msg.state = ADAPTER_MESSAGE_STATE_INCOMING; + msg.state = ADAPTER_MESSAGE_STATE_INCOMING; delete buf; return true; } @@ -402,13 +412,13 @@ bool CUSBCECAdapterCommunication::ParseMessage(const CCECAdapterMessage &msg) uint16_t CUSBCECAdapterCommunication::GetFirmwareVersion(void) { - CLockObject lock(m_mutex); uint16_t iReturn(m_iFirmwareVersion); if (!IsRunning()) return iReturn; if (iReturn == CEC_FW_VERSION_UNKNOWN) { + CLockObject lock(m_mutex); CLibCEC::AddLog(CEC_LOG_DEBUG, "requesting the firmware version"); CCECAdapterMessage *output = new CCECAdapterMessage; @@ -620,6 +630,7 @@ void CUSBCECAdapterCommunication::AddData(uint8_t *data, size_t iLen) m_currentAdapterMessage.Clear(); m_bGotStart = false; m_bNextIsEscaped = false; + m_bHasData = true; m_rcvCondition.Signal(); } else if (m_bNextIsEscaped) @@ -652,6 +663,7 @@ bool CUSBCECAdapterCommunication::ReadFromDevice(uint32_t iTimeout, size_t iSize if (iBytesRead < 0 || iBytesRead > 256) { CLibCEC::AddLog(CEC_LOG_ERROR, "error reading from serial port: %s", m_port->GetError().c_str()); + StopThread(false); return false; } else if (iBytesRead > 0) @@ -665,7 +677,6 @@ bool CUSBCECAdapterCommunication::ReadFromDevice(uint32_t iTimeout, size_t iSize void CUSBCECAdapterCommunication::SendMessageToAdapter(CCECAdapterMessage *msg) { CLockObject adapterLock(m_mutex); - CLockObject lock(msg->mutex); if (msg->tries == 1) SetLineTimeout(msg->lineTimeout); else @@ -687,7 +698,7 @@ void CUSBCECAdapterCommunication::SendMessageToAdapter(CCECAdapterMessage *msg) CLibCEC::AddLog(CEC_LOG_DEBUG, "did not receive ack"); } } - msg->condition.Signal(); + msg->event.Signal(); } void CUSBCECAdapterCommunication::WriteNextCommand(void) @@ -696,3 +707,10 @@ void CUSBCECAdapterCommunication::WriteNextCommand(void) if (m_outBuffer.Pop(msg)) SendMessageToAdapter(msg); } + +CStdString CUSBCECAdapterCommunication::GetPortName(void) +{ + CStdString strName; + strName = m_port->GetName(); + return strName; +}