From f80cd2082cb6b36e56e00d42c0f2fc104565f7e5 Mon Sep 17 00:00:00 2001 From: Lars Op den Kamp Date: Fri, 23 Mar 2012 11:52:10 +0100 Subject: [PATCH] cec: added the firmware version to cec-client's -l / --list-devices command. bugzid: 631 --- include/cec.h | 9 +++++++++ src/lib/CECProcessor.cpp | 16 ++++++++++++++-- src/lib/CECProcessor.h | 4 +++- src/lib/LibCEC.cpp | 8 ++++++++ src/lib/LibCEC.h | 2 ++ src/lib/adapter/AdapterCommunication.h | 3 ++- src/lib/adapter/USBCECAdapterCommunication.cpp | 15 ++++++++++----- src/lib/adapter/USBCECAdapterCommunication.h | 2 +- src/testclient/main.cpp | 17 +++++++++++++++-- 9 files changed, 64 insertions(+), 12 deletions(-) diff --git a/include/cec.h b/include/cec.h index 0332088..20e103b 100644 --- a/include/cec.h +++ b/include/cec.h @@ -424,6 +424,15 @@ namespace CEC * @return true when libCEC is the active source on the bus, false otherwise. */ virtual bool IsLibCECActiveSource(void) = 0; + + /*! + * @brief Get information about the given device + * @param strPort The port to which the device is connected + * @param config The device configuration + * @param iTimeoutMs The timeout in milliseconds + * @return True when the device was found, false otherwise + */ + virtual bool GetDeviceInformation(const char *strPort, libcec_configuration *config, uint32_t iTimeoutMs = 10000) = 0; }; }; diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index 5000e04..4685132 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -157,7 +157,7 @@ void CCECProcessor::Close(void) } } -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(); @@ -184,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(); @@ -1682,3 +1682,15 @@ 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; + return true; +} diff --git a/src/lib/CECProcessor.h b/src/lib/CECProcessor.h index d280844..41f3fde 100644 --- a/src/lib/CECProcessor.h +++ b/src/lib/CECProcessor.h @@ -142,11 +142,13 @@ namespace CEC virtual void HandlePoll(cec_logical_address initiator, cec_logical_address destination); virtual bool HandleReceiveFailed(cec_logical_address initiator); + virtual bool GetDeviceInformation(const char *strPort, libcec_configuration *config, uint32_t iTimeoutMs = 10000); + CCECBusDevice * m_busDevices[16]; PLATFORM::CMutex m_transmitMutex; private: - bool OpenConnection(const char *strPort, uint16_t iBaudRate, uint32_t iTimeoutMs); + bool OpenConnection(const char *strPort, uint16_t iBaudRate, uint32_t iTimeoutMs, bool bStartListening = true); bool Initialise(void); void SetInitialised(bool bSetTo = true); void CreateBusDevices(void); diff --git a/src/lib/LibCEC.cpp b/src/lib/LibCEC.cpp index dd8624a..03962e2 100644 --- a/src/lib/LibCEC.cpp +++ b/src/lib/LibCEC.cpp @@ -705,3 +705,11 @@ uint16_t CLibCEC::GetMaskForType(cec_device_type type) return 0; } } + +bool CLibCEC::GetDeviceInformation(const char *strPort, libcec_configuration *config, uint32_t iTimeoutMs /* = 10000 */) +{ + if (m_cec->IsRunning()) + return false; + + return m_cec->GetDeviceInformation(strPort, config, iTimeoutMs); +} \ No newline at end of file diff --git a/src/lib/LibCEC.h b/src/lib/LibCEC.h index b8c8667..2dca040 100644 --- a/src/lib/LibCEC.h +++ b/src/lib/LibCEC.h @@ -125,6 +125,8 @@ namespace CEC static cec_device_type GetType(cec_logical_address address); static uint16_t GetMaskForType(cec_logical_address address); static uint16_t GetMaskForType(cec_device_type type); + + virtual bool GetDeviceInformation(const char *strPort, libcec_configuration *config, uint32_t iTimeoutMs = 10000); //@} static void AddLog(const cec_log_level level, const char *strFormat, ...); diff --git a/src/lib/adapter/AdapterCommunication.h b/src/lib/adapter/AdapterCommunication.h index 400b321..98f55e6 100644 --- a/src/lib/adapter/AdapterCommunication.h +++ b/src/lib/adapter/AdapterCommunication.h @@ -71,9 +71,10 @@ namespace CEC * @param cb The callback struct. if set to NULL, the Read() method has to be used to read commands. if set, OnCommandReceived() will be called for each command that was received * @param iTimeoutMs Connection timeout in ms * @param bSkipChecks Skips all initial checks of the adapter, and starts the reader/writer threads directly after connecting. + * @param bStartListening Start a listener thread when true. False to just open a connection, read the device info, and close the connection. * @return True when connected, false otherwise */ - virtual bool Open(IAdapterCommunicationCallback *cb, uint32_t iTimeoutMs = 10000, bool bSkipChecks = false) = 0; + virtual bool Open(IAdapterCommunicationCallback *cb, uint32_t iTimeoutMs = 10000, bool bSkipChecks = false, bool bStartListening = true) = 0; /*! * @brief Close an open connection diff --git a/src/lib/adapter/USBCECAdapterCommunication.cpp b/src/lib/adapter/USBCECAdapterCommunication.cpp index 99086ce..d6f10d9 100644 --- a/src/lib/adapter/USBCECAdapterCommunication.cpp +++ b/src/lib/adapter/USBCECAdapterCommunication.cpp @@ -133,7 +133,7 @@ bool CUSBCECAdapterCommunication::CheckAdapter(uint32_t iTimeoutMs /* = 10000 */ return bReturn; } -bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32_t iTimeoutMs /* = 10000 */, bool bSkipChecks /* = false */) +bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32_t iTimeoutMs /* = 10000 */, bool bSkipChecks /* = false */, bool bStartListening /* = true */) { uint64_t iNow = GetTimeMs(); uint64_t iTimeout = iNow + iTimeoutMs; @@ -200,10 +200,10 @@ bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32 if (!bSkipChecks && !CheckAdapter()) { CLibCEC::AddLog(CEC_LOG_ERROR, "the adapter failed to pass basic checks"); - Close(); + delete m_port; return false; } - else + else if (bStartListening) { if (CreateThread()) { @@ -212,12 +212,16 @@ bool CUSBCECAdapterCommunication::Open(IAdapterCommunicationCallback *cb, uint32 } else { - Close(); + delete m_port; CLibCEC::AddLog(CEC_LOG_ERROR, "could not create a communication thread"); } } + else + { + delete m_port; + } - return false; + return true; } void CUSBCECAdapterCommunication::Close(void) @@ -534,6 +538,7 @@ bool CUSBCECAdapterCommunication::PersistConfiguration(libcec_configuration *con bool CUSBCECAdapterCommunication::GetConfiguration(libcec_configuration *configuration) { + configuration->iFirmwareVersion = m_iFirmwareVersion; if (m_iFirmwareVersion < 2) return false; diff --git a/src/lib/adapter/USBCECAdapterCommunication.h b/src/lib/adapter/USBCECAdapterCommunication.h index 5db5a1a..4e7944e 100644 --- a/src/lib/adapter/USBCECAdapterCommunication.h +++ b/src/lib/adapter/USBCECAdapterCommunication.h @@ -69,7 +69,7 @@ namespace CEC CUSBCECAdapterCommunication(CCECProcessor *processor, const char *strPort, uint16_t iBaudRate = 38400); virtual ~CUSBCECAdapterCommunication() {}; - virtual bool Open(IAdapterCommunicationCallback *cb, uint32_t iTimeoutMs = 10000, bool bSkipChecks = false); + virtual bool Open(IAdapterCommunicationCallback *cb, uint32_t iTimeoutMs = 10000, bool bSkipChecks = false, bool bStartListening = true); virtual void Close(void); virtual bool IsOpen(void); virtual CStdString GetError(void) const; diff --git a/src/testclient/main.cpp b/src/testclient/main.cpp index d915545..c9a74d7 100644 --- a/src/testclient/main.cpp +++ b/src/testclient/main.cpp @@ -194,9 +194,22 @@ void ListDevices(ICECAdapter *parser) } else { - PrintToStdOut("Found devices: %d\n", iDevicesFound); + CStdString strDeviceInfo; + strDeviceInfo.Format("Found devices: %d\n\n", iDevicesFound); + for (int8_t iDevicePtr = 0; iDevicePtr < iDevicesFound; iDevicePtr++) - PrintToStdOut("device: %d\npath: %s\ncom port: %s\n", iDevicePtr + 1, devices[iDevicePtr].path, devices[iDevicePtr].comm); + { + strDeviceInfo.AppendFormat("device: %d\ncom port: %s\n", iDevicePtr + 1, devices[iDevicePtr].comm); + libcec_configuration config; + config.Clear(); + + if (!parser->GetDeviceInformation(devices[iDevicePtr].comm, &config)) + PrintToStdOut("WARNING: unable to open the device on port %s", devices[iDevicePtr].comm); + else + strDeviceInfo.AppendFormat("firmware version: %d\n", config.iFirmwareVersion); + } + + PrintToStdOut(strDeviceInfo.c_str()); } } -- 2.34.1