diff --git a/grabber.cpp b/grabber.cpp index 9c763d0..be6574c 100644 --- a/grabber.cpp +++ b/grabber.cpp @@ -1,13 +1,22 @@ #include "grabber.h" #include +#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(); + if (camera->isOpen()) { + Pylon::CGrabResultPtr frame; + Pylon::CInstantCamera *cam = camera->getCamera(); + cam->StartGrabbing(); + while (!stop_request) { + camera->frameRate(75); + MyImage img; + cam->RetrieveResult( 5000, frame, Pylon::TimeoutHandling_ThrowException); + img.setFrame(frame); + buffer->push(img); + count += 1; + } + cam->StopGrabbing(); + std::cerr << "terminated: " << count << std::endl; + } } diff --git a/grabber.h b/grabber.h index 2d96d61..49c9695 100644 --- a/grabber.h +++ b/grabber.h @@ -3,18 +3,23 @@ #include #include +#include "pylonwrapper.h" +#include "imagebuffer.h" class Grabber : public QThread { Q_OBJECT public: - Grabber(QObject *parent = nullptr) : QThread(parent) {} + Grabber(PylonWrapper *camera, ImageBuffer*buffer, QObject *parent = nullptr) : + QThread(parent), camera(camera), buffer(buffer) {} void run() override; void stop(); private: bool stop_request = false; + PylonWrapper *camera; + ImageBuffer *buffer; public slots: void requestStop() { diff --git a/imagebuffer.cpp b/imagebuffer.cpp index 6e2632f..da01b3f 100644 --- a/imagebuffer.cpp +++ b/imagebuffer.cpp @@ -46,6 +46,7 @@ void ImageBuffer::push(const MyImage &img) { if (load < static_cast(buffer.capacity())) load += 1; mutex.unlock(); + std::cerr << "load: " << bufferLoad() << "\t pressure: " << bufferPreassure() << std::endl; } bool ImageBuffer::bufferNotEmpty() { diff --git a/pylonrecorder.cpp b/pylonrecorder.cpp index 911b378..e11d88d 100644 --- a/pylonrecorder.cpp +++ b/pylonrecorder.cpp @@ -20,7 +20,6 @@ #include #include #include -#include "grabber.h" #if defined(QT_PRINTSUPPORT_LIB) # include @@ -42,6 +41,8 @@ PylonRecorder::PylonRecorder(QWidget *parent) scrollArea->setVisible(false); setCentralWidget(scrollArea); pylon = new PylonWrapper(); + buffer = new ImageBuffer(); + grabber = new Grabber(pylon, buffer); createActions(); updateActions(); resize(QGuiApplication::primaryScreen()->availableSize() * 3 / 5); @@ -50,6 +51,8 @@ PylonRecorder::PylonRecorder(QWidget *parent) PylonRecorder::~PylonRecorder(){ delete pylon; + delete buffer; + delete grabber; } bool PylonRecorder::loadFile(const QString &fileName) { @@ -290,6 +293,7 @@ void PylonRecorder::createActions() { grab_still_action->setShortcut(tr("Ctrl+ ")); grab_continuous_action = camera_menu->addAction(tr("&grab continuous"), this, &PylonRecorder::startRecording); grab_continuous_action->setShortcut(tr("Ctrl+Enter")); + grab_stop_action = camera_menu->addAction(tr("&stop grabbing"), this, &PylonRecorder::stopRecording); QMenu *helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(tr("&About"), this, &PylonRecorder::about); @@ -301,6 +305,8 @@ void PylonRecorder::createActions() { toolbar->addAction(disconnect_camera_action); toolbar->addSeparator(); toolbar->addAction(grab_still_action); + toolbar->addAction(grab_continuous_action); + toolbar->addAction(grab_stop_action); } void PylonRecorder::updateActions() { @@ -313,6 +319,7 @@ void PylonRecorder::updateActions() { connect_camera_action->setEnabled(!pylon->isOpen()); grab_still_action->setEnabled(pylon->isOpen()); grab_continuous_action->setEnabled(pylon->isOpen()); + } void PylonRecorder::scaleImage(double factor) { @@ -357,31 +364,13 @@ void PylonRecorder::disconnectCamera() { 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); + grabber->start(); } -void PylonRecorder::stopRecording() {} +void PylonRecorder::stopRecording() { + grabber->requestStop(); + grabber->wait(10000); +} void PylonRecorder::grabStillFromPylon() { if (pylon->isOpen()) { diff --git a/pylonrecorder.h b/pylonrecorder.h index af6806c..296bfab 100644 --- a/pylonrecorder.h +++ b/pylonrecorder.h @@ -4,6 +4,8 @@ #include #include "pylonwrapper.h" #include "imagebuffer.h" +#include "grabber.h" + #include #if defined(QT_PRINTSUPPORT_LIB) # include @@ -66,7 +68,9 @@ private: QScrollArea *scrollArea; double scaleFactor = 1; PylonWrapper *pylon; - ImageBuffer buffer; + ImageBuffer *buffer; + Grabber *grabber; + bool grabbing; #if defined(QT_PRINTSUPPORT_LIB) && QT_CONFIG(printer) QPrinter printer; @@ -81,6 +85,7 @@ private: QAction *fitToWindowAct; QAction *grab_still_action; QAction *grab_continuous_action; + QAction *grab_stop_action; QAction *connect_camera_action; QAction *disconnect_camera_action; };