X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fimplementations%2FCECCommandHandler.cpp;h=7e5c87224e8541e45e40305a0abdaafe0e849a34;hb=a483a2fb27b9adbd48b114b5c9f25977dee12ea2;hp=94aaeaa9fcfd941a6116ef1abb139bf1033dcd45;hpb=66c16b6967cb0272afbdcce34156a754f00e5311;p=deb_libcec.git diff --git a/src/lib/implementations/CECCommandHandler.cpp b/src/lib/implementations/CECCommandHandler.cpp index 94aaeaa..7e5c872 100644 --- a/src/lib/implementations/CECCommandHandler.cpp +++ b/src/lib/implementations/CECCommandHandler.cpp @@ -85,8 +85,17 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) case CEC_OPCODE_GIVE_DECK_STATUS: HandleGiveDeckStatus(command); break; + case CEC_OPCODE_DECK_CONTROL: + HandleDeckControl(command); + /* pass to listeners */ + m_busDevice->GetProcessor()->AddCommand(command); + break; case CEC_OPCODE_MENU_REQUEST: - HandleMenuRequest(command); + if (!HandleMenuRequest(command)) + { + /* pass to listeners */ + m_busDevice->GetProcessor()->AddCommand(command); + } break; case CEC_OPCODE_GIVE_DEVICE_POWER_STATUS: HandleGiveDevicePowerStatus(command); @@ -182,6 +191,18 @@ bool CCECCommandHandler::HandleActiveSource(const cec_command &command) return true; } +bool CCECCommandHandler::HandleDeckControl(const cec_command &command) +{ + CCECBusDevice *device = GetDevice(command.destination); + if (device && device->GetType() == CEC_DEVICE_TYPE_PLAYBACK_DEVICE && command.parameters.size > 0) + { + ((CCECPlaybackDevice *) device)->SetDeckControlMode((cec_deck_control_mode) command.parameters[0]); + return true; + } + + return false; +} + bool CCECCommandHandler::HandleDeviceCecVersion(const cec_command &command) { if (command.parameters.size == 1) @@ -197,6 +218,7 @@ bool CCECCommandHandler::HandleDeviceCecVersion(const cec_command &command) bool CCECCommandHandler::HandleDeviceVendorCommandWithId(const cec_command &command) { SetVendorId(command); + m_busDevice->GetProcessor()->TransmitAbort(command.initiator, command.opcode, CEC_ABORT_REASON_REFUSED); return true; } @@ -300,6 +322,7 @@ bool CCECCommandHandler::HandleRequestActiveSource(const cec_command &command) vector devices; for (int iDevicePtr = (int)GetMyDevices(devices)-1; iDevicePtr >=0; iDevicePtr--) devices[iDevicePtr]->TransmitActiveSource(); + return true; } @@ -339,12 +362,21 @@ bool CCECCommandHandler::HandleSetStreamPath(const cec_command &command) { if (command.parameters.size >= 2) { - int streamaddr = ((uint16_t)command.parameters[0] << 8) | ((uint16_t)command.parameters[1]); + uint16_t iStreamAddress = ((uint16_t)command.parameters[0] << 8) | ((uint16_t)command.parameters[1]); CStdString strLog; - strLog.Format(">> %i sets stream path to physical address %04x", command.initiator, streamaddr); + strLog.Format(">> %i sets stream path to physical address %04x", command.initiator, iStreamAddress); m_busDevice->AddLog(CEC_LOG_DEBUG, strLog.c_str()); - return m_busDevice->GetProcessor()->SetStreamPath(streamaddr); + if (m_busDevice->GetProcessor()->SetStreamPath(iStreamAddress)) + { + CCECBusDevice *device = GetDeviceByPhysicalAddress(iStreamAddress); + if (device) + { + return device->TransmitActiveSource() && + device->TransmitMenuState(command.initiator); + } + } + return false; } return true; } @@ -421,7 +453,7 @@ unsigned int CCECCommandHandler::GetMyDevices(vector &devices) unsigned int iReturn(0); cec_logical_addresses addresses = m_busDevice->GetProcessor()->GetLogicalAddresses(); - for (unsigned int iPtr = 0; iPtr < 16; iPtr++) + for (uint8_t iPtr = 0; iPtr < 16; iPtr++) { if (addresses[iPtr]) { @@ -448,6 +480,11 @@ CCECBusDevice *CCECCommandHandler::GetDeviceByPhysicalAddress(uint16_t iPhysical return m_busDevice->GetProcessor()->GetDeviceByPhysicalAddress(iPhysicalAddress); } +CCECBusDevice *CCECCommandHandler::GetDeviceByType(cec_device_type type) const +{ + return m_busDevice->GetProcessor()->GetDeviceByType(type); +} + void CCECCommandHandler::SetVendorId(const cec_command &command) { if (command.parameters.size < 3) @@ -462,7 +499,39 @@ void CCECCommandHandler::SetVendorId(const cec_command &command) CCECBusDevice *device = GetDevice((cec_logical_address) command.initiator); if (device) - device->SetVendorId(iVendorId, command.parameters.size > 3 ? command.parameters[3] : 0); + device->SetVendorId(iVendorId); +} + +const char *CCECCommandHandler::ToString(const cec_menu_state state) +{ + switch (state) + { + case CEC_MENU_STATE_ACTIVATED: + return "activated"; + case CEC_MENU_STATE_DEACTIVATED: + return "deactivated"; + default: + return "unknown"; + } +} + +const char *CCECCommandHandler::ToString(const cec_version version) +{ + switch (version) + { + case CEC_VERSION_1_2: + return "1.2"; + case CEC_VERSION_1_2A: + return "1.2a"; + case CEC_VERSION_1_3: + return "1.3"; + case CEC_VERSION_1_3A: + return "1.3a"; + case CEC_VERSION_1_4: + return "1.4"; + default: + return "unknown"; + } } const char *CCECCommandHandler::ToString(const cec_power_status status) @@ -523,6 +592,23 @@ const char *CCECCommandHandler::ToString(const cec_logical_address address) } } +const char *CCECCommandHandler::ToString(const cec_deck_control_mode mode) +{ + switch (mode) + { + case CEC_DECK_CONTROL_MODE_SKIP_FORWARD_WIND: + return "skip forward wind"; + case CEC_DECK_CONTROL_MODE_EJECT: + return "eject"; + case CEC_DECK_CONTROL_MODE_SKIP_REVERSE_REWIND: + return "reverse rewind"; + case CEC_DECK_CONTROL_MODE_STOP: + return "stop"; + default: + return "unknown"; + } +} + const char *CCECCommandHandler::ToString(const cec_deck_info status) { switch (status) @@ -694,3 +780,39 @@ const char *CCECCommandHandler::ToString(const cec_opcode opcode) return "UNKNOWN"; } } + +const char *CCECCommandHandler::ToString(const cec_system_audio_status mode) +{ + switch(mode) + { + case CEC_SYSTEM_AUDIO_STATUS_ON: + return "on"; + case CEC_SYSTEM_AUDIO_STATUS_OFF: + return "off"; + default: + return "unknown"; + } +} + +const char *CCECCommandHandler::ToString(const cec_audio_status status) +{ + // TODO this is a mask + return "TODO"; +} + +const char *CCECCommandHandler::ToString(const cec_vendor_id vendor) +{ + switch (vendor) + { + case CEC_VENDOR_SAMSUNG: + return "Samsung"; + case CEC_VENDOR_LG: + return "LG"; + case CEC_VENDOR_PANASONIC: + return "Panasonic"; + case CEC_VENDOR_PIONEER: + return "Pioneer"; + default: + return "Unknown"; + } +}