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) :
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;
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);
+ m_communication->Close();
Sleep(500);
- iNow = GetTimeMs();
}
if (bReturn)
CLockObject lock(m_mutex);
m_configuration.baseDevice = iBaseDevice;
m_configuration.iHDMIPort = iPort;
- m_configuration.bAutodetectAddress = false;
}
if (!IsRunning() && !bForce)
{
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())
{
uint8_t iMaxTries(0);
{
CLockObject lock(m_mutex);
+ if (IsStopped())
+ return false;
LogOutput(data);
m_iLastTransmission = GetTimeMs();
if (!m_communication || !m_communication->IsOpen())
return "Philips";
case CEC_VENDOR_SONY:
return "Sony";
+ case CEC_VENDOR_TOSHIBA:
+ return "Toshiba";
default:
return "Unknown";
}
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";
}
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";
}
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
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);
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);
}
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;
}