From 06bfd4d72adaaf83d211f1104e71fe5f2b196442 Mon Sep 17 00:00:00 2001 From: Lars Op den Kamp Date: Tue, 1 Nov 2011 20:38:28 +0100 Subject: [PATCH] cec: moved SetAckMask() back to CCECProcessor, so the result can be processed properly --- src/lib/AdapterCommunication.cpp | 29 ++------------- src/lib/AdapterCommunication.h | 4 +- src/lib/CECProcessor.cpp | 64 ++++++++++++++++++++------------ src/lib/CECProcessor.h | 7 ++-- 4 files changed, 49 insertions(+), 55 deletions(-) diff --git a/src/lib/AdapterCommunication.cpp b/src/lib/AdapterCommunication.cpp index 8fc70cd..e94e8c0 100644 --- a/src/lib/AdapterCommunication.cpp +++ b/src/lib/AdapterCommunication.cpp @@ -80,6 +80,9 @@ CCECAdapterMessage::CCECAdapterMessage(const cec_command &command) push_back(MSGEND); } + + // set timeout + transmit_timeout = command.transmit_timeout; } CCECAdapterMessage &CCECAdapterMessage::operator =(const CCECAdapterMessage &msg) @@ -458,32 +461,6 @@ bool CAdapterCommunication::StartBootloader(void) return true; } -bool CAdapterCommunication::SetAckMask(uint16_t iMask) -{ - if (!IsRunning()) - return false; - - CStdString strLog; - strLog.Format("setting ackmask to %2x", iMask); - m_controller->AddLog(CEC_LOG_DEBUG, strLog.c_str()); - - CCECAdapterMessagePtr output(new CCECAdapterMessage); - - output->push_back(MSGSTART); - output->push_escaped(MSGCODE_SET_ACK_MASK); - output->push_escaped(iMask >> 8); - output->push_escaped((uint8_t)iMask); - output->push_back(MSGEND); - - if (!Write(output)) - { - m_controller->AddLog(CEC_LOG_ERROR, "could not set the ackmask"); - return false; - } - - return true; -} - bool CAdapterCommunication::PingAdapter(void) { if (!IsRunning()) diff --git a/src/lib/AdapterCommunication.h b/src/lib/AdapterCommunication.h index 21a775d..ef5e0aa 100644 --- a/src/lib/AdapterCommunication.h +++ b/src/lib/AdapterCommunication.h @@ -64,7 +64,7 @@ namespace CEC uint8_t operator[](uint8_t pos) const { return packet[pos]; } uint8_t at(uint8_t pos) const { return packet[pos]; } uint8_t size(void) const { return packet.size; } - void clear(void) { state = ADAPTER_MESSAGE_STATE_UNKNOWN; packet.clear(); } + void clear(void) { state = ADAPTER_MESSAGE_STATE_UNKNOWN; transmit_timeout = 0; packet.clear(); } void shift(uint8_t iShiftBy) { packet.shift(iShiftBy); } void push_back(uint8_t add) { packet.push_back(add); } cec_adapter_messagecode message(void) const { return packet.size >= 1 ? (cec_adapter_messagecode) (packet.at(0) & ~(MSGCODE_FRAME_EOM | MSGCODE_FRAME_ACK)) : MSGCODE_NOTHING; } @@ -77,6 +77,7 @@ namespace CEC cec_datapacket packet; cec_adapter_message_state state; + int32_t transmit_timeout; CMutex mutex; CCondition condition; }; @@ -102,7 +103,6 @@ namespace CEC void *Process(void); bool StartBootloader(void); - bool SetAckMask(uint16_t iMask); private: void WriteNextCommand(void); diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index 35fb4aa..09e1ce4 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -46,8 +46,7 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, CAdapterCommunication *serComm m_strDeviceName(strDeviceName), m_communication(serComm), m_controller(controller), - m_bMonitor(false), - m_bLogicalAddressSet(false) + m_bMonitor(false) { for (int iPtr = 0; iPtr < 16; iPtr++) m_busDevices[iPtr] = new CCECBusDevice(this, (cec_logical_address) iPtr, iPtr == iLogicalAddress ? iPhysicalAddress : 0); @@ -72,12 +71,6 @@ bool CCECProcessor::Start(void) return false; } - if (!SetLogicalAddress(m_iLogicalAddress)) - { - m_controller->AddLog(CEC_LOG_ERROR, "could not set the logical address"); - return false; - } - if (CreateThread()) { if (!m_startCondition.Wait(&m_mutex)) @@ -104,7 +97,7 @@ void *CCECProcessor::Process(void) cec_command command; CCECAdapterMessage msg; - m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress); + SetAckMask(0x1 << (uint8_t)m_iLogicalAddress); while (!IsStopped()) { @@ -170,21 +163,18 @@ void CCECProcessor::LogOutput(const cec_command &data) m_controller->AddLog(CEC_LOG_TRAFFIC, strTx.c_str()); } -bool CCECProcessor::SetLogicalAddress(cec_logical_address iLogicalAddress /* = CECDEVICE_UNKNOWN */) +bool CCECProcessor::SetLogicalAddress(cec_logical_address iLogicalAddress) { - if (iLogicalAddress != CECDEVICE_UNKNOWN) + if (m_iLogicalAddress != iLogicalAddress) { CStdString strLog; strLog.Format("<< setting logical address to %1x", iLogicalAddress); m_controller->AddLog(CEC_LOG_NOTICE, strLog.c_str()); m_iLogicalAddress = iLogicalAddress; - m_bLogicalAddressSet = false; + return SetAckMask(0x1 << (uint8_t)m_iLogicalAddress); } - if (!m_bLogicalAddressSet && m_iLogicalAddress != CECDEVICE_UNKNOWN) - m_bLogicalAddressSet = m_communication && m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress); - - return m_bLogicalAddressSet; + return true; } bool CCECProcessor::SetPhysicalAddress(uint16_t iPhysicalAddress) @@ -205,9 +195,9 @@ bool CCECProcessor::SwitchMonitoring(bool bEnable) m_bMonitor = bEnable; if (bEnable) - return m_communication && m_communication->SetAckMask(0); + return SetAckMask(0); else - return m_communication && m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress); + return SetAckMask(0x1 << (uint8_t)m_iLogicalAddress); } cec_version CCECProcessor::GetDeviceCecVersion(cec_logical_address iAddress) @@ -241,13 +231,15 @@ cec_power_status CCECProcessor::GetDevicePowerStatus(cec_logical_address iAddres bool CCECProcessor::Transmit(const cec_command &data) { - SetLogicalAddress(); - - bool bReturn(false); LogOutput(data); CCECAdapterMessagePtr output(new CCECAdapterMessage(data)); + return Transmit(output); +} +bool CCECProcessor::Transmit(CCECAdapterMessagePtr output) +{ + bool bReturn(false); CLockObject lock(&m_mutex); { CLockObject msgLock(&output->mutex); @@ -263,9 +255,9 @@ bool CCECProcessor::Transmit(const cec_command &data) } } - if (data.transmit_timeout > 0) + if (output->transmit_timeout > 0) { - if ((bReturn = WaitForTransmitSucceeded(output->size(), data.transmit_timeout)) == false) + if ((bReturn = WaitForTransmitSucceeded(output->size(), output->transmit_timeout)) == false) m_controller->AddLog(CEC_LOG_ERROR, "did not receive ack"); } else @@ -312,7 +304,8 @@ bool CCECProcessor::WaitForTransmitSucceeded(uint8_t iLength, uint32_t iTimeout switch(msg.message()) { case MSGCODE_COMMAND_ACCEPTED: - iPacketsLeft--; + if (iPacketsLeft > 0) + iPacketsLeft--; break; case MSGCODE_TRANSMIT_SUCCEEDED: bTransmitSucceeded = (iPacketsLeft == 0); @@ -409,3 +402,26 @@ void CCECProcessor::AddLog(cec_log_level level, const CStdString &strMessage) { m_controller->AddLog(level, strMessage); } + +bool CCECProcessor::SetAckMask(uint16_t iMask) +{ + CStdString strLog; + strLog.Format("setting ackmask to %2x", iMask); + m_controller->AddLog(CEC_LOG_DEBUG, strLog.c_str()); + + CCECAdapterMessagePtr output(new CCECAdapterMessage); + + output->push_back(MSGSTART); + output->push_escaped(MSGCODE_SET_ACK_MASK); + output->push_escaped(iMask >> 8); + output->push_escaped((uint8_t)iMask); + output->push_back(MSGEND); + + if (!Transmit(output)) + { + m_controller->AddLog(CEC_LOG_ERROR, "could not set the ackmask"); + return false; + } + + return true; +} diff --git a/src/lib/CECProcessor.h b/src/lib/CECProcessor.h index 8569949..e2793a3 100644 --- a/src/lib/CECProcessor.h +++ b/src/lib/CECProcessor.h @@ -65,11 +65,12 @@ namespace CEC virtual bool SetActiveView(void); virtual bool SetInactiveView(void); - virtual bool SetLogicalAddress(cec_logical_address iLogicalAddress = CECDEVICE_UNKNOWN); + virtual bool SetLogicalAddress(cec_logical_address iLogicalAddress); virtual bool SetPhysicalAddress(uint16_t iPhysicalAddress); virtual bool SwitchMonitoring(bool bEnable); - virtual bool Transmit(const cec_command &data); + virtual bool Transmit(const cec_command &data); + virtual bool Transmit(CCECAdapterMessagePtr output); virtual void TransmitAbort(cec_logical_address address, cec_opcode opcode, ECecAbortReason reason = CEC_ABORT_REASON_UNRECOGNIZED_OPCODE); virtual void SetCurrentButton(cec_user_control_code iButtonCode); @@ -80,6 +81,7 @@ namespace CEC CCECBusDevice *m_busDevices[16]; private: + bool SetAckMask(uint16_t iMask); void LogOutput(const cec_command &data); bool WaitForTransmitSucceeded(uint8_t iLength, uint32_t iTimeout = 1000); bool ParseMessage(const CCECAdapterMessage &msg); @@ -93,6 +95,5 @@ namespace CEC CAdapterCommunication *m_communication; CLibCEC *m_controller; bool m_bMonitor; - bool m_bLogicalAddressSet; }; }; -- 2.34.1