X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2FCECProcessor.cpp;h=96e82ce626ff4f23f3e3287b0ead0cd26f2797df;hb=be54289b785d3318dd644223cacb9f281f3e2d3d;hp=63009a87202617066ab8ef96227a83381d6790b2;hpb=ba73be2f178539d2dd9c289c1b54f3b1e3db50c3;p=deb_libcec.git diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index 63009a8..96e82ce 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -60,13 +60,11 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, libcec_configuration *configur m_logicalAddresses.Clear(); CreateBusDevices(); m_configuration.Clear(); - m_configuration.serverVersion = CEC_SERVER_VERSION_1_5_0; + m_configuration.serverVersion = configuration->serverVersion; SetConfiguration(configuration); if (m_configuration.tvVendor != CEC_VENDOR_UNKNOWN) m_busDevices[CECDEVICE_TV]->ReplaceHandler(false); - - GetCurrentConfiguration(configuration); } CCECProcessor::CCECProcessor(CLibCEC *controller, const char *strDeviceName, const cec_device_type_list &types, uint16_t iPhysicalAddress) : @@ -80,7 +78,7 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, const char *strDeviceName, con m_iLastTransmission(0) { m_configuration.Clear(); - m_configuration.serverVersion = CEC_SERVER_VERSION_1_5_0; + m_configuration.serverVersion = CEC_SERVER_VERSION_1_5_1; // client version < 1.5.0 m_configuration.clientVersion = (uint32_t)CEC_CLIENT_VERSION_PRE_1_5; @@ -183,16 +181,15 @@ bool CCECProcessor::OpenConnection(const char *strPort, uint16_t iBaudRate, uint return bReturn; } - uint64_t iNow = GetTimeMs(); - uint64_t iTarget = iTimeoutMs > 0 ? iNow + iTimeoutMs : iNow + CEC_DEFAULT_TRANSMIT_WAIT; + CTimeout timeout(iTimeoutMs > 0 ? iTimeoutMs : CEC_DEFAULT_TRANSMIT_WAIT); /* open a new connection */ unsigned iConnectTry(0); - while (iNow < iTarget && (bReturn = m_communication->Open(this, iTimeoutMs)) == false) + while (timeout.TimeLeft() > 0 && (bReturn = m_communication->Open(this, (timeout.TimeLeft() / CEC_CONNECT_TRIES))) == false) { CLibCEC::AddLog(CEC_LOG_ERROR, "could not open a connection (try %d)", ++iConnectTry); - Sleep(500); - iNow = GetTimeMs(); + m_communication->Close(); + CEvent::Sleep(1000); } if (bReturn) @@ -573,7 +570,6 @@ bool CCECProcessor::SetHDMIPort(cec_logical_address iBaseDevice, uint8_t iPort, CLockObject lock(m_mutex); m_configuration.baseDevice = iBaseDevice; m_configuration.iHDMIPort = iPort; - m_configuration.bAutodetectAddress = false; } if (!IsRunning() && !bForce) @@ -679,11 +675,7 @@ bool CCECProcessor::SetPhysicalAddress(uint16_t iPhysicalAddress, bool bSendUpda { CLockObject lock(m_mutex); m_configuration.iPhysicalAddress = iPhysicalAddress; - if (m_configuration.bAutodetectAddress) - { - m_configuration.baseDevice = CECDEVICE_UNKNOWN; - m_configuration.iHDMIPort = 0; - } + CLibCEC::AddLog(CEC_LOG_DEBUG, "setting physical address to '%4x'", iPhysicalAddress); if (!m_logicalAddresses.IsEmpty()) { @@ -886,6 +878,8 @@ bool CCECProcessor::Transmit(const cec_command &data) uint8_t iMaxTries(0); { CLockObject lock(m_mutex); + if (IsStopped()) + return false; LogOutput(data); m_iLastTransmission = GetTimeMs(); if (!m_communication || !m_communication->IsOpen()) @@ -1363,6 +1357,8 @@ const char *CCECProcessor::ToString(const cec_vendor_id vendor) return "Philips"; case CEC_VENDOR_SONY: return "Sony"; + case CEC_VENDOR_TOSHIBA: + return "Toshiba"; default: return "Unknown"; } @@ -1376,6 +1372,8 @@ const char *CCECProcessor::ToString(const cec_client_version version) return "pre-1.5"; case CEC_CLIENT_VERSION_1_5_0: return "1.5.0"; + case CEC_CLIENT_VERSION_1_5_1: + return "1.5.1"; default: return "Unknown"; } @@ -1389,6 +1387,8 @@ const char *CCECProcessor::ToString(const cec_server_version version) return "pre-1.5"; case CEC_SERVER_VERSION_1_5_0: return "1.5.0"; + case CEC_SERVER_VERSION_1_5_1: + return "1.5.1"; default: return "Unknown"; } @@ -1439,9 +1439,31 @@ void CCECBusScan::WaitUntilIdle(void) } } -bool CCECProcessor::StartBootloader(void) +bool CCECProcessor::StartBootloader(const char *strPort /* = NULL */) { - return m_communication->StartBootloader(); + if (!m_communication && strPort) + { + bool bReturn(false); + IAdapterCommunication *comm = new CUSBCECAdapterCommunication(this, strPort); + CTimeout timeout(10000); + int iConnectTry(0); + while (timeout.TimeLeft() > 0 && (bReturn = comm->Open(NULL, (timeout.TimeLeft() / CEC_CONNECT_TRIES)), true) == false) + { + CLibCEC::AddLog(CEC_LOG_ERROR, "could not open a connection (try %d)", ++iConnectTry); + comm->Close(); + Sleep(500); + } + if (comm->IsOpen()) + { + bReturn = comm->StartBootloader(); + delete comm; + } + return bReturn; + } + else + { + return m_communication->StartBootloader(); + } } bool CCECProcessor::PingAdapter(void) @@ -1467,9 +1489,9 @@ bool CCECProcessor::SetStreamPath(uint16_t iPhysicalAddress) bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) { - bool bReinit(false); + bool bReinit(false); CCECBusDevice *primary = IsRunning() ? GetPrimaryDevice() : NULL; - cec_device_type oldPrimaryType = primary ? primary->GetType() : CEC_DEVICE_TYPE_RECORDING_DEVICE; + cec_device_type oldPrimaryType = primary ? primary->GetType() : CEC_DEVICE_TYPE_RECORDING_DEVICE; m_configuration.clientVersion = configuration->clientVersion; // client version 1.5.0 @@ -1478,51 +1500,59 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) bool bDeviceTypeChanged = IsRunning () && m_configuration.deviceTypes != configuration->deviceTypes; m_configuration.deviceTypes = configuration->deviceTypes; + bool bPhysicalAddressChanged(false); + // autodetect address - uint16_t iPhysicalAddress = IsRunning() && configuration->bAutodetectAddress ? m_communication->GetPhysicalAddress() : 0; - bool bPhysicalAutodetected = IsRunning() && configuration->bAutodetectAddress && iPhysicalAddress != m_configuration.iPhysicalAddress && iPhysicalAddress != 0; - if (bPhysicalAutodetected) + bool bPhysicalAutodetected(false); + if (IsRunning() && configuration->bAutodetectAddress == 1) { - m_configuration.iPhysicalAddress = iPhysicalAddress; - m_configuration.bAutodetectAddress = true; - } - else - { - m_configuration.bAutodetectAddress = false; + uint16_t iPhysicalAddress = m_communication->GetPhysicalAddress(); + if (iPhysicalAddress != 0) + { + if (IsRunning()) + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - autodetected physical address '%4x'", __FUNCTION__, iPhysicalAddress); + bPhysicalAddressChanged = (m_configuration.iPhysicalAddress != iPhysicalAddress); + m_configuration.iPhysicalAddress = iPhysicalAddress; + m_configuration.iHDMIPort = 0; + m_configuration.baseDevice = CECDEVICE_UNKNOWN; + bPhysicalAutodetected = true; + } } // physical address - bool bPhysicalAddressChanged(false); if (!bPhysicalAutodetected) { - bPhysicalAddressChanged = IsRunning() && m_configuration.iPhysicalAddress != configuration->iPhysicalAddress; + if (configuration->iPhysicalAddress != 0) + bPhysicalAddressChanged = IsRunning() && m_configuration.iPhysicalAddress != configuration->iPhysicalAddress; + if (IsRunning()) + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - using physical address '%4x'", __FUNCTION__, configuration->iPhysicalAddress); m_configuration.iPhysicalAddress = configuration->iPhysicalAddress; } - // base device bool bHdmiPortChanged(false); if (!bPhysicalAutodetected && !bPhysicalAddressChanged) { + // base device bHdmiPortChanged = IsRunning() && m_configuration.baseDevice != configuration->baseDevice; + if (IsRunning()) + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - using base device '%x'", __FUNCTION__, (int)configuration->baseDevice); m_configuration.baseDevice = configuration->baseDevice; - } - else - { - m_configuration.baseDevice = CECDEVICE_UNKNOWN; - } - // hdmi port - if (!bPhysicalAutodetected && !bPhysicalAddressChanged) - { + // hdmi port bHdmiPortChanged |= IsRunning() && m_configuration.iHDMIPort != configuration->iHDMIPort; + if (IsRunning()) + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - using HDMI port '%d'", __FUNCTION__, configuration->iHDMIPort); m_configuration.iHDMIPort = configuration->iHDMIPort; } else { - m_configuration.iHDMIPort = 0; + if (IsRunning()) + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - resetting HDMI port and base device to defaults", __FUNCTION__); + m_configuration.baseDevice = CECDEVICE_UNKNOWN; + m_configuration.iHDMIPort = 0; } - bReinit = bPhysicalAddressChanged || bHdmiPortChanged || bDeviceTypeChanged || bPhysicalAutodetected; + bReinit = bPhysicalAddressChanged || bHdmiPortChanged || bDeviceTypeChanged; // device name snprintf(m_configuration.strDeviceName, 13, "%s", configuration->strDeviceName); @@ -1556,19 +1586,28 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) m_configuration.bPowerOffScreensaver = configuration->bPowerOffScreensaver; m_configuration.bPowerOffOnStandby = configuration->bPowerOffOnStandby; + // client version 1.5.1 + if (configuration->clientVersion >= CEC_CLIENT_VERSION_1_5_1) + m_configuration.bSendInactiveSource = configuration->bSendInactiveSource; + // ensure that there is at least 1 device type set if (m_configuration.deviceTypes.IsEmpty()) m_configuration.deviceTypes.Add(CEC_DEVICE_TYPE_RECORDING_DEVICE); if (bReinit) { - if (bDeviceTypeChanged) - return ChangeDeviceType(oldPrimaryType, m_configuration.deviceTypes[0]); - else if (bPhysicalAddressChanged) - return SetPhysicalAddress(m_configuration.iPhysicalAddress); + if (bDeviceTypeChanged) + return ChangeDeviceType(oldPrimaryType, m_configuration.deviceTypes[0]); + else if (bPhysicalAddressChanged) + return SetPhysicalAddress(m_configuration.iPhysicalAddress); else return SetHDMIPort(m_configuration.baseDevice, m_configuration.iHDMIPort); } + else if (m_configuration.bActivateSource == 1 && IsRunning() && !IsActiveSource(m_logicalAddresses.primary)) + { + // activate the source if we're not already the active source + SetActiveSource(m_configuration.deviceTypes.types[0]); + } return true; } @@ -1594,6 +1633,10 @@ bool CCECProcessor::GetCurrentConfiguration(libcec_configuration *configuration) configuration->bPowerOffScreensaver = m_configuration.bPowerOffScreensaver; configuration->bPowerOffOnStandby = m_configuration.bPowerOffOnStandby; + // client version 1.5.1 + if (configuration->clientVersion >= CEC_CLIENT_VERSION_1_5_1) + configuration->bSendInactiveSource = m_configuration.bSendInactiveSource; + return true; }