toshiba: map top menu and dvd menu buttons. closes #148
[deb_libcec.git] / src / lib / implementations / RLCommandHandler.cpp
index 5264c110ba092f454005758a425fbad07032f2cc..e969cac9963df23474c2d6c00357ba2dfe265a45 100644 (file)
 #include "lib/devices/CECBusDevice.h"
 #include "lib/CECProcessor.h"
 #include "lib/LibCEC.h"
+#include "lib/CECClient.h"
 
 using namespace CEC;
 using namespace PLATFORM;
 
+#define RL_KEY_TOP_MENU           0x10
+#define RL_KEY_DVD_MENU           0x11
+
 CRLCommandHandler::CRLCommandHandler(CCECBusDevice *busDevice,
                                      int32_t iTransmitTimeout /* = CEC_DEFAULT_TRANSMIT_TIMEOUT */,
                                      int32_t iTransmitWait /* = CEC_DEFAULT_TRANSMIT_WAIT */,
@@ -79,3 +83,58 @@ bool CRLCommandHandler::InitHandler(void)
 
   return true;
 }
+
+int CRLCommandHandler::HandleDeviceVendorCommandWithId(const cec_command &command)
+{
+  if (!m_processor->IsHandledByLibCEC(command.destination))
+    return CEC_ABORT_REASON_INVALID_OPERAND;
+
+  if (command.parameters.size < 4)
+    return CEC_ABORT_REASON_INVALID_OPERAND;
+
+  // check whether the vendor id matches
+  if (command.parameters[0] != 0x00 ||
+      command.parameters[1] != 0x00 ||
+      command.parameters[2] != 0x39)
+    return CEC_ABORT_REASON_INVALID_OPERAND;
+
+  bool bHandled(false);
+  CCECClient* client = m_processor->GetClient(command.destination);
+  if (client)
+  {
+    switch (command.parameters[3])
+    {
+    // user control pressed
+    case CEC_OPCODE_USER_CONTROL_PRESSED:
+      if (command.parameters.size == 5)
+      {
+        switch (command.parameters[4])
+        {
+        // top menu -> root menu
+        case RL_KEY_TOP_MENU:
+          client->SetCurrentButton(CEC_USER_CONTROL_CODE_ROOT_MENU);
+          break;
+        // dvd menu -> contents menu
+        case RL_KEY_DVD_MENU:
+          client->SetCurrentButton(CEC_USER_CONTROL_CODE_CONTENTS_MENU);
+          break;
+        default:
+          break;
+        }
+        bHandled = true;
+      }
+      break;
+    // user control released
+    case CEC_OPCODE_USER_CONTROL_RELEASE:
+      client->AddKey();
+      bHandled = true;
+      break;
+    default:
+      break;
+    }
+  }
+
+  return bHandled ?
+      COMMAND_HANDLED :
+      CCECCommandHandler::HandleDeviceVendorCommandWithId(command);
+}