/*
* 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.
#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)
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())
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);
+ }
}
}
if (activeSource)
return activeSource->GetLogicalAddress();
- if (bRequestActiveSource && m_busDevices->GetActiveSourceAddress() == CEC_INVALID_PHYSICAL_ADDRESS)
+ if (bRequestActiveSource)
{
// request the active source from the bus
CCECBusDevice *primary = GetPrimaryDevice();
config->iFirmwareBuildDate = m_communication->GetFirmwareBuildDate();
config->adapterType = m_communication->GetAdapterType();
+ Close();
+
return true;
}
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);
}
}
+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;