+bool CSLCommandHandler::HandleGiveDeckStatus(const cec_command &command)
+{
+ if (command.parameters.size == 1)
+ {
+ if (command.parameters[0] == CEC_STATUS_REQUEST_ONCE ||
+ command.parameters[0] == CEC_STATUS_REQUEST_ON)
+ {
+ TransmitDeckStatus(command.initiator);
+ }
+ else
+ {
+ CCECCommandHandler::HandleGiveDeckStatus(command);
+ }
+ }
+ return true;
+}
+
+void CSLCommandHandler::HandleVendorCommand01(const cec_command &command)
+{
+ TransmitVendorCommand0205(command.destination, command.initiator);
+}
+
+void CSLCommandHandler::TransmitVendorCommand0205(const cec_logical_address iSource, const cec_logical_address iDestination)
+{
+ cec_command response;
+ cec_command::Format(response, iSource, iDestination, CEC_OPCODE_VENDOR_COMMAND);
+ response.PushBack(SL_COMMAND_UNKNOWN_02);
+ response.PushBack(SL_COMMAND_UNKNOWN_03);
+
+ Transmit(response);
+}
+
+void CSLCommandHandler::TransmitVendorCommand05(const cec_logical_address iSource, const cec_logical_address iDestination)
+{
+ m_bSLEnabled = true;
+ cec_command response;
+ cec_command::Format(response, iSource, iDestination, CEC_OPCODE_VENDOR_COMMAND);
+ response.PushBack(SL_COMMAND_CONNECT_ACCEPT);
+ response.PushBack((uint8_t)iSource);
+ Transmit(response);
+}
+
+void CSLCommandHandler::HandleVendorCommandPowerOn(const cec_command &command)
+{
+ CCECBusDevice *device = m_processor->m_busDevices[m_processor->GetLogicalAddresses().primary];
+ if (device)
+ {
+ m_bSLEnabled = true;
+ device->SetPowerStatus(CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON);
+ device->TransmitPowerState(command.initiator);
+ device->TransmitVendorID(command.initiator);
+ TransmitPowerOn(device->GetLogicalAddress(), command.initiator);
+ }
+}
+
+void CSLCommandHandler::HandleVendorCommandSLConnect(const cec_command &command)
+{
+ m_bSLEnabled = true;
+ m_processor->m_busDevices[command.initiator]->SetActiveSource();
+ m_processor->m_busDevices[command.destination]->TransmitActiveSource();
+ TransmitVendorCommand05(command.destination, command.initiator);
+ TransmitDeckStatus(command.initiator);
+}
+
+void CSLCommandHandler::HandleVendorCommandPowerOnStatus(const cec_command &command)
+{
+ if (command.destination != CECDEVICE_BROADCAST)
+ {
+ CCECBusDevice *device = m_processor->m_busDevices[m_processor->GetLogicalAddresses().primary];
+ device->SetPowerStatus(CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON);
+ device->TransmitPowerState(command.initiator);
+ device->SetPowerStatus(CEC_POWER_STATUS_ON);
+ }
+}
+
+void CSLCommandHandler::TransmitDeckStatus(const cec_logical_address iDestination)
+{
+ /* set deck status for the playback device */
+ CCECBusDevice *primary = m_processor->m_busDevices[m_processor->GetLogicalAddresses().primary];
+ if (primary->GetType() == CEC_DEVICE_TYPE_PLAYBACK_DEVICE || primary->GetType() == CEC_DEVICE_TYPE_RECORDING_DEVICE)
+ {
+ ((CCECPlaybackDevice *)primary)->SetDeckStatus(CEC_DECK_INFO_OTHER_STATUS_LG);
+ ((CCECPlaybackDevice *)primary)->TransmitDeckStatus(iDestination);
+ }
+}
+
+bool CSLCommandHandler::TransmitLGVendorId(const cec_logical_address iInitiator, const cec_logical_address iDestination)
+{
+ cec_command response;
+ cec_command::Format(response, iInitiator, iDestination, CEC_OPCODE_DEVICE_VENDOR_ID);
+ response.parameters.PushBack((uint8_t) (((uint64_t)CEC_VENDOR_LG >> 16) & 0xFF));
+ response.parameters.PushBack((uint8_t) (((uint64_t)CEC_VENDOR_LG >> 8) & 0xFF));
+ response.parameters.PushBack((uint8_t) ((uint64_t)CEC_VENDOR_LG & 0xFF));
+
+ Transmit(response);
+ return true;
+}
+