return bReturn;
}
-bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32_t iTimeoutMs /* = 10000 */, bool bSkipChecks /* = false */)
+bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32_t iTimeoutMs /* = 10000 */, bool bSkipChecks /* = false */, bool bStartListening /* = true */)
{
uint64_t iNow = GetTimeMs();
uint64_t iTimeout = iNow + iTimeoutMs;
if (!bSkipChecks && !CheckAdapter())
{
CLibCEC::AddLog(CEC_LOG_ERROR, "the adapter failed to pass basic checks");
- Close();
+ delete m_port;
+ m_port = NULL;
return false;
}
- else
+ else if (bStartListening)
{
if (CreateThread())
{
}
else
{
- Close();
+ delete m_port;
+ m_port = NULL;
CLibCEC::AddLog(CEC_LOG_ERROR, "could not create a communication thread");
+ return false;
}
}
+ else
+ {
+ delete m_port;
+ m_port = NULL;
+ }
- return false;
+ return true;
}
void CUSBCECAdapterCommunication::Close(void)
/* stop the message processor */
m_messageProcessor->StopThread();
delete m_messageProcessor;
+ m_messageProcessor = NULL;
/* notify all threads that are waiting on messages to be sent */
CCECAdapterMessage *msg(NULL);
m_port = NULL;
}
+ m_rcvCondition.Broadcast();
return NULL;
}
output->retryTimeout = iRetryLineTimeout;
output->tries = 0;
+ if (data.destination < 15)
{
CLockObject lock(m_mutex);
m_bWaitingForAck[data.destination] = true;
if (m_currentframe.ack == 0x1)
{
m_lastDestination = m_currentframe.destination;
- if (!m_bWaitingForAck[m_currentframe.destination])
- m_processor->HandlePoll(m_currentframe.initiator, m_currentframe.destination);
- else
- m_bWaitingForAck[m_currentframe.destination] = false;
+ if (m_currentframe.destination < 15)
+ {
+ if (!m_bWaitingForAck[m_currentframe.destination])
+ m_processor->HandlePoll(m_currentframe.initiator, m_currentframe.destination);
+ else
+ m_bWaitingForAck[m_currentframe.destination] = false;
+ }
}
}
break;
bool CUSBCECAdapterCommunication::GetConfiguration(libcec_configuration *configuration)
{
+ configuration->iFirmwareVersion = m_iFirmwareVersion;
if (m_iFirmwareVersion < 2)
return false;
if (msg.Message() == MSGCODE_FRAME_START && msg.IsACK())
{
- if (m_bWaitingForAck[msg.Initiator()])
+ if (msg.Initiator() < 15 && m_bWaitingForAck[msg.Initiator()])
m_bWaitingForAck[msg.Initiator()] = false;
- else
+ else if (msg.Initiator() < 15)
{
m_processor->HandlePoll(msg.Initiator(), msg.Destination());
m_lastDestination = msg.Initiator();
Write(output);
bool bWriteOk = output->state == (output->expectControllerAck ? ADAPTER_MESSAGE_STATE_SENT_ACKED : ADAPTER_MESSAGE_STATE_SENT);
+ cec_adapter_messagecode reply = output->reply;
+ delete output;
+
if (!bWriteOk)
{
CLibCEC::AddLog(CEC_LOG_ERROR, "'%s' failed", CCECAdapterMessage::ToString(msgCode));
- delete output;
- if (!bIsRetry && output->reply == MSGCODE_COMMAND_REJECTED && msgCode != MSGCODE_SET_CONTROLLED)
+ if (!bIsRetry && reply == MSGCODE_COMMAND_REJECTED && msgCode != MSGCODE_SET_CONTROLLED)
{
CLibCEC::AddLog(CEC_LOG_DEBUG, "setting controlled mode and retrying");
if (SetControlledMode(true))
return false;
}
- delete output;
return true;
}