cec: added SwitchMonitoring()/cec_switch_monitoring() to the interface. when monitori...
authorLars Op den Kamp <lars@opdenkamp.eu>
Tue, 25 Oct 2011 22:19:09 +0000 (00:19 +0200)
committerLars Op den Kamp <lars@opdenkamp.eu>
Tue, 25 Oct 2011 22:19:09 +0000 (00:19 +0200)
include/cec.h
include/cecc.h
include/cectypes.h
src/lib/CECProcessor.cpp
src/lib/CECProcessor.h
src/lib/LibCEC.cpp
src/lib/LibCEC.h
src/lib/LibCECC.cpp
src/testclient/main.cpp

index c23c35a125ae83b6eeed287af8bd8a94bf4a050e..63564555564dfb46bbf64f8efc280c38d2a00d1e 100644 (file)
@@ -134,6 +134,11 @@ namespace CEC
      * @see cec_set_osd_string
      */
     virtual bool SetOSDString(cec_logical_address iLogicalAddress, cec_display_control duration, const char *strMessage) = 0;
+
+    /*!
+     * @see cec_switch_monitoring
+     */
+    virtual bool SwitchMonitoring(bool bEnable) = 0;
   };
 };
 
index c319c196da7ab33bcda88d576f4867a12d8ab0a8..1c9a987ac56d08f12e07ef287a7e7aa6b675a0fa 100644 (file)
@@ -213,6 +213,8 @@ extern DECLSPEC int cec_set_osd_string(CEC::cec_logical_address iLogicalAddress,
 extern DECLSPEC int cec_set_osd_string(cec_logical_address iLogicalAddress, cec_display_control duration, const char *strMessage);
 #endif
 
+extern DECLSPEC int cec_switch_monitoring(int bEnable);
+
 #ifdef __cplusplus
 };
 #endif
index 004ea060170047888c636bf8d019791e7fd24f87..e6c953e855221def2abceb9083d336e56ddfda51 100644 (file)
@@ -700,7 +700,7 @@ typedef enum cec_vendor_id
 #define MSGESC                       0xFD
 #define ESCOFFSET                    3
 #define CEC_MIN_VERSION              6
-#define CEC_LIB_VERSION              7
+#define CEC_LIB_VERSION              8
 #define CEC_BUTTON_TIMEOUT           500
 
 #ifdef __cplusplus
index c19890ba4024e036b2c6ff2cea5d2d8eedc09686..31f8803ac3af97dbe2bff32f779ae8befd47ebae 100644 (file)
@@ -45,7 +45,8 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, CAdapterCommunication *serComm
     m_iLogicalAddress(iLogicalAddress),
     m_strDeviceName(strDeviceName),
     m_communication(serComm),
-    m_controller(controller)
+    m_controller(controller),
+    m_bMonitor(false)
 {
   for (uint8_t iPtr = 0; iPtr < 16; iPtr++)
     m_vendorIds[iPtr] = CEC_VENDOR_UNKNOWN;
@@ -237,6 +238,19 @@ bool CCECProcessor::SetOSDString(cec_logical_address iLogicalAddress, cec_displa
   return Transmit(command);
 }
 
+bool CCECProcessor::SwitchMonitoring(bool bEnable)
+{
+  CStdString strLog;
+  strLog.Format("== %s monitoring mode ==", bEnable ? "enabling" : "disabling");
+  m_controller->AddLog(CEC_LOG_NOTICE, strLog.c_str());
+
+  m_bMonitor = bEnable;
+  if (bEnable)
+    return m_communication && m_communication->SetAckMask(0);
+  else
+    return m_communication && m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
+}
+
 bool CCECProcessor::TransmitFormatted(const cec_adapter_message &data, bool bWaitForAck /* = true */)
 {
   CLockObject lock(&m_mutex);
@@ -538,6 +552,9 @@ void CCECProcessor::ParseCommand(cec_command &command)
   }
   m_controller->AddLog(CEC_LOG_DEBUG, dataStr.c_str());
 
+  if (m_bMonitor)
+    return;
+
   if (command.destination == m_iLogicalAddress)
   {
     switch(command.opcode)
index dd0596e4e7d356e6675e4696b9851d73f6ba71a1..5ff3e6270cb1dff29a102d90688ee959b83e6a32 100644 (file)
@@ -60,6 +60,7 @@ namespace CEC
       virtual bool SetLogicalAddress(cec_logical_address iLogicalAddress);
       virtual bool SetPhysicalAddress(uint16_t iPhysicalAddress);
       virtual bool SetOSDString(cec_logical_address iLogicalAddress, cec_display_control duration, const char *strMessage);
+      virtual bool SwitchMonitoring(bool bEnable);
 
       static const char *CECVendorIdToString(const uint64_t iVendorId);
 
@@ -91,5 +92,6 @@ namespace CEC
       CLibCEC                       *m_controller;
       uint64_t                       m_vendorIds[16];
       uint8_t                        m_vendorClasses[16];
+      bool                           m_bMonitor;
   };
 };
