X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fimplementations%2FCECCommandHandler.cpp;h=d1a4855c793364ac65981cf7913d6906f3dfac02;hb=37acf382b4a151ba018ecd3558fdd5b8cc585077;hp=a073a3fe475b031010a84c042a7a3d5d426c5c0b;hpb=16b1e052e4a14432ca3bd6007e0e977ff2bed6ae;p=deb_libcec.git diff --git a/src/lib/implementations/CECCommandHandler.cpp b/src/lib/implementations/CECCommandHandler.cpp index a073a3f..d1a4855 100644 --- a/src/lib/implementations/CECCommandHandler.cpp +++ b/src/lib/implementations/CECCommandHandler.cpp @@ -42,6 +42,7 @@ using namespace std; CCECCommandHandler::CCECCommandHandler(CCECBusDevice *busDevice) { m_busDevice = busDevice; + m_processor = m_busDevice->GetProcessor(); } bool CCECCommandHandler::HandleCommand(const cec_command &command) @@ -49,9 +50,11 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) bool bHandled(true); CStdString strLog; - strLog.Format(">> %s (%X) -> %s (%X): %s (%2X)", ToString(command.initiator), command.initiator, ToString(command.destination), command.destination, ToString(command.opcode), command.opcode); + strLog.Format(">> %s (%X) -> %s (%X): %s (%2X)", m_processor->ToString(command.initiator), command.initiator, m_processor->ToString(command.destination), command.destination, m_processor->ToString(command.opcode), command.opcode); m_busDevice->AddLog(CEC_LOG_NOTICE, strLog); + m_processor->AddCommand(command); + switch(command.opcode) { case CEC_OPCODE_REPORT_POWER_STATUS: @@ -106,7 +109,16 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) HandleGiveSystemAudioModeStatus(command); break; case CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST: - HandleSetSystemAudioModeRequest(command); + HandleSystemAudioModeRequest(command); + break; + case CEC_OPCODE_REPORT_AUDIO_STATUS: + HandleReportAudioStatus(command); + break; + case CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS: + HandleSystemAudioModeStatus(command); + break; + case CEC_OPCODE_SET_SYSTEM_AUDIO_MODE: + HandleSetSystemAudioMode(command); break; case CEC_OPCODE_REQUEST_ACTIVE_SOURCE: HandleRequestActiveSource(command); @@ -129,12 +141,6 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) case CEC_OPCODE_REPORT_PHYSICAL_ADDRESS: HandleReportPhysicalAddress(command); break; - case CEC_OPCODE_REPORT_AUDIO_STATUS: - HandleReportAudioStatus(command); - break; - case CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS: - HandleSystemAudioStatus(command); - break; case CEC_OPCODE_SET_OSD_NAME: HandleSetOSDName(command); break; @@ -150,9 +156,6 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) break; } - if (command.destination == CECDEVICE_BROADCAST || m_busDevice->MyLogicalAddressContains(command.destination)) - m_busDevice->GetProcessor()->AddCommand(command); - return bHandled; } @@ -161,7 +164,7 @@ bool CCECCommandHandler::HandleActiveSource(const cec_command &command) if (command.parameters.size == 2) { uint16_t iAddress = ((uint16_t)command.parameters[0] << 8) | ((uint16_t)command.parameters[1]); - return m_busDevice->GetProcessor()->SetStreamPath(iAddress); + return m_processor->SetStreamPath(iAddress); } return true; @@ -194,7 +197,7 @@ bool CCECCommandHandler::HandleDeviceCecVersion(const cec_command &command) bool CCECCommandHandler::HandleDeviceVendorCommandWithId(const cec_command &command) { if (m_busDevice->MyLogicalAddressContains(command.destination)) - m_busDevice->GetProcessor()->TransmitAbort(command.initiator, command.opcode, CEC_ABORT_REASON_REFUSED); + m_processor->TransmitAbort(command.initiator, command.opcode, CEC_ABORT_REASON_REFUSED); return true; } @@ -303,7 +306,7 @@ bool CCECCommandHandler::HandleGiveSystemAudioModeStatus(const cec_command &comm bool CCECCommandHandler::HandleImageViewOn(const cec_command &command) { - m_busDevice->GetProcessor()->SetActiveSource(command.initiator); + m_processor->SetActiveSource(command.initiator); return true; } @@ -389,7 +392,7 @@ bool CCECCommandHandler::HandleRoutingInformation(const cec_command &command) if (command.parameters.size == 2) { uint16_t iNewAddress = ((uint16_t)command.parameters[0] << 8) | ((uint16_t)command.parameters[1]); - m_busDevice->GetProcessor()->SetStreamPath(iNewAddress); + m_processor->SetStreamPath(iNewAddress); } return false; @@ -444,7 +447,7 @@ bool CCECCommandHandler::HandleSetStreamPath(const cec_command &command) strLog.Format(">> %i sets stream path to physical address %04x", command.initiator, iStreamAddress); m_busDevice->AddLog(CEC_LOG_DEBUG, strLog.c_str()); - if (m_busDevice->GetProcessor()->SetStreamPath(iStreamAddress)) + if (m_processor->SetStreamPath(iStreamAddress)) { CCECBusDevice *device = GetDeviceByPhysicalAddress(iStreamAddress); if (device) @@ -457,13 +460,29 @@ bool CCECCommandHandler::HandleSetStreamPath(const cec_command &command) return false; } -bool CCECCommandHandler::HandleSetSystemAudioModeRequest(const cec_command &command) +bool CCECCommandHandler::HandleSystemAudioModeRequest(const cec_command &command) { - if (m_busDevice->MyLogicalAddressContains(command.destination) && command.parameters.size >= 1) + if (m_busDevice->MyLogicalAddressContains(command.destination)) { CCECBusDevice *device = GetDevice(command.destination); - if (device&& device->GetType() == CEC_DEVICE_TYPE_AUDIO_SYSTEM) - return ((CCECAudioSystem *) device)->SetSystemAudioMode(command); + if (device && device->GetType() == CEC_DEVICE_TYPE_AUDIO_SYSTEM) + { + if (command.parameters.size >= 2) + { + device->SetPowerStatus(CEC_POWER_STATUS_ON); + ((CCECAudioSystem *) device)->SetSystemAudioModeStatus(CEC_SYSTEM_AUDIO_STATUS_ON); + uint16_t iNewAddress = ((uint16_t)command.parameters[0] << 8) | ((uint16_t)command.parameters[1]); + CCECBusDevice *newActiveDevice = GetDeviceByPhysicalAddress(iNewAddress); + if (newActiveDevice) + m_processor->SetActiveSource(newActiveDevice->GetLogicalAddress()); + return ((CCECAudioSystem *) device)->TransmitSetSystemAudioMode(command.initiator); + } + else + { + ((CCECAudioSystem *) device)->SetSystemAudioModeStatus(CEC_SYSTEM_AUDIO_STATUS_OFF); + return ((CCECAudioSystem *) device)->TransmitSetSystemAudioMode(command.initiator); + } + } } return false; } @@ -477,13 +496,31 @@ bool CCECCommandHandler::HandleStandby(const cec_command &command) return true; } -bool CCECCommandHandler::HandleSystemAudioStatus(const cec_command &command) +bool CCECCommandHandler::HandleSystemAudioModeStatus(const cec_command &command) { - CCECBusDevice *device = GetDevice(command.initiator); - if (device && device->GetType() == CEC_DEVICE_TYPE_AUDIO_SYSTEM) + if (command.parameters.size == 1) { - ((CCECAudioSystem *)device)->SetSystemAudioMode(command); - return true; + CCECBusDevice *device = GetDevice(command.initiator); + if (device && device->GetType() == CEC_DEVICE_TYPE_AUDIO_SYSTEM) + { + ((CCECAudioSystem *)device)->SetSystemAudioModeStatus((cec_system_audio_status)command.parameters[0]); + return true; + } + } + + return false; +} + +bool CCECCommandHandler::HandleSetSystemAudioMode(const cec_command &command) +{ + if (command.parameters.size == 1) + { + CCECBusDevice *device = GetDevice(command.initiator); + if (device && device->GetType() == CEC_DEVICE_TYPE_AUDIO_SYSTEM) + { + ((CCECAudioSystem *)device)->SetSystemAudioModeStatus((cec_system_audio_status)command.parameters[0]); + return true; + } } return false; @@ -491,7 +528,7 @@ bool CCECCommandHandler::HandleSystemAudioStatus(const cec_command &command) bool CCECCommandHandler::HandleTextViewOn(const cec_command &command) { - m_busDevice->GetProcessor()->SetActiveSource(command.initiator); + m_processor->SetActiveSource(command.initiator); return true; } @@ -499,7 +536,7 @@ bool CCECCommandHandler::HandleUserControlPressed(const cec_command &command) { if (m_busDevice->MyLogicalAddressContains(command.destination) && command.parameters.size > 0) { - m_busDevice->GetProcessor()->AddKey(); + m_processor->AddKey(); if (command.parameters[0] <= CEC_USER_CONTROL_CODE_MAX) { @@ -515,7 +552,7 @@ bool CCECCommandHandler::HandleUserControlPressed(const cec_command &command) device->SetPowerStatus(CEC_POWER_STATUS_ON); } - m_busDevice->GetProcessor()->SetCurrentButton((cec_user_control_code) command.parameters[0]); + m_processor->SetCurrentButton((cec_user_control_code) command.parameters[0]); return true; } } @@ -525,7 +562,7 @@ bool CCECCommandHandler::HandleUserControlPressed(const cec_command &command) bool CCECCommandHandler::HandleUserControlRelease(const cec_command &command) { if (m_busDevice->MyLogicalAddressContains(command.destination)) - m_busDevice->GetProcessor()->AddKey(); + m_processor->AddKey(); return true; } @@ -541,7 +578,7 @@ unsigned int CCECCommandHandler::GetMyDevices(vector &devices) { unsigned int iReturn(0); - cec_logical_addresses addresses = m_busDevice->GetProcessor()->GetLogicalAddresses(); + cec_logical_addresses addresses = m_processor->GetLogicalAddresses(); for (uint8_t iPtr = 0; iPtr < 16; iPtr++) { if (addresses[iPtr]) @@ -559,19 +596,19 @@ CCECBusDevice *CCECCommandHandler::GetDevice(cec_logical_address iLogicalAddress CCECBusDevice *device = NULL; if (iLogicalAddress >= CECDEVICE_TV && iLogicalAddress <= CECDEVICE_BROADCAST) - device = m_busDevice->GetProcessor()->m_busDevices[iLogicalAddress]; + device = m_processor->m_busDevices[iLogicalAddress]; return device; } CCECBusDevice *CCECCommandHandler::GetDeviceByPhysicalAddress(uint16_t iPhysicalAddress) const { - return m_busDevice->GetProcessor()->GetDeviceByPhysicalAddress(iPhysicalAddress); + return m_processor->GetDeviceByPhysicalAddress(iPhysicalAddress); } CCECBusDevice *CCECCommandHandler::GetDeviceByType(cec_device_type type) const { - return m_busDevice->GetProcessor()->GetDeviceByType(type); + return m_processor->GetDeviceByType(type); } void CCECCommandHandler::SetVendorId(const cec_command &command) @@ -595,331 +632,27 @@ void CCECCommandHandler::SetPhysicalAddress(cec_logical_address iAddress, uint16 { if (!m_busDevice->MyLogicalAddressContains(iAddress)) { - bool bOurAddress(m_busDevice->GetProcessor()->GetPhysicalAddress() == iNewAddress); + bool bOurAddress(m_processor->GetPhysicalAddress() == iNewAddress); GetDevice(iAddress)->SetPhysicalAddress(iNewAddress); if (bOurAddress) { /* another device reported the same physical address as ours * since we don't have physical address detection yet, we'll just use the * given address, increased by 0x100 for now */ - m_busDevice->GetProcessor()->SetPhysicalAddress(iNewAddress + 0x100); + m_processor->SetPhysicalAddress(iNewAddress + 0x100); } } } -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) -{ - switch (status) - { - case CEC_POWER_STATUS_ON: - return "on"; - case CEC_POWER_STATUS_STANDBY: - return "standby"; - case CEC_POWER_STATUS_IN_TRANSITION_ON_TO_STANDBY: - return "in transition from on to standby"; - case CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON: - return "in transition from standby to on"; - default: - return "unknown"; - } -} - -const char *CCECCommandHandler::ToString(const cec_logical_address address) +void CCECCommandHandler::HandlePoll(const cec_logical_address iInitiator, const cec_logical_address iDestination) { - switch(address) - { - case CECDEVICE_AUDIOSYSTEM: - return "Audio"; - case CECDEVICE_BROADCAST: - return "Broadcast"; - case CECDEVICE_FREEUSE: - return "Free use"; - case CECDEVICE_PLAYBACKDEVICE1: - return "Playback 1"; - case CECDEVICE_PLAYBACKDEVICE2: - return "Playback 2"; - case CECDEVICE_PLAYBACKDEVICE3: - return "Playback 3"; - case CECDEVICE_RECORDINGDEVICE1: - return "Recorder 1"; - case CECDEVICE_RECORDINGDEVICE2: - return "Recorder 2"; - case CECDEVICE_RECORDINGDEVICE3: - return "Recorder 3"; - case CECDEVICE_RESERVED1: - return "Reserved 1"; - case CECDEVICE_RESERVED2: - return "Reserved 2"; - case CECDEVICE_TUNER1: - return "Tuner 1"; - case CECDEVICE_TUNER2: - return "Tuner 2"; - case CECDEVICE_TUNER3: - return "Tuner 3"; - case CECDEVICE_TUNER4: - return "Tuner 4"; - case CECDEVICE_TV: - return "TV"; - default: - return "unknown"; - } -} - -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) - { - case CEC_DECK_INFO_PLAY: - return "play"; - case CEC_DECK_INFO_RECORD: - return "record"; - case CEC_DECK_INFO_PLAY_REVERSE: - return "play reverse"; - case CEC_DECK_INFO_STILL: - return "still"; - case CEC_DECK_INFO_SLOW: - return "slow"; - case CEC_DECK_INFO_SLOW_REVERSE: - return "slow reverse"; - case CEC_DECK_INFO_FAST_FORWARD: - return "fast forward"; - case CEC_DECK_INFO_FAST_REVERSE: - return "fast reverse"; - case CEC_DECK_INFO_NO_MEDIA: - return "no media"; - case CEC_DECK_INFO_STOP: - return "stop"; - case CEC_DECK_INFO_SKIP_FORWARD_WIND: - return "info skip forward wind"; - case CEC_DECK_INFO_SKIP_REVERSE_REWIND: - return "info skip reverse rewind"; - case CEC_DECK_INFO_INDEX_SEARCH_FORWARD: - return "info index search forward"; - case CEC_DECK_INFO_INDEX_SEARCH_REVERSE: - return "info index search reverse"; - case CEC_DECK_INFO_OTHER_STATUS: - return "other"; - default: - return "unknown"; - } -} - -const char *CCECCommandHandler::ToString(const cec_opcode opcode) -{ - switch (opcode) - { - case CEC_OPCODE_ACTIVE_SOURCE: - return "active source"; - case CEC_OPCODE_IMAGE_VIEW_ON: - return "image view on"; - case CEC_OPCODE_TEXT_VIEW_ON: - return "text view on"; - case CEC_OPCODE_INACTIVE_SOURCE: - return "inactive source"; - case CEC_OPCODE_REQUEST_ACTIVE_SOURCE: - return "request active source"; - case CEC_OPCODE_ROUTING_CHANGE: - return "routing change"; - case CEC_OPCODE_ROUTING_INFORMATION: - return "routing information"; - case CEC_OPCODE_SET_STREAM_PATH: - return "set stream path"; - case CEC_OPCODE_STANDBY: - return "standby"; - case CEC_OPCODE_RECORD_OFF: - return "record off"; - case CEC_OPCODE_RECORD_ON: - return "record on"; - case CEC_OPCODE_RECORD_STATUS: - return "record status"; - case CEC_OPCODE_RECORD_TV_SCREEN: - return "record tv screen"; - case CEC_OPCODE_CLEAR_ANALOGUE_TIMER: - return "clear analogue timer"; - case CEC_OPCODE_CLEAR_DIGITAL_TIMER: - return "clear digital timer"; - case CEC_OPCODE_CLEAR_EXTERNAL_TIMER: - return "clear external timer"; - case CEC_OPCODE_SET_ANALOGUE_TIMER: - return "set analogue timer"; - case CEC_OPCODE_SET_DIGITAL_TIMER: - return "set digital timer"; - case CEC_OPCODE_SET_EXTERNAL_TIMER: - return "set external timer"; - case CEC_OPCODE_SET_TIMER_PROGRAM_TITLE: - return "set timer program title"; - case CEC_OPCODE_TIMER_CLEARED_STATUS: - return "timer cleared status"; - case CEC_OPCODE_TIMER_STATUS: - return "timer status"; - case CEC_OPCODE_CEC_VERSION: - return "cec version"; - case CEC_OPCODE_GET_CEC_VERSION: - return "get cec version"; - case CEC_OPCODE_GIVE_PHYSICAL_ADDRESS: - return "give physical address"; - case CEC_OPCODE_GET_MENU_LANGUAGE: - return "get menu language"; - case CEC_OPCODE_REPORT_PHYSICAL_ADDRESS: - return "report physical address"; - case CEC_OPCODE_SET_MENU_LANGUAGE: - return "set menu language"; - case CEC_OPCODE_DECK_CONTROL: - return "deck control"; - case CEC_OPCODE_DECK_STATUS: - return "deck status"; - case CEC_OPCODE_GIVE_DECK_STATUS: - return "give deck status"; - case CEC_OPCODE_PLAY: - return "play"; - case CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS: - return "give tuner status"; - case CEC_OPCODE_SELECT_ANALOGUE_SERVICE: - return "select analogue service"; - case CEC_OPCODE_SELECT_DIGITAL_SERVICE: - return "set digital service"; - case CEC_OPCODE_TUNER_DEVICE_STATUS: - return "tuner device status"; - case CEC_OPCODE_TUNER_STEP_DECREMENT: - return "tuner step decrement"; - case CEC_OPCODE_TUNER_STEP_INCREMENT: - return "tuner step increment"; - case CEC_OPCODE_DEVICE_VENDOR_ID: - return "device vendor id"; - case CEC_OPCODE_GIVE_DEVICE_VENDOR_ID: - return "give device vendor id"; - case CEC_OPCODE_VENDOR_COMMAND: - return "vendor command"; - case CEC_OPCODE_VENDOR_COMMAND_WITH_ID: - return "vendor command with id"; - case CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN: - return "vendor remote button down"; - case CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP: - return "vendor remote button up"; - case CEC_OPCODE_SET_OSD_STRING: - return "set osd string"; - case CEC_OPCODE_GIVE_OSD_NAME: - return "give osd name"; - case CEC_OPCODE_SET_OSD_NAME: - return "set osd name"; - case CEC_OPCODE_MENU_REQUEST: - return "menu request"; - case CEC_OPCODE_MENU_STATUS: - return "menu status"; - case CEC_OPCODE_USER_CONTROL_PRESSED: - return "user control pressed"; - case CEC_OPCODE_USER_CONTROL_RELEASE: - return "user control release"; - case CEC_OPCODE_GIVE_DEVICE_POWER_STATUS: - return "give device power status"; - case CEC_OPCODE_REPORT_POWER_STATUS: - return "report power status"; - case CEC_OPCODE_FEATURE_ABORT: - return "feature abort"; - case CEC_OPCODE_ABORT: - return "abort"; - case CEC_OPCODE_GIVE_AUDIO_STATUS: - return "give audio status"; - case CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS: - return "give audio mode status"; - case CEC_OPCODE_REPORT_AUDIO_STATUS: - return "report audio status"; - case CEC_OPCODE_SET_SYSTEM_AUDIO_MODE: - return "set system audio mode"; - case CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST: - return "system audio mode request"; - case CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS: - return "system audio mode status"; - case CEC_OPCODE_SET_AUDIO_RATE: - return "set audio rate"; - default: - 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"; + CStdString strLog; + strLog.Format("<< POLL: %s (%x) -> %s (%x)", m_processor->ToString(iInitiator), iInitiator, m_processor->ToString(iDestination), iDestination); + m_processor->AddLog(CEC_LOG_DEBUG, strLog); } -const char *CCECCommandHandler::ToString(const cec_vendor_id vendor) +bool CCECCommandHandler::HandleReceiveFailed(void) { - 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"; - case CEC_VENDOR_ONKYO: - return "Onkyo"; - default: - return "Unknown"; - } + /* default = error */ + return true; }