X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2FCECProcessor.cpp;h=88541c01fb315821f402f3f62af1b3cc1c90d0f0;hb=cb9128746f5f12e284c3e2efe92a1a5e39ac453c;hp=ae7d5fd16b93c1b7ecab70f2b8c784b8234f46b5;hpb=78e8010a91b23bd33c547937870d3240c641815f;p=deb_libcec.git diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index ae7d5fd..88541c0 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -41,7 +41,7 @@ using namespace CEC; using namespace std; CCECProcessor::CCECProcessor(CLibCEC *controller, CAdapterCommunication *serComm, const char *strDeviceName, cec_logical_address iLogicalAddress /* = CECDEVICE_PLAYBACKDEVICE1 */, uint16_t iPhysicalAddress /* = CEC_DEFAULT_PHYSICAL_ADDRESS*/) : - m_physicaladdress(iPhysicalAddress), + m_iPhysicalAddress(iPhysicalAddress), m_iLogicalAddress(iLogicalAddress), m_strDeviceName(strDeviceName), m_communication(serComm), @@ -158,8 +158,8 @@ bool CCECProcessor::SetActiveView(void) cec_command command; cec_command::format(command, m_iLogicalAddress, CECDEVICE_BROADCAST, CEC_OPCODE_ACTIVE_SOURCE); - command.parameters.push_back((m_physicaladdress >> 8) & 0xFF); - command.parameters.push_back(m_physicaladdress & 0xFF); + command.parameters.push_back((m_iPhysicalAddress >> 8) & 0xFF); + command.parameters.push_back(m_iPhysicalAddress & 0xFF); return Transmit(command); } @@ -173,8 +173,8 @@ bool CCECProcessor::SetInactiveView(void) cec_command command; cec_command::format(command, m_iLogicalAddress, CECDEVICE_BROADCAST, CEC_OPCODE_INACTIVE_SOURCE); - command.parameters.push_back((m_physicaladdress >> 8) & 0xFF); - command.parameters.push_back(m_physicaladdress & 0xFF); + command.parameters.push_back((m_iPhysicalAddress >> 8) & 0xFF); + command.parameters.push_back(m_iPhysicalAddress & 0xFF); return Transmit(command); } @@ -204,13 +204,39 @@ bool CCECProcessor::Transmit(const cec_command &data, bool bWaitForAck /* = true bool CCECProcessor::SetLogicalAddress(cec_logical_address iLogicalAddress) { CStdString strLog; - strLog.Format("<< setting logical address to %d", iLogicalAddress); + strLog.Format("<< setting logical address to %1x", iLogicalAddress); m_controller->AddLog(CEC_LOG_NOTICE, strLog.c_str()); m_iLogicalAddress = iLogicalAddress; return m_communication && m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress); } +bool CCECProcessor::SetPhysicalAddress(uint16_t iPhysicalAddress) +{ + CStdString strLog; + strLog.Format("<< setting physical address to %2x", iPhysicalAddress); + m_controller->AddLog(CEC_LOG_NOTICE, strLog.c_str()); + + m_iPhysicalAddress = iPhysicalAddress; + return SetActiveView(); +} + +bool CCECProcessor::SetOSDString(cec_logical_address iLogicalAddress, cec_display_control duration, const char *strMessage) +{ + CStdString strLog; + strLog.Format("<< display message '%s'", strMessage); + m_controller->AddLog(CEC_LOG_NOTICE, strLog.c_str()); + + cec_command command; + cec_command::format(command, m_iLogicalAddress, iLogicalAddress, CEC_OPCODE_SET_OSD_STRING); + command.parameters.push_back((uint8_t)duration); + + for (unsigned int iPtr = 0; iPtr < strlen(strMessage); iPtr++) + command.parameters.push_back(strMessage[iPtr]); + + return Transmit(command); +} + bool CCECProcessor::TransmitFormatted(const cec_adapter_message &data, bool bWaitForAck /* = true */) { CLockObject lock(&m_mutex); @@ -316,13 +342,13 @@ void CCECProcessor::ReportOSDName(cec_logical_address address /* = CECDEVICE_TV void CCECProcessor::ReportPhysicalAddress(void) { CStdString strLog; - strLog.Format("<< reporting physical address as %04x", m_physicaladdress); + strLog.Format("<< reporting physical address as %04x", m_iPhysicalAddress); m_controller->AddLog(CEC_LOG_NOTICE, strLog.c_str()); cec_command command; cec_command::format(command, m_iLogicalAddress, CECDEVICE_BROADCAST, CEC_OPCODE_REPORT_PHYSICAL_ADDRESS); - command.parameters.push_back((uint8_t) ((m_physicaladdress >> 8) & 0xFF)); - command.parameters.push_back((uint8_t) (m_physicaladdress & 0xFF)); + command.parameters.push_back((uint8_t) ((m_iPhysicalAddress >> 8) & 0xFF)); + command.parameters.push_back((uint8_t) (m_iPhysicalAddress & 0xFF)); command.parameters.push_back((uint8_t) (CEC_DEVICE_TYPE_PLAYBACK_DEVICE)); Transmit(command); @@ -334,8 +360,8 @@ void CCECProcessor::BroadcastActiveSource(void) cec_command command; cec_command::format(command, m_iLogicalAddress, CECDEVICE_BROADCAST, CEC_OPCODE_ACTIVE_SOURCE); - command.parameters.push_back((uint8_t) ((m_physicaladdress >> 8) & 0xFF)); - command.parameters.push_back((uint8_t) (m_physicaladdress & 0xFF)); + command.parameters.push_back((uint8_t) ((m_iPhysicalAddress >> 8) & 0xFF)); + command.parameters.push_back((uint8_t) (m_iPhysicalAddress & 0xFF)); Transmit(command); } @@ -550,15 +576,18 @@ void CCECProcessor::ParseCommand(cec_command &command) m_controller->AddKey(); if (command.parameters[0] <= CEC_USER_CONTROL_CODE_MAX) + { + CStdString strLog; + strLog.Format("key pressed: %1x", command.parameters[0]); + m_controller->AddLog(CEC_LOG_DEBUG, strLog.c_str()); + m_controller->SetCurrentButton((cec_user_control_code) command.parameters[0]); + } } break; case CEC_OPCODE_USER_CONTROL_RELEASE: m_controller->AddKey(); break; - case CEC_OPCODE_ROUTING_CHANGE: - m_controller->SetActiveView(); - break; default: m_controller->AddCommand(command); break; @@ -567,26 +596,37 @@ void CCECProcessor::ParseCommand(cec_command &command) else if (command.destination == CECDEVICE_BROADCAST) { CStdString strLog; - if (command.opcode == CEC_OPCODE_REQUEST_ACTIVE_SOURCE) + switch (command.opcode) { + case CEC_OPCODE_REQUEST_ACTIVE_SOURCE: strLog.Format(">> %i requests active source", (uint8_t) command.initiator); m_controller->AddLog(CEC_LOG_DEBUG, strLog.c_str()); BroadcastActiveSource(); - } - else if (command.opcode == CEC_OPCODE_SET_STREAM_PATH) - { + break; + case CEC_OPCODE_SET_STREAM_PATH: if (command.parameters.size >= 2) { - int streamaddr = ((int)command.parameters[0] << 8) | ((int)command.parameters[1]); + int streamaddr = ((uint16_t)command.parameters[0] << 8) | ((uint16_t)command.parameters[1]); strLog.Format(">> %i requests stream path from physical address %04x", command.initiator, streamaddr); m_controller->AddLog(CEC_LOG_DEBUG, strLog.c_str()); - if (streamaddr == m_physicaladdress) + if (streamaddr == m_iPhysicalAddress) BroadcastActiveSource(); } - } - else - { + break; + case CEC_OPCODE_ROUTING_CHANGE: + if (command.parameters.size == 4) + { + uint16_t iOldAddress = ((uint16_t)command.parameters[0] << 8) | ((uint16_t)command.parameters[1]); + uint16_t iNewAddress = ((uint16_t)command.parameters[2] << 8) | ((uint16_t)command.parameters[3]); + strLog.Format(">> %i changed physical address from %04x to %04x", command.initiator, iOldAddress, iNewAddress); + m_controller->AddLog(CEC_LOG_DEBUG, strLog.c_str()); + + m_controller->AddCommand(command); + } + break; + default: m_controller->AddCommand(command); + break; } } else