diff --git a/source/RobotAPI/components/units/KinematicUnitObserver.cpp b/source/RobotAPI/components/units/KinematicUnitObserver.cpp index f387672b1e5a0181463413093dcdb27720d6dda8..a90f70c0f177e36e7f8a95f38af7fa7b9749760b 100644 --- a/source/RobotAPI/components/units/KinematicUnitObserver.cpp +++ b/source/RobotAPI/components/units/KinematicUnitObserver.cpp @@ -159,7 +159,8 @@ void KinematicUnitObserver::reportJointAngles(const NameValueMap& jointAngles, I return; } - nameValueMapToDataFields("jointangles", jointAngles, timestamp); + nameValueMapToDataFields("jointangles", jointAngles, timestamp, aValueChanged); + updateChannel("jointangles"); @@ -180,7 +181,9 @@ void KinematicUnitObserver::reportJointVelocities(const NameValueMap& jointVeloc return; } - nameValueMapToDataFields("jointvelocities", jointVelocities, timestamp); + + nameValueMapToDataFields("jointvelocities", jointVelocities, timestamp, aValueChanged); + updateChannel("jointvelocities"); } catch (...) @@ -198,7 +201,9 @@ void KinematicUnitObserver::reportJointTorques(const NameValueMap& jointTorques, return; } - nameValueMapToDataFields("jointtorques", jointTorques, timestamp); + + nameValueMapToDataFields("jointtorques", jointTorques, timestamp, aValueChanged); + updateChannel("jointtorques"); } catch (...) @@ -221,7 +226,9 @@ void KinematicUnitObserver::reportJointCurrents(const NameValueMap& jointCurrent return; } - nameValueMapToDataFields("jointcurrents", jointCurrents, timestamp); + + nameValueMapToDataFields("jointcurrents", jointCurrents, timestamp, aValueChanged); + updateChannel("jointcurrents"); } catch (...) @@ -239,7 +246,9 @@ void KinematicUnitObserver::reportJointMotorTemperatures(const NameValueMap& joi return; } - nameValueMapToDataFields("jointmotortemperatures", jointMotorTemperatures, timestamp); + + nameValueMapToDataFields("jointmotortemperatures", jointMotorTemperatures, timestamp, aValueChanged); + updateChannel("jointmotortemperatures"); } catch (...) @@ -255,22 +264,34 @@ void KinematicUnitObserver::reportJointStatuses(const NameStatusMap& jointStatus // ******************************************************************** // private methods // ******************************************************************** -void KinematicUnitObserver::nameValueMapToDataFields(const std::string& channelName, const NameValueMap& nameValueMap, Ice::Long timestamp) +void KinematicUnitObserver::nameValueMapToDataFields(const std::string& channelName, const NameValueMap& nameValueMap, Ice::Long timestamp, bool aValueChanged) { // ARMARX_INFO << deactivateSpam(10) << " timestamp is " << (IceUtil::Time::now() - IceUtil::Time::microSeconds(timestamp)).toMicroSecondsDouble() << " µs old"; - StringVariantBaseMap map; - for (const auto & it : nameValueMap) + if (aValueChanged || initializedChannels.count(channelName) == 0) { + initializedChannels.insert(channelName); + boost::unordered_map< ::std::string, ::armarx::VariantBasePtr> map; if (timestamp < 0) { - map[it.first] = new Variant(it.second); + for (const auto & it : nameValueMap) + { + map[it.first] = new Variant(it.second); + } } else { - map[it.first] = new TimedVariant(it.second, IceUtil::Time::microSecondsDouble(timestamp)); + for (const auto & it : nameValueMap) + { + map[it.first] = new TimedVariant(new Variant(it.second), IceUtil::Time::microSeconds(timestamp)); + } } + setDataFieldsFlatCopy(channelName, map); } - setDataFieldsFlatCopy(channelName, map); + else + { + updateDatafieldTimestamps(channelName, timestamp); + } + } PropertyDefinitionsPtr KinematicUnitObserver::createPropertyDefinitions() diff --git a/source/RobotAPI/components/units/KinematicUnitObserver.h b/source/RobotAPI/components/units/KinematicUnitObserver.h index 8272327b7828a9788083a0b01edf27649a95c2f4..31ebe7633f01209d4df74ee9d844e89f9bfa3a13 100644 --- a/source/RobotAPI/components/units/KinematicUnitObserver.h +++ b/source/RobotAPI/components/units/KinematicUnitObserver.h @@ -138,8 +138,8 @@ namespace armarx } protected: - void nameValueMapToDataFields(const std::string& channelName, const NameValueMap& nameValueMap, Ice::Long timestamp); - + void nameValueMapToDataFields(const std::string& channelName, const NameValueMap& nameValueMap, Ice::Long timestamp, bool aValueChanged); + std::set<std::string> initializedChannels; private: std::string robotNodeSetName; };