X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;ds=inline;f=src%2Flib%2FCECProcessor.cpp;h=6e5bf19f6f7880609c033433866b85befbc0f469;hb=f3b6afa4b5b7637741592ce4535e34e04e68cb6a;hp=dee5f5949af2321acdfbb62a0682599014305d67;hpb=dd18e809ed406bd52c1097224c3f1c4419f5bf65;p=deb_libcec.git diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index dee5f59..6e5bf19 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 = configuration->serverVersion; + m_configuration.serverVersion = CEC_SERVER_VERSION_1_6_0; 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_5_2; + m_configuration.serverVersion = CEC_SERVER_VERSION_1_6_0; // client version < 1.5.0 m_configuration.clientVersion = (uint32_t)CEC_CLIENT_VERSION_PRE_1_5; @@ -150,13 +150,14 @@ void CCECProcessor::Close(void) if (bClose && m_communication) { + m_communication->PersistConfiguration(&m_configuration); m_communication->Close(); delete m_communication; m_communication = NULL; } } -bool CCECProcessor::OpenConnection(const char *strPort, uint16_t iBaudRate, uint32_t iTimeoutMs) +bool CCECProcessor::OpenConnection(const char *strPort, uint16_t iBaudRate, uint32_t iTimeoutMs, bool bStartListening /* = true */) { bool bReturn(false); Close(); @@ -183,7 +184,7 @@ bool CCECProcessor::OpenConnection(const char *strPort, uint16_t iBaudRate, uint /* open a new connection */ unsigned iConnectTry(0); - while (timeout.TimeLeft() > 0 && (bReturn = m_communication->Open(this, (timeout.TimeLeft() / CEC_CONNECT_TRIES))) == false) + while (timeout.TimeLeft() > 0 && (bReturn = m_communication->Open(this, (timeout.TimeLeft() / CEC_CONNECT_TRIES), false, bStartListening)) == false) { CLibCEC::AddLog(CEC_LOG_ERROR, "could not open a connection (try %d)", ++iConnectTry); m_communication->Close(); @@ -191,7 +192,13 @@ bool CCECProcessor::OpenConnection(const char *strPort, uint16_t iBaudRate, uint } if (bReturn) - CLibCEC::AddLog(CEC_LOG_NOTICE, "connected to the CEC adapter. firmware version = %d, client version = %s", m_communication->GetFirmwareVersion(), ToString((cec_client_version)m_configuration.clientVersion)); + { + m_configuration.iFirmwareVersion = m_communication->GetFirmwareVersion(); + CLibCEC::AddLog(CEC_LOG_NOTICE, "connected to the CEC adapter. firmware version = %d, client version = %s", m_configuration.iFirmwareVersion, ToString((cec_client_version)m_configuration.clientVersion)); + } + + if (m_configuration.bGetSettingsFromROM == 1) + m_communication->GetConfiguration(&m_configuration); return bReturn; } @@ -888,7 +895,7 @@ bool CCECProcessor::Transmit(const cec_command &data) iMaxTries = m_busDevices[data.initiator]->GetHandler()->GetTransmitRetries() + 1; } - return m_communication->Write(data, iMaxTries, m_iLineTimeout, m_iRetryLineTimeout) + return m_communication->Write(data, iMaxTries, m_iStandardLineTimeout, m_iRetryLineTimeout) == ADAPTER_MESSAGE_STATE_SENT_ACKED; } @@ -908,7 +915,9 @@ void CCECProcessor::TransmitAbort(cec_logical_address address, cec_opcode opcode void CCECProcessor::ParseCommand(const cec_command &command) { CStdString dataStr; - dataStr.Format(">> %1x%1x:%02x", command.initiator, command.destination, command.opcode); + dataStr.Format(">> %1x%1x", command.initiator, command.destination); + if (command.opcode_set == 1) + dataStr.AppendFormat(":%02x", command.opcode); for (uint8_t iPtr = 0; iPtr < command.parameters.size; iPtr++) dataStr.AppendFormat(":%02x", (unsigned int)command.parameters[iPtr]); CLibCEC::AddLog(CEC_LOG_TRAFFIC, dataStr.c_str()); @@ -1374,6 +1383,10 @@ const char *CCECProcessor::ToString(const cec_client_version version) return "1.5.1"; case CEC_CLIENT_VERSION_1_5_2: return "1.5.2"; + case CEC_CLIENT_VERSION_1_5_3: + return "1.5.3"; + case CEC_CLIENT_VERSION_1_6_0: + return "1.6.0"; default: return "Unknown"; } @@ -1391,6 +1404,10 @@ const char *CCECProcessor::ToString(const cec_server_version version) return "1.5.1"; case CEC_SERVER_VERSION_1_5_2: return "1.5.2"; + case CEC_SERVER_VERSION_1_5_3: + return "1.5.3"; + case CEC_SERVER_VERSION_1_6_0: + return "1.6.0"; default: return "Unknown"; } @@ -1475,7 +1492,7 @@ bool CCECProcessor::PingAdapter(void) void CCECProcessor::HandlePoll(cec_logical_address initiator, cec_logical_address destination) { - m_busDevices[initiator]->HandlePoll(destination); + m_busDevices[destination]->HandlePoll(initiator); } bool CCECProcessor::HandleReceiveFailed(cec_logical_address initiator) @@ -1643,6 +1660,10 @@ bool CCECProcessor::GetCurrentConfiguration(libcec_configuration *configuration) if (configuration->clientVersion >= CEC_CLIENT_VERSION_1_5_3) configuration->logicalAddresses = m_configuration.logicalAddresses; + // client version 1.6.0 + if (configuration->clientVersion >= CEC_CLIENT_VERSION_1_5_3) + configuration->logicalAddresses = m_configuration.logicalAddresses; + return true; } @@ -1661,3 +1682,16 @@ void CCECProcessor::RescanActiveDevices(void) for (unsigned int iPtr = 0; iPtr < 16; iPtr++) m_busDevices[iPtr]->GetStatus(true); } + +bool CCECProcessor::GetDeviceInformation(const char *strPort, libcec_configuration *config, uint32_t iTimeoutMs /* = 10000 */) +{ + if (!OpenConnection(strPort, 38400, iTimeoutMs, false)) + return false; + + config->iFirmwareVersion = m_communication->GetFirmwareVersion(); + config->iPhysicalAddress = m_communication->GetPhysicalAddress(); + + delete m_communication; + m_communication = NULL; + return true; +}