index 7c0f7927956126f088a9bb5ec443f9c04ebe086b..97427958f9df8d1f65cc0f565d6840ace93cf4fe 100644 (file)
@@ -198,6 +198,11 @@ bool CLibCEC::SetOSDString(cec_logical_address iLogicalAddress, cec_display_cont
   return m_cec ? m_cec->SetOSDString(iLogicalAddress, duration, strMessage) : false;
 }
 
+bool CLibCEC::SwitchMonitoring(bool bEnable)
+{
+  return m_cec ? m_cec->SwitchMonitoring(bEnable) : false;
+}
+
 void CLibCEC::AddLog(cec_log_level level, const string &strMessage)
 {
   if (m_cec)
index 8ea0c98417dba829b9c763f349709df29836b1ec..968d615f979717dcd794503bb8321181c9826f8e 100644 (file)
@@ -72,6 +72,7 @@ namespace CEC
       virtual bool SetActiveView(void);
       virtual bool SetInactiveView(void);
       virtual bool SetOSDString(cec_logical_address iLogicalAddress, cec_display_control duration, const char *strMessage);
+      virtual bool SwitchMonitoring(bool bEnable);
     //@}
 
       virtual void AddLog(cec_log_level level, const std::string &strMessage);
index d062dff9357f39ccdd76b6156eee1663a3ac58f2..79157658df088d7231b6a0e4ad838bea45746f6c 100644 (file)
@@ -180,4 +180,11 @@ int cec_set_osd_string(cec_logical_address iLogicalAddress, cec_display_control
   return -1;
 }
 
+int cec_switch_monitoring(int bEnable)
+{
+  if (cec_parser)
+    return cec_parser->SwitchMonitoring(bEnable == 1) ? 1 : 0;
+  return -1;
+}
+
 //@}
index 2939c6034f646e33aa4067b94205342ef7dd1909..b13f446860c2b743e4d36c06e99f82a75c5cf6a1 100644 (file)
@@ -43,7 +43,7 @@
 using namespace CEC;
 using namespace std;
 
-#define CEC_TEST_CLIENT_VERSION 7
+#define CEC_TEST_CLIENT_VERSION 8
 
 #include <cecloader.h>
 
@@ -186,6 +186,7 @@ void show_console_help(void)
   "osd {addr} {string}       set OSD message on the specified device." << endl <<
   "[osd 0 Test Message]      displays 'Test Message' on the TV" << endl <<
   endl <<
+  "[mon] {1|0}               enable or disable CEC bus monitoring." << endl <<
   "[ping]                    send a ping command to the CEC adapter." << endl <<
   "[bl]                      to let the adapter enter the bootloader, to upgrade" << endl <<
   "                          the flash rom." << endl <<
@@ -365,6 +366,14 @@ int main (int argc, char *argv[])
         {
           parser->PingAdapter();
         }
+        else if (command == "mon")
+        {
+          CStdString strEnable;
+          if (GetWord(input, strEnable) && (strEnable.Equals("0") || strEnable.Equals("1")))
+          {
+            parser->SwitchMonitoring(strEnable.Equals("1"));
+          }
+        }
         else if (command == "bl")
         {
           parser->StartBootloader();