diff --git a/dualcamwrapper.cpp b/dualcamwrapper.cpp index cae8aaa..11abcee 100644 --- a/dualcamwrapper.cpp +++ b/dualcamwrapper.cpp @@ -1,8 +1,7 @@ #include "dualcamwrapper.h" -DualcamWrapper::DualcamWrapper(const CameraLayout &layout): valid(false), withLayout(true), camera0(nullptr), camera1(nullptr), cameras(2, nullptr) { +DualcamWrapper::DualcamWrapper(const CameraLayout &layout): valid(false), withLayout(true) { qDebug() << "Constructor with layout"; - this->fullName = layout.devices[0]; this->layout = layout; Pylon::PylonInitialize(); } @@ -10,21 +9,11 @@ DualcamWrapper::DualcamWrapper(const CameraLayout &layout): valid(false), withLa DualcamWrapper::~DualcamWrapper() { qDebug() << "wrapper destructor"; - if (camera0 != nullptr){ - if (camera0->IsOpen()) { - qDebug() << "Camera 0 is open, closing it!"; - camera0->Close(); + for (int i =0; i < cameras.GetSize(); ++i) { + if (cameras[i].IsOpen()) { + cameras[i].Close(); + qDebug() << "Camera " << i << " is open, closing it!"; } - delete camera0; - camera0 = nullptr; - } - if (camera1 != nullptr){ - if (camera1->IsOpen()) { - qDebug() << "Camera 1 is open, closing it!"; - camera1->Close(); - } - delete camera1; - camera1 = nullptr; } terminate(); qDebug() << "Successfully deleted cameras"; @@ -46,49 +35,47 @@ bool DualcamWrapper::isOpen() { } -double DualcamWrapper::maxFrameRate() { - double max_rate = -1; - // FIXME max framerate of both cameras! - if (valid) { - GenApi::INodeMap& nodemap = camera0->GetNodeMap(); - GenApi::INode* n = nodemap.GetNode( "AcquisitionFrameRate" ); - Pylon::CFloatParameter framerate( n ); - return framerate.GetMax(); - } +double DualcamWrapper::maxFrameRate(int camindex) { + assert(camindex >= 0 && camindex < 2); + double max_rate = -1; + if (valid) { + GenApi::INodeMap& nodemap = getNodemap(camindex); + GenApi::INode* n = nodemap.GetNode( "AcquisitionFrameRate" ); + Pylon::CFloatParameter framerate( n ); + return framerate.GetMax(); + } return max_rate; } -bool DualcamWrapper::frameRate(uint new_framerate) { +bool DualcamWrapper::frameRate(uint new_framerate, int camindex) { if (valid) { - GenApi::INodeMap& nodemap = camera0->GetNodeMap(); - GenApi::INode* n = nodemap.GetNode( "AcquisitionFrameRateEnable" ); - Pylon::CBooleanParameter enableframerate(n); - enableframerate.SetValue(true); - - n = nodemap.GetNode( "AcquisitionFrameRate" ); - Pylon::CFloatParameter framerate( n ); - framerate.SetValue( new_framerate ); - - nodemap = camera1->GetNodeMap(); - n = nodemap.GetNode( "AcquisitionFrameRateEnable" ); - Pylon::CBooleanParameter enableframerate1(n); - enableframerate1.SetValue(true); - - n = nodemap.GetNode( "AcquisitionFrameRate" ); - Pylon::CFloatParameter framerate1( n ); - framerate1.SetValue( new_framerate ); - return true; + if (camindex == -1) { + frameRate(new_framerate, 0); + frameRate(new_framerate, 1); + return true; + } else if (camindex == 0 && camindex ==1) { + GenApi::INodeMap& nodemap = getNodemap(0); + GenApi::INode* n = nodemap.GetNode( "AcquisitionFrameRateEnable" ); + Pylon::CBooleanParameter enableframerate(n); + enableframerate.SetValue(true); + n = nodemap.GetNode( "AcquisitionFrameRate" ); + Pylon::CFloatParameter framerate( n ); + framerate.SetValue( new_framerate ); + return true; + } else { + return false; + } } return false; } -double DualcamWrapper::frameRate() { +double DualcamWrapper::frameRate(int camindex) { + assert(camindex > 0 && camindex < 2); double rate = -1.; - //FIXME read framerate setting from both cameras if (valid) { - GenApi::INodeMap& nodemap = camera0->GetNodeMap(); + GenApi::INodeMap& nodemap = getNodemap(camindex); GenApi::INode* n = nodemap.GetNode( "AcquisitionFrameRate" ); Pylon::CFloatParameter framerate( n ); rate = framerate.GetValue(); @@ -97,11 +84,11 @@ double DualcamWrapper::frameRate() { } -double DualcamWrapper::exposureTime() { - //FIXME exposure setting from both cameras +double DualcamWrapper::exposureTime(int camindex) { + assert(camindex > 0 && camindex < 2); double time = -1.; if (valid) { - GenApi::INodeMap& nodemap = camera0->GetNodeMap(); + GenApi::INodeMap& nodemap = getNodemap(camindex); GenApi::INode* n = nodemap.GetNode( "ExposureTime" ); Pylon::CFloatParameter exposure_time( n ); time = exposure_time.GetValue(); @@ -111,39 +98,32 @@ double DualcamWrapper::exposureTime() { bool DualcamWrapper::exposureTime(double exposure_time, int camindex) { - // FIXME support setting exposure individually if (valid) { - GenApi::INodeMap& nodemap = camera0->GetNodeMap(); - double d = GenApi::CFloatPtr(nodemap.GetNode("ExposureTime"))->GetValue(); - GenApi::INode* n = nodemap.GetNode( "ExposureTime" ); - try { - GenApi::CEnumerationPtr(nodemap.GetNode( "ExposureTimeMode" ))->FromString("Standard"); - } catch (...) { - qWarning() << "Could not set exposure for cam0"; - } - Pylon::CFloatParameter exp_time( n ); - exp_time.SetValue( exposure_time ); - - nodemap = camera1->GetNodeMap(); - d = GenApi::CFloatPtr(nodemap.GetNode("ExposureTime"))->GetValue(); - n = nodemap.GetNode( "ExposureTime" ); - try { - GenApi::CEnumerationPtr(nodemap.GetNode( "ExposureTimeMode" ))->FromString("Standard"); - } catch (...) { - qWarning() << "Could not set exposure for cam1"; + if (camindex == -1) { + exposureTime(exposure_time, 0); + exposureTime(exposure_time, 1); + } else { + GenApi::INodeMap& nodemap = getNodemap(camindex); + double d = GenApi::CFloatPtr(nodemap.GetNode("ExposureTime"))->GetValue(); + GenApi::INode* n = nodemap.GetNode( "ExposureTime" ); + try { + GenApi::CEnumerationPtr(nodemap.GetNode( "ExposureTimeMode" ))->FromString("Standard"); + } catch (...) { + qWarning() << "Could not set exposure for cam0"; + } + Pylon::CFloatParameter exp_time( n ); + exp_time.SetValue( exposure_time ); } - Pylon::CFloatParameter exp_time1( n ); - exp_time1.SetValue( exposure_time ); - return true; } return false; } -double DualcamWrapper::gain() { +double DualcamWrapper::gain(int camindex) { + assert(camindex >= 0 && camindex < 2); double gain = -1.; if (valid) { - GenApi::INodeMap& nodemap = camera0->GetNodeMap(); + GenApi::INodeMap& nodemap = getNodemap(camindex); GenApi::INode* n = nodemap.GetNode( "Gain" ); Pylon::CFloatParameter detector_gain( n ); gain = detector_gain.GetValue(); @@ -154,13 +134,17 @@ double DualcamWrapper::gain() { bool DualcamWrapper::gain(double gain_db, int camindex) { if (valid) { - GenApi::INodeMap& nodemap = camera0->GetNodeMap(); - GenApi::CFloatPtr(nodemap.GetNode("Gain"))->SetValue(gain_db); - - nodemap = camera1->GetNodeMap(); - GenApi::CFloatPtr(nodemap.GetNode("Gain"))->SetValue(gain_db); - return true; - } + if (camindex == -1) { + gain(gain_db, 0); + gain(gain_db, 1); + } else if (camindex >= 0 && camindex < 2) { + GenApi::INodeMap& nodemap = getNodemap(camindex); + GenApi::CFloatPtr(nodemap.GetNode("Gain"))->SetValue(gain_db); + return true; + } else{ + return false; + } + } return false; } @@ -169,22 +153,16 @@ ImageSettings DualcamWrapper::getImageSettings(int camindex) { ImageSettings settings; if (valid) { GenApi::INodeMap &nodemap = getNodemap(camindex); - // GenApi::INodeMap& nodemap; - // if (camindex == 0) { - // nodemap = camera0->GetNodeMap(); - // } else { - // nodemap = camera1->GetNodeMap(); - // } - Pylon::CEnumParameter pixelFormat( nodemap, "PixelFormat" ); - Pylon::CPixelTypeMapper pixelTypeMapper( &pixelFormat ); - Pylon::EPixelType pixelType = pixelTypeMapper.GetPylonPixelTypeFromNodeValue( pixelFormat.GetIntValue() ); - Pylon::CIntegerParameter width( nodemap, "Width" ); - Pylon::CIntegerParameter height( nodemap, "Height" ); - settings.pixelType = pixelType; - settings.width = (uint32_t)width.GetValue(); - settings.height = (uint32_t)height.GetValue(); - settings.orientation = Pylon::EImageOrientation::ImageOrientation_TopDown; - } + Pylon::CEnumParameter pixelFormat( nodemap, "PixelFormat" ); + Pylon::CPixelTypeMapper pixelTypeMapper( &pixelFormat ); + Pylon::EPixelType pixelType = pixelTypeMapper.GetPylonPixelTypeFromNodeValue( pixelFormat.GetIntValue() ); + Pylon::CIntegerParameter width( nodemap, "Width" ); + Pylon::CIntegerParameter height( nodemap, "Height" ); + settings.pixelType = pixelType; + settings.width = (uint32_t)width.GetValue(); + settings.height = (uint32_t)height.GetValue(); + settings.orientation = Pylon::EImageOrientation::ImageOrientation_TopDown; + } return settings; } @@ -195,14 +173,6 @@ bool DualcamWrapper::grabFrame(MyImage &img, int camindex) { qDebug() << "grabFrame from camera " << camindex; if (valid) { GenApi::INodeMap &nodemap = getNodemap(camindex); - // GenApi::INodeMap& nodemap; - // if (camindex == 0) { - // nodemap = camera0->GetNodeMap(); - // camera = camera0; - // } else { - // nodemap = camera1->GetNodeMap(); - // camera = camera1; - // } qDebug() << "Setting width" << layout.rois[0].width; Pylon::CIntegerParameter(nodemap, "Width").SetValue(layout.rois[0].width); qDebug() << "Setting height" << layout.rois[0].height; @@ -222,11 +192,7 @@ bool DualcamWrapper::grabFrame(MyImage &img, int camindex) { void DualcamWrapper::resetCamera(int camindex) { - GenApi::INodeMap &nodemap = getNodemap(camindex); - // ->GetNodeMap();; - // if (camindex == 1){ - // nodemap = camera1->GetNodeMap(); - // } + GenApi::INodeMap &nodemap = getNodemap( camindex ); int64_t dfltWidth = 2048; int64_t dfltHeight = 1536; qDebug() << "resetting camera to default ROI (" << dfltWidth << ", " << dfltHeight << ")"; @@ -248,13 +214,14 @@ void DualcamWrapper::resetCamera(int camindex) { bool DualcamWrapper::openCameras(std::string &message) { qDebug() << "opening cameras"; bool valid = true; + Pylon::CTlFactory& tlFactory = Pylon::CTlFactory::GetInstance(); + // Pylon::CInstantCameraArray cameras(2); + cameras.Initialize(2); try { - camera0 = new Pylon::CInstantCamera(); - Pylon::String_t fname(layout.devices[0].c_str()); - Pylon::IPylonDevice *pDevice = Pylon::CTlFactory::GetInstance().CreateDevice(fname); - camera0->Attach(pDevice); - camera0->Open(); - valid = camera0->IsOpen(); + cameras[0].Attach( tlFactory.CreateDevice( layout.devices[0].c_str() ) ); + cameras[1].Attach( tlFactory.CreateDevice( layout.devices[1].c_str() ) ); + valid = cameras[0].IsOpen(); + valid = valid & cameras[1].IsOpen(); message = "Successfully opened camera!"; } catch (const Pylon::GenericException &e) { message = e.GetDescription(); @@ -263,21 +230,6 @@ bool DualcamWrapper::openCameras(std::string &message) { return valid; } resetCamera(0); - - try { - camera1 = new Pylon::CInstantCamera(); - Pylon::String_t fname(layout.devices[1].c_str()); - Pylon::IPylonDevice *pDevice = Pylon::CTlFactory::GetInstance().CreateDevice(fname); - camera1->Attach(pDevice); - camera1->Open(); - valid = valid & camera1->IsOpen(); - message = "Successfully opened camera!"; - } catch (const Pylon::GenericException &e) { - message = e.GetDescription(); - std::cerr << "An exception occurred." << std::endl << e.GetDescription() << std::endl; - valid = false; - return valid; - } resetCamera(1); return valid; @@ -286,42 +238,25 @@ bool DualcamWrapper::openCameras(std::string &message) { void DualcamWrapper::closeCameras() { qDebug() << "Close cameras!"; - if (camera0->IsOpen()) { - try { - camera0->Close(); - valid = false; - delete camera0; - camera0 = nullptr; - } catch (const Pylon::GenericException &e) { - qWarning() << "An exception occurred." << e.GetDescription(); - } - } - if (camera1->IsOpen()) { - try { - camera1->Close(); - valid = false; - delete camera1; - camera1 = nullptr; - } catch (const Pylon::GenericException &e) { - qWarning() << "An exception occurred." << e.GetDescription(); - } - } + if (cameras[0].IsOpen()) { + cameras[0].Close(); + } + if (cameras[1].IsOpen()) { + cameras[1].Close(); + } + valid = false; } - -Pylon::CInstantCamera *DualcamWrapper::getCamera(int camindex) { - if (camindex == 0) { - return camera0; - } else { - return camera1; - } +Pylon::CInstantCameraArray &DualcamWrapper::getCameraArray() { + return cameras; } +// Pylon::CInstantCamera DualcamWrapper::getCamera(int camindex) { +// return this.cameras[camindex]; +// } + GenApi::INodeMap& DualcamWrapper::getNodemap(int camindex){ - GenApi::INodeMap &nodemap = camera0->GetNodeMap();; - if (camindex == 1){ - nodemap = camera1->GetNodeMap(); - } + GenApi::INodeMap &nodemap = cameras[camindex].GetNodeMap(); return nodemap; } \ No newline at end of file diff --git a/dualcamwrapper.h b/dualcamwrapper.h index cd58e63..eecc660 100644 --- a/dualcamwrapper.h +++ b/dualcamwrapper.h @@ -15,28 +15,28 @@ public: DualcamWrapper(const CameraLayout &layout); ~DualcamWrapper(); + ImageSettings getImageSettings(int camindex); bool isOpen(); void terminate(); bool openCameras(std::string &message); void closeCameras(); bool grabFrame(MyImage &img, int camindex=0); - bool frameRate(uint framerate); - double frameRate(); - double maxFrameRate(); - double exposureTime(); + bool frameRate(uint framerate, int camindex=-1); + double frameRate(int camindex); + double maxFrameRate(int camindex); + double exposureTime(int camindex); bool exposureTime(double exposure_time, int camindex=-1); - double gain(); + double gain(int camindex); bool gain(double gain_db, int camindex=-1); - Pylon::CInstantCamera *getCamera(int camindex); + Pylon::CInstantCameraArray &getCameraArray(); + // Pylon::CInstantCamera getCamera(int camindex); private: void resetCamera(int camindex); + Pylon::CInstantCameraArray cameras; GenApi::INodeMap& getNodemap(int camindex); - std::vector cameras; - Pylon::CInstantCamera *camera0, *camera1; bool valid, withLayout; - std::string fullName; CameraLayout layout; };