Select Git revision
FrameProcessor.cpp
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();
}