X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fadapter%2FUSBCECAdapterCommunication.cpp;h=4f477b90d6cfa9df43e29958d6f98bea92d43c4f;hb=ffdfabf02d6647c1745e3c92e7514c776d84c468;hp=e51a861f28579ebe6d5685c883032626e05add52;hpb=f99b4d1a21d99436a3e49733e7b83276a6362cbf;p=deb_libcec.git diff --git a/src/lib/adapter/USBCECAdapterCommunication.cpp b/src/lib/adapter/USBCECAdapterCommunication.cpp index e51a861..4f477b9 100644 --- a/src/lib/adapter/USBCECAdapterCommunication.cpp +++ b/src/lib/adapter/USBCECAdapterCommunication.cpp @@ -40,6 +40,8 @@ using namespace std; using namespace CEC; using namespace PLATFORM; +#define CEC_ADAPTER_PING_TIMEOUT 15000 + void *CUSBCECAdapterProcessor::Process(void) { cec_command command; @@ -221,6 +223,7 @@ void *CUSBCECAdapterCommunication::Process(void) cec_command command; command.Clear(); bool bCommandReceived(false); + CTimeout pingTimeout(CEC_ADAPTER_PING_TIMEOUT); while (!IsStopped()) { { @@ -233,6 +236,13 @@ void *CUSBCECAdapterCommunication::Process(void) if (!IsStopped() && bCommandReceived) m_messageProcessor->AddCommand(command); + /* ping the adapter every 15 seconds */ + if (pingTimeout.TimeLeft() == 0) + { + pingTimeout.Init(CEC_ADAPTER_PING_TIMEOUT); + PingAdapter(); + } + if (!IsStopped()) { Sleep(5); @@ -252,6 +262,9 @@ void *CUSBCECAdapterCommunication::Process(void) /* set the ackmask to 0 before closing the connection */ SetAckMaskInternal(0, true); + if (m_iFirmwareVersion >= 2) + SetControlledMode(false); + if (m_port) { delete m_port; @@ -556,6 +569,22 @@ bool CUSBCECAdapterCommunication::SetAckMaskInternal(uint16_t iMask, bool bWrite return bReturn; } +bool CUSBCECAdapterCommunication::PersistConfiguration(libcec_configuration *configuration) +{ + if (m_iFirmwareVersion < 2) + return false; + + bool bReturn(true); + bReturn &= SetAutoEnabled(true); + bReturn &= SetDefaultLogicalAddress(configuration->logicalAddresses.primary); + bReturn &= SetLogicalAddressMask(configuration->logicalAddresses.AckMask()); + bReturn &= SetPhysicalAddress(configuration->iPhysicalAddress); + bReturn &= SetCECVersion(CEC_VERSION_1_3A); + bReturn &= SetOSDName(configuration->strDeviceName); + if (bReturn) + bReturn = WriteEEPROM(); + return bReturn; +} bool CUSBCECAdapterCommunication::SetControlledMode(bool controlled) { @@ -571,7 +600,7 @@ bool CUSBCECAdapterCommunication::SetControlledMode(bool controlled) output->isTransmission = false; SendMessageToAdapter(output); - bool bWriteOk = output->state == ADAPTER_MESSAGE_STATE_SENT; + bool bWriteOk = output->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; delete output; if (!bWriteOk) { @@ -582,6 +611,183 @@ bool CUSBCECAdapterCommunication::SetControlledMode(bool controlled) return true; } +bool CUSBCECAdapterCommunication::SetAutoEnabled(bool enabled) +{ + CLockObject lock(m_mutex); + CLibCEC::AddLog(CEC_LOG_DEBUG, "turning autonomous mode %s", enabled ? "on" : "off"); + + CCECAdapterMessage *output = new CCECAdapterMessage; + + output->PushBack(MSGSTART); + output->PushEscaped(MSGCODE_SET_AUTO_ENABLED); + output->PushEscaped(enabled); + output->PushBack(MSGEND); + output->isTransmission = false; + + SendMessageToAdapter(output); + bool bWriteOk = output->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; + delete output; + if (!bWriteOk) + { + CLibCEC::AddLog(CEC_LOG_ERROR, "could not set autonomous mode"); + return false; + } + + return true; +} + +bool CUSBCECAdapterCommunication::SetDefaultLogicalAddress(cec_logical_address address) +{ + CLockObject lock(m_mutex); + CLibCEC::AddLog(CEC_LOG_DEBUG, "setting the default logical address to %1X", address); + + CCECAdapterMessage *output = new CCECAdapterMessage; + + output->PushBack(MSGSTART); + output->PushEscaped(MSGCODE_SET_DEFAULT_LOGICAL_ADDRESS); + output->PushEscaped((uint8_t) address); + output->PushBack(MSGEND); + output->isTransmission = false; + + SendMessageToAdapter(output); + bool bWriteOk = output->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; + delete output; + if (!bWriteOk) + { + CLibCEC::AddLog(CEC_LOG_ERROR, "could not set the default logical address"); + return false; + } + + return true; +} + +bool CUSBCECAdapterCommunication::SetLogicalAddressMask(uint16_t iMask) +{ + CLockObject lock(m_mutex); + CLibCEC::AddLog(CEC_LOG_DEBUG, "setting the logical address mask to %2X", iMask); + + CCECAdapterMessage *output = new CCECAdapterMessage; + + output->PushBack(MSGSTART); + output->PushEscaped(MSGCODE_SET_LOGICAL_ADDRESS_MASK); + output->PushEscaped(iMask >> 8); + output->PushEscaped((uint8_t)iMask); + output->PushBack(MSGEND); + output->isTransmission = false; + + SendMessageToAdapter(output); + bool bWriteOk = output->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; + delete output; + if (!bWriteOk) + { + CLibCEC::AddLog(CEC_LOG_ERROR, "could not set the logical address mask"); + return false; + } + + return true; +} + +bool CUSBCECAdapterCommunication::SetPhysicalAddress(uint16_t iPhysicalAddress) +{ + CLockObject lock(m_mutex); + CLibCEC::AddLog(CEC_LOG_DEBUG, "setting the physical address to %2X", iPhysicalAddress); + + CCECAdapterMessage *output = new CCECAdapterMessage; + + output->PushBack(MSGSTART); + output->PushEscaped(MSGCODE_SET_PHYSICAL_ADDRESS); + output->PushEscaped(iPhysicalAddress >> 8); + output->PushEscaped((uint8_t)iPhysicalAddress); + output->PushBack(MSGEND); + output->isTransmission = false; + + SendMessageToAdapter(output); + bool bWriteOk = output->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; + delete output; + if (!bWriteOk) + { + CLibCEC::AddLog(CEC_LOG_ERROR, "could not set the physical address"); + return false; + } + + return true; +} + +bool CUSBCECAdapterCommunication::SetCECVersion(cec_version version) +{ + CLockObject lock(m_mutex); + CLibCEC::AddLog(CEC_LOG_DEBUG, "setting the CEC version to %s", CLibCEC::GetInstance()->ToString(version)); + + CCECAdapterMessage *output = new CCECAdapterMessage; + + output->PushBack(MSGSTART); + output->PushEscaped(MSGCODE_SET_HDMI_VERSION); + output->PushEscaped((uint8_t)version); + output->PushBack(MSGEND); + output->isTransmission = false; + + SendMessageToAdapter(output); + bool bWriteOk = output->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; + delete output; + if (!bWriteOk) + { + CLibCEC::AddLog(CEC_LOG_ERROR, "could not set the CEC version"); + return false; + } + + return true; +} + +bool CUSBCECAdapterCommunication::SetOSDName(const char *strOSDName) +{ + CLockObject lock(m_mutex); + CLibCEC::AddLog(CEC_LOG_DEBUG, "setting the OSD name to %s", strOSDName); + + CCECAdapterMessage *output = new CCECAdapterMessage; + + output->PushBack(MSGSTART); + output->PushEscaped(MSGCODE_SET_OSD_NAME); + for (size_t iPtr = 0; iPtr < strlen(strOSDName); iPtr++) + output->PushEscaped(strOSDName[iPtr]); + output->PushBack(MSGEND); + output->isTransmission = false; + + SendMessageToAdapter(output); + bool bWriteOk = output->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; + delete output; + if (!bWriteOk) + { + CLibCEC::AddLog(CEC_LOG_ERROR, "could not set the OSD name"); + return false; + } + + return true; +} + +bool CUSBCECAdapterCommunication::WriteEEPROM(void) +{ + CLockObject lock(m_mutex); + CLibCEC::AddLog(CEC_LOG_DEBUG, "writing settings in the EEPROM"); + + CCECAdapterMessage *output = new CCECAdapterMessage; + + output->PushBack(MSGSTART); + output->PushEscaped(MSGCODE_WRITE_EEPROM); + output->PushBack(MSGEND); + output->isTransmission = false; + + SendMessageToAdapter(output); + bool bWriteOk = output->state == ADAPTER_MESSAGE_STATE_SENT_ACKED; + delete output; + if (!bWriteOk) + { + CLibCEC::AddLog(CEC_LOG_ERROR, "could not write the settings in the EEPROM"); + return false; + } + + return true; +} + bool CUSBCECAdapterCommunication::IsOpen(void) { return !IsStopped() && m_port->IsOpen() && IsRunning();