X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2FCECProcessor.cpp;h=8217e4edf93c340a4da94d7aa54d9947901cac03;hb=bb033e13e66263b9fa45e779e9a6435a85134e0e;hp=4bdc882ed9df6caeff264a54fc0a069eaf6ae6cb;hpb=0b71487197ed7281dda06f53ecaf846f1fd7e942;p=deb_libcec.git diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index 4bdc882..8217e4e 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -59,7 +59,7 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, libcec_configuration *configur { CreateBusDevices(); m_configuration.Clear(); - m_configuration.serverVersion = CEC_SERVER_VERSION_1_6_1; + m_configuration.serverVersion = CEC_SERVER_VERSION_1_6_2; SetConfiguration(configuration); if (m_configuration.tvVendor != CEC_VENDOR_UNKNOWN) @@ -77,7 +77,7 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, const char *strDeviceName, con m_iLastTransmission(0) { m_configuration.Clear(); - m_configuration.serverVersion = CEC_SERVER_VERSION_1_6_1; + m_configuration.serverVersion = CEC_SERVER_VERSION_1_6_2; // client version < 1.5.0 m_configuration.clientVersion = (uint32_t)CEC_CLIENT_VERSION_PRE_1_5; @@ -188,7 +188,17 @@ bool CCECProcessor::OpenConnection(const char *strPort, uint16_t iBaudRate, uint if (bReturn) { m_configuration.iFirmwareVersion = m_communication->GetFirmwareVersion(); - CLibCEC::AddLog(CEC_LOG_NOTICE, "connected to the CEC adapter. firmware version = %d, client version = %s", m_configuration.iFirmwareVersion, ToString((cec_client_version)m_configuration.clientVersion)); + m_configuration.iFirmwareBuildDate = m_communication->GetFirmwareBuildDate(); + CStdString strLog; + strLog.Format("connected to the CEC adapter. libCEC version = %s, client version = %s, firmware version = %d", ToString((cec_server_version)m_configuration.serverVersion), ToString((cec_client_version)m_configuration.clientVersion), m_configuration.iFirmwareVersion); + if (m_configuration.iFirmwareBuildDate > 0) + { + time_t buildTime = (time_t)m_configuration.iFirmwareBuildDate; + strLog.AppendFormat(", firmware build date: %s", asctime(gmtime(&buildTime))); + strLog = strLog.Left((int)strLog.length() - 1); // strip \n added by asctime + strLog.append(" +0000"); + } + CLibCEC::AddLog(CEC_LOG_NOTICE, strLog); } if (m_configuration.bGetSettingsFromROM == 1) @@ -399,7 +409,7 @@ bool CCECProcessor::ChangeDeviceType(cec_device_type from, cec_device_type to) newDevice->SetOSDName(previousDevice->GetOSDName(false)); previousDevice->SetOSDName(ToString(previousDevice->GetLogicalAddress())); - newDevice->SetPhysicalAddress(previousDevice->GetPhysicalAddress(false)); + newDevice->SetPhysicalAddress(previousDevice->GetPhysicalAddress()); previousDevice->SetPhysicalAddress(0xFFFF); newDevice->SetPowerStatus(previousDevice->GetPowerStatus(false)); @@ -515,7 +525,7 @@ bool CCECProcessor::SetActiveSource(cec_device_type type /* = CEC_DEVICE_TYPE_RE } m_busDevices[addr]->SetActiveSource(); - if (m_busDevices[addr]->GetPhysicalAddress(false) != 0xFFFF) + if (m_busDevices[addr]->GetPhysicalAddress() != 0xFFFF) bReturn = m_busDevices[addr]->ActivateSource(); return bReturn; @@ -526,12 +536,16 @@ bool CCECProcessor::SetActiveSource(uint16_t iStreamPath) bool bReturn(false); // suppress polls when searching for a device - CCECBusDevice *device = GetDeviceByPhysicalAddress(iStreamPath, false, true); + CCECBusDevice *device = GetDeviceByPhysicalAddress(iStreamPath); if (device) { device->SetActiveSource(); bReturn = true; } + else + { + CLibCEC::AddLog(CEC_LOG_DEBUG, "device with PA '%04x' not found", iStreamPath); + } return bReturn; } @@ -639,7 +653,7 @@ bool CCECProcessor::PhysicalAddressInUse(uint16_t iPhysicalAddress) { for (unsigned int iPtr = 0; iPtr < 15; iPtr++) { - if (m_busDevices[iPtr]->GetPhysicalAddress(false) == iPhysicalAddress) + if (m_busDevices[iPtr]->GetPhysicalAddress() == iPhysicalAddress) return true; } return false; @@ -800,19 +814,19 @@ uint8_t CCECProcessor::MuteAudio(bool bSendRelease /* = true */) return status; } -CCECBusDevice *CCECProcessor::GetDeviceByPhysicalAddress(uint16_t iPhysicalAddress, bool bRefresh /* = false */, bool bSuppressPoll /* = false */) const +CCECBusDevice *CCECProcessor::GetDeviceByPhysicalAddress(uint16_t iPhysicalAddress, bool bSuppressUpdate /* = true */) { - if (m_busDevices[m_configuration.logicalAddresses.primary]->GetPhysicalAddress(false) == iPhysicalAddress) - return m_busDevices[m_configuration.logicalAddresses.primary]; + CCECBusDevice *device(NULL); - CCECBusDevice *device = NULL; - for (unsigned int iPtr = 0; iPtr < 16; iPtr++) + // invalid PA + if (iPhysicalAddress == 0xFFFF) + return device; + + // check each device until we found a match + for (unsigned int iPtr = 0; !device && iPtr < 16; iPtr++) { - if (m_busDevices[iPtr]->GetPhysicalAddress(bRefresh, bSuppressPoll) == iPhysicalAddress) - { + if (m_busDevices[iPtr]->GetPhysicalAddress(bSuppressUpdate) == iPhysicalAddress) device = m_busDevices[iPtr]; - break; - } } return device; @@ -869,6 +883,13 @@ bool CCECProcessor::GetDeviceMenuLanguage(cec_logical_address iAddress, cec_menu return false; } +CStdString CCECProcessor::GetDeviceName(void) const +{ + CStdString strName; + strName = m_configuration.strDeviceName; + return strName; +} + uint64_t CCECProcessor::GetDeviceVendorId(cec_logical_address iAddress) { if (m_busDevices[iAddress]) @@ -879,7 +900,7 @@ uint64_t CCECProcessor::GetDeviceVendorId(cec_logical_address iAddress) uint16_t CCECProcessor::GetDevicePhysicalAddress(cec_logical_address iAddress) { if (m_busDevices[iAddress]) - return m_busDevices[iAddress]->GetPhysicalAddress(false); + return m_busDevices[iAddress]->GetPhysicalAddress(); return false; } @@ -1006,7 +1027,7 @@ bool CCECProcessor::IsPresentDeviceType(cec_device_type type) uint16_t CCECProcessor::GetPhysicalAddress(void) const { if (!m_configuration.logicalAddresses.IsEmpty() && m_busDevices[m_configuration.logicalAddresses.primary]) - return m_busDevices[m_configuration.logicalAddresses.primary]->GetPhysicalAddress(false); + return m_busDevices[m_configuration.logicalAddresses.primary]->GetPhysicalAddress(); return false; } @@ -1048,7 +1069,10 @@ bool CCECProcessor::StandbyDevices(cec_logical_address address /* = CECDEVICE_BR for (uint8_t iPtr = 0; iPtr <= 0xF; iPtr++) { if (m_configuration.powerOffDevices[iPtr]) + { + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - putting '%s' in standby mode", __FUNCTION__, ToString((cec_logical_address)iPtr)); bReturn &= m_busDevices[iPtr]->Standby(); + } } return bReturn; } @@ -1063,8 +1087,11 @@ bool CCECProcessor::PowerOnDevices(cec_logical_address address /* = CECDEVICE_BR bool bReturn(true); for (uint8_t iPtr = 0; iPtr <= 0xF; iPtr++) { - if (m_configuration.powerOffDevices[iPtr]) + if (m_configuration.wakeDevices[iPtr]) + { + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - powering on '%s'", __FUNCTION__, ToString((cec_logical_address)iPtr)); bReturn &= m_busDevices[iPtr]->PowerOn(); + } } return bReturn; } @@ -1470,51 +1497,6 @@ const char *CCECProcessor::ToString(const cec_server_version version) } } -void *CCECBusScan::Process(void) -{ - CCECBusDevice *device(NULL); - uint8_t iCounter(0); - - while (!IsStopped()) - { - if (++iCounter < 10) - { - Sleep(1000); - continue; - } - for (unsigned int iPtr = 0; iPtr <= 11 && !IsStopped(); iPtr++) - { - device = m_processor->m_busDevices[iPtr]; - WaitUntilIdle(); - if (device && device->GetStatus(true) == CEC_DEVICE_STATUS_PRESENT) - { - WaitUntilIdle(); - if (!IsStopped()) - device->GetVendorId(); - - WaitUntilIdle(); - if (!IsStopped()) - device->GetPowerStatus(true); - } - } - } - - return NULL; -} - -void CCECBusScan::WaitUntilIdle(void) -{ - if (IsStopped()) - return; - - int32_t iWaitTime = 3000 - (int32_t)(GetTimeMs() - m_processor->GetLastTransmission()); - while (iWaitTime > 0) - { - Sleep(iWaitTime); - iWaitTime = 3000 - (int32_t)(GetTimeMs() - m_processor->GetLastTransmission()); - } -} - bool CCECProcessor::StartBootloader(const char *strPort /* = NULL */) { if (!m_communication && strPort) @@ -1683,7 +1665,7 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) // client version 1.6.2 if (configuration->clientVersion >= CEC_CLIENT_VERSION_1_6_2) { - snprintf(m_configuration.strDeviceLanguage, 3, "%s", configuration->strDeviceLanguage); + memcpy(m_configuration.strDeviceLanguage, configuration->strDeviceLanguage, 3); } // ensure that there is at least 1 device type set @@ -1749,6 +1731,12 @@ bool CCECProcessor::GetCurrentConfiguration(libcec_configuration *configuration) configuration->bShutdownOnStandby = m_configuration.bShutdownOnStandby; } + // client version 1.6.2 + if (configuration->clientVersion >= CEC_CLIENT_VERSION_1_6_2) + { + memcpy(configuration->strDeviceLanguage, m_configuration.strDeviceLanguage, 3); + configuration->iFirmwareBuildDate = m_configuration.iFirmwareBuildDate; + } return true; } @@ -1764,7 +1752,7 @@ bool CCECProcessor::PersistConfiguration(libcec_configuration *configuration) void CCECProcessor::RescanActiveDevices(void) { - for (unsigned int iPtr = 0; iPtr < 16; iPtr++) + for (unsigned int iPtr = 0; iPtr < CECDEVICE_BROADCAST; iPtr++) m_busDevices[iPtr]->GetStatus(true); } @@ -1780,3 +1768,11 @@ bool CCECProcessor::GetDeviceInformation(const char *strPort, libcec_configurati m_communication = NULL; return true; } + +bool CCECProcessor::TransmitPendingActiveSourceCommands(void) +{ + bool bReturn(true); + for (unsigned int iPtr = 0; iPtr < CECDEVICE_BROADCAST; iPtr++) + bReturn &= m_busDevices[iPtr]->TransmitPendingActiveSourceCommands(); + return bReturn; +}