X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2FCECProcessor.cpp;h=a44b81eb6a314167395916af458c7ab3d26c91f4;hb=7f913ac9bcf453b455321397e675bb8e529e049e;hp=97f57a47ac67a2758850e6bdfbab5fcb08eb04ca;hpb=fe6911e11baf213182f61b638a27f7cf3a22d64f;p=deb_libcec.git diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index 97f57a4..a44b81e 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -1,7 +1,7 @@ /* * This file is part of the libCEC(R) library. * - * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved. + * libCEC(R) is Copyright (C) 2011-2013 Pulse-Eight Limited. All rights reserved. * libCEC(R) is an original work, containing original code. * * libCEC(R) is a trademark of Pulse-Eight Limited. @@ -53,6 +53,7 @@ using namespace PLATFORM; #define CEC_PROCESSOR_SIGNAL_WAIT_TIME 1000 #define ACTIVE_SOURCE_CHECK_INTERVAL 500 +#define TV_PRESENT_CHECK_INTERVAL 30000 #define ToString(x) CCECTypeUtils::ToString(x) @@ -216,6 +217,7 @@ void *CCECProcessor::Process(void) cec_command command; command.Clear(); CTimeout activeSourceCheck(ACTIVE_SOURCE_CHECK_INTERVAL); + CTimeout tvPresentCheck(TV_PRESENT_CHECK_INTERVAL); // as long as we're not being stopped and the connection is open while (!IsStopped() && m_communication->IsOpen()) @@ -239,6 +241,19 @@ void *CCECProcessor::Process(void) TransmitPendingActiveSourceCommands(); activeSourceCheck.Init(ACTIVE_SOURCE_CHECK_INTERVAL); } + + // check whether the TV is present and responding + if (tvPresentCheck.TimeLeft() == 0) + { + if (!m_busDevices->At(CECDEVICE_TV)->IsPresent()) + { + libcec_parameter param; + param.paramType = CEC_PARAMETER_TYPE_STRING; + param.paramData = (void*)"TV does not respond to CEC polls"; + GetPrimaryClient()->Alert(CEC_ALERT_TV_POLL_FAILED, param); + } + tvPresentCheck.Init(TV_PRESENT_CHECK_INTERVAL); + } } } @@ -260,6 +275,12 @@ bool CCECProcessor::ActivateSource(uint16_t iStreamPath) return bReturn; } +void CCECProcessor::SetActiveSource(bool bSetTo, bool bClientUnregistered) +{ + if (m_communication) + m_communication->SetActiveSource(bSetTo, bClientUnregistered); +} + void CCECProcessor::SetStandardLineTimeout(uint8_t iTimeout) { CLockObject lock(m_mutex); @@ -315,11 +336,11 @@ bool CCECProcessor::PollDevice(cec_logical_address iAddress) CCECBusDevice *primary = GetPrimaryDevice(); // poll the destination, with the primary as source if (primary) - return primary->TransmitPoll(iAddress, false); + return primary->TransmitPoll(iAddress, true); CCECBusDevice *device = m_busDevices->At(CECDEVICE_UNREGISTERED); if (device) - return device->TransmitPoll(iAddress, false); + return device->TransmitPoll(iAddress, true); return false; } @@ -459,13 +480,7 @@ void CCECProcessor::TransmitAbort(cec_logical_address source, cec_logical_addres void CCECProcessor::ProcessCommand(const cec_command &command) { // log the command - CStdString dataStr; - dataStr.Format(">> %1x%1x", command.initiator, command.destination); - if (command.opcode_set == 1) - dataStr.AppendFormat(":%02x", command.opcode); - for (uint8_t iPtr = 0; iPtr < command.parameters.size; iPtr++) - dataStr.AppendFormat(":%02x", (unsigned int)command.parameters[iPtr]); - m_libcec->AddLog(CEC_LOG_TRAFFIC, dataStr.c_str()); + m_libcec->AddLog(CEC_LOG_TRAFFIC, ToString(command).c_str()); // find the initiator CCECBusDevice *device = m_busDevices->At(command.initiator); @@ -617,6 +632,8 @@ bool CCECProcessor::GetDeviceInformation(const char *strPort, libcec_configurati config->iFirmwareBuildDate = m_communication->GetFirmwareBuildDate(); config->adapterType = m_communication->GetAdapterType(); + Close(); + return true; } @@ -689,7 +706,7 @@ bool CCECProcessor::AllocateLogicalAddresses(CCECClient* client) // replace a previous client CLockObject lock(m_mutex); m_clients.erase((*it)->GetLogicalAddress()); - m_clients.insert(make_pair((*it)->GetLogicalAddress(), client)); + m_clients.insert(make_pair((*it)->GetLogicalAddress(), client)); } // set the new ackmask @@ -701,6 +718,14 @@ bool CCECProcessor::AllocateLogicalAddresses(CCECClient* client) return true; } +uint16_t CCECProcessor::GetPhysicalAddressFromEeprom(void) +{ + libcec_configuration config; config.Clear(); + if (m_communication) + m_communication->GetConfiguration(config); + return config.iPhysicalAddress; +} + bool CCECProcessor::RegisterClient(CCECClient *client) { if (!client) @@ -729,6 +754,7 @@ bool CCECProcessor::RegisterClient(CCECClient *client) // ensure that controlled mode is enabled m_communication->SetControlledMode(true); + m_bMonitor = false; // source logical address for requests cec_logical_address sourceAddress(CECDEVICE_UNREGISTERED); @@ -824,6 +850,9 @@ bool CCECProcessor::RegisterClient(CCECClient *client) GetTV()->MarkHandlerReady(); } + // report our OSD name to the TV, since some TVs don't request it + client->GetPrimaryDevice()->TransmitOSDName(CECDEVICE_TV, false); + // request the power status of the TV tv->RequestPowerStatus(sourceAddress, true); @@ -855,7 +884,7 @@ bool CCECProcessor::UnregisterClient(CCECClient *client) m_clients.erase(entry); // reset the device status - (*it)->ResetDeviceStatus(); + (*it)->ResetDeviceStatus(true); } } @@ -968,6 +997,14 @@ void CCECProcessor::HandleLogicalAddressLost(cec_logical_address oldAddress) } } +void CCECProcessor::HandlePhysicalAddressChanged(uint16_t iNewAddress) +{ + m_libcec->AddLog(CEC_LOG_NOTICE, "physical address changed to %04x", iNewAddress); + CCECClient* client = GetPrimaryClient(); + if (client) + client->SetPhysicalAddress(iNewAddress); +} + uint16_t CCECProcessor::GetAdapterVendorId(void) const { return m_communication ? m_communication->GetAdapterVendorId() : 0;