X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fimplementations%2FCECCommandHandler.cpp;h=2324c2011d9664a04d361e3210398fcf00baaf16;hb=38bdb94305cac92a7ac8ea31e2c1533dc17fb8dc;hp=790b631b25694b86a930fb7b996f413de2b49a51;hpb=6a1c0009842a1857b863655813595292422a512b;p=deb_libcec.git diff --git a/src/lib/implementations/CECCommandHandler.cpp b/src/lib/implementations/CECCommandHandler.cpp index 790b631..2324c20 100644 --- a/src/lib/implementations/CECCommandHandler.cpp +++ b/src/lib/implementations/CECCommandHandler.cpp @@ -45,13 +45,20 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) { bool bHandled(true); - if (command.destination == m_busDevice->GetMyLogicalAddress()) + if (m_busDevice->MyLogicalAddressContains(command.destination)) { switch(command.opcode) { + case CEC_OPCODE_REPORT_POWER_STATUS: + HandleReportPowerStatus(command); + break; case CEC_OPCODE_CEC_VERSION: HandleDeviceCecVersion(command); break; + case CEC_OPCODE_SET_MENU_LANGUAGE: + HandleSetMenuLanguage(command); + m_busDevice->GetProcessor()->AddCommand(command); + break; case CEC_OPCODE_GIVE_PHYSICAL_ADDRESS: HandleGivePhysicalAddress(command); break; @@ -87,6 +94,7 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) break; default: UnhandledCommand(command); + m_busDevice->GetProcessor()->AddCommand(command); bHandled = false; break; } @@ -96,14 +104,20 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) CStdString strLog; switch (command.opcode) { + case CEC_OPCODE_SET_MENU_LANGUAGE: + HandleSetMenuLanguage(command); + m_busDevice->GetProcessor()->AddCommand(command); + break; case CEC_OPCODE_REQUEST_ACTIVE_SOURCE: HandleRequestActiveSource(command); break; case CEC_OPCODE_SET_STREAM_PATH: HandleSetStreamPath(command); + m_busDevice->GetProcessor()->AddCommand(command); break; case CEC_OPCODE_ROUTING_CHANGE: HandleRoutingChange(command); + m_busDevice->GetProcessor()->AddCommand(command); break; case CEC_OPCODE_DEVICE_VENDOR_ID: HandleDeviceVendorId(command); @@ -113,6 +127,7 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) break; default: UnhandledCommand(command); + m_busDevice->GetProcessor()->AddCommand(command); bHandled = false; break; } @@ -120,7 +135,7 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) else { CStdString strLog; - strLog.Format("ignoring frame: destination: %u != %u", command.destination, (uint8_t)m_busDevice->GetMyLogicalAddress()); + strLog.Format("ignoring frame: we're not at destination %x", command.destination); m_busDevice->AddLog(CEC_LOG_DEBUG, strLog.c_str()); bHandled = false; } @@ -160,54 +175,54 @@ bool CCECCommandHandler::HandleDeviceVendorId(const cec_command &command) bool CCECCommandHandler::HandleGetCecVersion(const cec_command &command) { - CCECBusDevice *device = GetDevice(command.initiator); + CCECBusDevice *device = GetDevice(command.destination); if (device) - return device->ReportCECVersion(); + return device->TransmitCECVersion(command.initiator); return false; } bool CCECCommandHandler::HandleGiveDeckStatus(const cec_command &command) { - CCECBusDevice *device = GetDevice(command.initiator); + CCECBusDevice *device = GetDevice(command.destination); if (device) - return device->ReportDeckStatus(); + return device->TransmitDeckStatus(command.initiator); return false; } bool CCECCommandHandler::HandleGiveDevicePowerStatus(const cec_command &command) { - CCECBusDevice *device = GetDevice(command.initiator); + CCECBusDevice *device = GetDevice(command.destination); if (device) - return device->ReportPowerState(); + return device->TransmitPowerState(command.initiator); return false; } bool CCECCommandHandler::HandleGiveDeviceVendorId(const cec_command &command) { - CCECBusDevice *device = GetDevice(command.initiator); + CCECBusDevice *device = GetDevice(command.destination); if (device) - return device->ReportVendorID(); + return device->TransmitVendorID(command.initiator); return false; } bool CCECCommandHandler::HandleGiveOSDName(const cec_command &command) { - CCECBusDevice *device = GetDevice(command.initiator); + CCECBusDevice *device = GetDevice(command.destination); if (device) - return device->ReportOSDName(); + return device->TransmitOSDName(command.initiator); return false; } bool CCECCommandHandler::HandleGivePhysicalAddress(const cec_command &command) { - CCECBusDevice *device = GetThisDevice(); + CCECBusDevice *device = GetDevice(command.destination); if (device) - return device->BroadcastPhysicalAddress(); + return device->TransmitPhysicalAddress(); return false; } @@ -216,21 +231,32 @@ bool CCECCommandHandler::HandleMenuRequest(const cec_command &command) { if (command.parameters[0] == CEC_MENU_REQUEST_TYPE_QUERY) { - CCECBusDevice *device = GetDevice(command.initiator); + CCECBusDevice *device = GetDevice(command.destination); if (device) - return device->ReportMenuState(); + return device->TransmitMenuState(command.initiator); } return false; } +bool CCECCommandHandler::HandleReportPowerStatus(const cec_command &command) +{ + if (command.parameters.size == 1) + { + CCECBusDevice *device = GetDevice(command.initiator); + if (device) + device->SetPowerStatus((cec_power_status) command.parameters[0]); + } + return true; +} + bool CCECCommandHandler::HandleRequestActiveSource(const cec_command &command) { CStdString strLog; strLog.Format(">> %i requests active source", (uint8_t) command.initiator); m_busDevice->AddLog(CEC_LOG_DEBUG, strLog.c_str()); - CCECBusDevice *device = GetThisDevice(); + CCECBusDevice *device = m_busDevice->GetProcessor()->m_busDevices[m_busDevice->GetMyLogicalAddress()]; if (device) - return device->BroadcastActiveSource(); + return device->TransmitActiveSource(); return false; } @@ -248,6 +274,24 @@ bool CCECCommandHandler::HandleRoutingChange(const cec_command &command) return true; } +bool CCECCommandHandler::HandleSetMenuLanguage(const cec_command &command) +{ + if (command.parameters.size == 3) + { + CCECBusDevice *device = GetDevice(command.initiator); + if (device) + { + cec_menu_language language; + language.device = command.initiator; + for (uint8_t iPtr = 0; iPtr < 4; iPtr++) + language.language[iPtr] = command.parameters[iPtr]; + language.language[3] = 0; + device->SetMenuLanguage(language); + } + } + return true; +} + bool CCECCommandHandler::HandleSetStreamPath(const cec_command &command) { if (command.parameters.size >= 2) @@ -258,9 +302,9 @@ bool CCECCommandHandler::HandleSetStreamPath(const cec_command &command) m_busDevice->AddLog(CEC_LOG_DEBUG, strLog.c_str()); if (streamaddr == m_busDevice->GetMyPhysicalAddress()) { - CCECBusDevice *device = GetThisDevice(); + CCECBusDevice *device = GetDevice(command.destination); if (device) - return device->BroadcastActiveSource(); + return device->TransmitActiveSource(); return false; } } @@ -293,7 +337,9 @@ bool CCECCommandHandler::HandleUserControlRelease(const cec_command &command) void CCECCommandHandler::UnhandledCommand(const cec_command &command) { - m_busDevice->GetProcessor()->AddCommand(command); + CStdString strLog; + strLog.Format("unhandled command with opcode %02x from address %d", command.opcode, command.initiator); + m_busDevice->AddLog(CEC_LOG_DEBUG, strLog); } CCECBusDevice *CCECCommandHandler::GetDevice(cec_logical_address iLogicalAddress) const @@ -305,8 +351,3 @@ CCECBusDevice *CCECCommandHandler::GetDevice(cec_logical_address iLogicalAddress return device; } - -CCECBusDevice *CCECCommandHandler::GetThisDevice(void) const -{ - return m_busDevice->GetProcessor()->m_busDevices[m_busDevice->GetMyLogicalAddress()]; -}