#include "env.h"
#include "ANCommandHandler.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,
int32_t iTransmitTimeout ,
int32_t iTransmitWait ,
int8_t iTransmitRetries ,
int64_t iActiveSourcePending ) :
CCECCommandHandler(busDevice, iTransmitTimeout, iTransmitWait, iTransmitRetries, iActiveSourcePending)
{
m_vendorId = CEC_VENDOR_SAMSUNG;
m_bOPTSendDeckStatusUpdateOnActiveSource = false;
if (busDevice->GetLogicalAddress() == CECDEVICE_TV)
{
m_busDevice->GetProcessor()->SetAutoMode(false);
}
}
int CANCommandHandler::HandleVendorRemoteButtonDown(const cec_command &command)
{
if (command.parameters.size == 0)
return CEC_ABORT_REASON_INVALID_OPERAND;
if (!m_processor->CECInitialised())
return CEC_ABORT_REASON_NOT_IN_CORRECT_MODE_TO_RESPOND;
CECClientPtr client = m_processor->GetClient(command.destination);
if (!client)
return CEC_ABORT_REASON_NOT_IN_CORRECT_MODE_TO_RESPOND;
cec_keypress key;
key.duration = CEC_BUTTON_TIMEOUT;
key.keycode = (cec_user_control_code)command.parameters[0];
if (client)
client->AddKey(key);
return COMMAND_HANDLED;
}
bool CANCommandHandler::PowerOn(const cec_logical_address iInitiator, const cec_logical_address iDestination)
{
if (iDestination == CECDEVICE_AUDIOSYSTEM)
{
return TransmitKeypress(iInitiator, iDestination, CEC_USER_CONTROL_CODE_POWER_ON_FUNCTION) &&
TransmitKeyRelease(iInitiator, iDestination);
}
return CCECCommandHandler::PowerOn(iInitiator, iDestination);
}
int CANCommandHandler::HandleDeviceVendorCommandWithId(const cec_command &command)
{
if (!m_processor->IsHandledByLibCEC(command.destination) && command.destination != CECDEVICE_BROADCAST)
return CEC_ABORT_REASON_INVALID_OPERAND;
if (command.parameters[0] == 0x00 && command.parameters[1] == 0x00 && command.parameters[2] == 0xf0)
{
if (command.parameters[3] == 0x23)
{
cec_command response;
cec_command::Format(response, command.destination, command.initiator, CEC_OPCODE_VENDOR_COMMAND_WITH_ID);
response.parameters.PushBack(0x00); response.parameters.PushBack(0x00); response.parameters.PushBack(0xf0);
response.parameters.PushBack(0x24);
response.parameters.PushBack(0x00);
response.parameters.PushBack(0x80);
Transmit(response, false, true);
return COMMAND_HANDLED;
}
}
return CEC_ABORT_REASON_INVALID_OPERAND;
}
int CANCommandHandler::HandleSetMenuLanguage(const cec_command &command)
{
if (m_processor->CECInitialised() && command.initiator == CECDEVICE_TV && command.destination == CECDEVICE_BROADCAST)
{
m_processor->GetDevice(command.initiator)->SetPowerStatus(CEC_POWER_STATUS_ON);
}
return CCECCommandHandler::HandleSetMenuLanguage(command);
}