From 87938bd81728a890f6a92d3c2400f1ffa6b2b9da Mon Sep 17 00:00:00 2001
From: Fabian Paus <fabian.paus@kit.edu>
Date: Sun, 17 Nov 2019 18:12:28 +0100
Subject: [PATCH] ArViz: Get timestamps for replay and display them

---
 .../ArViz/ArVizWidgetController.cpp           | 34 ++++++++++++++-----
 .../gui-plugins/ArViz/ArVizWidgetController.h |  2 +-
 2 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp
index 6b5c54779..88dc0f434 100644
--- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp
@@ -346,7 +346,6 @@ void ArVizWidgetController::onRefreshRecordings()
         currentText = currentItem->text().toStdString();
     }
 
-    // TODO: Remember old selected entry and try to restore
     widget.recordingList->clear();
     int currentTextIndex = -1;
     int index = 0;
@@ -384,11 +383,15 @@ void ArVizWidgetController::onRecordingSelectionChanged(QListWidgetItem* current
     }
 }
 
-static std::string timestampToString(long timestampInMicroSeconds)
+static std::string timestampToString(long timestampInMicroSeconds, bool showMS = false)
 {
     IceUtil::Time time = IceUtil::Time::microSeconds(timestampInMicroSeconds);
     std::string timeString = time.toDateTime();
-    return timeString.substr(0, timeString.size() - 4);
+    if (!showMS)
+    {
+        timeString = timeString.substr(0, timeString.size() - 4);
+    };
+    return timeString;
 }
 
 void ArVizWidgetController::onReplaySpinChanged(int newValue)
@@ -403,13 +406,11 @@ void ArVizWidgetController::onReplaySliderChanged(int newValue)
         currentRevision = newValue;
         widget.replayRevisionSpinBox->setValue(newValue);
 
-        // TODO: Get the correct timestamp from the batch
-        long timestamp = currentRecording.firstTimestampInMicroSeconds;
+        long timestamp = replayToRevision(currentRevision);
 
         widget.replayTimestampLabel->setText(QString::fromStdString(
-                timestampToString(timestamp)
+                timestampToString(timestamp, true)
                                              ));
-        replayToRevision(currentRevision);
     }
 }
 
@@ -457,7 +458,7 @@ void ArVizWidgetController::selectRecording(const viz::Recording& recording)
 
 }
 
-void ArVizWidgetController::replayToRevision(long revision)
+long ArVizWidgetController::replayToRevision(long revision)
 {
     viz::RecordingBatchHeader* matchingBatchHeader = nullptr;
     for (auto& batchHeader : currentRecording.batchHeaders)
@@ -472,7 +473,7 @@ void ArVizWidgetController::replayToRevision(long revision)
     if (matchingBatchHeader == nullptr)
     {
         ARMARX_WARNING << "Could not find batch for revision: " << revision;
-        return;
+        return -1;
     }
 
     viz::RecordingBatch const& batch = getRecordingBatch(matchingBatchHeader->index);
@@ -481,6 +482,21 @@ void ArVizWidgetController::replayToRevision(long revision)
                 << "\nGot batch: " << batch.header.firstRevision << " - " << batch.header.lastRevision
                 << "\nUpdates: " << batch.updates.size()
                 << "\nInitial state: " << batch.initialState.size();
+
+
+    auto revisionLess = [](viz::TimestampedLayerUpdate const & lhs, viz::TimestampedLayerUpdate const & rhs)
+    {
+        return lhs.revision < rhs.revision;
+    };
+    viz::TimestampedLayerUpdate pivot;
+    pivot.revision = revision;
+    auto updateBegin = std::lower_bound(batch.updates.begin(), batch.updates.end(), pivot, revisionLess);
+    auto updateEnd = std::upper_bound(updateBegin, batch.updates.end(), pivot, revisionLess);
+
+    // TODO: Set current state to batch initial state
+    // Apply updates until updateEnd
+
+    return updateBegin->timestampInMicroseconds;
 }
 
 viz::RecordingBatch const& ArVizWidgetController::getRecordingBatch(long index)
diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h
index ce720de88..822104b64 100644
--- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h
+++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h
@@ -132,7 +132,7 @@ namespace armarx
 
         void selectRecording(viz::Recording const& recording);
 
-        void replayToRevision(long revision);
+        long replayToRevision(long revision);
 
     private:
         Ui::ArVizWidget widget;
-- 
GitLab