#include "CameraPool.h" #include #include "callbackFunc.h" #include "lpCameraConfig.h" #include "QFunctionTransfer.h" CCameraPool::CCameraPool(void) : m_libs("") { m_nFrameRate = 0; m_nCameraEncode = 0; } CCameraPool::~CCameraPool(void) { releaseImagesList(); } int CCameraPool::InitPool() { int nRet = 0; return nRet; } void CCameraPool::FreePool() { ICloseDevices(); IDeleteDameraes(); } int CCameraPool::ICreateCamDevices() { QList keys = lpCameraConfig::instance()->CameraKeys(); for (int i = 0; i < keys.size(); ++i) { if (m_CamDevMap.contains(keys[i])) { continue; } ICameraObject* pObject = m_libs.Create(lpCameraConfig::instance()->getCameraOption(keys[i]), this); if (NULL == pObject) { continue; } pObject->m_pCamOpt->status = TP_CAMERA_STATUS_INITED; m_CamDevMap.insert(keys[i], pObject); } return m_CamDevMap.size(); } bool CCameraPool::ICreateCamera(const QString& strSerial, int nType) { if (m_CamDevMap.contains(strSerial)) { return false; } TP_CAMERA_OPTION camOpt; camOpt.deviceType = nType; camOpt.uniqueName = strSerial; ICameraObject* pObject = m_libs.Create(&camOpt, this); if (NULL == pObject) { return false; } pObject->m_pCamOpt->status = TP_CAMERA_STATUS_INITED; m_CamDevMap.insert(strSerial, pObject); lpCameraConfig::instance()->addCameraOption(strSerial, camOpt); return true; } bool CCameraPool::IOpenCamera(const QString& strSerial, bool bReopen) { ICameraObject* pCamera = m_CamDevMap.value(strSerial); if (!pCamera) return false; if (bReopen) { pCamera->ICloseCamera(); pCamera->m_pCamOpt->status = TP_CAMERA_STATUS_CLOSED; } int nret = pCamera->IOpenCamera(); if (nret == 1){ pCamera->m_pCamOpt->status = TP_CAMERA_STATUS_OPENED; return true; } return false; } bool CCameraPool::ICloseCamera(const QString& strSerial) { ICameraObject* pCamera = m_CamDevMap.value(strSerial); if (!pCamera) return false; pCamera->ICloseCamera(); pCamera->m_pCamOpt->status = TP_CAMERA_STATUS_CLOSED; return true; } bool CCameraPool::IDelCamera(const QString& strSerial) { ICameraObject* pCamera = m_CamDevMap.value(strSerial); if (pCamera){ pCamera->IStopCamera(); pCamera->ICloseCamera(); pCamera->m_pCamOpt->status = TP_CAMERA_STATUS_UNINIT; m_libs.Delete(pCamera); } m_CamDevMap.remove(strSerial); lpCameraConfig::instance()->delCameraOption(strSerial); return true; } bool CCameraPool::IAddCamera(const QString& strName, const TP_CAMERA_OPTION& camOpt) { bool bret = false; if(m_CamDevMap.contains(strName)) { bret = ICloseCamera(strName); if (!bret) return bret; } lpCameraConfig::instance()->addCameraOption(strName, camOpt); { ICameraObject* pCamObj = m_libs.Create(lpCameraConfig::instance()->getCameraOption(strName), this); if (pCamObj) { pCamObj->m_pCamOpt->status = TP_CAMERA_STATUS_INITED; m_CamDevMap.insert(strName, pCamObj); } else{ return false; } } bret = IOpenCamera(strName, true); if (!bret) return bret; { bret = IStartCamera(strName); } return bret; } bool CCameraPool::IRunAlg(const QString& strSerial, bool bRun) { ICameraObject* pCamera = m_CamDevMap.value(strSerial); if (!pCamera) return false; pCamera->m_pCamOpt->bAutoRunAlg = bRun; return true; } bool CCameraPool::IStartCamera(const QString& strSerial) { ICameraObject* pCamera = m_CamDevMap.value(strSerial); if (!pCamera) return false; int nret = pCamera->IStartCamera(); if (nret == 1){ pCamera->m_pCamOpt->status = TP_CAMERA_STATUS_STARTED; return true; } return false; } bool CCameraPool::IStopCamera(const QString& strSerial) { ICameraObject* pCamera = m_CamDevMap.value(strSerial); if (!pCamera) return false; pCamera->IStopCamera(); pCamera->m_pCamOpt->status = TP_CAMERA_STATUS_STOPPED; return true; } void CCameraPool::IDeleteDameraes() { IStopDevices(); ICloseDevices(); m_CamDevMap.clear(cameraErased, &m_libs); } void CCameraPool::cameraOpen(class ICameraObject*& pCam, void* pData) { if (!pCam) return; if (pCam->IOpenCamera() == 1) { pCam->m_pCamOpt->status = TP_CAMERA_STATUS_OPENED; } } void CCameraPool::cameraOpenEx(class ICameraObject*& pCam, void* pData) { if (!pCam) return; if (pCam->m_pCamOpt->bAutoOpen) { if (pCam->IOpenCamera() == 1) { pCam->m_pCamOpt->status = TP_CAMERA_STATUS_OPENED; } } } int CCameraPool::IOpenDevices(bool bReopenAll) { if( bReopenAll ) { ICloseDevices(); } m_CamDevMap.iterateCall(cameraOpen, NULL); m_CamDevMap.iterateCall(cameraCalRelyOn, &m_CamDevMap); return 1; } int CCameraPool::IOpenDevicesEx(bool bReopenAll) { if (bReopenAll) { ICloseDevices(); } m_CamDevMap.iterateCall(cameraOpenEx, NULL); m_CamDevMap.iterateCall(cameraCalRelyOnEx, &m_CamDevMap); return 1; } int CCameraPool::InitDevices() { for (QZkMutexMap::iterator it = m_CamDevMap.begin(); it != m_CamDevMap.end(); ++it) { ICameraObject* pCamObj = *it; if (pCamObj) { pCamObj->InitProperty(); } } return 1; } void CCameraPool::cameraClose(class ICameraObject*& pCam, void* pData) { if (!pCam) return; pCam->ICloseCamera(); pCam->m_pCamOpt->status = TP_CAMERA_STATUS_CLOSED; } void CCameraPool::ICloseDevices() { m_CamDevMap.iterateCall(cameraClose, NULL); } void CCameraPool::IStartDevices() { m_CamDevMap.iterateCall(cameraStartDevices, NULL); } void CCameraPool::IStopDevices(const QString& sDef/* = NULL*/) { if (sDef.isEmpty()) { m_CamDevMap.iterateCall(cameraStopDevices, NULL); } else { m_CamDevMap.valueCall(sDef, cameraStopDevices, NULL); } } void CCameraPool::ISetTriggerMode(emTpDeviceTriggerMode mode) { } // void CCameraPool::DeviceLost(const QString& strName) // { // ICameraObject* pObj = m_CamDevMap.take(strName); // if (NULL != pObj) // { // m_libs.Delete(pObj); // } // } QList CCameraPool::ICameraKeys() { return lpCameraConfig::instance()->CameraKeys(); } QList CCameraPool::ICameraKeysOrderByIds() { return lpCameraConfig::instance()->CameraKeysOrderByIds(); } bool CCameraPool::ICameraOption(const QString& strSerial, TP_CAMERA_OPTION& camOpt) { return lpCameraConfig::instance()->getCameraOption(strSerial, camOpt); } bool CCameraPool::ICameraOptionByKey(const QString& strSerial, TP_CAMERA_OPTION& camOpt) { return lpCameraConfig::instance()->CameraOptionByKey(strSerial, camOpt); } bool CCameraPool::ISetCameraOption(const QString& strSerial, const TP_CAMERA_OPTION& camOpt) { bool bRet = lpCameraConfig::instance()->SetCameraOption(strSerial, camOpt); if (bRet) { ICameraObject* pCam = m_CamDevMap.value(strSerial, NULL); if (NULL != pCam) { pCam->ISetProperty(NULL); } } return bRet; } bool CCameraPool::IGetCameraOption(const QString& strSerial, const TP_CAMERA_OPTION& camOpt) { bool bRet = lpCameraConfig::instance()->SetCameraOption(strSerial, camOpt); if (bRet) { ICameraObject* pCam = m_CamDevMap.value(strSerial, NULL); if (NULL != pCam) { //return pCam->IGetProperty(&camOpt); } } return bRet; } QList CCameraPool::IEnumAvailableCameras(emTpDeviceType camType) { QList ret; // if the camera dll has been loaded QZkMutexMap::const_iterator iter = m_CamDevMap.constBegin(); while (iter != m_CamDevMap.constEnd()) { ICameraObject* pCam = iter.value(); if (pCam && pCam->m_pCamOpt->deviceType == camType){ ret = pCam->IEnumAvailableCameras(); return ret; } iter++; } // the camera dll has not been loaded TP_CAMERA_OPTION camOpt; camOpt.deviceType = camType; ret = m_libs.enumAvailableCameras(&camOpt, this); return ret; } // void CCameraPool::ISetTriggerMode(emTpDeviceTriggerMode mode/* = TRIGGER_DIRECT_FOREWARD */, long nFrameRate /* = 0 */) // { // // gGlobalPoolOption.triggerMode = mode; // // gGlobalPoolOption.triggerDirection = nDirection; // // gGlobalPoolOption.frameRate = nFrameRate; // // gGlobalPoolOption.fixedFrames = nFrameRate; // // m_nTriggerMode = mode; // // m_nFrameRate = nFrameRate; // // //set every device's trigger // // m_thdTrigger.LockWorked(); // // m_cameraes.iterateCall(cameraSetTriggerMode, &gGlobalPoolOption); // // IStartDevices(); // // m_thdTrigger.UnlockWorked(); // //begin or end trigger's thread // if( DEV_TRIGGER_MODE_AUTO != mode && // DEV_TRIGGER_MODE_FIXED_AUTO != mode ) // { // //m_thdTrigger.EndThread(); // // m_thdTrigger.SetAutoTrigger(false); // } // else // { // // m_thdTrigger.SetFrame(nFrameRate); // //m_thdTrigger.StartTrigger(); // // m_thdTrigger.SetAutoTrigger(true); // } // } void gfunc_snap_camera_image(const QString& key, class ICameraObject*& pCam, void* pData) { if (!pCam) return; QStringList* pKeys = (QStringList*)pData; if (!pKeys->contains(key)) { return; } pCam->ISnapCamera(); } void CCameraPool::ISnapImage(const QStringList& camKeys) { foreach(QString var, camKeys) { QZkMutexMap::iterator it = m_CamDevMap.find(var); if (it != m_CamDevMap.end()) { ICameraObject* pObj = *it; if (pObj) { pObj->ISnapCamera(); } } } // m_CamDevMap.iterateCall2(gfunc_snap_camera_image, (void*)(&camKeys)); } void gfunc_send_soft_trigger(const QString& key, class ICameraObject*& pCam, void* pData) { if (!pCam) return; // if (NULL != pCam->RelyOnCamera()) // { // return; // } if (NULL != pData) { QStringList* pKeys = (QStringList*)pData; if (!pKeys->contains(key)) { return; } } // pCam->ISendSoftTrigger(); } void CCameraPool::ISendSoftTrigger(const QStringList& camKeys) { if (camKeys.isEmpty()) { m_CamDevMap.iterateCall2(gfunc_send_soft_trigger, NULL); } else { m_CamDevMap.iterateCall2(gfunc_send_soft_trigger, (void*)(&camKeys)); } } void CCameraPool::calRelyOn() { m_CamDevMap.iterateCall(cameraCalRelyOn, &m_CamDevMap); } void CCameraPool::ISetCameraProperty(const QString& camera, emTpCameraProperty property, long nValue) { } void CCameraPool::ISetCameraProperty(const QString& camera, TP_CAMERA_PROPERTY& property) { if( camera.isNull() ) { m_CamDevMap.iterateCall(cameraSetProperty, &property); } else { m_CamDevMap.valueCall(camera, cameraSetProperty, &property); } } void CCameraPool::IGetCameraProperty(const QString& camera, TP_CAMERA_PROPERTY& property) { } void CCameraPool::cameraSetProperty(class ICameraObject*& pCam, void* pData) { if (!pCam) return; pCam->ISetProperty((TP_CAMERA_PROPERTY*)pData); } lpCameraImage* CCameraPool::IPopCameraImage() { return m_imagesList.takeFirst(NULL); } int CCameraPool::createDeviceByOptiones() { QList keys = lpCameraConfig::instance()->CameraKeys(); for( int i = 0; i < keys.size(); ++i ) { if( m_CamDevMap.contains(keys[i]) ) { continue; } ICameraObject* pObject = m_libs.Create(lpCameraConfig::instance()->getCameraOption(keys[i]), this); if( NULL == pObject ) { continue; } if( 0 == pObject->IOpenCamera() ) { m_libs.Delete(pObject); continue; } pObject->m_pCamOpt->status = TP_CAMERA_STATUS_OPENED; m_CamDevMap.insert(keys[i], pObject); } return m_CamDevMap.size(); } void CCameraPool::cameraErased(class ICameraObject*& pCam, void* pData) { if (!pCam) return; CLibCamera* pLibs = (CLibCamera*)pData; pCam->IStopCamera(); pCam->ICloseCamera(); pCam->m_pCamOpt->status = TP_CAMERA_STATUS_UNINIT; pLibs->Delete(pCam); } void CCameraPool::cameraStartDevices(class ICameraObject*& pCam, void* pData) { if (!pCam) return; if (pCam->IStartCamera() == 1){ pCam->m_pCamOpt->status = TP_CAMERA_STATUS_STARTED; } } void CCameraPool::cameraStopDevices(class ICameraObject*& pCam, void* pData) { if (!pCam) return; pCam->IStopCamera(); pCam->m_pCamOpt->status = TP_CAMERA_STATUS_STOPPED; } void CCameraPool::cameraSetTriggerMode(class ICameraObject*& pCam, void* pData) { } void CCameraPool::cameraSnaps(class ICameraObject*& pCam, void* pData) { if (!pCam) return; pCam->ISnapCamera(); } void CCameraPool::cameraIntervalCaptures(class ICameraObject*& pCam, void* pData) { if (!pCam) return; //tagCOMMIT_TRIGGER_PARAM* pParam = (tagCOMMIT_TRIGGER_PARAM*)pData; // if (NULL != pCam->RelyOnCamera()) // { // return; // } //pCam->ISnapCamera(pParam->direct); pCam->IAutoCapture(); } void CCameraPool::cameraCalRelyOn(class ICameraObject*& pCam, void* pData) { // if (!pCam) return; // QZkMutexMap* pCameraes = (QZkMutexMap*)pData; // TP_CAMERA_OPTION* pOpt = pCam->m_pCamOpt; // if( DEV_CAM_VIRTUAL_FOLDER == pOpt->deviceType && NULL == pCam->RelyOnCamera() && pCameraes->contains(pOpt->relyOnCamera) ) // { // ICameraObject* pCamRelyOn = pCameraes->value(pOpt->relyOnCamera, NULL); // if( NULL != pCamRelyOn ) // { // pCam->SetRelyOnCamera(pCamRelyOn); // pCamRelyOn->SetReliedByCamera(pCam); // } // } } void CCameraPool::cameraCalRelyOnEx(class ICameraObject*& pCam, void* pData) { // if (!pCam) return; // QZkMutexMap* pCameraes = (QZkMutexMap*)pData; // TP_CAMERA_OPTION* pOpt = pCam->m_pCamOpt; // if (DEV_CAM_VIRTUAL_FOLDER == pOpt->deviceType && pOpt->bAutoOpen && NULL == pCam->RelyOnCamera() && pCameraes->contains(pOpt->relyOnCamera)) // { // ICameraObject* pCamRelyOn = pCameraes->value(pOpt->relyOnCamera, NULL); // if (NULL != pCamRelyOn) // { // pCam->SetRelyOnCamera(pCamRelyOn); // pCamRelyOn->SetReliedByCamera(pCam); // } // } } //在主线程中运行? int CCameraPool::IPushCameraData(ICameraObject* pCamObj) { if (m_imagesList.size() >= 32) { qWarning("Cache OverFlow, Camera Image Count:%d", m_imagesList.size()); if (pCamObj->m_nFrameNum > 0) { pCamObj->m_nFrameNum--; } return 0; } if (NULL == pCamObj || NULL == pCamObj->m_pCamOpt ) { return 0; } lpCameraImage *pImage = m_imagesMerging.value(pCamObj->m_pCamOpt->uniqueName, NULL); if (NULL == pImage) { pImage = new lpCameraImage(); } int nRet = 0; if (NULL != pImage) { // int nRet = pImage->CopyCameraObject(pCamObj); if (-1 == nRet) { delete pImage; pImage = NULL; } else if (1 == nRet) { // if (pCamObj->m_pCamOpt->bAutoRunAlg == false) // { // // delete pImage; // pImage = NULL; // } // else { QString strSerial = pImage->Serial(); QImage showImg = pImage->ToQImage(); QFunctionTransfer::Instance()->execInMain([this, strSerial, showImg]() { if (lpCallBackFunc::instance()->m_ImageCallBackFunc) { lpCallBackFunc::instance()->m_ImageCallBackFunc(strSerial, showImg); } }); try { //获取算法参数 绑定到图像 if (lpCallBackFunc::instance()->m_GetVariantCallBackFunc) { QVariant val = lpCallBackFunc::instance()->m_GetVariantCallBackFunc(pCamObj->m_pCamOpt->id); pImage->SetVarFromUI(val); } } catch (...) { qCritical() << "Critical error." << __FUNCTION__; return 0; } pImage->SetMeterCode(m_nCameraEncode); m_imagesList.append(pImage); pImage = NULL; } } m_imagesMerging.insert(pCamObj->m_pCamOpt->uniqueName, pImage); nRet = 1; } //checks to stop trigger in fixed_auto return nRet; } //don't combine image int CCameraPool::IPushCameraData2(ICameraObject* pCamObj) { if (m_imagesList.size() >= 32) { qWarning("Cache OverFlow, Camera Image Count:%d", m_imagesList.size()); } quint64 msec = QDateTime::currentMSecsSinceEpoch(); if (NULL == pCamObj || NULL == pCamObj->m_pCamOpt) { return 0; } // if (pCamObj->m_pCamOpt->bIgnoreImage) { if (pCamObj->m_nFrameNum > 0) { pCamObj->m_nFrameNum--; } return 0; } // pCamObj->SaveToFile(); lpCameraImage* pImage = new lpCameraImage(); if (NULL == pImage) { return 0; } if (0 == pImage->CopyCameraObject2(pCamObj)) { delete pImage; return 0; } if (lpCallBackFunc::instance()->m_GetVariantCallBackFunc) { QVariant val = lpCallBackFunc::instance()->m_GetVariantCallBackFunc(pCamObj->m_pCamOpt->id); pImage->SetVarFromUI(val); } m_imagesList.append(pImage); return 1; } bool CCameraPool::IGetWidth(const QString& strSerial, int& width) { ICameraObject* pCam = m_CamDevMap.value(strSerial, NULL); if (NULL != pCam) { TP_CAMERA_PROPERTY nProperty; nProperty.property = TP_CAM_PROPERTY_IMAGE_WIDTH; bool bRet = pCam->IGetProperty(&nProperty); width = nProperty.value; return bRet; } return false; } bool CCameraPool::ISetWidth(const QString& strSerial, int& width) { ICameraObject* pCam = m_CamDevMap.value(strSerial, NULL); if (NULL != pCam) { TP_CAMERA_PROPERTY nProperty; nProperty.property = TP_CAM_PROPERTY_IMAGE_WIDTH; nProperty.value = width; TP_CAMERA_OPTION* opt = lpCameraConfig::instance()->getCameraOption(strSerial); if (opt) { opt->width = width; } return pCam->ISetProperty(&nProperty); } return false; } bool CCameraPool::IGetHeight(const QString& strSerial, int& height) { ICameraObject* pCam = m_CamDevMap.value(strSerial, NULL); if (NULL != pCam) { TP_CAMERA_PROPERTY nProperty; nProperty.property = TP_CAM_PROPERTY_IMAGE_HEIGHT; bool bRet = pCam->IGetProperty(&nProperty); height = nProperty.value; return bRet; } return false; } bool CCameraPool::ISetHeight(const QString& strSerial, int& height) { ICameraObject* pCam = m_CamDevMap.value(strSerial, NULL); if (NULL != pCam) { TP_CAMERA_PROPERTY nProperty; nProperty.property = TP_CAM_PROPERTY_IMAGE_HEIGHT; nProperty.value = height; TP_CAMERA_OPTION* opt = lpCameraConfig::instance()->getCameraOption(strSerial); if (opt) { opt->height = height; } return pCam->ISetProperty(&nProperty); } return false; } bool CCameraPool::IGetGain(const QString& strSerial, int& height) { ICameraObject* pCam = m_CamDevMap.value(strSerial, NULL); if (NULL != pCam) { TP_CAMERA_PROPERTY nProperty; nProperty.property = TP_CAM_PROPERTY_GAIN; bool bRet = pCam->IGetProperty(&nProperty); height = nProperty.value; return bRet; } return false; } bool CCameraPool::ISetGain(const QString& strSerial, int& height) { ICameraObject* pCam = m_CamDevMap.value(strSerial, NULL); if (NULL != pCam) { TP_CAMERA_PROPERTY nProperty; nProperty.property = TP_CAM_PROPERTY_GAIN; nProperty.value = height; pCam->ISetProperty(&nProperty); TP_CAMERA_OPTION* opt = lpCameraConfig::instance()->getCameraOption(strSerial); if (opt) { opt->gain = height; } return true; } return false; } bool CCameraPool::IGetExposureTime(const QString& strSerial, int& height) { ICameraObject* pCam = m_CamDevMap.value(strSerial, NULL); if (NULL != pCam) { TP_CAMERA_PROPERTY nProperty; nProperty.property = TP_CAM_PROPERTY_EXPOSURE; bool bRet = pCam->IGetProperty(&nProperty); height = nProperty.value; return bRet; } return false; } bool CCameraPool::ISetExposureTime(const QString& strSerial, int& height) { ICameraObject* pCam = m_CamDevMap.value(strSerial, NULL); if (NULL != pCam) { TP_CAMERA_PROPERTY nProperty; nProperty.property = TP_CAM_PROPERTY_EXPOSURE; nProperty.value = height; pCam->ISetProperty(&nProperty); TP_CAMERA_OPTION* opt = lpCameraConfig::instance()->getCameraOption(strSerial); if (opt) { opt->exposure = height; } return true; } return false; } void CCameraPool::IFreeCameraImage(lpCameraImage *pCamImg) { delete pCamImg; } QMap CCameraPool::IGetCamShowNames() { return lpCameraConfig::instance()->GetCamShowNames(); } void CCameraPool::ISetCameraEncode(INT64 code, INT64 rate) { m_nCameraEncode = code; m_nEncoderRate = rate; }