cec: cleanups, documentation and some fixes for the last commits
[deb_libcec.git] / src / lib / implementations / ANCommandHandler.cpp
index a313819ca581cc79c1baef56da150ac57126a2b6..ed4218ea96e36a9553ccf45a7beb97f3118ae6ee 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the libCEC(R) library.
  *
- * libCEC(R) is Copyright (C) 2011 Pulse-Eight Limited.  All rights reserved.
+ * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited.  All rights reserved.
  * libCEC(R) is an original work, containing original code.
  *
  * libCEC(R) is a trademark of Pulse-Eight Limited.
 #include "ANCommandHandler.h"
 #include "../devices/CECBusDevice.h"
 #include "../CECProcessor.h"
-#include "../util/StdString.h"
+#include "../LibCEC.h"
+#include "../CECClient.h"
 
 using namespace CEC;
 
+#define LIB_CEC     m_busDevice->GetProcessor()->GetLib()
+#define ToString(p) LIB_CEC->ToString(p)
+
 CANCommandHandler::CANCommandHandler(CCECBusDevice *busDevice) :
     CCECCommandHandler(busDevice)
 {
   m_vendorId = CEC_VENDOR_SAMSUNG;
+  m_bOPTSendDeckStatusUpdateOnActiveSource = false;
 }
 
 bool CANCommandHandler::HandleVendorRemoteButtonDown(const cec_command &command)
 {
-  if (m_processor->IsStarted() && command.parameters.size > 0)
+  if (m_processor->IsRunning() && command.parameters.size > 0)
   {
+    CCECClient *client = m_processor->GetClient(command.destination);
+
     cec_keypress key;
     key.duration = CEC_BUTTON_TIMEOUT;
     key.keycode = CEC_USER_CONTROL_CODE_UNKNOWN;
 
     switch (command.parameters[0])
     {
-    case CEC_AN_USER_CONTROL_CODE_RETURN:
-      key.keycode = CEC_USER_CONTROL_CODE_EXIT;
+    case CEC_USER_CONTROL_CODE_AN_RETURN:
+      key.keycode = client && client->GetClientVersion() >= CEC_CLIENT_VERSION_1_5_0 ?
+        CEC_USER_CONTROL_CODE_AN_RETURN :
+        CEC_USER_CONTROL_CODE_EXIT;
+      break;
+    case CEC_USER_CONTROL_CODE_AN_CHANNELS_LIST:
+      key.keycode = CEC_USER_CONTROL_CODE_AN_CHANNELS_LIST;
       break;
     default:
       break;
     }
 
-    if (key.keycode != CEC_USER_CONTROL_CODE_UNKNOWN)
-    {
-      CStdString strLog;
-      strLog.Format("key pressed: %1x", key.keycode);
-      m_busDevice->AddLog(CEC_LOG_DEBUG, strLog);
-
-      m_busDevice->GetProcessor()->AddKey(key);
-    }
+    if (key.keycode != CEC_USER_CONTROL_CODE_UNKNOWN && client)
+      client->AddKey(key);
   }
 
   return true;
@@ -76,7 +82,7 @@ bool CANCommandHandler::HandleVendorRemoteButtonDown(const cec_command &command)
 bool CANCommandHandler::HandleCommand(const cec_command &command)
 {
   bool bHandled(false);
-  if (m_busDevice->MyLogicalAddressContains(command.destination))
+  if (m_processor->IsHandledByLibCEC(command.destination))
   {
     switch(command.opcode)
     {
@@ -98,3 +104,15 @@ bool CANCommandHandler::HandleCommand(const cec_command &command)
 
   return bHandled;
 }
+
+bool CANCommandHandler::PowerOn(const cec_logical_address iInitiator, const cec_logical_address iDestination)
+{
+  if (iDestination == CECDEVICE_AUDIOSYSTEM)
+  {
+    /* Samsung AVR devices need to be woken up with key CEC_USER_CONTROL_CODE_POWER_ON_FUNCTION */
+    return TransmitKeypress(iInitiator, iDestination, CEC_USER_CONTROL_CODE_POWER_ON_FUNCTION) &&
+        TransmitKeyRelease(iInitiator, iDestination);
+  }
+
+  return CCECCommandHandler::PowerOn(iInitiator, iDestination);
+}