X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2FCECProcessor.cpp;h=435eec925a0ff9c52d6eb543cf72e341fff2f12e;hb=3d78df91b40ec5020b312fff1ff0c3abe1524948;hp=cb4fe8101e31adb144515dab7009830ea71f3c0c;hpb=5dcf9f25c9b94a9c7a1892cce6e94857ae413a48;p=deb_libcec.git diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index cb4fe81..435eec9 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -41,6 +41,7 @@ #include "devices/CECTV.h" #include "implementations/CECCommandHandler.h" #include "LibCEC.h" +#include "platform/util/timeutils.h" using namespace CEC; using namespace std; @@ -134,20 +135,49 @@ bool CCECProcessor::OpenConnection(const char *strPort, uint16_t iBaudRate, uint CLockObject lock(m_mutex); if (!m_communication) { - m_controller->AddLog(CEC_LOG_ERROR, "no connection handler found"); + CLibCEC::AddLog(CEC_LOG_ERROR, "no connection handler found"); return bReturn; } /* check for an already opened connection */ if (m_communication->IsOpen()) { - m_controller->AddLog(CEC_LOG_ERROR, "connection already opened"); + CLibCEC::AddLog(CEC_LOG_ERROR, "connection already opened"); return bReturn; } + uint64_t iNow = GetTimeMs(); + uint64_t iTarget = iTimeoutMs > 0 ? iNow + iTimeoutMs : iNow + CEC_DEFAULT_TRANSMIT_WAIT; + unsigned iConnectTry(0), iPingTry(0), iFwVersionTry(0); + bool bConnected(false), bPinged(false); + /* open a new connection */ - if ((bReturn = m_communication->Open(strPort, iBaudRate, iTimeoutMs)) == false) - m_controller->AddLog(CEC_LOG_ERROR, "could not open a connection"); + while (iNow < iTarget && (bConnected = m_communication->Open(strPort, iBaudRate, iTimeoutMs)) == false) + { + CLibCEC::AddLog(CEC_LOG_ERROR, "could not open a connection (try %d)", ++iConnectTry); + Sleep(500); + iNow = GetTimeMs(); + } + + /* try to ping the adapter */ + while (bConnected && iNow < iTarget && (bPinged = m_communication->PingAdapter()) == false) + { + CLibCEC::AddLog(CEC_LOG_ERROR, "the adapter did not respond correctly to a ping (try %d)", ++iPingTry); + Sleep(500); + iNow = GetTimeMs(); + } + + /* try to read the firmware version */ + uint16_t iFirmwareVersion(CEC_FW_VERSION_UNKNOWN); + while (bPinged && iNow < iTarget && (iFirmwareVersion = m_communication->GetFirmwareVersion()) == CEC_FW_VERSION_UNKNOWN) + { + CLibCEC::AddLog(CEC_LOG_ERROR, "the adapter did not respond with a correct firmware version (try %d)", ++iFwVersionTry); + Sleep(500); + iNow = GetTimeMs(); + } + + if ((bReturn = iFirmwareVersion != CEC_FW_VERSION_UNKNOWN) == true) + CLibCEC::AddLog(CEC_LOG_NOTICE, "connected to the CEC adapter. firmware version = %d", iFirmwareVersion); return bReturn; } @@ -168,7 +198,7 @@ bool CCECProcessor::Initialise(void) if (!FindLogicalAddresses()) { - m_controller->AddLog(CEC_LOG_ERROR, "could not detect our logical addresses"); + CLibCEC::AddLog(CEC_LOG_ERROR, "could not detect our logical addresses"); return bReturn; } @@ -181,11 +211,7 @@ bool CCECProcessor::Initialise(void) ReplaceHandlers(); if ((bReturn = SetHDMIPort(m_iBaseDevice, m_iHDMIPort, true)) == false) - { - CStdString strLog; - strLog.Format("unable to set HDMI port %d on %s (%x)", m_iHDMIPort, ToString(m_iBaseDevice), (uint8_t)m_iBaseDevice); - m_controller->AddLog(CEC_LOG_ERROR, strLog); - } + CLibCEC::AddLog(CEC_LOG_ERROR, "unable to set HDMI port %d on %s (%x)", m_iHDMIPort, ToString(m_iBaseDevice), (uint8_t)m_iBaseDevice); SetInitialised(bReturn); @@ -204,19 +230,19 @@ bool CCECProcessor::Start(const char *strPort, uint16_t iBaudRate /* = 38400 */, /* create the processor thread */ if (!CreateThread() || !m_startCondition.Wait(m_mutex) || !m_bStarted) { - m_controller->AddLog(CEC_LOG_ERROR, "could not create a processor thread"); + CLibCEC::AddLog(CEC_LOG_ERROR, "could not create a processor thread"); return bReturn; } } if ((bReturn = Initialise()) == false) { - m_controller->AddLog(CEC_LOG_ERROR, "could not create a processor thread"); + CLibCEC::AddLog(CEC_LOG_ERROR, "could not create a processor thread"); StopThread(true); } else { - m_controller->AddLog(CEC_LOG_DEBUG, "processor thread started"); + CLibCEC::AddLog(CEC_LOG_DEBUG, "processor thread started"); } return bReturn; @@ -235,7 +261,7 @@ bool CCECProcessor::TryLogicalAddress(cec_logical_address address) bool CCECProcessor::FindLogicalAddressRecordingDevice(void) { - AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'recording device'"); + CLibCEC::AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'recording device'"); return TryLogicalAddress(CECDEVICE_RECORDINGDEVICE1) || TryLogicalAddress(CECDEVICE_RECORDINGDEVICE2) || TryLogicalAddress(CECDEVICE_RECORDINGDEVICE3); @@ -243,7 +269,7 @@ bool CCECProcessor::FindLogicalAddressRecordingDevice(void) bool CCECProcessor::FindLogicalAddressTuner(void) { - AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'tuner'"); + CLibCEC::AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'tuner'"); return TryLogicalAddress(CECDEVICE_TUNER1) || TryLogicalAddress(CECDEVICE_TUNER2) || TryLogicalAddress(CECDEVICE_TUNER3) || @@ -252,7 +278,7 @@ bool CCECProcessor::FindLogicalAddressTuner(void) bool CCECProcessor::FindLogicalAddressPlaybackDevice(void) { - AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'playback device'"); + CLibCEC::AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'playback device'"); return TryLogicalAddress(CECDEVICE_PLAYBACKDEVICE1) || TryLogicalAddress(CECDEVICE_PLAYBACKDEVICE2) || TryLogicalAddress(CECDEVICE_PLAYBACKDEVICE3); @@ -260,7 +286,7 @@ bool CCECProcessor::FindLogicalAddressPlaybackDevice(void) bool CCECProcessor::FindLogicalAddressAudioSystem(void) { - AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'audio'"); + CLibCEC::AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'audio'"); return TryLogicalAddress(CECDEVICE_AUDIOSYSTEM); } @@ -268,9 +294,7 @@ bool CCECProcessor::ChangeDeviceType(cec_device_type from, cec_device_type to) { bool bChanged(false); - CStdString strLog; - strLog.Format("changing device type '%s' into '%s'", ToString(from), ToString(to)); - AddLog(CEC_LOG_NOTICE, strLog); + CLibCEC::AddLog(CEC_LOG_NOTICE, "changing device type '%s' into '%s'", ToString(from), ToString(to)); CLockObject lock(m_mutex); CCECBusDevice *previousDevice = GetDeviceByType(from); @@ -347,15 +371,13 @@ bool CCECProcessor::FindLogicalAddresses(void) { bool bReturn(true); m_logicalAddresses.Clear(); - CStdString strLog; for (unsigned int iPtr = 0; iPtr < 5; iPtr++) { if (m_types.types[iPtr] == CEC_DEVICE_TYPE_RESERVED) continue; - strLog.Format("%s - device %d: type %d", __FUNCTION__, iPtr, m_types.types[iPtr]); - AddLog(CEC_LOG_DEBUG, strLog); + CLibCEC::AddLog(CEC_LOG_DEBUG, "%s - device %d: type %d", __FUNCTION__, iPtr, m_types.types[iPtr]); if (m_types.types[iPtr] == CEC_DEVICE_TYPE_RECORDING_DEVICE) bReturn &= FindLogicalAddressRecordingDevice(); @@ -388,7 +410,7 @@ void *CCECProcessor::Process(void) { CLockObject lock(m_mutex); m_bStarted = true; - m_controller->AddLog(CEC_LOG_DEBUG, "processor thread started"); + CLibCEC::AddLog(CEC_LOG_DEBUG, "processor thread started"); m_startCondition.Signal(); } @@ -536,9 +558,7 @@ bool CCECProcessor::SetHDMIPort(cec_logical_address iBaseDevice, uint8_t iPort, if (!m_bStarted && !bForce) return true; - CStdString strLog; - strLog.Format("setting HDMI port to %d on device %s (%d)", iPort, ToString(iBaseDevice), (int)iBaseDevice); - AddLog(CEC_LOG_DEBUG, strLog); + CLibCEC::AddLog(CEC_LOG_DEBUG, "setting HDMI port to %d on device %s (%d)", iPort, ToString(iBaseDevice), (int)iBaseDevice); uint16_t iPhysicalAddress(0); if (iBaseDevice > CECDEVICE_TV) @@ -563,7 +583,7 @@ bool CCECProcessor::SetHDMIPort(cec_logical_address iBaseDevice, uint8_t iPort, } if (!bReturn) - m_controller->AddLog(CEC_LOG_ERROR, "failed to set the physical address"); + CLibCEC::AddLog(CEC_LOG_ERROR, "failed to set the physical address"); else { lock.Unlock(); @@ -602,7 +622,7 @@ void CCECProcessor::LogOutput(const cec_command &data) for (uint8_t iPtr = 0; iPtr < data.parameters.size; iPtr++) strTx.AppendFormat(":%02x", data.parameters[iPtr]); - m_controller->AddLog(CEC_LOG_TRAFFIC, strTx.c_str()); + CLibCEC::AddLog(CEC_LOG_TRAFFIC, strTx.c_str()); } bool CCECProcessor::SetLogicalAddress(cec_logical_address iLogicalAddress) @@ -610,9 +630,7 @@ bool CCECProcessor::SetLogicalAddress(cec_logical_address iLogicalAddress) CLockObject lock(m_mutex); if (m_logicalAddresses.primary != iLogicalAddress) { - CStdString strLog; - strLog.Format("<< setting primary logical address to %1x", iLogicalAddress); - m_controller->AddLog(CEC_LOG_NOTICE, strLog.c_str()); + CLibCEC::AddLog(CEC_LOG_NOTICE, "<< setting primary logical address to %1x", iLogicalAddress); m_logicalAddresses.primary = iLogicalAddress; m_logicalAddresses.Set(iLogicalAddress); return SetAckMask(m_logicalAddresses.AckMask()); @@ -673,9 +691,7 @@ bool CCECProcessor::SetPhysicalAddress(uint16_t iPhysicalAddress, bool bSendUpda bool CCECProcessor::SwitchMonitoring(bool bEnable) { - CStdString strLog; - strLog.Format("== %s monitoring mode ==", bEnable ? "enabling" : "disabling"); - m_controller->AddLog(CEC_LOG_NOTICE, strLog.c_str()); + CLibCEC::AddLog(CEC_LOG_NOTICE, "== %s monitoring mode ==", bEnable ? "enabling" : "disabling"); { CLockObject lock(m_mutex); @@ -848,7 +864,7 @@ bool CCECProcessor::Transmit(const cec_command &data) bReturn = Transmit(output); /* set to "not present" on failed ack */ - if (output->IsError() && output->reply == MSGCODE_TRANSMIT_FAILED_ACK && + if (output->state == ADAPTER_MESSAGE_STATE_SENT_NOT_ACKED && output->Destination() != CECDEVICE_BROADCAST) m_busDevices[output->Destination()]->SetDeviceStatus(CEC_DEVICE_STATUS_NOT_PRESENT); @@ -883,7 +899,7 @@ bool CCECProcessor::Transmit(CCECAdapterMessage *output) void CCECProcessor::TransmitAbort(cec_logical_address address, cec_opcode opcode, cec_abort_reason reason /* = CEC_ABORT_REASON_UNRECOGNIZED_OPCODE */) { - m_controller->AddLog(CEC_LOG_DEBUG, "<< transmitting abort message"); + CLibCEC::AddLog(CEC_LOG_DEBUG, "<< transmitting abort message"); cec_command command; // TODO @@ -941,7 +957,7 @@ bool CCECProcessor::ParseMessage(const CCECAdapterMessage &msg) break; } - m_controller->AddLog(bIsError ? CEC_LOG_WARNING : CEC_LOG_DEBUG, msg.ToString()); + CLibCEC::AddLog(bIsError ? CEC_LOG_WARNING : CEC_LOG_DEBUG, msg.ToString()); return bEom; } @@ -951,7 +967,7 @@ void CCECProcessor::ParseCommand(cec_command &command) dataStr.Format(">> %1x%1x:%02x", command.initiator, command.destination, command.opcode); for (uint8_t iPtr = 0; iPtr < command.parameters.size; iPtr++) dataStr.AppendFormat(":%02x", (unsigned int)command.parameters[iPtr]); - m_controller->AddLog(CEC_LOG_TRAFFIC, dataStr.c_str()); + CLibCEC::AddLog(CEC_LOG_TRAFFIC, dataStr.c_str()); if (!m_bMonitor && command.initiator >= CECDEVICE_TV && command.initiator <= CECDEVICE_BROADCAST) m_busDevices[(uint8_t)command.initiator]->HandleCommand(command); @@ -992,31 +1008,6 @@ uint16_t CCECProcessor::GetPhysicalAddress(void) const return false; } -void CCECProcessor::SetCurrentButton(cec_user_control_code iButtonCode) -{ - m_controller->SetCurrentButton(iButtonCode); -} - -void CCECProcessor::AddCommand(const cec_command &command) -{ - m_controller->AddCommand(command); -} - -void CCECProcessor::AddKey(cec_keypress &key) -{ - m_controller->AddKey(key); -} - -void CCECProcessor::AddKey(void) -{ - m_controller->AddKey(); -} - -void CCECProcessor::AddLog(cec_log_level level, const CStdString &strMessage) -{ - m_controller->AddLog(level, strMessage); -} - bool CCECProcessor::SetAckMask(uint16_t iMask) { return m_communication->SetAckMask(iMask);