#include "cameras.h" #include #include #include #include #include #include Cameras::Cameras(uvosled* led, bool quirks, bool serial): led_(led), quirks_(quirks), serial_(serial) { ledTimer.setSingleShot(true); cameraFailureTimer.setSingleShot(true); connect(&ledTimer, &QTimer::timeout, this, &Cameras::lightOff); connect(&cameraFailureTimer, &QTimer::timeout, this, &Cameras::reloadCameras); } Cameras::~Cameras() { lightOff(); } bool Cameras::setCameras(const std::vector& descriptions) { clear(); bool ret = true; for(auto& camera : descriptions) { if(!addCamera(camera)) ret = false; } return ret; } void Cameras::reloadCameras() { setCameras(getCameras()); } void Cameras::clear() { free_ = false; for(auto& camera : cameras_) cameraRemoved(camera); cameras_.clear(); if(led_) uvosled_set_current(led_, 0xFF, 0); } std::vector Cameras::getCameras() { std::vector desc; desc.reserve(cameras_.size()); for(std::shared_ptr camera : cameras_) desc.push_back(camera->cam()->getDescription()); return desc; } std::shared_ptr Cameras::getCamera(size_t id) { std::vector desc = getCameras(); for(size_t i = 0; i < desc.size(); ++i) { if(desc[i].getId() == id) return cameras_[i]; } return std::shared_ptr(nullptr); } bool Cameras::addCamera(const cam::Camera::Description& desc) { cameras_.push_back(std::shared_ptr(new Camera(desc))); if(!cameras_.back()->cam()->isOpen()) { cameras_.pop_back(); return false; } enableCapture(false); blockCaptureId_ = cameras_.back()->id(); cameras_.back()->cam()->setExposureTime(exposrueTime_); if(quirks_ && desc.getVendor().find("Photonfocus") != std::string::npos) { qDebug()<<"Mitiagting broken PhotonFocus single shot mode"; std::shared_ptr camera = cameras_.back(); camera->cam()->setTriggerMode(cam::Camera::TRIGGER_FREE); camera->cam()->setAcquisitionMode(cam::Camera::MODE_FREE); camera->cam()->setFrameRate(10); camera->cam()->startAcquisition(); std::this_thread::sleep_for (std::chrono::milliseconds(200)); camera->cam()->stopAcquisition(); cameras_.pop_back(); camera = nullptr; std::this_thread::sleep_for (std::chrono::milliseconds(200)); cameras_.push_back(std::shared_ptr(new Camera(desc))); if(!cameras_.back()->cam()->isOpen()) { cameras_.pop_back(); return false; } camera = cameras_.back(); cameraAdded(camera); camera->cam()->setTriggerMode(cam::Camera::TRIGGER_FREE); camera->cam()->setAcquisitionMode(cam::Camera::MODE_FREE); camera->cam()->setFrameRate(10); camera->cam()->startAcquisition(); if(!serial_) QTimer::singleShot(quirkTime, this, [this, camera](){finishAddCamera(camera);}); else { std::this_thread::sleep_for(std::chrono::microseconds(static_cast(quirkTime*1000))); finishAddCamera(camera); } } else { finishAddCamera(cameras_.back()); } return true; } void Cameras::finishAddCamera(std::shared_ptr camera) { camera->cam()->setTriggerMode(cam::Camera::TRIGGER_SOFTWARE); setFree(free_); connect(camera.get(), &Camera::newImage, this, &Cameras::imageRecived); if(blockCaptureId_ == camera->id()) enableCapture(true); qDebug()<<"Using camera"<id(); } bool Cameras::lightFor(const LightingSetup& lighting, double time) { int ret = 0; if(led_) { ret = uvosled_set_current(led_, lighting.mask, lighting.brightness); ledTimer.start(time*1000); } return ret == 0; } void Cameras::lightOff() { if(led_) uvosled_set_current(led_, 0xff, 0); ledTimer.stop(); } void Cameras::trigger() { if(serial_) { if(captureingCamera == 0) lightFor(lighting_, exposrueTime_*1.5*cameras_.size()); cameras_[captureingCamera]->cam()->trigger(); ++captureingCamera; if(captureingCamera < cameras_.size()) QTimer::singleShot(exposrueTime_*1000, this, &Cameras::trigger); else captureingCamera = 0; } else { lightFor(lighting_, exposrueTime_*1.5); for(auto& camera : cameras_) camera->cam()->trigger(); } } bool Cameras::start() { bool ret = true; for(auto& camera : cameras_) { if(!camera->cam()->startAcquisition()) ret = false; } if(free_) uvosled_set_current(led_, lighting_.mask, lighting_.brightness); return ret; } bool Cameras::stop() { bool ret = true; for(auto& camera : cameras_) { if(!camera->cam()->stopAcquisition()) ret = false; } lightOff(); return ret; } void Cameras::disable(bool disable) { disable_ = disable; } bool Cameras::setFree(bool free) { stop(); free_ = free; bool ret = true; for(auto& camera : cameras_) { if(!camera->cam()->setAcquisitionMode(free ? cam::Camera::MODE_FREE : cam::Camera::MODE_SINGLE)) { qDebug()<<"failed to set acquisition mode on camera"<id(); ret = false; } if(ret) camera->cam()->setTriggerMode(free ? cam::Camera::TRIGGER_FREE : cam::Camera::TRIGGER_SOFTWARE); } return ret; } bool Cameras::setExposureTime(double exposureTime) { stop(); exposrueTime_ = exposureTime; bool ret = true; for(auto& camera : cameras_) { if(!camera->cam()->setExposureTime(exposrueTime_*1000000)) { qDebug()<<"failed to set exposure on camera"<id(); ret = false; } } return ret; } void Cameras::imageRecived(Camera::Image img) { if(!disable_) { qDebug()<<"free"<cam()->getTemperature(temp)) mean+=temp; else failure = true; } if(!failure) return mean/cameras_.size(); else return NAN; } void Cameras::setSetup(const std::vector& setups) { for(auto& camera : cameras_) for(auto& setup : setups) if(camera->id() == setup.id) camera->cam()->setBayerMode(setup.bayerMode); } void Cameras::store(QSettings &settings) { std::vector available = cam::Camera::getAvailableCameras(); settings.beginWriteArray(GROUP, cameras_.size()); for(size_t i = 0; i < cameras_.size(); ++i) { settings.setArrayIndex(i); settings.setValue("id", static_cast(cameras_[i]->id())); } settings.endArray(); } void Cameras::load(QSettings &settings) { std::vector available = cam::Camera::getAvailableCameras(); int size = settings.beginReadArray(GROUP); for(int i = 0; i < size; ++i) { settings.setArrayIndex(i); size_t hash = settings.value("id", 0).toULongLong(); for(auto& camera : available) { if(camera.getId() == hash) addCamera(camera); } } settings.endArray(); }