send an alert when the TV does not respond to polls
[deb_libcec.git] / src / lib / CECProcessor.cpp
index 73c921d8120f68c0ffff4f440e6e66e2e0443b07..38d5992541ad297cc82207ccc0ce404c1c5459a7 100644 (file)
@@ -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 = "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);
@@ -617,6 +638,8 @@ bool CCECProcessor::GetDeviceInformation(const char *strPort, libcec_configurati
   config->iFirmwareBuildDate = m_communication->GetFirmwareBuildDate();
   config->adapterType        = m_communication->GetAdapterType();
 
+  Close();
+
   return true;
 }
 
@@ -737,6 +760,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);
@@ -832,6 +856,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);
 
@@ -863,7 +890,7 @@ bool CCECProcessor::UnregisterClient(CCECClient *client)
         m_clients.erase(entry);
 
       // reset the device status
-      (*it)->ResetDeviceStatus();
+      (*it)->ResetDeviceStatus(true);
     }
   }
 
@@ -976,6 +1003,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;