From 2efc60fde8ef12c126ff6fada59ac0fedbee92f0 Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nwpope@utu.fi>
Date: Fri, 28 Jun 2019 13:31:08 +0300
Subject: [PATCH] Working snapshot stream record

---
 applications/gui/src/media_panel.cpp     | 27 ++++++++++++++++++------
 applications/gui/src/media_panel.hpp     |  6 ++++++
 applications/gui/src/src_window.cpp      |  2 +-
 components/rgbd-sources/src/snapshot.cpp | 13 ++++++++----
 4 files changed, 37 insertions(+), 11 deletions(-)

diff --git a/applications/gui/src/media_panel.cpp b/applications/gui/src/media_panel.cpp
index 83bad8511..2e0f5fae2 100644
--- a/applications/gui/src/media_panel.cpp
+++ b/applications/gui/src/media_panel.cpp
@@ -17,6 +17,7 @@ MediaPanel::MediaPanel(ftl::gui::Screen *screen) : nanogui::Window(screen, ""),
     using namespace nanogui;
 
     paused_ = false;
+    writer_ = nullptr;
 
     setLayout(new BoxLayout(Orientation::Horizontal,
 									Alignment::Middle, 5, 10));
@@ -54,8 +55,24 @@ MediaPanel::MediaPanel(ftl::gui::Screen *screen) : nanogui::Window(screen, ""),
     button = new Button(this, "", ENTYPO_ICON_CONTROLLER_RECORD);
     button->setFlags(Button::ToggleButton);
     button->setChangeCallback([this,button](bool state) {
-        if (state) button->setTextColor(nanogui::Color(1.0f,0.1f,0.1f,1.0f));
-        else button->setTextColor(nanogui::Color(1.0f,1.0f,1.0f,1.0f));
+        if (state){
+            auto *cam = screen_->activeCamera();
+
+            button->setTextColor(nanogui::Color(1.0f,0.1f,0.1f,1.0f));
+            char timestamp[18];
+			std::time_t t=std::time(NULL);
+			std::strftime(timestamp, sizeof(timestamp), "%F-%H%M%S", std::localtime(&t));
+			writer_ = new ftl::rgbd::SnapshotStreamWriter(std::string(timestamp) + ".tar.gz", 1000 / 25);
+            writer_->addSource(cam->source());
+            writer_->start();
+        } else {
+            button->setTextColor(nanogui::Color(1.0f,1.0f,1.0f,1.0f));
+            if (writer_) {
+                writer_->stop();
+                delete writer_;
+                writer_ = nullptr;
+            }
+        }
         //if (state) ... start
         //else ... stop
     });
@@ -92,12 +109,10 @@ MediaPanel::MediaPanel(ftl::gui::Screen *screen) : nanogui::Window(screen, ""),
 			auto writer = ftl::rgbd::SnapshotWriter(std::string(timestamp) + ".tar.gz");
 			cv::Mat rgb, depth;
 			cam->source()->getFrames(rgb, depth);
-			if (!writer.addCameraRGBD(
+			if (!writer.addCameraParams("0", cam->source()->getPose(), cam->source()->parameters()) || !writer.addCameraRGBD(
 					"0", // TODO
 					rgb,
-					depth,
-					cam->source()->getPose(),
-					cam->source()->parameters()
+					depth
 				)) {
 				LOG(ERROR) << "Snapshot failed";
 			}
diff --git a/applications/gui/src/media_panel.hpp b/applications/gui/src/media_panel.hpp
index 0f17bd340..c65c48770 100644
--- a/applications/gui/src/media_panel.hpp
+++ b/applications/gui/src/media_panel.hpp
@@ -4,6 +4,11 @@
 #include <nanogui/window.h>
 
 namespace ftl {
+
+namespace rgbd {
+class SnapshotStreamWriter;
+}
+
 namespace gui {
 
 class Screen;
@@ -16,6 +21,7 @@ class MediaPanel : public nanogui::Window {
     private:
     ftl::gui::Screen *screen_;
     bool paused_;
+    ftl::rgbd::SnapshotStreamWriter *writer_;
 };
 
 }
diff --git a/applications/gui/src/src_window.cpp b/applications/gui/src/src_window.cpp
index 010ef2392..124285573 100644
--- a/applications/gui/src/src_window.cpp
+++ b/applications/gui/src/src_window.cpp
@@ -102,7 +102,7 @@ SourceWindow::SourceWindow(ftl::gui::Screen *screen)
 					this->src_->parameters()
 				)) {
 				LOG(ERROR) << "Snapshot failed";
-			}*/
+			}
 		}
 		catch(std::runtime_error) {
 			LOG(ERROR) << "Snapshot failed (file error)";
diff --git a/components/rgbd-sources/src/snapshot.cpp b/components/rgbd-sources/src/snapshot.cpp
index b45ea4f93..b4ea2aac4 100644
--- a/components/rgbd-sources/src/snapshot.cpp
+++ b/components/rgbd-sources/src/snapshot.cpp
@@ -143,7 +143,11 @@ bool SnapshotWriter::addCameraRGBD(const string &name, const Mat &rgb, const Mat
 }
 
 SnapshotStreamWriter::SnapshotStreamWriter(const string &filename, int delay) : 
-		writer_(filename), delay_(delay) {}
+		run_(false), finished_(false), writer_(filename), delay_(delay) {}
+
+SnapshotStreamWriter::~SnapshotStreamWriter() {
+
+}
 
 void SnapshotStreamWriter::addSource(ftl::rgbd::Source *src) {
 	writer_.addCameraParams(std::to_string(sources_.size()), src->getPose(), src->parameters());
@@ -151,7 +155,7 @@ void SnapshotStreamWriter::addSource(ftl::rgbd::Source *src) {
 }
 
 void SnapshotStreamWriter::run() {
-	vector<Mat> rgb;(sources_.size());
+	vector<Mat> rgb(sources_.size());
 	vector<Mat> depth(sources_.size());
 
 	while(run_) {
@@ -164,7 +168,7 @@ void SnapshotStreamWriter::run() {
 		}
 
 		for(size_t i = 0; i < sources_.size(); ++i) {
-			writer_.addCameraRGBD(ms + "-" + std::to_string(i), rgb[i], depth[i]);
+			writer_.addCameraRGBD(std::to_string(ms) + "-" + std::to_string(i), rgb[i], depth[i]);
 		}
 
 		std::this_thread::sleep_for(std::chrono::microseconds(delay_));
@@ -182,8 +186,9 @@ void SnapshotStreamWriter::start() {
 
 
 void SnapshotStreamWriter::stop() {
+	bool wasrunning = run_;
 	run_ = false;
-	thread_.join();
+	if (wasrunning) thread_.join();
 }
 
 
-- 
GitLab