-#pragma once
/*
* 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 "CECBusDevice.h"
-#include "CECProcessor.h"
-#include "util/StdString.h"
+#include "../devices/CECBusDevice.h"
+#include "../CECProcessor.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 (command.parameters.size > 0)
+ if (m_processor->IsRunning() && command.parameters.size > 0)
{
- m_busDevice->GetProcessor()->AddKey();
+ CCECClient *client = m_processor->GetClient(command.destination);
+
+ cec_keypress key;
+ key.duration = CEC_BUTTON_TIMEOUT;
+ key.keycode = CEC_USER_CONTROL_CODE_UNKNOWN;
- uint8_t iButton = 0;
switch (command.parameters[0])
{
- case CEC_AN_USER_CONTROL_CODE_RETURN:
- iButton = CEC_USER_CONTROL_CODE_PREVIOUS_CHANNEL;
+ 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 (iButton > 0 && iButton <= CEC_USER_CONTROL_CODE_MAX)
- {
- CStdString strLog;
- strLog.Format("key pressed: %1x", iButton);
- m_busDevice->AddLog(CEC_LOG_DEBUG, strLog);
-
- m_busDevice->GetProcessor()->SetCurrentButton((cec_user_control_code) command.parameters[0]);
- }
+ if (key.keycode != CEC_USER_CONTROL_CODE_UNKNOWN && client)
+ client->AddKey(key);
}
return true;
bool CANCommandHandler::HandleCommand(const cec_command &command)
{
- bool bHandled(true);
- if (command.destination == m_busDevice->GetMyLogicalAddress())
+ bool bHandled(false);
+ if (m_processor->IsHandledByLibCEC(command.destination))
{
switch(command.opcode)
{
case CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN:
+ bHandled = true;
HandleVendorRemoteButtonDown(command);
break;
case CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP:
+ bHandled = true;
HandleUserControlRelease(command);
break;
default:
- bHandled = false;
- break;
- }
- }
- else if (command.destination == CECDEVICE_BROADCAST)
- {
- switch(command.opcode)
- {
- // TODO
- default:
- bHandled = false;
break;
}
}
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);
+}