diff --git a/grabber.cpp b/grabber.cpp new file mode 100644 index 0000000..9c763d0 --- /dev/null +++ b/grabber.cpp @@ -0,0 +1,13 @@ +#include "grabber.h" +#include + +void Grabber::run() { + int count = 0; + while (!stop_request) { + std::cerr << "running: " << count << std::endl; + count += 1; + msleep(500); + } + std::cerr << "terminated: " << count << std::endl; + //emit terminated(); +} diff --git a/grabber.h b/grabber.h new file mode 100644 index 0000000..2d96d61 --- /dev/null +++ b/grabber.h @@ -0,0 +1,28 @@ +#ifndef GRABBER_H +#define GRABBER_H + +#include +#include + +class Grabber : public QThread +{ + Q_OBJECT +public: + Grabber(QObject *parent = nullptr) : QThread(parent) {} + + void run() override; + void stop(); + +private: + bool stop_request = false; + +public slots: + void requestStop() { + stop_request=true; + } + +signals: + void terminated(); +}; + +#endif // GRABBER_H diff --git a/pylonrecorder.cpp b/pylonrecorder.cpp index 87ed2ff..911b378 100644 --- a/pylonrecorder.cpp +++ b/pylonrecorder.cpp @@ -19,6 +19,8 @@ #include #include #include +#include +#include "grabber.h" #if defined(QT_PRINTSUPPORT_LIB) # include @@ -310,7 +312,7 @@ void PylonRecorder::updateActions() { disconnect_camera_action->setEnabled(pylon->isOpen()); connect_camera_action->setEnabled(!pylon->isOpen()); grab_still_action->setEnabled(pylon->isOpen()); - grab_continuous_action->setEnabled(false); + grab_continuous_action->setEnabled(pylon->isOpen()); } void PylonRecorder::scaleImage(double factor) { @@ -343,6 +345,7 @@ void PylonRecorder::connectCamera() { pylon->openCamera(message); statusBar()->showMessage(QString::fromStdString(message)); updateActions(); + std::cerr << pylon->maxFrameRate() << std::endl; } @@ -352,7 +355,31 @@ void PylonRecorder::disconnectCamera() { updateActions(); } -void PylonRecorder::startRecording() {} +void PylonRecorder::startRecording() { + int framecount = 500; + Grabber grabber; + grabber.start(); + Pylon::CGrabResultPtr frame; + if (pylon->isOpen()) { + pylon->frameRate(75); + Pylon::CInstantCamera *cam = pylon->getCamera(); + cam->StartGrabbing(); + auto start = std::chrono::high_resolution_clock::now(); + for (int i = 0; i < framecount; ++i) { + MyImage img; + cam->RetrieveResult( 5000, frame, Pylon::TimeoutHandling_ThrowException); + img.setFrame(frame); + buffer.push(img); + std::cerr << i << ": Buffer stats: capacity: " << buffer.capacity() << "\tload: " << buffer.bufferLoad() << "\t pressure: " << buffer.bufferPreassure() << "frameid: " << frame->GetID() << std::endl; + } + auto finish = std::chrono::high_resolution_clock::now(); + std::chrono::duration elapsed = finish - start; + cam->StopGrabbing(); + std::cerr << "elapsed time: " << elapsed.count() << " s\n"; + } + grabber.requestStop(); + grabber.wait(10000); +} void PylonRecorder::stopRecording() {} diff --git a/pylonrecorder.h b/pylonrecorder.h index a49bd99..af6806c 100644 --- a/pylonrecorder.h +++ b/pylonrecorder.h @@ -3,6 +3,7 @@ #include #include "pylonwrapper.h" +#include "imagebuffer.h" #include #if defined(QT_PRINTSUPPORT_LIB) # include @@ -65,6 +66,7 @@ private: QScrollArea *scrollArea; double scaleFactor = 1; PylonWrapper *pylon; + ImageBuffer buffer; #if defined(QT_PRINTSUPPORT_LIB) && QT_CONFIG(printer) QPrinter printer; diff --git a/recorder.pro b/recorder.pro index 4e19ad5..480b17f 100644 --- a/recorder.pro +++ b/recorder.pro @@ -3,11 +3,13 @@ requires(qtConfig(filedialog)) qtHaveModule(printsupport): QT += gui printsupport HEADERS = \ + grabber.h \ imagebuffer.h \ myimage.h \ pylonrecorder.h \ pylonwrapper.h SOURCES = \ + grabber.cpp \ imagebuffer.cpp \ myimage.cpp \ pylonrecorder.cpp \