From: Lars Op den Kamp Date: Tue, 24 Jan 2012 23:15:11 +0000 (+0100) Subject: cec: move WaitForTransmissionSucceeded() to CAdapterCommunication and wait for MSGCOD... X-Git-Tag: upstream/2.2.0~1^2~39^2~17 X-Git-Url: https://git.piment-noir.org/?p=deb_libcec.git;a=commitdiff_plain;h=5dcf9f25c9b94a9c7a1892cce6e94857ae413a48 cec: move WaitForTransmissionSucceeded() to CAdapterCommunication and wait for MSGCODE_COMMAND_ACCEPTED too when pinging the adapter, starting the bootloader and setting the ackmask --- diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index 3a5742b..cb4fe81 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -861,36 +861,19 @@ bool CCECProcessor::Transmit(CCECAdapterMessage *output) bool bReturn(false); CLockObject lock(m_mutex); { + if (!m_communication) + return bReturn; + m_iLastTransmission = GetTimeMs(); m_communication->SetLineTimeout(m_iStandardLineTimeout); - output->tries = 1; + output->tries = 0; do { if (output->tries > 0) m_communication->SetLineTimeout(m_iRetryLineTimeout); - - CLockObject msgLock(output->mutex); - if (!m_communication || !m_communication->Write(output)) - return bReturn; - else - { - output->condition.Wait(output->mutex); - if (output->state != ADAPTER_MESSAGE_STATE_SENT) - { - m_controller->AddLog(CEC_LOG_ERROR, "command was not sent"); - return bReturn; - } - } - - if (output->transmit_timeout > 0) - { - if ((bReturn = m_communication->WaitForTransmitSucceeded(output)) == false) - m_controller->AddLog(CEC_LOG_DEBUG, "did not receive ack"); - } - else - bReturn = true; - }while (output->transmit_timeout > 0 && output->NeedsRetry() && ++output->tries < output->maxTries); + bReturn = m_communication->Write(output); + }while (!bReturn && output->transmit_timeout > 0 && output->NeedsRetry() && ++output->tries < output->maxTries); } m_communication->SetLineTimeout(m_iStandardLineTimeout); @@ -1036,25 +1019,7 @@ void CCECProcessor::AddLog(cec_log_level level, const CStdString &strMessage) bool CCECProcessor::SetAckMask(uint16_t iMask) { - bool bReturn(false); - CStdString strLog; - strLog.Format("setting ackmask to %2x", iMask); - m_controller->AddLog(CEC_LOG_DEBUG, strLog.c_str()); - - CCECAdapterMessage *output = new CCECAdapterMessage; - - output->PushBack(MSGSTART); - output->PushEscaped(MSGCODE_SET_ACK_MASK); - output->PushEscaped(iMask >> 8); - output->PushEscaped((uint8_t)iMask); - output->PushBack(MSGEND); - - if ((bReturn = Transmit(output)) == false) - m_controller->AddLog(CEC_LOG_ERROR, "could not set the ackmask"); - - delete output; - - return bReturn; + return m_communication->SetAckMask(iMask); } bool CCECProcessor::TransmitKeypress(cec_logical_address iDestination, cec_user_control_code key, bool bWait /* = true */) diff --git a/src/lib/adapter/AdapterCommunication.cpp b/src/lib/adapter/AdapterCommunication.cpp index a792a1d..821a4f2 100644 --- a/src/lib/adapter/AdapterCommunication.cpp +++ b/src/lib/adapter/AdapterCommunication.cpp @@ -140,9 +140,30 @@ void *CAdapterCommunication::Process(void) bool CAdapterCommunication::Write(CCECAdapterMessage *data) { - data->state = ADAPTER_MESSAGE_STATE_WAITING; + bool bReturn(false); + + CLockObject lock(data->mutex); + data->state = ADAPTER_MESSAGE_STATE_WAITING_TO_BE_SENT; m_outBuffer.Push(data); - return true; + data->condition.Wait(data->mutex); + + if (data->state != ADAPTER_MESSAGE_STATE_SENT) + { + m_processor->AddLog(CEC_LOG_ERROR, "command was not sent"); + } + if (WaitForTransmitSucceeded(data)) + { + if (data->isTransmission) + data->state = ADAPTER_MESSAGE_STATE_SENT_ACKED; + bReturn = true; + } + else + { + data->state = ADAPTER_MESSAGE_STATE_SENT_NOT_ACKED; + m_processor->AddLog(CEC_LOG_DEBUG, "did not receive ack"); + } + + return bReturn; } bool CAdapterCommunication::Read(CCECAdapterMessage &msg, uint32_t iTimeout) @@ -195,7 +216,7 @@ bool CAdapterCommunication::Read(CCECAdapterMessage &msg, uint32_t iTimeout) } if (bGotFullMessage) - msg.state = ADAPTER_MESSAGE_STATE_RECEIVED; + msg.state = ADAPTER_MESSAGE_STATE_INCOMING; return bGotFullMessage; } @@ -217,11 +238,10 @@ bool CAdapterCommunication::StartBootloader(void) output->PushBack(MSGSTART); output->PushEscaped(MSGCODE_START_BOOTLOADER); output->PushBack(MSGEND); + output->isTransmission = false; - CLockObject lock(output->mutex); - if (Write(output)) - output->condition.Wait(output->mutex); - bReturn = output->state == ADAPTER_MESSAGE_STATE_SENT; + if ((bReturn = Write(output)) == false) + m_processor->AddLog(CEC_LOG_ERROR, "could not start the bootloader"); delete output; return bReturn; @@ -239,11 +259,10 @@ bool CAdapterCommunication::PingAdapter(void) output->PushBack(MSGSTART); output->PushEscaped(MSGCODE_PING); output->PushBack(MSGEND); + output->isTransmission = false; - CLockObject lock(output->mutex); - if (Write(output)) - output->condition.Wait(output->mutex); - bReturn = output->state == ADAPTER_MESSAGE_STATE_SENT; + if ((bReturn = Write(output)) == false) + m_processor->AddLog(CEC_LOG_ERROR, "could not ping the adapter"); delete output; return bReturn; @@ -261,6 +280,7 @@ bool CAdapterCommunication::SetLineTimeout(uint8_t iTimeout) output->PushEscaped(MSGCODE_TRANSMIT_IDLETIME); output->PushEscaped(iTimeout); output->PushBack(MSGEND); + output->isTransmission = false; if ((bReturn = Write(output)) == false) m_processor->AddLog(CEC_LOG_ERROR, "could not set the idletime"); @@ -270,6 +290,29 @@ bool CAdapterCommunication::SetLineTimeout(uint8_t iTimeout) return bReturn; } +bool CAdapterCommunication::SetAckMask(uint16_t iMask) +{ + bool bReturn(false); + CStdString strLog; + strLog.Format("setting ackmask to %2x", iMask); + m_processor->AddLog(CEC_LOG_DEBUG, strLog.c_str()); + + CCECAdapterMessage *output = new CCECAdapterMessage; + + output->PushBack(MSGSTART); + output->PushEscaped(MSGCODE_SET_ACK_MASK); + output->PushEscaped(iMask >> 8); + output->PushEscaped((uint8_t)iMask); + output->PushBack(MSGEND); + output->isTransmission = false; + + if ((bReturn = Write(output)) == false) + m_processor->AddLog(CEC_LOG_ERROR, "could not set the ackmask"); + delete output; + + return bReturn; +} + bool CAdapterCommunication::IsOpen(void) { return !IsStopped() && m_port->IsOpen() && IsRunning(); @@ -322,6 +365,8 @@ bool CAdapterCommunication::WaitForTransmitSucceeded(CCECAdapterMessage *message m_processor->AddLog(CEC_LOG_DEBUG, msg.ToString()); if (iPacketsLeft > 0) iPacketsLeft--; + if (!message->isTransmission && iPacketsLeft == 0) + bTransmitSucceeded = true; break; case MSGCODE_TRANSMIT_SUCCEEDED: m_processor->AddLog(CEC_LOG_DEBUG, msg.ToString()); diff --git a/src/lib/adapter/AdapterCommunication.h b/src/lib/adapter/AdapterCommunication.h index 51734e1..bdc3de3 100644 --- a/src/lib/adapter/AdapterCommunication.h +++ b/src/lib/adapter/AdapterCommunication.h @@ -62,6 +62,7 @@ namespace CEC bool SetLineTimeout(uint8_t iTimeout); bool StartBootloader(void); + bool SetAckMask(uint16_t iMask); bool WaitForTransmitSucceeded(CCECAdapterMessage *message); diff --git a/src/lib/adapter/AdapterMessage.h b/src/lib/adapter/AdapterMessage.h index 4fadbed..26acd90 100644 --- a/src/lib/adapter/AdapterMessage.h +++ b/src/lib/adapter/AdapterMessage.h @@ -36,9 +36,11 @@ namespace CEC typedef enum cec_adapter_message_state { ADAPTER_MESSAGE_STATE_UNKNOWN = 0, - ADAPTER_MESSAGE_STATE_WAITING, + ADAPTER_MESSAGE_STATE_WAITING_TO_BE_SENT, ADAPTER_MESSAGE_STATE_SENT, - ADAPTER_MESSAGE_STATE_RECEIVED, + ADAPTER_MESSAGE_STATE_SENT_NOT_ACKED, + ADAPTER_MESSAGE_STATE_SENT_ACKED, + ADAPTER_MESSAGE_STATE_INCOMING, ADAPTER_MESSAGE_STATE_ERROR } cec_adapter_message_state; @@ -97,6 +99,7 @@ namespace CEC // set timeout transmit_timeout = command.transmit_timeout; + //TODO } CCECAdapterMessage &operator=(const CCECAdapterMessage &msg) @@ -258,6 +261,7 @@ namespace CEC maxTries = CEC_DEFAULT_TRANSMIT_RETRIES + 1; tries = 0; reply = MSGCODE_NOTHING; + isTransmission = true; } void Shift(uint8_t iShiftBy) @@ -349,6 +353,7 @@ namespace CEC cec_datapacket packet; cec_adapter_message_state state; int32_t transmit_timeout; + bool isTransmission; PLATFORM::CMutex mutex; PLATFORM::CCondition condition; };