Skip to content
Snippets Groups Projects
Select Git revision
  • 9af1281d94eaa3a9b406fb17b0556e1be980d0a6
  • master default protected
  • cali
  • dev protected
4 results

core.h

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    core.cpp 4.77 KiB
    #include "core.h"
    #include "camobserver.h"
    #include "utils.h"
    #include "cam.h"
    #include "record.h"
    
    #include <iostream>
    #include <list>
    #include <vector>
    
    #include "VmbCPP/Interface.h"
    #include <VmbCPP/SharedPointerDefines.h>
    #include <VmbCPP/VmbCPP.h>
    #include <VmbCPP/Camera.h>
    #include <VmbC/VmbCommonTypes.h>
    
    #include <QDebug>
    #include <QThread>
    #include <QTimer>
    #include <QCoreApplication>
    
    using namespace VmbCPP;
    
    Core::Core() : IPrinter(),
    	_sys( VmbSystem::GetInstance() ), // create and get Vimba singleton
    	_camObserver( new CamObserver )
    {
    	QTimer::singleShot(0, this, SLOT(init())); //delayed init to allow connections to be established -> print/error signals!
    }
    
    void Core::init()
    {
    	if ( f(_sys.Startup(), "init API") )
    		qApp->exit(VmbErrorApiNotStarted);
    
    	f(_sys.RegisterCameraListObserver(ICameraListObserverPtr(_camObserver)), "register cam observer");
    	connect( _camObserver, SIGNAL(cameraChanged(CameraPtr,UpdateTriggerType)), this, SLOT(onCameraChanged(CameraPtr,UpdateTriggerType)) ); //listcams calls updateCams!
    
    	//parse config file
    	QList<QPair<QString, QString>> parsedCameras;
    	if( ! utils::parseConfig(parsedCameras) )
    	{
    		utils::running = false;
    		qApp->quit();
    		return;
    	}
    
    	//create cams and their corresponding record objects and add 'em to list
    	for ( auto cam : parsedCameras )
    	{
    		auto pcam = std::make_shared<Cam>(cam.first,cam.second);
    		auto prec = std::make_shared<Record>();
    		prec->init(pcam);
    		pcam->_rec = prec;
    
    		_cameras.push_back(pcam);
    	}
    
    	showInfo();
    	detectCams();
    	// listCams();
    }
    
    
    Core::~Core()
    {
    	qDebug() << __FUNCTION__ << "():" << __LINE__;
    	_sys.Shutdown(); // will delete camObserver
    }
    
    // update & sync camera vectors
    void Core::detectCams()
    {
    	info("Looking for cams...");
    	for ( auto cam : _cameras )
    	{
    		if( cam->state() == Cam::disconnected )
    		{
    			CameraPtr pcam;
    			if( VmbErrorSuccess == _sys.GetCameraByID( cam->ip().toStdString(), VmbAccessModeFull, pcam ) )
    			{
    				cam->setCameraPtr(pcam); //triggers camobserver changed signal > set state
    				//create Vimba Camera
    				//now valid 'cam and record objects
    			}
    		}
    	}
    }
    
    void Core::onCameraChanged(CameraPtr vcam, UpdateTriggerType type)
    {
    	for (const auto& cam : _cameras)
    		if (cam->getCameraPtr() == vcam)
    			cam->onChanged(type);
    
    	listCams();
    }
    
    void Core::listCams()
    {
    	// qDebug() << __LINE__ << "-" << __PRETTY_FUNCTION__ << "";
    	QStringList allCamInfo;
    	for ( auto camera : _cameras  )
    	{
    		QString camInfo;
    		if( camera == cam() )
    			camInfo += " * ";
    		else
    			camInfo += "   ";
    		camInfo += camera->camInfo();
    
    		allCamInfo << camInfo;
    	}
    
    	if ( ! _cameras.size() )
    		emit error(utils::errNoCams);
    
    	print(allCamInfo);
    }
    
    void Core::openCam()
    {
    	if( cam() )
    		cam()->open();
    }
    
    void Core::closeCam()
    {
    	if( cam() )
    		cam()->close();
    }
    
    /*
    current camera getter + setter
    -1 is dflt and means "return current camera"
    other idx's update idx and return new curCam
    */
    CamPtr Core::cam(const unsigned long &idx)
    {
    	static unsigned long curIdx = 0;
    	if( idx != -1UL )
    	{
    		curIdx = idx;
    		listCams(); // avoid endless loop
    	}
    
    	try
    	{
    		return _cameras.at(curIdx);
    	}
    	catch (const std::out_of_range& oor)
    	{
    		emit error(utils::errCamIdx);
    		return nullptr;
    	}
    }
    
    void Core::startRecording()
    {
    	if( !cam() || !cam()->rec() )
    		return;
    	//!rec() - test this worx (booloperator record) XXX
    
    	if( cam()->state() != Cam::opened )
    		return error("cant start recording, when cam is " + cam()->stateToString(cam()->state()));
    
    	cam()->rec()->start();
    }
    
    void Core::stopRecording()
    {
    	if( !cam() || !cam()->rec() )
    		return;
    
    	if( cam()->state() != Cam::recording )
    		return error("cant stop recording, when cam is " + cam()->stateToString(cam()->state()));
    
    	cam()->rec()->stop();
    }
    
    void Core::showRecordingStats()
    {
    	qDebug() << __LINE__ << "-" << __PRETTY_FUNCTION__ << "";
    	if( cam() && cam()->rec() && cam()->getCameraPtr() )
    	{
    		info(cam()->rec()->stats());
    	}
    }
    
    void Core::showInfo()
    {
    	print("---------(( INFO ))------------");
    	print("configFile",utils::configFile());
    	print("	outDir",utils::outDir());
    	print("	frameSize",utils::frameSize());
    	print("	fps",utils::fps());
    	print("	recDuration",utils::recDuration());
    	print("settingsFile",utils::settingsFile());
    	print("ncam",utils::ncam());
    	print("threadsPerCam",utils::threadsPerCam());
    	print("-------------------------------");
    
     	// if( cam() && cam()->rec() )
    	// {
    		// print(QString("check outdir: %1").arg(cam()->rec()->checkDir())); //dir exists, space available
    	// 	// info(cam()->rec()->stats()); //only after cam discovered
    	// }
    
    }
    
    void Core::setDuration1(seconds dur)
    {
    	if( cam() && cam()->rec())
    		cam()->rec()->setDur(dur);
    }
    
    void Core::setDurationAll(seconds dur)
    {
    	for ( auto cam : _cameras )
    		cam->rec()->setDur(dur);
    }
    
    void Core::loadSettings()
    {
    	if( cam() )
    		cam()->loadSettings();
    }
    
    void Core::saveSettings()
    {
    	if( cam() )
    		cam()->saveSettings();
    }