Skip to content

iRAYPLE AE3600MG010 software trigger sometimes get image timeout #1030

@liyu9202

Description

@liyu9202

Describe the bug
I am using iRAYPLE AE3600MG010 camera for project development, but when i use its software trigger order to get image with trigger mode setting on, trigger source choose software, it sometimes will warn image getting timeout and not call in Arvcallback.

generalcamera.zip

Expected behavior
it should get image with trigger execution. here is the code for camera connect and image acquisition process :

bool GeneralCameraModule::connect()
{
    m_stop = false;
    m_lastErrorMessage = "";
    if(flow() != nullptr)
        flow()->setIsDuringOpenDevice(true);

    std::vector<module::GeneralCameraId> cameras = module::GeneralCamera::listCameras();
    if(cameras.empty())
    {
        m_lastErrorMessage = tr("Can not find any device!");
        setMessage(m_lastErrorMessage);
        return false;
    }
    m_acquisitionControlSetting->updateSNList();
    for(int i = 0; i< cameras.size(); i++)
    {
        if (AcquisitionControlSettingItem::autoSN == m_acquisitionControlSetting->m_connectMode
            || m_acquisitionControlSetting->m_selectedSN.contains(QString(cameras[i].serialnumber))) {
            m_general_cameraId = cameras[i];
            m_cameraName = QString(cameras[i].id);
            m_general_camera = QSharedPointer<module::GeneralCamera>(new module::GeneralCamera(cameras[i]));
            m_userSettingItem->setSensorPtr(m_general_camera);
            if(m_general_camera->camera != NULL)
            {
                m_acquisitionControlSetting->setSensorPtr(m_general_camera);
                m_analogSetting->setSensorPtr(m_general_camera);
                m_counterandtimerSettingItem->setSensorPtr(m_general_camera);
                m_digitalioSettingItem->setSensorPtr(m_general_camera);
                m_imageformatSettingItem->setSensorPtr(m_general_camera);
                m_ispSettingItem->setSensorPtr(m_general_camera);
                imageViewModelPtr()->clear();
                timer = new QTimer(this);
                QObject::connect(timer, &QTimer::timeout, this, &GeneralCameraModule::checkCameraStatus);
                //timer->start(2000);
                setConnectState(true);
                m_general_camera->callback_data.done = false;
                m_general_camera->callback_data.stream = NULL;
                m_general_camera->createStream();
                setCameraInfo();
                m_settingsModelPtr->resetModel();
            }
            break;
        }
    }
    m_settingsModelPtr->InitSettings();
    m_settingsModelPtr->saveSettings();
    if(cameras.size() > 0 && !isConnected())
    {
        m_lastErrorMessage = tr("Can not find the specified device!");
        setMessage(m_lastErrorMessage);
        qCritical() << "Can not find the specified device: " << m_acquisitionControlSetting->m_selectedSN;
        return false;
    }

    if(flow() != nullptr)
        flow()->setIsDuringOpenDevice(false);
    return true;
}
ModuleVisualAbstract::StateType GeneralCameraModule::doProcess()
{
    setMessage("");
    if(isConnected() && m_general_camera)
    {
        m_general_camera->callback_data.done = false;
        if(m_acquisitionControlSetting->triggerMode() == lemon::GeniCamPara::TriggerModeType::On)
        {
            m_general_camera->excuteTrigger();
        }
        else
        {
             m_general_camera->startAcquisition();
        }
    }
    else{
        setMessage(tr("Camera is not connected"));
        return StateType::EndFailure;
    }
    auto start = std::chrono::high_resolution_clock::now();
    while(!m_stop)
    {
        if(m_general_camera->callback_data.done == true)
        {
            m_general_camera->callback_data.done = false;
            if(m_imageformatSettingItem->pixelFormat() == lemon::GeniCamPara::Mono8)
            {
                m_imagePtr = QSharedPointer<mpalgorithm::Image>(new mpalgorithm::Image(m_general_camera->callback_data.width,m_general_camera->callback_data.height,mpalgorithm::ImageType::GRAY_UCHAR,1,0, m_general_camera->callback_data.imagedata));
            }
            else if(m_imageformatSettingItem->pixelFormat() == lemon::GeniCamPara::Mono10|| m_imageformatSettingItem->pixelFormat() == lemon::GeniCamPara::Mono12)
            {
                m_imagePtr = QSharedPointer<mpalgorithm::Image>(new mpalgorithm::Image(m_general_camera->callback_data.width,m_general_camera->callback_data.height,mpalgorithm::ImageType::USHORT_Z,1,0, m_general_camera->callback_data.imagedata));
                m_imagePtr->setZ0(0);
                m_imagePtr->setZInc(1);
                float x0 = -m_imagePtr.data()->width() / 2.0;
                float y0 = -m_imagePtr.data()->height() / 2.0;
                m_imagePtr->setX0(x0);
                m_imagePtr->setXInc(1);
                m_imagePtr->setY0(y0);
                m_imagePtr->setYInc(1);
            }
            else
            {
                setMessage(tr("Camera image format is not supported"));
                return StateType::EndFailure;
            }
            if(m_acquisitionControlSetting->acquisitionMode() == lemon::GeniCamPara::AcquisitionModeType::SingleFrame || m_acquisitionControlSetting->triggerMode() == lemon::GeniCamPara::TriggerModeType::On)
            {
                imageViewModelPtr()->update();
                break;
            }
            else if(m_acquisitionControlSetting->acquisitionMode() == lemon::GeniCamPara::AcquisitionModeType::MultiFrame)
            {
                m_framecount++;
                imageViewModelPtr()->update();
                if(m_framecount == m_acquisitionControlSetting->acquisitionframecount())
                {
                    m_framecount = 0;
                    break;
                }
                start = std::chrono::high_resolution_clock::now();
            }
            else if(m_acquisitionControlSetting->acquisitionMode() == lemon::GeniCamPara::AcquisitionModeType::Continuous && m_acquisitionControlSetting->triggerMode() == lemon::GeniCamPara::TriggerModeType::Off)
            {
                imageViewModelPtr()->update();
                start = std::chrono::high_resolution_clock::now();
            }
        }
        auto end = std::chrono::high_resolution_clock::now();
        std::chrono::duration<double> elapsed = end - start;
        long long elapsed_seconds = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count();
        if(elapsed_seconds > 5000.0) //如果时间差超过5秒
        {
            setMessage(tr("Camera gets image timeout"));
            return StateType::EndFailure;
        }
        setCameraInfo();
    }
    setCameraInfo();
    return StateType::EndSuccess;
}

Camera description:

  • iRAYPLE
  • AE3600MG010
  • GiGE

Platform description:

  • Aravis 0.9.0
  • OS: Win11 homeoffice 10.0.22631 version
  • Hardware x64

Additional context
attached files is my modified .cpp and .h file using aravis library.
please find out whether there exist some unreasonable code or some error needing fix

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions