toshiba: map top menu and dvd menu buttons. closes #148
authorLars Op den Kamp <lars@opdenkamp.eu>
Mon, 18 Mar 2013 14:08:17 +0000 (15:08 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Mon, 18 Mar 2013 14:09:53 +0000 (15:09 +0100)
- top menu mapped to CEC root menu
- dvd menu mapped to CEC contents menu

src/lib/implementations/RLCommandHandler.cpp
src/lib/implementations/RLCommandHandler.h

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);
+}
index 1bb04993c221c0b472cc493ac99ce8a88c054718..be9b5d9af39ccc30f2f17d3dd18fe6d2af62f8c1 100644 (file)
@@ -46,5 +46,6 @@ namespace CEC
     virtual ~CRLCommandHandler(void) {};
 
     bool InitHandler(void);
+    int HandleDeviceVendorCommandWithId(const cec_command &command);
   };
 };