- if (m_processor->IsStarted() && (m_busDevice->MyLogicalAddressContains(command.destination) ||
- command.destination == CECDEVICE_BROADCAST))
- {
- switch(command.opcode)
- {
- case CEC_OPCODE_VENDOR_COMMAND:
- bHandled = HandleVendorCommand(command);
- break;
- case CEC_OPCODE_FEATURE_ABORT:
- {
- if (!m_bVendorIdSent)
- {
- m_bVendorIdSent = true;
- TransmitLGVendorId(m_processor->GetLogicalAddresses().primary, CECDEVICE_BROADCAST);
- }
- }
- bHandled = true;
- default:
- break;
- }
- }
-
- if (!bHandled)
- bHandled = CCECCommandHandler::HandleCommand(command);
-
- return bHandled;
-}
-
-void CSLCommandHandler::HandlePoll(const cec_logical_address iInitiator, const cec_logical_address iDestination)
-{
- CCECCommandHandler::HandlePoll(iInitiator, iDestination);
- m_bAwaitingReceiveFailed = true;
-}
-
-bool CSLCommandHandler::HandleReceiveFailed(void)
-{
- if (m_bAwaitingReceiveFailed)
- {
- m_bAwaitingReceiveFailed = false;
- return false;
- }
-
- return true;
-}
-
-bool CSLCommandHandler::InitHandler(void)
-{
- if (m_bHandlerInited)
- return true;
- m_bHandlerInited = true;
-
- m_processor->SetStandardLineTimeout(3);
- m_processor->SetRetryLineTimeout(3);
-
- /* increase the number of retries because the tv is keeping the bus busy at times */
- m_iTransmitWait = 2000;
- m_iTransmitRetries = 4;
- m_iTransmitTimeout = 500;
-
- CCECBusDevice *primary = m_processor->GetPrimaryDevice();
- if (m_busDevice->GetLogicalAddress() != primary->GetLogicalAddress())
- {
- primary->SetVendorId(CEC_VENDOR_LG, false);
- primary->TransmitVendorID(CECDEVICE_TV, false);
- }
-
- if (m_busDevice->GetLogicalAddress() == CECDEVICE_TV)
- {
- /* LG TVs don't always reply to CEC version requests, so just set it to 1.3a */
- m_busDevice->SetCecVersion(CEC_VERSION_1_3A);
- }
-
- /* LG devices always return "korean" as language */
- cec_menu_language lang;
- lang.device = m_busDevice->GetLogicalAddress();
- snprintf(lang.language, 4, "eng");
- m_busDevice->SetMenuLanguage(lang);
-
- if (m_busDevice->GetLogicalAddress() == CECDEVICE_TV)
- {
- m_processor->SetActiveSource();
-
- /* LG TVs only route keypresses when the deck status is set to 0x20 */
- cec_logical_addresses addr = m_processor->GetLogicalAddresses();
- for (uint8_t iPtr = 0; iPtr < 15; iPtr++)
- {
- CCECBusDevice *device = m_processor->m_busDevices[iPtr];
-
- if (addr[iPtr])
- {
- if (device && (device->GetType() == CEC_DEVICE_TYPE_PLAYBACK_DEVICE ||
- device->GetType() == CEC_DEVICE_TYPE_RECORDING_DEVICE))
- {
- ((CCECPlaybackDevice *)device)->SetDeckStatus(CEC_DECK_INFO_OTHER_STATUS_LG);
- ((CCECPlaybackDevice *)device)->TransmitDeckStatus(CECDEVICE_TV);
- }
- }
- }
- }
-
- return true;
-}
-
-bool CSLCommandHandler::TransmitPowerOn(const cec_logical_address iInitiator, const cec_logical_address iDestination)
-{
- if (iDestination != CECDEVICE_BROADCAST &&
- iDestination != CECDEVICE_TV &&
- m_processor->m_busDevices[iDestination]->GetVendorId(false) == CEC_VENDOR_LG)
- {
- cec_command command;
- cec_command::Format(command, iInitiator, iDestination, CEC_OPCODE_VENDOR_COMMAND);
- command.parameters.PushBack((uint8_t)SL_COMMAND_POWER_ON);
- command.parameters.PushBack(0x00);
- return Transmit(command);
- }
-
- return CCECCommandHandler::TransmitPowerOn(iInitiator, iDestination);