From e259d668adb0abf6f30b18f8d3b8a02317c631a3 Mon Sep 17 00:00:00 2001
From: Jan Grewe <jan.grewe@g-node.org>
Date: Mon, 11 Mar 2024 15:53:44 +0100
Subject: [PATCH] add grabber for dual cam recordings

---
 dualcamgrabber.cpp | 29 +++++++++++++++++++++++
 dualcamgrabber.h   | 58 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+)
 create mode 100644 dualcamgrabber.cpp
 create mode 100644 dualcamgrabber.h

diff --git a/dualcamgrabber.cpp b/dualcamgrabber.cpp
new file mode 100644
index 0000000..3f073a1
--- /dev/null
+++ b/dualcamgrabber.cpp
@@ -0,0 +1,29 @@
+#include "dualcamgrabber.h"
+#include <iostream>
+#include <pylon/PylonIncludes.h>
+
+void DualcamGrabber::run() {
+  stop_request = false;
+  size_t framecount = 0;
+  if (wrapper->isOpen()) {
+      Pylon::CInstantCameraArray &cameras = wrapper->getCameraArray();
+      wrapper->frameRate(static_cast<uint>(framerate));
+      wrapper->exposureTime(exposure);
+      wrapper->gain(gain);
+      cameras.StartGrabbing();
+      Pylon::CGrabResultPtr frame0, frame1;
+
+      while (cameras.IsGrabbing() && !stop_request) {
+          MyImage *img = new MyImage();
+          cameras.RetrieveResult( 5000, framecount % 2 == 0 ? frame0 : frame1, Pylon::TimeoutHandling_ThrowException );
+          img->setFrame(framecount % 2 == 0 ? frame0 : frame1);
+          if (framecount % 2 == 0) {
+            buffer0->push(img);
+          } else {
+            buffer1->push(img);
+          }
+          framecount += 1;
+      }
+      cameras.StopGrabbing();
+    }
+}
diff --git a/dualcamgrabber.h b/dualcamgrabber.h
new file mode 100644
index 0000000..aef1afa
--- /dev/null
+++ b/dualcamgrabber.h
@@ -0,0 +1,58 @@
+#ifndef DUALCAMGRABBER_H
+#define DUALCAMGRABBER_H
+
+#include <QObject>
+#include <QThread>
+#include "dualcamwrapper.h"
+#include "imagebuffer.h"
+
+class DualcamGrabber : public QThread
+{
+  Q_OBJECT
+public:
+  DualcamGrabber(DualcamWrapper *wrapper, ImageBuffer *buffer0, ImageBuffer * buffer1, int framerate, QObject *parent = nullptr) :
+    QThread(parent), wrapper(wrapper), buffer0(buffer0), buffer1(buffer1), framerate(framerate) {}
+
+  void run() override;
+  void stop();
+  int currentFramerate() {
+    return framerate;
+  }
+
+  double currentExposureTime() {
+      return exposure;
+  }
+
+  double currentGain() {
+      return gain;
+  }
+
+private:
+  bool stop_request = false;
+  DualcamWrapper *wrapper;
+  ImageBuffer *buffer0, *buffer1;
+  int framerate;
+  double exposure, gain;
+
+public slots:
+  void requestStop() {
+    stop_request=true;
+  }
+
+  void setFrameRate(int newFramerate) {
+    framerate = newFramerate;
+  }
+
+  void setExposureTime(double newExposureTime) {
+    exposure = newExposureTime;
+  }
+
+  void setGain(double gain_db) {
+    gain = gain_db;
+  }
+
+signals:
+  void terminated();
+};
+
+#endif // DUALCAMGRABBER_H