X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2FCECProcessor.cpp;h=ea1a353c5ea90a218fab24338ecb0cb1a5b99390;hb=90cfaac2259efb20d92744578657c85c6f20b786;hp=c7d586e79cce42ab39e061a69b419ebbf786d3f6;hpb=46dfe6c479beeded3b4df937567ff93ec94cc0a8;p=deb_libcec.git diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index c7d586e..ea1a353 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -59,7 +59,7 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, libcec_configuration *configur { CreateBusDevices(); m_configuration.Clear(); - m_configuration.serverVersion = CEC_SERVER_VERSION_1_6_0; + m_configuration.serverVersion = CEC_SERVER_VERSION_1_6_1; SetConfiguration(configuration); if (m_configuration.tvVendor != CEC_VENDOR_UNKNOWN) @@ -77,7 +77,7 @@ CCECProcessor::CCECProcessor(CLibCEC *controller, const char *strDeviceName, con m_iLastTransmission(0) { m_configuration.Clear(); - m_configuration.serverVersion = CEC_SERVER_VERSION_1_6_0; + m_configuration.serverVersion = CEC_SERVER_VERSION_1_6_1; // client version < 1.5.0 m_configuration.clientVersion = (uint32_t)CEC_CLIENT_VERSION_PRE_1_5; @@ -210,7 +210,7 @@ bool CCECProcessor::OpenConnection(const char *strPort, uint16_t iBaudRate, uint bool CCECProcessor::IsInitialised(void) { - CLockObject lock(m_mutex); + CLockObject lock(m_threadMutex); return m_bInitialised; } @@ -240,6 +240,21 @@ bool CCECProcessor::Initialise(void) /* make the primary device the active source if the option is set */ if (m_configuration.bActivateSource == 1) m_busDevices[m_configuration.logicalAddresses.primary]->m_bActiveSource = true; + + /* set the default menu language for devices we control */ + cec_menu_language language; + language.device = m_configuration.logicalAddresses.primary; + memcpy(language.language, m_configuration.strDeviceLanguage, 3); + language.language[3] = 0; + + for (uint8_t iPtr = 0; iPtr < 16; iPtr++) + { + if (m_configuration.logicalAddresses[iPtr]) + { + language.device = (cec_logical_address) iPtr; + m_busDevices[iPtr]->SetMenuLanguage(language); + } + } } /* get the vendor id from the TV, so we are using the correct handler */ @@ -377,12 +392,6 @@ bool CCECProcessor::ChangeDeviceType(cec_device_type from, cec_device_type to) previousDevice->SetCecVersion(CEC_VERSION_UNKNOWN); newDevice->SetMenuLanguage(previousDevice->GetMenuLanguage(false)); - cec_menu_language lang; - lang.device = previousDevice->GetLogicalAddress(); - for (unsigned int iPtr = 0; iPtr < 4; iPtr++) - lang.language[iPtr] = '?'; - lang.language[3] = 0; - previousDevice->SetMenuLanguage(lang); newDevice->SetMenuState(previousDevice->GetMenuState()); previousDevice->SetMenuState(CEC_MENU_STATE_DEACTIVATED); @@ -922,8 +931,21 @@ bool CCECProcessor::Transmit(const cec_command &data) iMaxTries = m_busDevices[data.initiator]->GetHandler()->GetTransmitRetries() + 1; } - return m_communication->Write(data, iMaxTries, m_iStandardLineTimeout, m_iRetryLineTimeout) - == ADAPTER_MESSAGE_STATE_SENT_ACKED; + bool bRetry(true); + uint8_t iTries(0); + uint8_t iLineTimeout = m_iStandardLineTimeout; + cec_adapter_message_state adapterState = ADAPTER_MESSAGE_STATE_UNKNOWN; + + while (bRetry && ++iTries < iMaxTries) + { + if (m_busDevices[data.initiator]->IsUnsupportedFeature(data.opcode)) + return false; + + adapterState = m_communication->Write(data, bRetry, iLineTimeout); + iLineTimeout = m_iRetryLineTimeout; + } + + return adapterState == ADAPTER_MESSAGE_STATE_SENT_ACKED; } void CCECProcessor::TransmitAbort(cec_logical_address address, cec_opcode opcode, cec_abort_reason reason /* = CEC_ABORT_REASON_UNRECOGNIZED_OPCODE */) @@ -990,7 +1012,7 @@ uint16_t CCECProcessor::GetPhysicalAddress(void) const bool CCECProcessor::SetAckMask(uint16_t iMask) { - return m_communication->SetAckMask(iMask); + return m_communication ? m_communication->SetAckMask(iMask) : false; } bool CCECProcessor::TransmitKeypress(cec_logical_address iDestination, cec_user_control_code key, bool bWait /* = true */) @@ -1026,7 +1048,10 @@ bool CCECProcessor::StandbyDevices(cec_logical_address address /* = CECDEVICE_BR for (uint8_t iPtr = 0; iPtr <= 0xF; iPtr++) { if (m_configuration.powerOffDevices[iPtr]) + { + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - putting '%s' in standby mode", __FUNCTION__, ToString((cec_logical_address)iPtr)); bReturn &= m_busDevices[iPtr]->Standby(); + } } return bReturn; } @@ -1041,8 +1066,11 @@ bool CCECProcessor::PowerOnDevices(cec_logical_address address /* = CECDEVICE_BR bool bReturn(true); for (uint8_t iPtr = 0; iPtr <= 0xF; iPtr++) { - if (m_configuration.powerOffDevices[iPtr]) + if (m_configuration.wakeDevices[iPtr]) + { + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - powering on '%s'", __FUNCTION__, ToString((cec_logical_address)iPtr)); bReturn &= m_busDevices[iPtr]->PowerOn(); + } } return bReturn; } @@ -1414,6 +1442,10 @@ const char *CCECProcessor::ToString(const cec_client_version version) return "1.5.3"; case CEC_CLIENT_VERSION_1_6_0: return "1.6.0"; + case CEC_CLIENT_VERSION_1_6_1: + return "1.6.1"; + case CEC_CLIENT_VERSION_1_6_2: + return "1.6.2"; default: return "Unknown"; } @@ -1435,6 +1467,10 @@ const char *CCECProcessor::ToString(const cec_server_version version) return "1.5.3"; case CEC_SERVER_VERSION_1_6_0: return "1.6.0"; + case CEC_SERVER_VERSION_1_6_1: + return "1.6.1"; + case CEC_SERVER_VERSION_1_6_2: + return "1.6.2"; default: return "Unknown"; } @@ -1650,6 +1686,12 @@ bool CCECProcessor::SetConfiguration(const libcec_configuration *configuration) m_configuration.bShutdownOnStandby = configuration->bShutdownOnStandby; } + // client version 1.6.2 + if (configuration->clientVersion >= CEC_CLIENT_VERSION_1_6_2) + { + snprintf(m_configuration.strDeviceLanguage, 3, "%s", configuration->strDeviceLanguage); + } + // ensure that there is at least 1 device type set if (m_configuration.deviceTypes.IsEmpty()) m_configuration.deviceTypes.Add(CEC_DEVICE_TYPE_RECORDING_DEVICE); @@ -1718,12 +1760,12 @@ bool CCECProcessor::GetCurrentConfiguration(libcec_configuration *configuration) bool CCECProcessor::CanPersistConfiguration(void) { - return m_communication->GetFirmwareVersion() >= 2; + return m_communication ? m_communication->GetFirmwareVersion() >= 2 : false; } bool CCECProcessor::PersistConfiguration(libcec_configuration *configuration) { - return m_communication->PersistConfiguration(configuration); + return m_communication ? m_communication->PersistConfiguration(configuration) : false; } void CCECProcessor::RescanActiveDevices(void)