-
-
Notifications
You must be signed in to change notification settings - Fork 391
Open
Labels
Description
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.
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