diff --git a/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp b/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp index 96ad7fed33e9be2813679f6ab20405f85300fc57..5f99047a649e80be511efd37c1cfbc8ac438031a 100644 --- a/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp +++ b/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp @@ -51,11 +51,11 @@ namespace armarx::viz return "UNKNOWN"; } - static void updateVisualizationCB(void* data, SoSensor* sensor) - { - auto* visu = static_cast<CoinVisualizer*>(data); - visu->update(); - } + // static void updateVisualizationCB(void* data, SoSensor* sensor) + // { + // auto* visu = static_cast<CoinVisualizer*>(data); + // visu->update(); + // } struct TimedBlock { @@ -89,10 +89,10 @@ namespace armarx::viz &CoinVisualizerWrapper::onUpdateFailure); root = new SoSeparator; - timerSensor = new SoTimerSensor(updateVisualizationCB, this); + //timerSensor = new SoTimerSensor(updateVisualizationCB, this); - float cycleTimeMS = 33.0f; - timerSensor->setInterval(SbTime(cycleTimeMS / 1000.0f)); + //float cycleTimeMS = 33.0f; + //timerSensor->setInterval(SbTime(cycleTimeMS / 1000.0f)); } CoinVisualizer::~CoinVisualizer() @@ -115,8 +115,8 @@ namespace armarx::viz state = CoinVisualizerState::STARTING; stateStorage = storage; - SoSensorManager* sensor_mgr = SoDB::getSensorManager(); - sensor_mgr->insertTimerSensor(timerSensor); + //SoSensorManager* sensor_mgr = SoDB::getSensorManager(); + //sensor_mgr->insertTimerSensor(timerSensor); } void CoinVisualizer::stop() @@ -272,6 +272,10 @@ namespace armarx::viz void CoinVisualizer::update() { + { + std::lock_guard lock(timingMutex); + lastTiming.updateToggle = (lastTiming.updateToggle + 1) % 10; + } switch (state) { case CoinVisualizerState::STARTING: @@ -312,6 +316,7 @@ namespace armarx::viz // We should restart the pull for updates so it can run in parallel data::LayerUpdates currentUpdates = pulledUpdates; updateResult = CoinVisualizerUpdateResult::WAITING; + timing.waitStart = time_start; storage->begin_pullUpdatesSince(currentUpdates.revision, callback); auto layerIDsBefore = getLayerIDs(); @@ -343,6 +348,7 @@ namespace armarx::viz // Copy the timing result std::lock_guard lock(timingMutex); timing.counter = lastTiming.counter + 1; + timing.updateToggle = lastTiming.updateToggle; lastTiming = std::move(timing); } } @@ -350,7 +356,13 @@ namespace armarx::viz case CoinVisualizerUpdateResult::WAITING: { // Still waiting for result - } break; + { + // Copy the timing result + std::lock_guard lock(timingMutex); + lastTiming.waitDuration = IceUtil::Time::now() - lastTiming.waitStart; + } + } + break; case CoinVisualizerUpdateResult::FAILURE: { std::unique_lock<std::mutex> lock(stateMutex); diff --git a/source/RobotAPI/components/ArViz/Coin/Visualizer.h b/source/RobotAPI/components/ArViz/Coin/Visualizer.h index 5cb71b0fecc568e06b42ae49d8f8e9525104feea..49ad2a51bd6f70dfddac1785296b8abc07ba08c9 100644 --- a/source/RobotAPI/components/ArViz/Coin/Visualizer.h +++ b/source/RobotAPI/components/ArViz/Coin/Visualizer.h @@ -174,6 +174,11 @@ namespace armarx::viz IceUtil::Time layersChanged = IceUtil::Time::seconds(0); IceUtil::Time total = IceUtil::Time::seconds(0); + IceUtil::Time waitStart = IceUtil::Time::seconds(0); + IceUtil::Time waitDuration = IceUtil::Time::seconds(0); + + int updateToggle = 0; + int counter = 0; }; diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp index 44d9c0aa5a71bee4a4095077a3aca2525cb0437a..4f7372a5e178ed8ec895049ef094af354d297ee2 100644 --- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp +++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp @@ -65,6 +65,9 @@ namespace armarx widget.setupUi(getWidget()); + updateTimer = new QTimer(this); + connect(updateTimer, &QTimer::timeout, this, QOverload<>::of(&This::onUpdate)); + timingObserverTimer = new QTimer(this); connect(timingObserverTimer, &QTimer::timeout, this, QOverload<>::of(&This::onTimingObserverUpdate)); @@ -186,6 +189,7 @@ namespace armarx changeMode(ArVizWidgetMode::Live); timingObserverTimer->start(33); + updateTimer->start(33); } void ArVizWidgetController::onDisconnectGui() @@ -440,10 +444,15 @@ namespace armarx layerTreeChanged(nullptr, 0); } + void ArVizWidgetController::onUpdate() + { + visualizer.update(); + } + void ArVizWidgetController::onTimingObserverUpdate() { viz::CoinVisualizer_UpdateTiming timing = visualizer.getTiming(); - if (timing.counter > lastTiming.counter) + //if (timing.counter > lastTiming.counter) { if (debugObserver) { @@ -453,6 +462,8 @@ namespace armarx timingMap["1.2 apply, updateElements (ms)"] = new Variant(timing.applyTotal.updateElements.toMilliSecondsDouble()); timingMap["1.3 apply, removeElements (ms)"] = new Variant(timing.applyTotal.removeElements.toMilliSecondsDouble()); timingMap["2. layers (ms)"] = new Variant(timing.layersChanged.toMilliSecondsDouble()); + timingMap["3. wait duration (ms)"] = new Variant(timing.waitDuration.toMilliSecondsDouble()); + timingMap["4. update toggle"] = new Variant(timing.updateToggle); timingMap["total (ms)"] = new Variant(timing.total.toMilliSecondsDouble()); timings.push_back(timing.total.toMilliSecondsDouble()); diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h index 7a3a0bfa34330ecf32509b24d2e1d420e4016d0f..31383a63ea78c510ec781951ff56b5fdbcafee06 100644 --- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h +++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h @@ -140,6 +140,7 @@ namespace armarx void showAllLayers(bool visible); void showFilteredLayers(bool visible); + void onUpdate(); void onTimingObserverUpdate(); @@ -174,6 +175,7 @@ namespace armarx QPointer<SimpleConfigDialog> configDialog; + QTimer* updateTimer; QTimer* timingObserverTimer; viz::CoinVisualizer_UpdateTiming lastTiming; StringVariantBaseMap timingMap;