Newer
Older
CasicBioRecNew / device / IrisCameraController.cpp
#include "IrisCameraController.h"

static qint8 IRIS_CAMERA_SWITCHER = 0; // 用于切换左右两个相机工作的奇偶变量

IrisCameraController::IrisCameraController(QObject *parent) : QObject(parent)
{
    this->leftHandler = new IrisCameraCapEventHandler(this);
    this->rightHandler = new IrisCameraCapEventHandler(this);
}
IrisCameraController::~IrisCameraController()
{
    this->closeIrisCamera();
}


void IrisCameraController::initIrisCamera()
{
    IGXFactory::GetInstance().Init();

    //枚举设备
    IGXFactory::GetInstance().UpdateDeviceList(1000, irisCamList);

    this->OpenDevice();
}

void IrisCameraController::openIrisCamera()
{
    //设置Buffer处理模式
    leftStreamFeaturePtr->GetEnumFeature("StreamBufferHandlingMode")->SetValue("OldestFirst");
    rightStreamFeaturePtr->GetEnumFeature("StreamBufferHandlingMode")->SetValue("OldestFirst");

    //注册回调函数
    leftStreamPtr->RegisterCaptureCallback(leftHandler, &leftCamPtr);
    rightStreamPtr->RegisterCaptureCallback(rightHandler, &rightCamPtr);

    //开启流层通道
    leftStreamPtr->StartGrab();
    rightStreamPtr->StartGrab();

    //发送开采命令
    leftFeaturePtr->GetCommandFeature("AcquisitionStart")->Execute();
    rightFeaturePtr->GetCommandFeature("AcquisitionStart")->Execute();

    // 启动定时器
    TimeCounterUtil::getInstance().irisCapCounter->start(SettingConfig::getInstance().IRIS_FRAME_INTERVAL); // 50ms执行一次定时器
}

void IrisCameraController::closeIrisCamera()
{

}

void IrisCameraController::startCapture()
{
    // 获取定时器, 绑定定时函数
    connect(TimeCounterUtil::getInstance().irisCapCounter, &QTimer::timeout,
            this, &IrisCameraController::getOneFaceFrm);
//    LOG(DEBUG) << QString("[IrisCameraController][startCapture]虹膜相机拍图").toStdString();
}
void IrisCameraController::stopCapture()
{
    // 获取定时器, 绑定定时函数
    disconnect(TimeCounterUtil::getInstance().irisCapCounter, &QTimer::timeout,
               this, &IrisCameraController::getOneFaceFrm);
//    LOG(DEBUG) << QString("[IrisCameraController][stopCapture]虹膜相机停止拍图").toStdString();
}

void IrisCameraController::getOneFaceFrm()
{
    // 发送软触发命令(在触发模式开启时有效)
    if (IRIS_CAMERA_SWITCHER % 2 == 0)
    {
        leftFeaturePtr->GetCommandFeature("TriggerSoftware")->Execute();
    } else
    {
        rightFeaturePtr->GetCommandFeature("TriggerSoftware")->Execute();
    }

    IRIS_CAMERA_SWITCHER++;
}

void IrisCameraController::getLeftAndRightEyeFrame()
{
    leftFeaturePtr->GetCommandFeature("TriggerSoftware")->Execute();
    QThread::msleep(100);
    rightFeaturePtr->GetCommandFeature("TriggerSoftware")->Execute();
}

void IrisCameraController::OpenDevice()
{
    for(size_t i = 0; i < this->irisCamList.size(); i++)
    {
        auto device = irisCamList.at(i);
        size_t leftKeyIndex = device.GetUserID().find("left");
        size_t rightKeyIndex = device.GetUserID().find("right");
        if (leftKeyIndex >= 0 && leftKeyIndex < 32)
        {
            leftCamPtr = IGXFactory::GetInstance().OpenDeviceByUserID(device.GetUserID(), GX_ACCESS_EXCLUSIVE);
            leftFeaturePtr = leftCamPtr->GetRemoteFeatureControl();

            // 判断设备流是否大于零, 如果大于零则打开流
            int nStreamCount = leftCamPtr->GetStreamCount();
            if (nStreamCount > 0)
            {
                leftStreamPtr = leftCamPtr->OpenStream(0);
                leftStreamFeaturePtr = leftStreamPtr->GetFeatureControl();
            }

            // 建议用户在打开网络相机之后, 根据当前网络环境设置相机的流通道包长值,
            // 以提高网络相机的采集性能, 设置方法参考以下代码。
            GX_DEVICE_CLASS_LIST objDeviceClass = leftCamPtr->GetDeviceInfo().GetDeviceClass();
            if(GX_DEVICE_CLASS_GEV == objDeviceClass)
            {
                // 判断设备是否支持流通道数据包功能
                if(true == leftFeaturePtr->IsImplemented("GevSCPSPacketSize"))
                {
                    // 获取当前网络环境的最优包长值
                    int nPacketSize = leftStreamPtr->GetOptimalPacketSize();
                    // 将最优包长值设置为当前设备的流通道包长值
                    leftFeaturePtr->GetIntFeature("GevSCPSPacketSize")->SetValue(nPacketSize);
                }
            }

            //设置采集模式为连续采集模式
            leftFeaturePtr->GetEnumFeature("AcquisitionMode")->SetValue("Continuous");

            //设置触发模式关
            leftFeaturePtr->GetEnumFeature("TriggerMode")->SetValue("On");
            leftFeaturePtr->GetEnumFeature("TriggerSource")->SetValue("Software");
        } else if (rightKeyIndex >= 0 && rightKeyIndex < 32)
        {
            rightCamPtr = IGXFactory::GetInstance().OpenDeviceByUserID(device.GetUserID(), GX_ACCESS_EXCLUSIVE);
            rightFeaturePtr = rightCamPtr->GetRemoteFeatureControl();

            //判断设备流是否大于零, 如果大于零则打开流
            int nStreamCount = rightCamPtr->GetStreamCount();
            if (nStreamCount > 0)
            {
                rightStreamPtr = rightCamPtr->OpenStream(0);
                rightStreamFeaturePtr = rightStreamPtr->GetFeatureControl();
            }

            // 建议用户在打开网络相机之后, 根据当前网络环境设置相机的流通道包长值,
            // 以提高网络相机的采集性能, 设置方法参考以下代码。
            GX_DEVICE_CLASS_LIST objDeviceClass = rightCamPtr->GetDeviceInfo().GetDeviceClass();
            if(GX_DEVICE_CLASS_GEV == objDeviceClass)
            {
                // 判断设备是否支持流通道数据包功能
                if(true == rightFeaturePtr->IsImplemented("GevSCPSPacketSize"))
                {
                    // 获取当前网络环境的最优包长值
                    int nPacketSize = rightStreamPtr->GetOptimalPacketSize();
                    // 将最优包长值设置为当前设备的流通道包长值
                    rightFeaturePtr->GetIntFeature("GevSCPSPacketSize")->SetValue(nPacketSize);
                }
            }

            //设置采集模式为连续采集模式
            rightFeaturePtr->GetEnumFeature("AcquisitionMode")->SetValue("Continuous");

            //设置触发模式关
            rightFeaturePtr->GetEnumFeature("TriggerMode")->SetValue("On");
            rightFeaturePtr->GetEnumFeature("TriggerSource")->SetValue("Software");
        }
    }
}