12 #include <unordered_set>
185 std::string m_strTextValueCopy;
192 using tSignal = std::pair<ISignalRegistry::tSignalAttributes, std::vector<cTestSignalValueNs>>;
193 using tSignals = std::map<adtf::util::cString, tSignal>;
205 m_pSignalListening->UnregisterSignalsListener(*
this);
207 for (
const auto& strSignal: m_oRequestedSignals)
209 const auto itSignal = m_oSignals.find(strSignal.c_str());
210 if (itSignal != m_oSignals.end())
212 m_pSignalListening->CancelSignalUpdates(itSignal->second.first.nSignalID, *
this);
220 std::scoped_lock oSignalsGuard(m_oSignalsMutex);
224 if (m_oRequestedSignals.find(sSignalAttributes.
strName) != m_oRequestedSignals.end())
230 m_oSignalsChanged.notify_all();
236 std::scoped_lock oGuard(m_oSignalsMutex);
237 m_oSignals.erase(sSignalAttributes.
strName);
240 m_oSignalsChanged.notify_all();
245 std::scoped_lock oGuard(m_oSignalsMutex);
250 const tSignals& GetSignals()
const
252 std::scoped_lock oSignalsGuard(m_oSignalsMutex);
256 tSignals GetCurrentSignals()
258 std::scoped_lock oSignalsGuard(m_oSignalsMutex);
262 size_t GetUpdateCount(
const char* strSignal)
264 std::scoped_lock oSignalsGuard(m_oSignalsMutex);
265 return m_oSignals.at(strSignal).second.size();
268 void RequestUpdates(
const char* strSignal)
270 std::optional<ISignalRegistry::tSignalID> nId;
273 std::scoped_lock oSignalsGuard(m_oSignalsMutex);
274 m_oRequestedSignals.insert(strSignal);
276 const auto itSignal = m_oSignals.find(strSignal);
277 if (itSignal != m_oSignals.end())
279 nId = itSignal->second.first.nSignalID;
285 THROW_IF_FAILED(m_pSignalListening->RequestSignalUpdates(*nId, *
this));
289 void CancelUpdates(
const char* strSignal)
291 std::optional<ISignalRegistry::tSignalID> nId;
294 std::scoped_lock oSignalsGuard(m_oSignalsMutex);
295 m_oRequestedSignals.erase(strSignal);
296 const auto itSignal = m_oSignals.find(strSignal);
297 if (itSignal != m_oSignals.end())
299 nId = itSignal->second.first.nSignalID;
305 m_pSignalListening->CancelSignalUpdates(*nId, *
this);
311 auto oBeginTimePoint = std::chrono::steady_clock::now();
312 while (std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now() - oBeginTimePoint) < nMaxSeconds)
314 const size_t oCurrentCount = m_oUpdateCount;
315 if (oCurrentCount < nUpdateCountEachSignal * m_oSignals.size())
324 const size_t oLastCount = m_oUpdateCount;
325 return (oLastCount >= nUpdateCountEachSignal * m_oSignals.size());
330 std::unique_lock oLock(m_oSignalsMutex);
331 return m_oSignalsChanged.wait_for(oLock, tmTimeout, [&] {
return m_oSignals.count(strName) > 0 ;});
336 mutable std::recursive_mutex m_oSignalsMutex;
337 std::condition_variable_any m_oSignalsChanged;
339 std::unordered_map<ISignalRegistry::tSignalID, tSignals::iterator> m_oIdMap;
340 std::unordered_set<std::string> m_oRequestedSignals;
341 std::atomic<size_t> m_oUpdateCount;
346 using ant::cTestListener;
347 using ant::cTestSignalValueNs;
Copyright © Audi Electronics Venture GmbH.
A common result class usable as return value throughout.
Callback interface for signal value updates.
virtual void SignalUpdated(ISignalRegistry::tSignalID nSignalID, const ISignalRegistry::tSignalValue &sValue)=0
Called for each update of a signal.
Callback interface that informs about added and/or removed signals.
virtual void SignalAdded(const ISignalRegistry::tSignalAttributes &sSignalAttributes)=0
Called when a new signal has been added.
virtual void SignalRemoved(const ISignalRegistry::tSignalAttributes &sSignalAttributes)=0
Called when a signal has been removed.
Interface for listening to signals that are available via the signal regsitry.
virtual tResult CancelSignalUpdates(ISignalRegistry::tSignalID nSignalID, ISignalListener &oListener)=0
Cancels a request for signal updates.
virtual tResult RegisterSignalsListener(ISignalsListener &oListener)=0
Registers a new listener for added and removed signals.
~ISignalListening()=default
Protected destructor --> Use implemented Destroy() instead of delete!
ADTF_IID(ISignalListening, "signal_listening.ant.services.adtf.iid")
Interface ID for the interface.
virtual tResult RequestSignalUpdates(ISignalRegistry::tSignalID nSignalID, ISignalListener &oListener)=0
Requests updates for a given signal.
virtual tResult UnregisterSignalsListener(ISignalsListener &oListener)=0
Unregisters a listener for added and removed signals.
size_t tSignalID
unique id for signals
virtual void SignalUpdated(ISignalRegistry::tSignalID nSignalID, const adtf::services::flash::ISignalRegistry::tSignalValueNs &sValue)
Called for each update of a signal.
virtual tResult CancelSignalUpdates(ISignalRegistry::tSignalID nSignalID, ISignalListener &oListener)=0
Cancels a request for signal updates.
~ISignalListening()=default
Protected destructor --> Use implemented Destroy() instead of delete!
virtual tResult RequestSignalUpdates(ISignalRegistry::tSignalID nSignalID, ISignalListener &oListener)=0
Requests updates for a given signal.
ADTF_IID(ISignalListening, "signal_listening.flash.services.adtf.iid")
Interface ID for the interface.
virtual void SignalAdded(const ISignalRegistry::tSignalAttributes &sSignalAttributes) override
Called when a new signal has been added.
virtual void SignalRemoved(const ISignalRegistry::tSignalAttributes &sSignalAttributes) override
Called when a signal has been removed.
virtual void SignalUpdated(ISignalRegistry::tSignalID nSignalID, const ISignalRegistry::tSignalValueNs &sValue) override
Called for each update of a signal.
Base class for every interface type within the uCOM.
virtual tResult GetObject(iobject_ptr< IObject > &pObject, const char *strNameOID) const =0
Get registered object from object registry.
Object pointer implementation used for reference counting on objects of type IObject.
string_base< cStackString > cString
cString implementation for a stack string which works on stack if string is lower than A_UTILS_DEFAUL...
std::chrono::seconds seconds
Compatibility to C++11 std::chrono::seconds
std::chrono::nanoseconds nanoseconds
Compatibility to C++11 std::chrono::nanoseconds
std::chrono::milliseconds milliseconds
Compatibility to C++11 std::chrono::milliseconds
Namespace for entire ADTF SDK.
adtf::ucom::IRuntime * _runtime
Global Runtime Pointer to reference to the current runtime.
Copyright © Audi Electronics Venture GmbH.
const char * strName
The name. Separate trees nodes with '/'.
tSignalID nSignalID
The unique id.
const char * strTextValue
TEXTTABLE value or NULL (text representation of the value).
base::flash::tNanoSeconds nTimeStamp
Timestamp of signal value (-1 == undefined)
double f64Value
Physical signal value (this is where you put the values you want to display)
#define THROW_IF_FAILED(s)
throws if the expression returns a failed tResult