From 0290ecb192df6759f45c90dd6b5d2c2e78352a69 Mon Sep 17 00:00:00 2001
From: Jan Grewe <jan.grewe@g-node.org>
Date: Thu, 19 Nov 2020 09:02:15 +0100
Subject: [PATCH] [exposure] enable to set the exposure time

---
 grabber.cpp       |  1 +
 grabber.h         |  8 ++++++++
 pylonrecorder.cpp | 16 ++++++++++++++--
 pylonrecorder.h   |  4 ++--
 pylonwrapper.cpp  | 23 +++++++++++++++++++++++
 pylonwrapper.h    |  2 ++
 writer.h          |  1 +
 7 files changed, 51 insertions(+), 4 deletions(-)

diff --git a/grabber.cpp b/grabber.cpp
index cdccdb2..59fa903 100644
--- a/grabber.cpp
+++ b/grabber.cpp
@@ -7,6 +7,7 @@ void Grabber::run() {
   int count = 0;
   if (camera->isOpen()) {
       camera->frameRate(static_cast<uint>(framerate));
+      camera->exposureTime(exposure);
       Pylon::CGrabResultPtr frame;
       Pylon::CInstantCamera *cam = camera->getCamera();
       cam->StartGrabbing();
diff --git a/grabber.h b/grabber.h
index 7365da0..5c7683a 100644
--- a/grabber.h
+++ b/grabber.h
@@ -19,11 +19,16 @@ public:
     return framerate;
   }
 
+  double currentExposureTime() {
+      return exposure;
+  }
+
 private:
   bool stop_request = false;
   PylonWrapper *camera;
   ImageBuffer *buffer;
   int framerate;
+  double exposure;
 
 public slots:
   void requestStop() {
@@ -32,6 +37,9 @@ public slots:
   void setFrameRate(int newFramerate) {
     framerate = newFramerate;
   }
+  void setExposureTime(double newExposureTime) {
+    exposure = newExposureTime;
+  }
 signals:
   void terminated();
 };
diff --git a/pylonrecorder.cpp b/pylonrecorder.cpp
index b0e49f9..4810c4a 100644
--- a/pylonrecorder.cpp
+++ b/pylonrecorder.cpp
@@ -385,6 +385,13 @@ void PylonRecorder::createActions() {
   buffersizeSpinner->setFixedSize(120, 25);
   buffersizeSpinner->setStyleSheet("QSpinBox{font-size: 10px;font-family: Arial;color: rgb(0, 0, 0);background-color: rgb(255,255,255);}");
 
+  exposureSpinner = new QSpinBox();
+  exposureSpinner->setRange(10, 50000);
+  exposureSpinner->setSingleStep(10);
+  exposureSpinner->setValue(defaultExposureTime);
+  exposureSpinner->setFixedSize(120, 25);
+  exposureSpinner->setStyleSheet("QSpinBox{font-size: 10px;font-family: Arial;color: rgb(0, 0, 0);background-color: rgb(255,255,255);}");
+
   dryRunCheckBox = new QCheckBox("Dry run, no writing");
   dryRunCheckBox->setChecked(false);
   dryRunCheckBox->setFixedSize(150, 25);
@@ -400,9 +407,12 @@ void PylonRecorder::createActions() {
   toolbar->addAction(grab_continuous_action);
   toolbar->addAction(grab_stop_action);
   toolbar->addSeparator();
-  toolbar->addWidget(new QLabel("frame rate:"));
+  toolbar->addWidget(new QLabel("frame rate (Hz):"));
   toolbar->addWidget(framerateSpinner);
   toolbar->addSeparator();
+  toolbar->addWidget(new QLabel("exposure time (us):"));
+  toolbar->addWidget(exposureSpinner);
+  toolbar->addSeparator();
   toolbar->addWidget(new QLabel("buffer size:"));
   toolbar->addWidget(buffersizeSpinner);
   toolbar->addSeparator();
@@ -480,11 +490,11 @@ void PylonRecorder::disconnectCamera() {
 
 void PylonRecorder::startRecording() {
   std::string filename = createFilename();
-  //std::cerr << filename << std::endl;
   fileLabel->setText(QString::fromStdString(filename));
   VideoSpecs specs;
   specs.fps = framerateSpinner->value();
   specs.filename = filename;
+  specs.exposureTime = static_cast<double>(exposureSpinner->value());
   ImageSettings settings = pylon->getImageSettings();
   specs.width = static_cast<uint32_t>(settings.width);
   specs.height= static_cast<uint32_t>(settings.height);
@@ -497,6 +507,8 @@ void PylonRecorder::startRecording() {
   }
   if (framerateSpinner->value() != grabber->currentFramerate())
     grabber->setFrameRate(framerateSpinner->value());
+  if (exposureSpinner->value() != int(grabber->currentExposureTime()))
+      grabber->setExposureTime(static_cast<double>(exposureSpinner->value()));
   writer->setVideoSpecs(specs);
   buffer->clear();
   grabber->start();
diff --git a/pylonrecorder.h b/pylonrecorder.h
index ee1dddd..7bbbf06 100644
--- a/pylonrecorder.h
+++ b/pylonrecorder.h
@@ -76,7 +76,7 @@ private:
     void applyScaling();
     void adjustScrollBar(QScrollBar *scrollBar, double factor);
 
-    int defaultBufferSize = 1000, defaultFrameRate = 30, movieCount = 0;
+    int defaultBufferSize = 1000, defaultFrameRate = 30, movieCount = 0, defaultExposureTime = 3000;
     QImage image;
     QTimer *frameTimer, *preassureTimer, *labelTimer;
     QLabel *imageLabel, *writingLabel, *grabbingLabel, *cameraConnectedLabel, *fileLabel;
@@ -94,7 +94,7 @@ private:
     QString activeLabelStyleHigh = "QLabel { font-size: 10px;font-family: Arial; color : red; }";
     QString activeLabelStyleLow = "QLabel { font-size: 10px;font-family: Arial; color : cmyk(0, 255, 255, 0, 50); }";
     QString inactiveLabelStyle = ("QLabel { font-size: 10px;font-family: Arial; color :gray; }");
-    QSpinBox *framerateSpinner, *buffersizeSpinner;
+    QSpinBox *framerateSpinner, *buffersizeSpinner, *exposureSpinner;
 
 
 #if defined(QT_PRINTSUPPORT_LIB) && QT_CONFIG(printer)
diff --git a/pylonwrapper.cpp b/pylonwrapper.cpp
index d9c80e4..f9b8913 100644
--- a/pylonwrapper.cpp
+++ b/pylonwrapper.cpp
@@ -59,6 +59,29 @@ double PylonWrapper::frameRate() {
   return rate;
 }
 
+double PylonWrapper::exposureTime() {
+  double time = -1.;
+  if (valid) {
+      GenApi::INodeMap& nodemap = camera->GetNodeMap();
+      GenApi::INode* n = nodemap.GetNode( "ExposureTime" );
+      Pylon::CFloatParameter exposure_time( n );
+      time = exposure_time.GetValue();
+    }
+  return time;
+}
+
+bool PylonWrapper::exposureTime(double exposure_time) {
+    if (valid) {
+        GenApi::INodeMap& nodemap = camera->GetNodeMap();
+        GenApi::CEnumerationPtr(nodemap.GetNode( "ExposureTimeMode" ))->FromString("Standard");
+        GenApi::INode* n = nodemap.GetNode( "ExposureTime" );
+        Pylon::CFloatParameter exp_time( n );
+        exp_time.SetValue( exposure_time );
+        return true;
+      }
+    return false;
+}
+
 ImageSettings PylonWrapper::getImageSettings() {
   ImageSettings settings;
   if (valid) {
diff --git a/pylonwrapper.h b/pylonwrapper.h
index 66f14d1..f2e5e24 100644
--- a/pylonwrapper.h
+++ b/pylonwrapper.h
@@ -27,6 +27,8 @@ public:
     bool frameRate(uint framerate);
     double frameRate();
     double maxFrameRate();
+    double exposureTime();
+    bool exposureTime(double exposure_time);
     Pylon::CInstantCamera *getCamera();
 
 private:
diff --git a/writer.h b/writer.h
index 673b365..4f5c17d 100644
--- a/writer.h
+++ b/writer.h
@@ -11,6 +11,7 @@ struct VideoSpecs {
   std::string filename;
   uint32_t width, height, quality = 95;
   int fps;
+  double exposureTime;
   Pylon::EPixelType pixelType;
   Pylon::EImageOrientation orientation;
 };