29#include <unordered_map>
35#include <ArmarXCore/interface/observers/ObserverInterface.h>
36#include <ArmarXCore/interface/observers/VariantBase.h>
55 "MaxHistorySize", 5000,
"Maximum number of entries in the Observer history");
58 "The Observer history is written with this maximum "
59 "frequency. Everything faster is being skipped.");
61 "CreateUpdateFrequenciesChannel",
63 "If true, an additional channel is created that shows the update frequency of "
64 "every other channel in that observer.");
85 virtual public ObserverInterface,
97 const Ice::Current&)
const override;
109 CheckIdentifier
installCheck(
const CheckConfiguration& configuration);
111 const CheckConfiguration& configuration,
112 const Ice::Current&)
override;
123 const CheckIdentifier&
id,
124 const Ice::Current&)
override;
135 const Ice::Current&
c = Ice::emptyCurrent)
const;
138 const Ice::Current&
c)
const override;
142 const std::string& datafieldName)
const;
144 const std::string& channelName,
145 const std::string& datafieldName,
146 const Ice::Current&)
const override;
152 const Ice::Current&)
const override;
156 const std::string& datafieldName)
const;
158 const std::string& channelName,
159 const std::string& datafieldName,
160 const Ice::Current&)
const override;
171 const Ice::Current&
c);
174 const Ice::Current&
c)
override;
180 const std::string& channelName,
181 const Ice::Current&)
const override;
191 ChannelRegistryEntry
getChannel(
const std::string& channelName)
const;
193 const std::string& channelName,
194 const Ice::Current&)
const override;
206 bool includeMetaChannels,
207 const Ice::Current&)
override;
219 const Ice::Current&)
override;
225 const std::string& channelName,
226 const Ice::Current&)
const override;
230 const std::string& datafieldName)
const;
232 const std::string& channelName,
233 const std::string& datafieldName,
234 const Ice::Current&)
const override;
246 const DatafieldRefBasePtr& datafieldRef);
249 const DatafieldFilterBasePtr& filter,
250 const DatafieldRefBasePtr& datafieldRef,
251 const Ice::Current&)
override;
255 const DatafieldFilterBasePtr& filter,
256 const DatafieldRefBasePtr& datafieldRef);
258 const AMD_ObserverInterface_createNamedFilteredDatafieldPtr& amd,
259 const std::string& filterDatafieldName,
260 const DatafieldFilterBasePtr& filter,
261 const DatafieldRefBasePtr& datafieldRef,
262 const Ice::Current&)
override;
273 const DatafieldRefBasePtr& datafieldRef,
274 const Ice::Current&)
override;
278 Ice::Float timestepMs,
279 const Ice::Current&
c)
const;
281 const std::string& channelName,
282 Ice::Float timestepMs,
283 const Ice::Current&
c)
const override;
287 Ice::Long startTimestamp,
288 Ice::Long endTimestamp,
289 Ice::Float timestepMs,
290 const Ice::Current&
c)
const;
293 const std::string& channelName,
294 Ice::Long startTimestamp,
295 Ice::Long endTimestamp,
296 Ice::Float timestepMs,
297 const Ice::Current&
c)
const override;
301 const std::string& datafieldName,
302 Ice::Float timestepMs,
303 const Ice::Current&
c)
const;
305 const std::string& channelName,
306 const std::string& datafieldName,
307 Ice::Float timestepMs,
308 const Ice::Current&
c)
const override;
312 const std::string& datafieldName,
313 Ice::Long startTimestamp,
314 Ice::Long endTimestamp,
315 Ice::Float timestepMs,
316 const Ice::Current&
c)
const;
318 const AMD_ObserverInterface_getPartialDatafieldHistoryPtr& amd,
319 const std::string& channelName,
320 const std::string& datafieldName,
321 Ice::Long startTimestamp,
322 Ice::Long endTimestamp,
323 Ice::Float timestepMs,
324 const Ice::Current&
c)
const override;
338 void offerChannel(std::string channelName, std::string description);
351 std::string datafieldName,
353 std::string description);
366 std::string datafieldName,
368 std::string description);
370 std::string datafieldName,
372 const std::string& description);
397 const std::string& datafieldName,
399 bool triggerFilterUpdate =
true);
401 const std::string& datafieldName,
403 bool triggerFilterUpdate =
true);
406 bool triggerFilterUpdate =
true);
408 const std::string& channelName,
409 const std::unordered_map<::std::string, ::armarx::VariantBasePtr>& datafieldValues,
410 bool triggerFilterUpdate =
true);
412 const std::string& channelName,
413 const std::unordered_map<std::string, Ice::Long>& datafieldValues);
416 const std::string& description,
418 bool triggerFilterUpdate =
true);
429 const std::set<std::string>& updatedDatafields = std::set<std::string>());
441 const std::string& datafieldName,
445 const std::string& datafieldName,
467 void metaUpdateTask();
473 void setDataFieldFlatCopy(
const DataFieldRegistry::iterator& dataFieldIter,
481 const ChannelRegistryEntry& channel)
const;
485 getDefaultName()
const override
490 PropertyDefinitionsPtr createPropertyDefinitions()
override;
492 void onInitComponent()
override;
493 void postOnConnectComponent()
override;
494 void onConnectComponent()
override;
495 void preOnDisconnectComponent()
override;
496 void onExitComponent()
override;
498 void updateRefreshRateChannel(
const std::string& channelName);
500 void channelUpdateFunction();
501 void doChannelUpdate(
const std::string& channelName,
502 const std::set<std::string>& updatedDatafields);
504 void updateFilters();
506 void addToChannelHistory(
const std::pair<IceUtil::Time, ChannelRegistryEntry>& historyEntry,
507 const std::string& channelName);
510 void addWorkerJob(
const std::string& name, std::function<
void(
void)>&& f)
const;
511 void addWorkerJob(
const std::string& name, std::function<
void(
void)>&& f);
520 catch (std::exception& e)
523 amd->ice_exception(e);
529 amd->ice_exception(std::runtime_error{std::move(s)});
534 template <
class... Params>
536 internalAddWorkerJob(
const std::string& name,
540 const Params&... ps)
const
544 [
this, derivedPtr, amd, fnc, params = std::make_tuple(ps...)]
546 callAndPassExceptionToAMD(
550 auto lambda = [&](auto&&... ps2)
551 { return (derivedPtr->*fnc)(std::move(ps2)...); };
552 using return_t = decltype(std::apply(lambda, params));
553 if constexpr (std::is_same_v<void, return_t>)
556 std::apply(lambda, params);
561 amd->ice_response(std::apply(lambda, params));
568 template <
class AMDPtr,
class FReturn,
class FOwner,
class... FParams,
class...
Params>
572 FReturn (FOwner::*fnc)(FParams...)
const,
573 const Params&... ps)
const
575 static_assert(std::is_base_of_v<Observer, FOwner>);
576 internalAddWorkerJob(name,
dynamic_cast<const FOwner*
>(
this), amd, fnc, ps...);
579 template <
class AMDPtr,
class FReturn,
class FOwner,
class... FParams,
class... Params>
583 FReturn (FOwner::*fnc)(FParams...),
586 static_assert(std::is_base_of_v<Observer, FOwner>);
587 internalAddWorkerJob(name,
dynamic_cast<FOwner*
>(
this), amd, fnc, ps...);
590 virtual void preWorkerJobs();
591 virtual void postWorkerJobs();
592 using ClockT = std::chrono::high_resolution_clock;
#define ARMARXCORE_IMPORT_EXPORT
ComponentPropertyDefinitions(std::string prefix, bool hasObjectNameParameter=true)
Component()
Protected default constructor. Used for virtual inheritance. Use createManagedIceObject() instead.
A ConditionCheck implements a check on the sensor data stream of a Sensor-Actor Unit.
The DatafieldRef class is similar to the ChannelRef, but points to a specific Datafield instead of to...
ObserverPropertyDefinitions(std::string prefix)
void removeFilteredDatafield(const DatafieldRefBasePtr &datafieldRef)
Removes a previously installed filter.
DatafieldRefBasePtr createFilteredDatafield(const DatafieldFilterBasePtr &filter, const DatafieldRefBasePtr &datafieldRef)
This function creates a new datafield with new filter on the given datafield.
std::string getObserverName() const
void getAvailableChecks_async(const AMD_ObserverInterface_getAvailableChecksPtr &amd, const Ice::Current &) override
bool existsChannel(const std::string &channelName) const
void offerChannel(std::string channelName, std::string description)
Offer a channel.
void removeCheck_async(const AMD_ObserverInterface_removeCheckPtr &amd, const CheckIdentifier &id, const Ice::Current &) override
void existsChannel_async(const AMD_ObserverInterface_existsChannelPtr &amd, const std::string &channelName, const Ice::Current &) const override
void getDatafieldHistory_async(const AMD_ObserverInterface_getDatafieldHistoryPtr &amd, const std::string &channelName, const std::string &datafieldName, Ice::Float timestepMs, const Ice::Current &c) const override
void getPartialDatafieldHistory_async(const AMD_ObserverInterface_getPartialDatafieldHistoryPtr &amd, const std::string &channelName, const std::string &datafieldName, Ice::Long startTimestamp, Ice::Long endTimestamp, Ice::Float timestepMs, const Ice::Current &c) const override
void removeDatafield(DataFieldIdentifierBasePtr id)
void scheduleDatafieldFilterUpdate(const std::string &channelName, const std::string &datafieldName, const VariantBasePtr &value)
typename ClockT::time_point TimepointT
void getDataFieldRef_async(const AMD_ObserverInterface_getDataFieldRefPtr &amd, const DataFieldIdentifierBasePtr &identifier, const Ice::Current &) const override
StringConditionCheckMap getAvailableChecks()
Retrieve list of available condition checks.
void removeChannel(std::string channelName)
Remove a channel.
void removeCheck(const CheckIdentifier &id)
Removes a condition check from the observer.
void getChannelHistory_async(const AMD_ObserverInterface_getChannelHistoryPtr &amd, const std::string &channelName, Ice::Float timestepMs, const Ice::Current &c) const override
void getAvailableChannels_async(const AMD_ObserverInterface_getAvailableChannelsPtr &amd, bool includeMetaChannels, const Ice::Current &) override
void getDataFields_async(const AMD_ObserverInterface_getDataFieldsPtr &amd, const DataFieldIdentifierBaseList &identifiers, const Ice::Current &c) override
void offerDataField(std::string channelName, std::string datafieldName, VariantTypeId type, std::string description)
Offer a datafield without default value.
void getDatafieldByName_async(const AMD_ObserverInterface_getDatafieldByNamePtr &amd, const std::string &channelName, const std::string &datafieldName, const Ice::Current &) const override
void removeFilteredDatafield_async(const AMD_ObserverInterface_removeFilteredDatafieldPtr &amd, const DatafieldRefBasePtr &datafieldRef, const Ice::Current &) override
std::chrono::high_resolution_clock ClockT
void getChannel_async(const AMD_ObserverInterface_getChannelPtr &amd, const std::string &channelName, const Ice::Current &) const override
void offerConditionCheck(std::string checkName, ConditionCheck *conditionCheck)
Offer a condition check.
ChannelRegistryEntry getChannel(const std::string &channelName) const
Retrieve information on all sensory data channels available from the observer.
void getDataField_async(const AMD_ObserverInterface_getDataFieldPtr &amd, const DataFieldIdentifierBasePtr &identifier, const Ice::Current &c) const override
void createNamedFilteredDatafield_async(const AMD_ObserverInterface_createNamedFilteredDatafieldPtr &amd, const std::string &filterDatafieldName, const DatafieldFilterBasePtr &filter, const DatafieldRefBasePtr &datafieldRef, const Ice::Current &) override
void getObserverName_async(const AMD_ObserverInterface_getObserverNamePtr &amd, const Ice::Current &) const override
virtual void onInitObserver()=0
Framework hook.
void updateChannel(const std::string &channelName, const std::set< std::string > &updatedDatafields=std::set< std::string >())
Update all conditions for a channel.
TimedVariantBasePtr getDataField(const DataFieldIdentifierBasePtr &identifier, const Ice::Current &c=Ice::emptyCurrent) const
Retrieve data field from observer.
void setDataFieldsFlatCopy(const std::string &channelName, const StringVariantBaseMap &datafieldValues, bool triggerFilterUpdate=true)
TimedVariantBasePtr getDatafieldByName(const std::string &channelName, const std::string &datafieldName) const
ChannelHistory getChannelHistory(const std::string &channelName, Ice::Float timestepMs, const Ice::Current &c) const
std::unique_ptr< Impl > impl
void maybeOfferChannelAndSetDataFieldsFlatCopy(const std::string &channelName, const std::string &description, const StringVariantBaseMap &datafieldValues, bool triggerFilterUpdate=true)
TimedVariantBaseList getDataFields(const DataFieldIdentifierBaseList &identifiers, const Ice::Current &c)
Retrieve list of data field from observer.
void offerDataFieldWithDefault(std::string channelName, std::string datafieldName, const Variant &defaultValue, std::string description)
Offer a datafield with default value.
void existsDataField_async(const AMD_ObserverInterface_existsDataFieldPtr &amd, const std::string &channelName, const std::string &datafieldName, const Ice::Current &) const override
void updateDatafieldTimestamps(const std::string &channelName, const std::unordered_map< std::string, Ice::Long > &datafieldValues)
static float TimeDeltaInMs(TimepointT t0)
ChannelHistory getPartialChannelHistory(const std::string &channelName, Ice::Long startTimestamp, Ice::Long endTimestamp, Ice::Float timestepMs, const Ice::Current &c) const
virtual void onConnectObserver()=0
Framework hook.
void getDatafieldRefByName_async(const AMD_ObserverInterface_getDatafieldRefByNamePtr &amd, const std::string &channelName, const std::string &datafieldName, const Ice::Current &) const override
bool existsDataField(const std::string &channelName, const std::string &datafieldName) const
TimedVariantBaseList getDatafieldHistory(const std::string &channelName, const std::string &datafieldName, Ice::Float timestepMs, const Ice::Current &c) const
void getDatafieldsOfChannel_async(const AMD_ObserverInterface_getDatafieldsOfChannelPtr &amd, const std::string &channelName, const Ice::Current &) const override
TimedVariantBaseList getPartialDatafieldHistory(const std::string &channelName, const std::string &datafieldName, Ice::Long startTimestamp, Ice::Long endTimestamp, Ice::Float timestepMs, const Ice::Current &c) const
std::recursive_mutex channelsMutex
DatafieldRefBasePtr getDatafieldRefByName(const std::string &channelName, const std::string &datafieldName) const
void createFilteredDatafield_async(const AMD_ObserverInterface_createFilteredDatafieldPtr &amd, const DatafieldFilterBasePtr &filter, const DatafieldRefBasePtr &datafieldRef, const Ice::Current &) override
ChannelRegistry getAvailableChannels(bool includeMetaChannels)
Retrieve information on all sensory data channels available from the observer.
void setDataField(const std::string &channelName, const std::string &datafieldName, const Variant &value, bool triggerFilterUpdate=true)
set datafield with datafieldName and in channel channelName
void setDataFieldFlatCopy(const std::string &channelName, const std::string &datafieldName, const VariantPtr &value, bool triggerFilterUpdate=true)
DatafieldRefBasePtr createNamedFilteredDatafield(const std::string &filterDatafieldName, const DatafieldFilterBasePtr &filter, const DatafieldRefBasePtr &datafieldRef)
CheckIdentifier installCheck(const CheckConfiguration &configuration)
Installs a condition check with the observer.
void callAndPassExceptionToAMD(auto &amd, auto f) const
DatafieldRefBasePtr getDataFieldRef(const DataFieldIdentifierBasePtr &identifier) const
void getPartialChannelHistory_async(const AMD_ObserverInterface_getPartialChannelHistoryPtr &amd, const std::string &channelName, Ice::Long startTimestamp, Ice::Long endTimestamp, Ice::Float timestepMs, const Ice::Current &c) const override
void addWorkerJob(const std::string &name, const AMDPtr &amd, FReturn(FOwner::*fnc)(FParams...), const Params &... ps)
virtual void onExitObserver()
Framework hook.
StringTimedVariantBaseMap getDatafieldsOfChannel(const std::string &channelName) const
void addWorkerJob(const std::string &name, const AMDPtr &amd, FReturn(FOwner::*fnc)(FParams...) const, const Params &... ps) const
void offerOrUpdateDataFieldsFlatCopy(const std::string &channelName, const StringVariantBaseMap &valueMap)
bool offerOrUpdateDataField(std::string channelName, std::string datafieldName, const Variant &value, const std::string &description)
void installCheck_async(const AMD_ObserverInterface_installCheckPtr &amd, const CheckConfiguration &configuration, const Ice::Current &) override
std::set< std::string > updateDatafieldFilter(const std::string &channelName, const std::string &datafieldName, const VariantBasePtr &value)
std::string prefix
Prefix of the properties such as namespace, domain, component name, etc.
PropertyDefinition< PropertyType > & defineOptionalProperty(const std::string &name, PropertyType defaultValue, const std::string &description="", PropertyDefinitionBase::PropertyConstness constness=PropertyDefinitionBase::eConstant)
The Variant class is described here: Variants.
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
#define ARMARX_ERROR
The logging level for unexpected behaviour, that must be fixed.
const std::list< std::string > identifiers
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::map< std::string, VariantBasePtr > StringVariantBaseMap
std::string GetHandledExceptionString()
IceInternal::Handle< DataFieldIdentifierBase > DataFieldIdentifierBasePtr
IceInternal::Handle< Variant > VariantPtr
::std::vector<::armarx::DataFieldIdentifierBasePtr > DataFieldIdentifierBaseList
IceInternal::Handle< ConditionCheck > ConditionCheckPtr
IceInternal::Handle< DatafieldRef > DatafieldRefPtr
::IceInternal::Handle<::armarx::VariantBase > VariantBasePtr
std::multimap< std::string, std::string > Params