From 1566732d9dfa2e51702f5ffcac85dc4dfdd7f34e Mon Sep 17 00:00:00 2001
From: armar-user <armar-user@kit.edu>
Date: Tue, 20 Jul 2021 17:21:43 +0200
Subject: [PATCH] (FP, RK) ArViz: Replace Coin timer by QtTimer to fix ArViz
 from freezing (update() would not be called in some cases)

---
 .../components/ArViz/Coin/Visualizer.cpp      | 20 +++++++++----------
 .../ArViz/ArVizWidgetController.cpp           |  9 +++++++++
 .../gui-plugins/ArViz/ArVizWidgetController.h |  2 ++
 3 files changed, 21 insertions(+), 10 deletions(-)

diff --git a/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp b/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp
index 96ad7fed3..3f24eecf8 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()
diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp
index 44d9c0aa5..3de4e9110 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,6 +444,11 @@ namespace armarx
         layerTreeChanged(nullptr, 0);
     }
 
+    void ArVizWidgetController::onUpdate()
+    {
+        visualizer.update();
+    }
+
     void ArVizWidgetController::onTimingObserverUpdate()
     {
         viz::CoinVisualizer_UpdateTiming timing = visualizer.getTiming();
diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h
index 7a3a0bfa3..31383a63e 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;
-- 
GitLab