From 6a82c8d6403cc75355fd4663812cfe50f14ae7a7 Mon Sep 17 00:00:00 2001
From: Jan Grewe <jan.grewe@g-node.org>
Date: Mon, 4 Mar 2024 18:13:45 +0100
Subject: [PATCH] grabbing still in single camera mode works again

---
 pylonrecorder.cpp | 104 +++++++++++++++++++++++++---------------------
 pylonrecorder.h   |   4 +-
 2 files changed, 60 insertions(+), 48 deletions(-)

diff --git a/pylonrecorder.cpp b/pylonrecorder.cpp
index 661cb86..21c7e7b 100644
--- a/pylonrecorder.cpp
+++ b/pylonrecorder.cpp
@@ -21,7 +21,6 @@
 #include <iostream>
 #include <chrono>
 #include <cmath>
-#include "util.h"
 
 #if defined(QT_PRINTSUPPORT_LIB)
 #  include <QtPrintSupport/qtprintsupportglobal.h>
@@ -120,33 +119,39 @@ PylonRecorder::PylonRecorder(QWidget *parent)
   applySettings();
 }
 
-void PylonRecorder::setupCameras(){
-  for (auto dev : deviceList) {
-    std::cout << dev.GetFullName() << " " << dev.GetFriendlyName() << std::endl;
-  }
-  std::cout << "peng\n";
-  std::cout << deviceList.size() << std::endl;
-  std::cout << "peng\n";
-
-  if (deviceList.size() == 0) {
-    qWarning() << "device list is empty!";
-    QErrorMessage message(this);
-    message.showMessage("No camera detected!");
-  } else {
-    std::cout << "peng\n";
-    // std::string cname = (std::string)deviceList[0].GetFullName(); 
-    // pyloncam = new PylonWrapper(cname);
-    qDebug() << "Creating buffer, grabber, and writer";
-    buffer = new ImageBuffer(defaultBufferSize);
-    grabber = new Grabber(pyloncam, buffer, defaultFrameRate);
-    writer = new Writer(buffer);
-    connect(writer, &Writer::writingDone, this, &PylonRecorder::writerDone);
-  } 
-}
+// void PylonRecorder::setupCameras(){
+//   std::cerr << "Setting up cameras!" << std::endl;
+//   qDebug() << "setting up cameras";
+//   for (auto dev : deviceList) {
+//     std::cout << dev.GetFullName() << " " << dev.GetFriendlyName() << std::endl;
+//   }
+//   std::string s = "detected ";
+//   s += deviceList.size();
+//   s += " devices";
+//   qDebug() << s.c_str();
+
+//   if (deviceList.size() == 0) {
+//     qWarning() << "device list is empty!";
+//     QErrorMessage message(this);
+//     message.showMessage("No camera detected!");
+//   } else {
+//     std::cout << "peng\n";
+//     std::string cname = (std::string)deviceList[0].GetFullName(); 
+//     // qDebug() <<
+//     // pyloncam = new PylonWrapper(cname);
+//     qDebug() << "Creating buffer, grabber, and writer";
+//     buffer = new ImageBuffer(defaultBufferSize);
+//     grabber = new Grabber(pyloncam, buffer, defaultFrameRate);
+//     writer = new Writer(buffer);
+//     connect(writer, &Writer::writingDone, this, &PylonRecorder::writerDone);
+//   } 
+// }
 
 void PylonRecorder::detectCameras() {
+  qDebug() << "Detecting devices!";
   Pylon::CTlFactory& TlFactory = Pylon::CTlFactory::GetInstance();
   TlFactory.EnumerateDevices(deviceList);
+  qDebug() << "Found devices!" << deviceList.size();
 }
 
 PylonRecorder::~PylonRecorder(){
@@ -607,17 +612,14 @@ void PylonRecorder::cameraConfiguration(){
 }
 
 void PylonRecorder::camerasetup() {
-  std::cerr << "camera settings accepted1" << std::endl;
-  std::cerr << d->result() << std::endl;
-  std::cerr << "camera settings accepted2" << std::endl;
-  CameraLayout l = d->layout();
-  std::cerr << l.rois.size() << l.devices.size() << std::endl;
-  std::cerr << "camera settings accepted3" << std::endl;
-
+  qDebug() << "Cameras setting " << ((d->result()) ? "Accepted" : "Dicarded");
+  this->layout = d->layout();
   delete d;
 }
 
 void PylonRecorder::connectCamera() {
+  this->layout = CameraLayout();
+  qDebug() << "connecting camera(s)";
   if (deviceList.size() == 0) {
     detectCameras();
     QMessageBox msgBox;
@@ -625,23 +627,29 @@ void PylonRecorder::connectCamera() {
     msgBox.setText(msg);
     msgBox.exec();
   } else {
-    // std::string cname = (std::string)deviceList[0].GetFullName(); 
-    // pyloncam = new PylonWrapper(cname);
-    // std::string message;
-    // bool success = pyloncam->openCamera(message);
-    // if (success) {
-    //   cameraConnectedLabel->setText("connected");
-    //   cameraConnectedLabel->setStyleSheet("QLabel { font-size: 10px;font-family: Arial;color: green;}");
-    // } else {
-    //   QMessageBox msgBox;
-    //   QString msg = "<p><b>Could not open camera device!</b><p><p>" + QString::fromStdString(message) + "</p>";
-    //   msgBox.setText(msg);
-    //   msgBox.exec();
-    // }
-    // statusBar()->showMessage(QString::fromStdString(message));
-    // updateActions();
     cameraConfiguration();
+    if (layout.mode == CameraMode::single) {
+      qDebug() << "single camera mode";
+      assert(layout.devices.size() == 1);
+      std::string cname = layout.devices[0];
+      std::string message;
+      qDebug() << "connecting to camera " << cname.c_str();
+      pyloncam = new PylonWrapper(cname);
+      bool success = pyloncam->openCamera(message);
+      if (success) {
+        cameraConnectedLabel->setText("connected");
+        cameraConnectedLabel->setStyleSheet("QLabel { font-size: 10px;font-family: Arial;color: green;}");
+      } else {
+        QMessageBox msgBox;
+        QString msg = "<p><b>Could not open camera device!</b><p><p>" + QString::fromStdString(message) + "</p>";
+        msgBox.setText(msg);
+        msgBox.exec();
+      }
+      statusBar()->showMessage(QString::fromStdString(message));
+      updateActions();
+    }
   }
+  qDebug() << "connecting cam(s) done!";
 }
 
 
@@ -803,7 +811,8 @@ void PylonRecorder::displayBufferPressure() {
 
 
 void PylonRecorder::grabStillFromPylon() {
-  if (pyloncam->isOpen()) {
+  qDebug() << "Grab still image form camera!";
+  if (pyloncam != nullptr && pyloncam->isOpen()) {
       MyImage img;
       bool valid = pyloncam->grabFrame(img);
       if (valid) {
@@ -814,6 +823,7 @@ void PylonRecorder::grabStillFromPylon() {
     } else {
       statusBar()->showMessage(tr("Camera is not open! Connect to camera first!"));
     }
+  qDebug() << "grabbing still image done!";
 }
 
 
diff --git a/pylonrecorder.h b/pylonrecorder.h
index 351fe51..cb8e6a8 100644
--- a/pylonrecorder.h
+++ b/pylonrecorder.h
@@ -13,6 +13,7 @@
 #include "writer.h"
 #include "projectsettings.h"
 #include "camconfig.h"
+#include "util.h"
 
 #include <QImage>
 #if defined(QT_PRINTSUPPORT_LIB)
@@ -86,7 +87,7 @@ private:
     void applyScaling();
     void adjustScrollBar(QScrollBar *scrollBar, double factor);
     void detectCameras();
-    void setupCameras();
+    // void setupCameras();
     int defaultBufferSize = 3000, defaultFrameRate = 30, movieCount = 0, defaultExposureTime = 6000, defaultGain=13;
     QSettings *settings = new QSettings;
     QImage image;
@@ -101,6 +102,7 @@ private:
     ImageBuffer *buffer;
     Grabber *grabber;
     Writer *writer;
+    CameraLayout layout;
     bool grabbing, stopRequest, writing, labelSwitch, dryRun;
     QPalette progressPalette;
     QString activeLabelStyleHigh = "QLabel { font-size: 10pt;font-family: Arial; color : red; }";