#include "env.h"
#include "RLCommandHandler.h"
#include "p8-platform/util/timeutils.h"
#include "devices/CECBusDevice.h"
#include "CECProcessor.h"
#include "LibCEC.h"
#include "CECClient.h"
using namespace CEC;
using namespace P8PLATFORM;
#define RL_KEY_TOP_MENU 0x10
#define RL_KEY_DVD_MENU 0x11
CRLCommandHandler::CRLCommandHandler(CCECBusDevice *busDevice,
int32_t iTransmitTimeout ,
int32_t iTransmitWait ,
int8_t iTransmitRetries ,
int64_t iActiveSourcePending ) :
CCECCommandHandler(busDevice, iTransmitTimeout, iTransmitWait, iTransmitRetries, iActiveSourcePending)
{
m_vendorId = CEC_VENDOR_TOSHIBA;
}
bool CRLCommandHandler::InitHandler(void)
{
if (m_bHandlerInited)
return true;
m_bHandlerInited = true;
if (m_busDevice->GetLogicalAddress() != CECDEVICE_TV)
return true;
CCECBusDevice *primary = m_processor->GetPrimaryDevice();
if (primary && primary->GetLogicalAddress() != CECDEVICE_UNREGISTERED)
{
if (m_busDevice->GetLogicalAddress() != primary->GetLogicalAddress())
{
primary->SetVendorId(CEC_VENDOR_TOSHIBA);
primary->ReplaceHandler(false);
}
if (m_busDevice->GetLogicalAddress() == CECDEVICE_TV)
{
primary->TransmitVendorID(CECDEVICE_BROADCAST, false, false);
}
}
return true;
}
int CRLCommandHandler::HandleDeviceVendorCommandWithId(const cec_command &command)
{
if (!m_processor->IsHandledByLibCEC(command.destination) && command.destination != CECDEVICE_BROADCAST)
return CEC_ABORT_REASON_INVALID_OPERAND;
if (command.parameters.size < 4)
return CEC_ABORT_REASON_INVALID_OPERAND;
if (command.parameters[0] != 0x00 ||
command.parameters[1] != 0x00 ||
command.parameters[2] != 0x39)
return CEC_ABORT_REASON_INVALID_OPERAND;
bool bHandled(false);
CECClientPtr client = m_processor->GetClient(command.destination);
if (client)
{
switch (command.parameters[3])
{
case CEC_OPCODE_USER_CONTROL_PRESSED:
if (command.parameters.size == 5)
{
bHandled = true;
switch (command.parameters[4])
{
case RL_KEY_TOP_MENU:
client->SetCurrentButton(CEC_USER_CONTROL_CODE_TOP_MENU);
break;
case RL_KEY_DVD_MENU:
client->SetCurrentButton(CEC_USER_CONTROL_CODE_DVD_MENU);
break;
default:
bHandled = false;
break;
}
}
break;
case CEC_OPCODE_USER_CONTROL_RELEASE:
client->AddKey();
bHandled = true;
break;
default:
break;
}
}
return bHandled ?
COMMAND_HANDLED :
CCECCommandHandler::HandleDeviceVendorCommandWithId(command);
}