27#include <Ice/ObjectAdapter.h>
28#include <Ice/ValueFactory.h>
38template class ::IceInternal::Handle<::armarx::ChannelRef>;
48 validationTimeout(4000), waitIntervallMs(10)
56 this->observerProxy = ObserverInterfacePrx::uncheckedCast(observer->
getProxy());
57 this->communicator = observerProxy->ice_getCommunicator();
58 this->observerName = observer->
getName();
59 this->channelName = channelName;
62 initializeDataFields(observer);
66 validationTimeout(4000), waitIntervallMs(10)
73 this->observerProxy = observerPrx;
74 this->observerName = observerPrx->ice_getIdentity().name;
75 this->channelName = channelName;
76 this->communicator = observerProxy->ice_getCommunicator();
79 initializeDataFields();
93 if (std::find(datafieldNames.begin(), datafieldNames.end(), datafieldName) ==
98 if (std::find(datafieldNames.begin(), datafieldNames.end(), datafieldName) ==
118 result = TimedVariantPtr::dynamicCast(
119 observerProxy->getDatafieldByName(
getChannelName(), datafieldName));
126 ObserverInterfacePrx::uncheckedCast(communicator->stringToProxy(observerName));
127 result = TimedVariantPtr::dynamicCast(
128 observerProxy->getDatafieldByName(
getChannelName(), datafieldName));
141 const ObserverInterfacePrx&
149 return observerProxy;
164 const Ice::StringSeq&
167 return datafieldNames;
173 for (
unsigned int i = 0; i < datafieldNames.size(); ++i)
175 if (datafieldName == datafieldNames.at(i))
200 <<
": Initialized as retrieved from proxy : " << initialized;
208 initializeDataFields();
219 cln->initialized = this->initialized;
221 cln->observerName = this->observerName;
222 cln->channelName = this->channelName;
223 cln->datafieldNames = this->datafieldNames;
225 cln->observerProxy = this->observerProxy;
234 s <<
"Reference to channel " << channelName <<
" on observer " << observerName;
248 int validateWaitIntervallMs = waitIntervallMs;
249 IceUtil::Time waitStartTime = IceUtil::Time::now();
251 IceUtil::Time timeout = IceUtil::Time::milliSeconds(validationTimeout);
253 IceUtil::Time lastOutput = IceUtil::Time::milliSeconds(0);
255 while (IceUtil::Time(waitStartTime + timeout - IceUtil::Time::now()).toMilliSeconds() > 0)
262 if (IceUtil::Time(IceUtil::Time::now() - lastOutput).toSeconds() >=
267 lastOutput = IceUtil::Time::now();
270 usleep(validateWaitIntervallMs * 1000);
272 if (validateWaitIntervallMs <
273 validationTimeout * 0.5f)
275 validateWaitIntervallMs *= 2;
286 ChannelRef::assureProxy()
293 ObserverInterfacePrx::checkedCast(communicator->stringToProxy(observerName));
300 if (observerProxy && !initialized)
302 initializeDataFields();
305 return (observerProxy != 0);
309 ChannelRef::initializeDataFields(
Observer* obs)
311 ChannelRegistryEntry channel =
314 DataFieldRegistry::const_iterator iterData = channel.dataFields.begin();
315 datafieldNames.clear();
317 while (iterData != channel.dataFields.end())
319 datafieldNames.push_back(iterData->second.identifier->datafieldName);
323 initialized = channel.initialized;
331 communicator = observerProxy->ice_getCommunicator();
340 obj->setString(
"observerName", observerName);
341 obj->setString(
"channelName", channelName);
349 observerName = obj->getString(
"observerName");
350 channelName = obj->getString(
"channelName");
354 throw LocalException(
355 "The adapter in the Ice::current object must be set to load a ChannelRef from XML");
358 communicator =
c.adapter->getCommunicator();
VariantTypeId getType(const Ice::Current &c=Ice::emptyCurrent) const override
void ice_postUnmarshal() override
std::string output(const Ice::Current &c=Ice::emptyCurrent) const override
VariantDataClassPtr clone(const Ice::Current &c=Ice::emptyCurrent) const override
bool hasDatafield(const std::string &datafieldName) const
DataFieldIdentifierPtr getDataFieldIdentifier(const std::string &datafieldName)
bool validate(const Ice::Current &c=Ice::emptyCurrent) override
void deserialize(const ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) override
const ObserverInterfacePrx & getObserverProxy()
const std::string & getObserverName() const
const Ice::StringSeq & getDataFieldNames() const
void serialize(const ObjectSerializerBasePtr &serializer, const ::Ice::Current &=Ice::emptyCurrent) const override
TimedVariantPtr getDataField(const std::string &datafieldName)
const std::string & getChannelName() const
DataFieldIdentifier provide the basis to identify data field within a distributed ArmarX scenario.
std::string getName() const
Retrieve name of object.
Ice::ObjectPrx getProxy(long timeoutMs=0, bool waitForScheduler=true) const
Returns the proxy of this object (optionally it waits for the proxy)
Baseclass for all ArmarX Observers.
ChannelRegistryEntry getChannel(const std::string &channelName) const
Retrieve information on all sensory data channels available from the observer.
This exception is thrown when accessing an uninitialized proxy.
#define ARMARX_FATAL_S
The logging level for unexpected behaviour, that will lead to a seriously malfunctioning program and ...
#define ARMARX_WARNING_S
The logging level for unexpected behaviour, but not a serious problem.
const VariantTypeId ChannelRef
This file offers overloads of toIce() and fromIce() functions for STL container types.
IceInternal::Handle< TimedVariant > TimedVariantPtr
IceInternal::Handle< ChannelRef > ChannelRefPtr
IceInternal::Handle< AbstractObjectSerializer > AbstractObjectSerializerPtr
const LogSender::manipulator flush
IceInternal::Handle< DataFieldIdentifier > DataFieldIdentifierPtr
Typedef of DataFieldIdentifierPtr as IceInternal::Handle<DataFieldIdentifier> for convenience.