send an alert when the TV does not respond to polls
authorLars Op den Kamp <lars@opdenkamp.eu>
Fri, 8 Mar 2013 10:55:06 +0000 (11:55 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Fri, 8 Mar 2013 12:51:59 +0000 (13:51 +0100)
include/cectypes.h
src/lib/CECProcessor.cpp

index 0b62529fda39b8abf986e76e0b6d44eda2f42cd1..1e2c7dbe2154444d27328a0b5121d99df78d1df4 100644 (file)
@@ -1281,7 +1281,8 @@ typedef enum libcec_alert
   CEC_ALERT_CONNECTION_LOST,
   CEC_ALERT_PERMISSION_ERROR,
   CEC_ALERT_PORT_BUSY,
-  CEC_ALERT_PHYSICAL_ADDRESS_ERROR
+  CEC_ALERT_PHYSICAL_ADDRESS_ERROR,
+  CEC_ALERT_TV_POLL_FAILED
 } libcec_alert;
 
 typedef enum libcec_parameter_type
index 84a46d635e01823a7fb7bcff25adcb666fcdf36b..38d5992541ad297cc82207ccc0ce404c1c5459a7 100644 (file)
@@ -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);
+      }
     }
   }