diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleLogging.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleLogging.cpp index 725bb380ed3638ac9ad71102375c0c4a4a0c8f5d..b12127e4d8541fbf332b249988658288ea05ea29 100644 --- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleLogging.cpp +++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleLogging.cpp @@ -427,8 +427,8 @@ namespace armarx::RobotUnitModule continue; //do not add to result and skipp during processing } auto& descrEntr = descr.entries[valData.fields.at(i).name]; -//*INDENT-OFF* -// clang-format off + //*INDENT-OFF* + // clang-format off #define make_case(Type, TName) \ (typeid(Type) == *valData.fields.at(i).type) \ { \ @@ -494,7 +494,7 @@ namespace armarx::RobotUnitModule ARMARX_TRACE; throwIfInControlThread(BOOST_CURRENT_FUNCTION); std::lock_guard<std::mutex> guard{rtLoggingMutex}; - + if (rtDataStreamingEntry.count(receiver) == 0u) { ARMARX_INFO << "stopDataStreaming called for a nonexistent log"; @@ -755,441 +755,448 @@ namespace armarx::RobotUnitModule } // Process devices. - {// Sensors. - {ARMARX_TRACE; - durations.sens.start(); - //sensors - for (std::size_t idxDev = 0; idxDev < data.sensors.size(); ++idxDev) - { - const SensorValueBase* val = data.sensors.at(idxDev); - //dimensions of sensor value (e.g. vel, tor, f_x, f_y, ...) - for (std::size_t idxField = 0; idxField < val->getNumberOfDataFields(); ++idxField) + { // Sensors. { - if (!rtLoggingEntries.empty()) + ARMARX_TRACE; + durations.sens.start(); + //sensors + for (std::size_t idxDev = 0; idxDev < data.sensors.size(); ++idxDev) { - durations.sens_csv.start(); - const auto str = val->getDataFieldAs<std::string>(idxField); - for (auto& [_, entry] : rtLoggingEntries) + const SensorValueBase* val = data.sensors.at(idxDev); + //dimensions of sensor value (e.g. vel, tor, f_x, f_y, ...) + for (std::size_t idxField = 0; idxField < val->getNumberOfDataFields(); + ++idxField) { - if (entry->loggedSensorDeviceValues.at(idxDev).at(idxField)) + if (!rtLoggingEntries.empty()) { - entry->stream << ";" << str; + durations.sens_csv.start(); + const auto str = val->getDataFieldAs<std::string>(idxField); + for (auto& [_, entry] : rtLoggingEntries) + { + if (entry->loggedSensorDeviceValues.at(idxDev).at(idxField)) + { + entry->stream << ";" << str; + } + } + durations.sens_csv.stop(); + } + if (!rtDataStreamingEntry.empty()) + { + durations.sens_stream.start(); + for (auto& [_, rtStreamingEntry] : rtDataStreamingEntry) + { + durations.sens_stream_elem.start(); + rtStreamingEntry.processSens(*val, idxDev, idxField); + durations.sens_stream_elem.stop(); + } + durations.sens_stream.stop(); } } - durations.sens_csv.stop(); } - if (!rtDataStreamingEntry.empty()) + durations.sens.stop(); + } + + // Controller. + { + durations.ctrl.start(); + ARMARX_TRACE; + //joint controllers + for (std::size_t idxDev = 0; idxDev < data.control.size(); ++idxDev) { - durations.sens_stream.start(); - for (auto& [_, rtStreamingEntry] : rtDataStreamingEntry) + const auto& vals = data.control.at(idxDev); + //control value (e.g. v_platform) + for (std::size_t idxVal = 0; idxVal < vals.size(); ++idxVal) { - durations.sens_stream_elem.start(); - rtStreamingEntry.processSens(*val, idxDev, idxField); - durations.sens_stream_elem.stop(); + const ControlTargetBase* val = vals.at(idxVal); + //dimensions of control value (e.g. v_platform_x, v_platform_y, v_platform_rotate) + for (std::size_t idxField = 0; idxField < val->getNumberOfDataFields(); + ++idxField) + { + if (!rtLoggingEntries.empty()) + { + durations.ctrl_csv.start(); + std::string str; + val->getDataFieldAs(idxField, str); // expensive function + for (auto& [_, entry] : rtLoggingEntries) + { + if (entry->loggedControlDeviceValues.at(idxDev).at(idxVal).at( + idxField)) + { + entry->stream << ";" << str; + } + } + durations.ctrl_csv.stop(); + } + if (!rtDataStreamingEntry.empty()) + { + durations.ctrl_stream.start(); + for (auto& [_, rtStreamingEntry] : rtDataStreamingEntry) + { + durations.ctrl_stream_elem.start(); + rtStreamingEntry.processCtrl(*val, idxDev, idxVal, idxField); + durations.ctrl_stream_elem.stop(); + } + durations.ctrl_stream.stop(); + } + } } - durations.sens_stream.stop(); } + + durations.ctrl.stop(); } - } - durations.sens.stop(); - } + } // namespace armarx::RobotUnitModule - // Controller. - { - durations.ctrl.start(); - ARMARX_TRACE; - //joint controllers - for (std::size_t idxDev = 0; idxDev < data.control.size(); ++idxDev) + //finish processing { - const auto& vals = data.control.at(idxDev); - //control value (e.g. v_platform) - for (std::size_t idxVal = 0; idxVal < vals.size(); ++idxVal) + //store data to backlog { - const ControlTargetBase* val = vals.at(idxVal); - //dimensions of control value (e.g. v_platform_x, v_platform_y, v_platform_rotate) - for (std::size_t idxField = 0; idxField < val->getNumberOfDataFields(); ++idxField) + if (rtLoggingBacklogEnabled) { - if (!rtLoggingEntries.empty()) + durations.backlog.start(); + ARMARX_TRACE; + if (data.writeTimestamp + rtLoggingBacklogRetentionTime >= now) { - durations.ctrl_csv.start(); - std::string str; - val->getDataFieldAs(idxField, str); // expensive function - for (auto& [_, entry] : rtLoggingEntries) - { - if (entry->loggedControlDeviceValues.at(idxDev).at(idxVal).at(idxField)) - { - entry->stream << ";" << str; - } - } - durations.ctrl_csv.stop(); + backlog.emplace_back(data, true); //true for minimal copy } - if (!rtDataStreamingEntry.empty()) + durations.backlog.stop(); + } + } + //print + reset messages + { + durations.msg.start(); + ARMARX_TRACE; + for (const ::armarx::detail::RtMessageLogEntryBase* ptr : + data.messages.getEntries()) + { + if (!ptr) { - durations.ctrl_stream.start(); - for (auto& [_, rtStreamingEntry] : rtDataStreamingEntry) - { - durations.ctrl_stream_elem.start(); - rtStreamingEntry.processCtrl(*val, idxDev, idxVal, idxField); - durations.ctrl_stream_elem.stop(); - } - durations.ctrl_stream.stop(); + break; } + ptr->print(controlThreadId); } + durations.msg.stop(); } } - - durations.ctrl.stop(); } -} // namespace armarx::RobotUnitModule -//finish processing -{ - //store data to backlog + bool + Logging::MatchName(const std::string& pattern, const std::string& name) { - if (rtLoggingBacklogEnabled) + ARMARX_TRACE; + if (pattern.empty()) { - durations.backlog.start(); - ARMARX_TRACE; - if (data.writeTimestamp + rtLoggingBacklogRetentionTime >= now) - { - backlog.emplace_back(data, true); //true for minimal copy - } - durations.backlog.stop(); + return false; } - } - //print + reset messages - { - durations.msg.start(); - ARMARX_TRACE; - for (const ::armarx::detail::RtMessageLogEntryBase* ptr : data.messages.getEntries()) + static const std::regex pattern_regex{R"(^\^?[- ._*a-zA-Z0-9]+\$?$)"}; + if (!std::regex_match(pattern, pattern_regex)) { - if (!ptr) - { - break; - } - ptr->print(controlThreadId); + throw InvalidArgumentException{"Pattern '" + pattern + "' is invalid"}; } - durations.msg.stop(); + static const std::regex reg_dot{"[.]"}; + static const std::regex reg_star{"[*]"}; + const std::string rpl1 = std::regex_replace(pattern, reg_dot, "\\."); + const std::string rpl2 = std::regex_replace(rpl1, reg_star, ".*"); + const std::regex key_regex{rpl2}; + return std::regex_search(name, key_regex); } -} -} -bool -Logging::MatchName(const std::string& pattern, const std::string& name) -{ - ARMARX_TRACE; - if (pattern.empty()) - { - return false; - } - static const std::regex pattern_regex{R"(^\^?[- ._*a-zA-Z0-9]+\$?$)"}; - if (!std::regex_match(pattern, pattern_regex)) - { - throw InvalidArgumentException{"Pattern '" + pattern + "' is invalid"}; - } - static const std::regex reg_dot{"[.]"}; - static const std::regex reg_star{"[*]"}; - const std::string rpl1 = std::regex_replace(pattern, reg_dot, "\\."); - const std::string rpl2 = std::regex_replace(rpl1, reg_star, ".*"); - const std::regex key_regex{rpl2}; - return std::regex_search(name, key_regex); -} - -void -Logging::_postOnInitRobotUnit() -{ - ARMARX_TRACE; - throwIfInControlThread(BOOST_CURRENT_FUNCTION); - rtLoggingTimestepMs = getProperty<std::size_t>("RTLogging_PeriodMs"); - ARMARX_CHECK_LESS(0, rtLoggingTimestepMs) << "The property RTLoggingPeriodMs must not be 0"; - - messageBufferSize = getProperty<std::size_t>("RTLogging_MessageBufferSize"); - messageBufferMaxSize = getProperty<std::size_t>("RTLogging_MaxMessageBufferSize"); - ARMARX_CHECK_LESS_EQUAL(messageBufferSize, messageBufferMaxSize); - - messageBufferNumberEntries = getProperty<std::size_t>("RTLogging_MessageNumber"); - messageBufferMaxNumberEntries = getProperty<std::size_t>("RTLogging_MaxMessageNumber"); - ARMARX_CHECK_LESS_EQUAL(messageBufferNumberEntries, messageBufferMaxNumberEntries); - - rtLoggingBacklogRetentionTime = - IceUtil::Time::milliSeconds(getProperty<std::size_t>("RTLogging_KeepIterationsForMs")); - rtLoggingBacklogMaxSize = getProperty<std::size_t>("RTLogging_MaxBacklogSize"); - rtLoggingBacklogEnabled = getProperty<bool>("RTLogging_EnableBacklog"); - getProperty(numberOfEntriesToLog, "RTLogging_LogLastNMessagesOnly"); - ARMARX_CHECK_GREATER(getControlThreadTargetPeriod().toMicroSeconds(), 0); - ARMARX_IMPORTANT << "Initializing RTLogging with the following parameters: " << VAROUT(rtLoggingTimestepMs) - << VAROUT(messageBufferSize) << VAROUT(messageBufferMaxSize) - << VAROUT(messageBufferNumberEntries) << VAROUT(messageBufferMaxNumberEntries) - << VAROUT(rtLoggingBacklogRetentionTime) << VAROUT(rtLoggingBacklogMaxSize) - << VAROUT(rtLoggingBacklogEnabled) << VAROUT(numberOfEntriesToLog); -} - -void -Logging::_postFinishDeviceInitialization() -{ - ARMARX_TRACE; - throwIfInControlThread(BOOST_CURRENT_FUNCTION); - //init buffer + void + Logging::_postOnInitRobotUnit() { ARMARX_TRACE; - std::size_t ctrlThreadPeriodUs = - static_cast<std::size_t>(getControlThreadTargetPeriod().toMicroSeconds()); - std::size_t logThreadPeriodUs = rtLoggingTimestepMs * 1000; - std::size_t nBuffers = (logThreadPeriodUs / ctrlThreadPeriodUs + 1) * 100; - - const auto bufferSize = - _module<ControlThreadDataBuffer>().getControlThreadOutputBuffer().initialize( - nBuffers, - _module<Devices>().getControlDevices(), - _module<Devices>().getSensorDevices(), - messageBufferSize, - messageBufferNumberEntries, - messageBufferMaxSize, - messageBufferMaxNumberEntries); - ARMARX_INFO << "RTLogging activated. Using " << nBuffers << " buffers " - << "(buffersize = " << bufferSize << " bytes)"; + throwIfInControlThread(BOOST_CURRENT_FUNCTION); + rtLoggingTimestepMs = getProperty<std::size_t>("RTLogging_PeriodMs"); + ARMARX_CHECK_LESS(0, rtLoggingTimestepMs) << "The property RTLoggingPeriodMs must not be 0"; + + messageBufferSize = getProperty<std::size_t>("RTLogging_MessageBufferSize"); + messageBufferMaxSize = getProperty<std::size_t>("RTLogging_MaxMessageBufferSize"); + ARMARX_CHECK_LESS_EQUAL(messageBufferSize, messageBufferMaxSize); + + messageBufferNumberEntries = getProperty<std::size_t>("RTLogging_MessageNumber"); + messageBufferMaxNumberEntries = getProperty<std::size_t>("RTLogging_MaxMessageNumber"); + ARMARX_CHECK_LESS_EQUAL(messageBufferNumberEntries, messageBufferMaxNumberEntries); + + rtLoggingBacklogRetentionTime = + IceUtil::Time::milliSeconds(getProperty<std::size_t>("RTLogging_KeepIterationsForMs")); + rtLoggingBacklogMaxSize = getProperty<std::size_t>("RTLogging_MaxBacklogSize"); + rtLoggingBacklogEnabled = getProperty<bool>("RTLogging_EnableBacklog"); + getProperty(numberOfEntriesToLog, "RTLogging_LogLastNMessagesOnly"); + ARMARX_CHECK_GREATER(getControlThreadTargetPeriod().toMicroSeconds(), 0); + ARMARX_IMPORTANT << "Initializing RTLogging with the following parameters: " + << VAROUT(rtLoggingTimestepMs) << VAROUT(messageBufferSize) + << VAROUT(messageBufferMaxSize) << VAROUT(messageBufferNumberEntries) + << VAROUT(messageBufferMaxNumberEntries) + << VAROUT(rtLoggingBacklogRetentionTime) << VAROUT(rtLoggingBacklogMaxSize) + << VAROUT(rtLoggingBacklogEnabled) << VAROUT(numberOfEntriesToLog); } - //init logging names + field types + + void + Logging::_postFinishDeviceInitialization() { ARMARX_TRACE; - const auto makeValueMetaData = [&](auto* val, const std::string& namePre) + throwIfInControlThread(BOOST_CURRENT_FUNCTION); + //init buffer + { + ARMARX_TRACE; + std::size_t ctrlThreadPeriodUs = + static_cast<std::size_t>(getControlThreadTargetPeriod().toMicroSeconds()); + std::size_t logThreadPeriodUs = rtLoggingTimestepMs * 1000; + std::size_t nBuffers = (logThreadPeriodUs / ctrlThreadPeriodUs + 1) * 100; + + const auto bufferSize = + _module<ControlThreadDataBuffer>().getControlThreadOutputBuffer().initialize( + nBuffers, + _module<Devices>().getControlDevices(), + _module<Devices>().getSensorDevices(), + messageBufferSize, + messageBufferNumberEntries, + messageBufferMaxSize, + messageBufferMaxNumberEntries); + ARMARX_INFO << "RTLogging activated. Using " << nBuffers << " buffers " + << "(buffersize = " << bufferSize << " bytes)"; + } + //init logging names + field types { - ValueMetaData data; - const auto names = val->getDataFieldNames(); - data.fields.resize(names.size()); + ARMARX_TRACE; + const auto makeValueMetaData = [&](auto* val, const std::string& namePre) + { + ValueMetaData data; + const auto names = val->getDataFieldNames(); + data.fields.resize(names.size()); - for (std::size_t fieldIdx = 0; fieldIdx < names.size(); ++fieldIdx) + for (std::size_t fieldIdx = 0; fieldIdx < names.size(); ++fieldIdx) + { + std::string const& fieldName = names[fieldIdx]; + data.fields.at(fieldIdx).name = namePre + '.' + fieldName; + data.fields.at(fieldIdx).type = &(val->getDataFieldType(fieldIdx)); + } + return data; + }; + + //sensorDevices + controlDeviceValueMetaData.reserve(_module<Devices>().getControlDevices().size()); + for (const auto& cd : _module<Devices>().getControlDevices().values()) { - std::string const& fieldName = names[fieldIdx]; - data.fields.at(fieldIdx).name = namePre + '.' + fieldName; - data.fields.at(fieldIdx).type = &(val->getDataFieldType(fieldIdx)); + ARMARX_TRACE; + controlDeviceValueMetaData.emplace_back(); + auto& dataForDev = controlDeviceValueMetaData.back(); + dataForDev.reserve(cd->getJointControllers().size()); + for (auto jointC : cd->getJointControllers()) + { + dataForDev.emplace_back(makeValueMetaData(jointC->getControlTarget(), + "ctrl." + cd->getDeviceName() + "." + + jointC->getControlMode())); + } } - return data; - }; - - //sensorDevices - controlDeviceValueMetaData.reserve(_module<Devices>().getControlDevices().size()); - for (const auto& cd : _module<Devices>().getControlDevices().values()) - { - ARMARX_TRACE; - controlDeviceValueMetaData.emplace_back(); - auto& dataForDev = controlDeviceValueMetaData.back(); - dataForDev.reserve(cd->getJointControllers().size()); - for (auto jointC : cd->getJointControllers()) + //sensorDevices + sensorDeviceValueMetaData.reserve(_module<Devices>().getSensorDevices().size()); + for (const auto& sd : _module<Devices>().getSensorDevices().values()) { - dataForDev.emplace_back(makeValueMetaData(jointC->getControlTarget(), - "ctrl." + cd->getDeviceName() + "." + - jointC->getControlMode())); + ARMARX_TRACE; + sensorDeviceValueMetaData.emplace_back( + makeValueMetaData(sd->getSensorValue(), "sens." + sd->getDeviceName())); } } - //sensorDevices - sensorDeviceValueMetaData.reserve(_module<Devices>().getSensorDevices().size()); - for (const auto& sd : _module<Devices>().getSensorDevices().values()) + //start logging thread is done in rtinit + //maybe add the default log { ARMARX_TRACE; - sensorDeviceValueMetaData.emplace_back( - makeValueMetaData(sd->getSensorValue(), "sens." + sd->getDeviceName())); + const auto loggingpath = getProperty<std::string>("RTLogging_DefaultLog").getValue(); + if (!loggingpath.empty()) + { + defaultLogHandle = startRtLogging(loggingpath, getLoggingNames()); + } } } - //start logging thread is done in rtinit - //maybe add the default log + + void + Logging::DataStreamingEntry::clearResult() { ARMARX_TRACE; - const auto loggingpath = getProperty<std::string>("RTLogging_DefaultLog").getValue(); - if (!loggingpath.empty()) + for (auto& e : result) { - defaultLogHandle = startRtLogging(loggingpath, getLoggingNames()); + entryBuffer.emplace_back(std::move(e)); } + result.clear(); } -} -void -Logging::DataStreamingEntry::clearResult() -{ - ARMARX_TRACE; - for (auto& e : result) + RobotUnitDataStreaming::TimeStep + Logging::DataStreamingEntry::allocateResultElement() const { - entryBuffer.emplace_back(std::move(e)); + ARMARX_TRACE; + RobotUnitDataStreaming::TimeStep data; + data.bools.resize(numBools); + data.bytes.resize(numBytes); + data.shorts.resize(numShorts); + data.ints.resize(numInts); + data.longs.resize(numLongs); + data.floats.resize(numFloats); + data.doubles.resize(numDoubles); + return data; } - result.clear(); -} -RobotUnitDataStreaming::TimeStep -Logging::DataStreamingEntry::allocateResultElement() const -{ - ARMARX_TRACE; - RobotUnitDataStreaming::TimeStep data; - data.bools.resize(numBools); - data.bytes.resize(numBytes); - data.shorts.resize(numShorts); - data.ints.resize(numInts); - data.longs.resize(numLongs); - data.floats.resize(numFloats); - data.doubles.resize(numDoubles); - return data; -} - -RobotUnitDataStreaming::TimeStep -Logging::DataStreamingEntry::getResultElement() -{ - ARMARX_TRACE; - if (entryBuffer.empty()) + RobotUnitDataStreaming::TimeStep + Logging::DataStreamingEntry::getResultElement() { - return allocateResultElement(); + ARMARX_TRACE; + if (entryBuffer.empty()) + { + return allocateResultElement(); + } + auto e = std::move(entryBuffer.back()); + entryBuffer.pop_back(); + return e; } - auto e = std::move(entryBuffer.back()); - entryBuffer.pop_back(); - return e; -} -void -Logging::DataStreamingEntry::processHeader(const ControlThreadOutputBuffer::Entry& e) -{ - ARMARX_TRACE; - if (stopStreaming) + void + Logging::DataStreamingEntry::processHeader(const ControlThreadOutputBuffer::Entry& e) { - return; - } + ARMARX_TRACE; + if (stopStreaming) + { + return; + } - auto& data = result.emplace_back(getResultElement()); + auto& data = result.emplace_back(getResultElement()); - data.iterationId = e.iteration; - data.timestampUSec = e.sensorValuesTimestamp.toMicroSeconds(); - data.timesSinceLastIterationUSec = e.timeSinceLastIteration.toMicroSeconds(); -} + data.iterationId = e.iteration; + data.timestampUSec = e.sensorValuesTimestamp.toMicroSeconds(); + data.timesSinceLastIterationUSec = e.timeSinceLastIteration.toMicroSeconds(); + } -void -WriteTo(const auto& dentr, - const Logging::DataStreamingEntry::OutVal& out, - const auto& val, - std::size_t fidx, - auto& data) -{ - ARMARX_TRACE; - using enum_t = Logging::DataStreamingEntry::ValueT; - try + void + WriteTo(const auto& dentr, + const Logging::DataStreamingEntry::OutVal& out, + const auto& val, + std::size_t fidx, + auto& data) { ARMARX_TRACE; - switch (out.value) + using enum_t = Logging::DataStreamingEntry::ValueT; + try { - case enum_t::Bool: - bool b; - val.getDataFieldAs(fidx, b); - data.bools.at(out.idx) = b; - return; - case enum_t::Byte: - val.getDataFieldAs(fidx, data.bytes.at(out.idx)); - return; - case enum_t::Short: - val.getDataFieldAs(fidx, data.shorts.at(out.idx)); - return; - case enum_t::Int: - val.getDataFieldAs(fidx, data.ints.at(out.idx)); - return; - case enum_t::Long: - val.getDataFieldAs(fidx, data.longs.at(out.idx)); - return; - case enum_t::Float: - val.getDataFieldAs(fidx, data.floats.at(out.idx)); - return; - case enum_t::Double: - val.getDataFieldAs(fidx, data.doubles.at(out.idx)); - return; - case enum_t::Skipped: - return; + ARMARX_TRACE; + switch (out.value) + { + case enum_t::Bool: + bool b; + val.getDataFieldAs(fidx, b); + data.bools.at(out.idx) = b; + return; + case enum_t::Byte: + val.getDataFieldAs(fidx, data.bytes.at(out.idx)); + return; + case enum_t::Short: + val.getDataFieldAs(fidx, data.shorts.at(out.idx)); + return; + case enum_t::Int: + val.getDataFieldAs(fidx, data.ints.at(out.idx)); + return; + case enum_t::Long: + val.getDataFieldAs(fidx, data.longs.at(out.idx)); + return; + case enum_t::Float: + val.getDataFieldAs(fidx, data.floats.at(out.idx)); + return; + case enum_t::Double: + val.getDataFieldAs(fidx, data.doubles.at(out.idx)); + return; + case enum_t::Skipped: + return; + } + } + catch (...) + { + ARMARX_ERROR << GetHandledExceptionString() << "\ntype " << static_cast<int>(out.value) + << "\n" + << VAROUT(data.bools.size()) << " " << VAROUT(dentr.numBools) << "\n" + << VAROUT(data.bytes.size()) << " " << VAROUT(dentr.numBytes) << "\n" + << VAROUT(data.shorts.size()) << " " << VAROUT(dentr.numShorts) << "\n" + << VAROUT(data.ints.size()) << " " << VAROUT(dentr.numInts) << "\n" + << VAROUT(data.longs.size()) << " " << VAROUT(dentr.numLongs) << "\n" + << VAROUT(data.floats.size()) << " " << VAROUT(dentr.numFloats) << "\n" + << VAROUT(data.doubles.size()) << " " << VAROUT(dentr.numDoubles); + throw; } } - catch (...) - { - ARMARX_ERROR << GetHandledExceptionString() << "\ntype " << static_cast<int>(out.value) - << "\n" - << VAROUT(data.bools.size()) << " " << VAROUT(dentr.numBools) << "\n" - << VAROUT(data.bytes.size()) << " " << VAROUT(dentr.numBytes) << "\n" - << VAROUT(data.shorts.size()) << " " << VAROUT(dentr.numShorts) << "\n" - << VAROUT(data.ints.size()) << " " << VAROUT(dentr.numInts) << "\n" - << VAROUT(data.longs.size()) << " " << VAROUT(dentr.numLongs) << "\n" - << VAROUT(data.floats.size()) << " " << VAROUT(dentr.numFloats) << "\n" - << VAROUT(data.doubles.size()) << " " << VAROUT(dentr.numDoubles); - throw; - } -} -void -Logging::DataStreamingEntry::processCtrl(const ControlTargetBase& val, - std::size_t didx, - std::size_t vidx, - std::size_t fidx) -{ - ARMARX_TRACE; - if (stopStreaming) + void + Logging::DataStreamingEntry::processCtrl(const ControlTargetBase& val, + std::size_t didx, + std::size_t vidx, + std::size_t fidx) { - return; + ARMARX_TRACE; + if (stopStreaming) + { + return; + } + auto& data = result.back(); + const OutVal& o = ctrlDevs.at(didx).at(vidx).at(fidx); + WriteTo(*this, o, val, fidx, data); } - auto& data = result.back(); - const OutVal& o = ctrlDevs.at(didx).at(vidx).at(fidx); - WriteTo(*this, o, val, fidx, data); -} - -void -Logging::DataStreamingEntry::processSens(const SensorValueBase& val, - std::size_t didx, - std::size_t fidx) -{ - ARMARX_TRACE; - if (stopStreaming) + + void + Logging::DataStreamingEntry::processSens(const SensorValueBase& val, + std::size_t didx, + std::size_t fidx) { - return; + ARMARX_TRACE; + if (stopStreaming) + { + return; + } + auto& data = result.back(); + const OutVal& o = sensDevs.at(didx).at(fidx); + WriteTo(*this, o, val, fidx, data); } - auto& data = result.back(); - const OutVal& o = sensDevs.at(didx).at(fidx); - WriteTo(*this, o, val, fidx, data); -} -void -Logging::DataStreamingEntry::send(const RobotUnitDataStreaming::ReceiverPrx& r, std::uint64_t msgId) -{ - ARMARX_TRACE; - const auto start_send = armarx::rtNow(); - const auto num_timesteps = result.size(); - updateCalls.emplace_back(r->begin_update(result, static_cast<Ice::Long>(msgId))); - const auto start_clear = armarx::rtNow(); - clearResult(); - const auto end = armarx::rtNow(); - ARMARX_DEBUG_S << "Logging::DataStreamingEntry::send" - << "\n update " << (start_clear - start_send).toMilliSecondsDouble() << "ms (" - << num_timesteps << " timesteps)" - << "\n clear " << (end - start_clear).toMilliSecondsDouble() << "ms"; - - //now execute all ready callbacks - std::size_t i = 0; - for (; i < updateCalls.size(); ++i) + void + Logging::DataStreamingEntry::send(const RobotUnitDataStreaming::ReceiverPrx& r, + std::uint64_t msgId) { - try + ARMARX_TRACE; + const auto start_send = armarx::rtNow(); + const auto num_timesteps = result.size(); + updateCalls.emplace_back(r->begin_update(result, static_cast<Ice::Long>(msgId))); + const auto start_clear = armarx::rtNow(); + clearResult(); + const auto end = armarx::rtNow(); + ARMARX_DEBUG_S << "Logging::DataStreamingEntry::send" + << "\n update " << (start_clear - start_send).toMilliSecondsDouble() + << "ms (" << num_timesteps << " timesteps)" + << "\n clear " << (end - start_clear).toMilliSecondsDouble() << "ms"; + + //now execute all ready callbacks + std::size_t i = 0; + for (; i < updateCalls.size(); ++i) { - if (!updateCalls.at(i)->isCompleted()) + try { - break; + if (!updateCalls.at(i)->isCompleted()) + { + break; + } + r->end_update(updateCalls.at(i)); + connectionFailures = 0; } - r->end_update(updateCalls.at(i)); - connectionFailures = 0; - } - catch (...) - { - ARMARX_TRACE; - ++connectionFailures; - if (connectionFailures > rtStreamMaxClientErrors) + catch (...) { - stopStreaming = true; - ARMARX_WARNING_S << "DataStreaming Receiver was not reachable for " - << connectionFailures << " iterations! Removing receiver"; - updateCalls.clear(); - break; + ARMARX_TRACE; + ++connectionFailures; + if (connectionFailures > rtStreamMaxClientErrors) + { + stopStreaming = true; + ARMARX_WARNING_S << "DataStreaming Receiver was not reachable for " + << connectionFailures << " iterations! Removing receiver"; + updateCalls.clear(); + break; + } } } + if (!updateCalls.empty()) + { + updateCalls.erase(updateCalls.begin(), updateCalls.begin() + i); + } } - if (!updateCalls.empty()) - { - updateCalls.erase(updateCalls.begin(), updateCalls.begin() + i); - } -} } // namespace armarx::RobotUnitModule