diff --git a/BaseModules/Hd_CameraModule_HIK_hard_GenTL/CMakeLists.txt b/BaseModules/Hd_CameraModule_HIK_hard_GenTL/CMakeLists.txt new file mode 100644 index 0000000..e86c65b --- /dev/null +++ b/BaseModules/Hd_CameraModule_HIK_hard_GenTL/CMakeLists.txt @@ -0,0 +1,70 @@ +# 获取获取当前目录名 +get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(TIMESTAMP RUN_TIME) +message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME}) + +set(DLL_NAMES "mvs" "opencv") +foreach(child ${DLL_NAMES}) + LIST(APPEND ENV_INCLUDE ${${child}_include}) + LIST(APPEND ENV_LIB ${${child}_lib}) + LIST(APPEND ENV_TARGET ${${child}_target_link}) +endforeach() +message(" ENV_INCLUDE : " ${ENV_INCLUDE} ) +message(" ENV_LIB : " ${ENV_LIB} ) +message(" ENV_TARGET : " ${ENV_TARGET} ) +include_directories( + + ${ENV_INCLUDE} + ) + +link_directories ( + ${ENV_LIB} + + ) + + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_CXX_STANDARD 11) +SET(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_AUTOMOC ON) +SET(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +FILE(GLOB HEAD_FILES "./*.h" ) +FILE(GLOB SRC_FILES "./*.cpp") +FILE(GLOB UI_FILES "./*.ui") + + +#find_package(Qt5 COMPONENTS Core REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED) + +add_library(${CURRENT_FOLDER} SHARED + ${HEAD_FILES} + ${SRC_FILES} + ${UI_FILES} + ) + + + +set_target_properties(${CURRENT_FOLDER} PROPERTIES LINKER_LANGUAGE C + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + ) + + +target_link_libraries(${CURRENT_FOLDER} PRIVATE + ${ENV_TARGET} + Qt${QT_VERSION_MAJOR}::Core + ) + + +# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY) + + + + +string(TIMESTAMP RUN_TIME) +message( " model end : " ${CURRENT_FOLDER}:${RUN_TIME}) diff --git a/BaseModules/Hd_CameraModule_HIK_hard_GenTL/Hd_CameraModule_HIK_hard_GenTL.cpp b/BaseModules/Hd_CameraModule_HIK_hard_GenTL/Hd_CameraModule_HIK_hard_GenTL.cpp new file mode 100644 index 0000000..5f3b95c --- /dev/null +++ b/BaseModules/Hd_CameraModule_HIK_hard_GenTL/Hd_CameraModule_HIK_hard_GenTL.cpp @@ -0,0 +1,537 @@ +#include "Hd_CameraModule_HIK_hard_GenTL.h" +#include + +#include +QByteArray mv_Status = "connected";//0106 新增相机断联报警 +long long index = 0; //相机序号 +void* handle; +string Username = ""; +bool m_flag = false; +//MV_CC_DEVICE_INFO_LIST m_stDevList;//相机设备 +bool moduleStatus = true; +QQueue queuepic; +//data == "rest_newProductIn"时要结束run;机台报警,取图超时,复位后重新拍的情况。 +bool ifBreak = false; +//ifRunning减少ifBreak的判断;"rest_newProductIn"时,Logic_camera_thread框架会结束未处理完的相相机取图 +bool ifRunning = false; + +MV_GENTL_DEV_INFO_LIST m_stDevList; // ch:设备信息列表结构体变量,用来存储设备列表 +MV_GENTL_IF_INFO_LIST m_stIFList; + +QString byteArrayToUnicode(const QByteArray array) { + + // state用于保存转换状态,它的成员invalidChars,可用来判断是否转换成功 + // 如果转换成功,则值为0,如果值大于0,则说明转换失败 + QTextCodec::ConverterState state; + // 先尝试使用utf-8的方式把QByteArray转换成QString + QString text = QTextCodec::codecForName("UTF-8")->toUnicode(array.constData(), array.size(), &state); + // 如果转换时无效字符数量大于0,说明编码格式不对 + if (state.invalidChars > 0) + { + // 再尝试使用GBK的方式进行转换,一般就能转换正确(当然也可能是其它格式,但比较少见了) + text = QTextCodec::codecForName("GBK")->toUnicode(array); + } + return text; +} +QMutex* n_mutex = new QMutex(); +//cv::Mat srcImage; +//是否为标准通信流程: +//标准通信流程,run函数设置曝光/增益;非标准通信流程(简单通信流程),回调函数设置曝光/增益 +bool ifStandard = false; +//相机取图超时时间 +int getImageTimeOut = 1000; +//总取图数 +int imgIndex = 0; +//曝光值列表 +QQueue expourseTimeList; +//增益列表 +QQueue gainList; + +bool IsColor(MvGvspPixelType enType) +{ + switch (enType) + { + case PixelType_Gvsp_RGB8_Packed: + case PixelType_Gvsp_YUV422_Packed: + case PixelType_Gvsp_YUV422_YUYV_Packed: + case PixelType_Gvsp_BayerGR8: + case PixelType_Gvsp_BayerRG8: + case PixelType_Gvsp_BayerGB8: + case PixelType_Gvsp_BayerBG8: + case PixelType_Gvsp_BayerGB10: + case PixelType_Gvsp_BayerGB10_Packed: + case PixelType_Gvsp_BayerBG10: + case PixelType_Gvsp_BayerBG10_Packed: + case PixelType_Gvsp_BayerRG10: + case PixelType_Gvsp_BayerRG10_Packed: + case PixelType_Gvsp_BayerGR10: + case PixelType_Gvsp_BayerGR10_Packed: + case PixelType_Gvsp_BayerGB12: + case PixelType_Gvsp_BayerGB12_Packed: + case PixelType_Gvsp_BayerBG12: + case PixelType_Gvsp_BayerBG12_Packed: + case PixelType_Gvsp_BayerRG12: + case PixelType_Gvsp_BayerRG12_Packed: + case PixelType_Gvsp_BayerGR12: + case PixelType_Gvsp_BayerGR12_Packed: + return true; + default: + return false; + } +} +//0106 断线重连 +void __stdcall ReconnectDevice(unsigned int nMsgType, void* pUser); +void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFrameInfo0, void* pUser0); +//搜索所有设备 +int SearchDevice() +{ + const char* chCtiPath = "MvFGProducerXoF.cti";//.cti文件路径 + int nRet = 0; + nRet = MV_CC_EnumInterfacesByGenTL(&m_stIFList, chCtiPath); + if (nRet != MV_OK) + { + qDebug() << "EnumInterfacsByGenTL fail"; + return 0; + } + + if (m_stIFList.nInterfaceNum == 0) + { + qDebug() << "No Device"; + return 0; + } + + // ch:枚举子网内所有设备 | en:Enumerate all devices within subnet + for (int p = 0; p < m_stIFList.nInterfaceNum; p++) + { + memset(&m_stDevList, 0, sizeof(MV_CC_DEVICE_INFO_LIST)); + nRet = MV_CC_EnumDevicesByGenTL(m_stIFList.pIFInfo[p], &m_stDevList); + bool ifHas = false; + for (int i = 0; i < m_stDevList.nDeviceNum; i++) + { + //SN + unsigned char* name = m_stDevList.pDeviceInfo[i]->chSerialNumber; + string userName = static_cast((LPCSTR)name); + if (Username == userName) + { + index = i; + ifHas = true; + break; + } + } + if (ifHas)break; + } + if (MV_OK != nRet) + { + return 0; + } + return -1; +} + +bool connctDevice() +{ + index = -1; + SearchDevice(); + if (index == -1) + { + //未匹配到相机 + //qDebug() << "[Waring] " << "Hd_CameraModule_HIK not match --CameraName:" << QString::fromStdString(Username); + return false; + } + unsigned char* name = m_stDevList.pDeviceInfo[index]->chSerialNumber; + string userName = static_cast((LPCSTR)name); + qDebug() << "[INFO] " << " start" << "--UserName:" << QString::fromStdString(userName); + if (handle != NULL) + { + MV_CC_StopGrabbing(handle); + MV_CC_CloseDevice(handle); + MV_CC_DestroyHandle(handle); + } + + //打开相机 + MV_CC_CreateHandleByGenTL(&handle, m_stDevList.pDeviceInfo[index]); + int nRet = MV_CC_OpenDevice(handle); + ////触发模式 + MV_CC_SetEnumValue(handle, "TriggerSource", MV_TRIGGER_SOURCE_LINE0); + MV_CC_SetEnumValue(handle, "TriggerMode", MV_TRIGGER_MODE_ON); + // //加载用户集,相机设置应当UserSet1 + nRet = MV_CC_SetEnumValueByString(handle, "UserSetSelector", "UserSet1"); + if (MV_OK != nRet) + { + qDebug() << "Set UserSetSelector fail! nRet " << nRet; + } + // ch:注册抓图回调 | en:Register image callback + MV_CC_SetIntValueEx(handle, "GevHeartbeatTimeout", 3000);//心跳日志 + + nRet = MV_CC_RegisterImageCallBackEx(handle, ImageCallBackEx, handle);//注册回调 + if (MV_OK != nRet) + return false; + nRet = MV_CC_RegisterExceptionCallBack(handle, ReconnectDevice, NULL);//断线重连 + if (MV_OK != nRet) + return false; + MV_CC_StartGrabbing(handle); + return true; +} +void SetExposureTime(float exposureValue) +{ + qDebug() << "[INFO] " << "exposureValue:" << exposureValue; + MV_CC_SetEnumValue(handle, "ExposureAuto", MV_EXPOSURE_AUTO_MODE_OFF); + MV_CC_SetFloatValue(handle, "ExposureTime", exposureValue); +} + +void SetGain(float GainValue) +{ + qDebug() << "[INFO] " << "GainValue:" << GainValue; + MV_CC_SetEnumValue(handle, "GainAuto", 0); + MV_CC_SetFloatValue(handle, "Gain", GainValue); +} + +//0518 断线重连 +void __stdcall ReconnectDevice(unsigned int nMsgType, void* pUser) +{ + mv_Status = "disconnect"; + qDebug() << "[Error] " << " MV camera disconnects!"; + moduleStatus = false; + if (nMsgType == MV_EXCEPTION_DEV_DISCONNECT) + { + //断开连接 + MV_CC_CloseDevice(handle); + int nRet = MV_CC_DestroyHandle(handle); + handle = nullptr; + BOOL bConnected = FALSE; + while (1) + { + Sleep(100); + if (connctDevice() == true) + { + qWarning() << "[Hd_CameraModule_HIK] " << " Hd_CameraModule_HIK create success again! "; + moduleStatus = true; + break; + } + + } + } +} + +//0106 断连提示 +void _stdcall ExceptionCB(unsigned int nMesgType, void* pUser) { + mv_Status = "disconnect"; + qDebug() << "[Error] " << " MvCameraTL disconnects!"; +} + + +Hd_CameraModule_HIK_hard_GenTL* create() +{ + qDebug() << "[INFO] " << "Hd_CameraModule_HIK create success!" ; + return new Hd_CameraModule_HIK_hard_GenTL; +} + +void destory(Hd_CameraModule_HIK_hard_GenTL * ptr) +{ + if(ptr) + { + delete ptr; + ptr = nullptr; + } + qDebug() << "[INFO] " << "Hd_CameraModule_HIK destory success!"; +} + +//回调函数; +//经测试,相机像素格式Mono8、RGB8是可以正常转换的,YUV422还需要优化;RGB8格式比YUV422帧率低;BGR格式会导致异色问题 +void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFrameInfo0, void* pUser0) +{ + Q_UNUSED(pUser0) + int frameNum = 0; + double time_Start = (double)clock(); + n_mutex->lock(); + cv::Mat srcImage = cv::Mat(); + //qDebug() << "[info]" << __FUNCTION__ << " line:" << __LINE__ << "--- start"; + if (pFrameInfo0) + { + //获取的是单通道灰度图 + if (pFrameInfo0->enPixelType == PixelType_Gvsp_Mono8)//获取当前采集到的图像格式 + { + srcImage = cv::Mat(pFrameInfo0->nHeight, pFrameInfo0->nWidth, CV_8UC1, pData0); + } + //获取的是RGB8图 + else if (pFrameInfo0->enPixelType == PixelType_Gvsp_BGR8_Packed) + { + srcImage = cv::Mat(pFrameInfo0->nHeight, pFrameInfo0->nWidth, CV_8UC3, pData0); + + //cvtColor(srcImage, srcImage, COLOR_RGB2BGR);//导致异色 + } + else if (IsColor(pFrameInfo0->enPixelType)) //其它格式彩色图 + { + MvGvspPixelType enDstPixelType = PixelType_Gvsp_Undefined; + enDstPixelType = PixelType_Gvsp_BGR8_Packed; + unsigned char* pConvertData = NULL; + pConvertData = (unsigned char*)malloc(pFrameInfo0->nWidth * pFrameInfo0->nHeight * 3); + if (NULL == pConvertData) + { + printf("malloc pConvertData fail!\n"); + } + else + { + unsigned int nConvertDataSize = 0; + nConvertDataSize = pFrameInfo0->nWidth * pFrameInfo0->nHeight * 3; + + // ch:像素格式转换 | en:Convert pixel format + MV_CC_PIXEL_CONVERT_PARAM stConvertParam = { 0 }; + + frameNum = pFrameInfo0->nFrameNum; //ch:帧号 | en:frame number + stConvertParam.nWidth = pFrameInfo0->nWidth; //ch:图像宽 | en:image width + stConvertParam.nHeight = pFrameInfo0->nHeight; //ch:图像高 | en:image height + stConvertParam.pSrcData = pData0; //ch:输入数据缓存 | en:input data buffer + stConvertParam.nSrcDataLen = pFrameInfo0->nFrameLen; //ch:输入数据大小 | en:input data size + stConvertParam.enSrcPixelType = pFrameInfo0->enPixelType; //ch:输入像素格式 | en:input pixel format + stConvertParam.enDstPixelType = enDstPixelType; //ch:输出像素格式 | en:output pixel format + stConvertParam.pDstBuffer = pConvertData; //ch:输出数据缓存 | en:output data buffer + stConvertParam.nDstBufferSize = nConvertDataSize; //ch:输出缓存大小 | en:output buffer size + int nRet = MV_CC_ConvertPixelType(handle, &stConvertParam); + + Mat mysrcImage = cv::Mat(pFrameInfo0->nHeight, pFrameInfo0->nWidth, CV_8UC3, stConvertParam.pDstBuffer); + mysrcImage.copyTo(srcImage); + + free(pConvertData); + pConvertData = NULL; + stConvertParam = { 0 }; + } + } + } + if(srcImage.empty()) + { + srcImage = cv::Mat(5, 5, CV_8UC1).setTo(0); + } + if (ifStandard == false) + { + imgIndex++; + if (expourseTimeList.size() > 1 && expourseTimeList[imgIndex % expourseTimeList.size()] != expourseTimeList[(imgIndex - 1) % expourseTimeList.size()]) + SetExposureTime(expourseTimeList[imgIndex % expourseTimeList.size()]); + if (gainList.size() > 1 && gainList[imgIndex % gainList.size()] != gainList[(imgIndex - 1) % gainList.size()]) + SetGain(gainList[imgIndex % gainList.size()]); + } + queuepic.push_back(srcImage.clone()); + m_flag = true; + n_mutex->unlock(); + pData0 = { 0 }; + + double time_End = (double)clock(); + qDebug() << "[INFO] " << __FUNCTION__ << " line:" << __LINE__ << " checkImg getImg,Time:" << (time_End - time_Start) << "ms" + << "--CameraName:" << QString::fromStdString(Username) << " imgIndex:" << imgIndex << "nFrameNum : " << frameNum; +} + +Hd_CameraModule_HIK_hard_GenTL::Hd_CameraModule_HIK_hard_GenTL() +{ + //m_thread = new MyThread; + //m_mutex = new QMutex(); +} +//关闭设备 +void CloseDevice() +{ + MV_CC_StopGrabbing(handle); + MV_CC_CloseDevice(handle); + MV_CC_DestroyHandle(handle); +} +Hd_CameraModule_HIK_hard_GenTL::~Hd_CameraModule_HIK_hard_GenTL() +{ + CloseDevice(); + if(n_mutex) + { + delete n_mutex; + n_mutex = nullptr; + } + + qDebug() << "[INFO] " << " delete success!"; +} +//从类中读数据到实例对象 +bool Hd_CameraModule_HIK_hard_GenTL::readData(std::vector &mat,QByteArray &data) +{ + if (queuepic.isEmpty()) + { + //qCritical() << __FUNCTION__ << " line:" <<__LINE__ << " srcImage is null"; + return false; + } + n_mutex->lock(); + cv::Mat img = cv::Mat(); + queuepic.dequeue().copyTo(img); + mat.push_back(img.clone()); + n_mutex->unlock(); + + qDebug() << "[INFO] " << __FUNCTION__ << " line:" << __LINE__ << " checkImg readData--CameraName:" << QString::fromStdString(Username) << "--imgIndex : " << imgIndex; + return true; +} + +//实例对象把数据写入到类;加载模型后会运行此函数 +bool Hd_CameraModule_HIK_hard_GenTL::writeData(std::vector &mat,QByteArray &data) +{ + Q_UNUSED(mat); + //2024.02.18更新,相机对应的读SN信号时,表示新产品进入,设置初始值 + if (data == "rest_newProductIn") + { + //根据实际项目,设置初始值:曝光、增益,ROI区域等 + { + if (expourseTimeList.size() > 0) + SetExposureTime(expourseTimeList[0]); + if (gainList.size() > 0) + SetGain(gainList[0]); + } + if (queuepic.size() > 0) + { + n_mutex->lock(); + queuepic.clear(); + n_mutex->unlock(); + std::cout << "rest_newProductIn , queuePic.size() > 0 ,signal maybe too fast " << Username << std::endl; + qWarning() << __FUNCTION__ << " line: " << __LINE__ << "rest_newProductIn , queuePic.size() > 0 ,signal maybe too fast " << QString::fromStdString(Username); + } + if (ifRunning == true) + { + ifBreak = true; + Sleep(10); + } + imgIndex = 0; + return true; + } + else + { + m_flag = false; + expourseTimeList.clear(); + gainList.clear(); + } + //Username= data.toStdString(); + return true; +} +//传入initParas函数,格式为:相机key+参数名1#参数值1#参数值2+参数名2#参数值1... +bool Hd_CameraModule_HIK_hard_GenTL::initParas(QByteArray& initData) +{ + QByteArrayList valueList = initData.split('+'); + Username = valueList[0]; + imgIndex = 0; + expourseTimeList.clear(); + gainList.clear(); + if (valueList.size() > 1) + for (int i = 1; i < valueList.size(); i++) + { + QString valuei = byteArrayToUnicode(valueList[i]); + //valuei.prepend(valueList[i]); + if (valuei.contains("expourseTime")) + { + QStringList expourseTimeL = valuei.split('#'); + if (expourseTimeL.size() > 1) + for (int j = 1; j < expourseTimeL.size(); j++) + expourseTimeList.enqueue(expourseTimeL[j].toFloat()); + } + if (valuei.contains("gain")) + { + QStringList gainL = valuei.split('#'); + if (gainL.size() > 1) + for (int j = 1; j < gainL.size(); j++) + gainList.enqueue(gainL[j].toFloat()); + } + + if (valuei.contains("是否为标准通信流程")) + { + if (valuei.contains("true")) + ifStandard = true; + } + if (valuei.contains("取图超时")) + { + QStringList gainL = valuei.split('#'); + if (gainL.size() > 1) + getImageTimeOut = gainL[1].toInt(); + if (getImageTimeOut < 50) + getImageTimeOut = 1000; + } + if (valuei.contains("OffsetX")) + { + QStringList valueL = valuei.split('#'); + if (valueL.size() > 1) + if (valueL[1].toInt() >= 0) + MV_CC_SetIntValue(handle, "OffsetX", valueL[1].toInt()); + } + if (valuei.contains("OffsetY")) + { + QStringList valueL = valuei.split('#'); + if (valueL.size() > 1) + if (valueL[1].toInt() >= 0) + MV_CC_SetIntValue(handle, "OffsetY", valueL[1].toInt()); + } + if (valuei.contains("Width")) + { + QStringList valueL = valuei.split('#'); + if (valueL.size() > 1) + if (valueL[1].toInt() >= 0) + MV_CC_SetIntValue(handle, "Width", valueL[1].toInt()); + } + if (valuei.contains("Height")) + { + QStringList valueL = valuei.split('#'); + if (valueL.size() > 1) + if (valueL[1].toInt() >= 0) + MV_CC_SetIntValue(handle, "Height", valueL[1].toInt()); + } + } + + bool ifOk = connctDevice(); + if (ifOk == true) + { + if (expourseTimeList.size() > 0) + SetExposureTime(expourseTimeList[0]); + if (gainList.size() > 0) + SetGain(gainList[0]); + } + imgIndex = 0; + return ifOk; +} + +bool Hd_CameraModule_HIK_hard_GenTL::run() +{ + qDebug() << "[INFO] " << " run start" << QString::fromStdString(Username); + bool result = false; + ifRunning = true; + ifBreak = false; + try + { + m_flag = false; + int mytime = 0; + while (true) + { + if (moduleStatus == false || mytime++ > getImageTimeOut || ifBreak == true) + { + result = false; + break; + } + n_mutex->lock(); + if (queuepic.size() > 0) + { + n_mutex->unlock(); + result = true; + break; + } + n_mutex->unlock(); + Sleep(1); + } + //考虑到误触发、漏触发的图,在这里进行设置。 + //需要设置曝光时 + if (ifStandard == true) + { + imgIndex++; + if (expourseTimeList.size() > 1 && expourseTimeList[imgIndex % expourseTimeList.size()] != expourseTimeList[(imgIndex - 1) % expourseTimeList.size()]) + SetExposureTime(expourseTimeList[imgIndex % expourseTimeList.size()]); + if (gainList.size() > 1 && gainList[imgIndex % gainList.size()] != gainList[(imgIndex - 1) % gainList.size()]) + SetGain(gainList[imgIndex % gainList.size()]); + } + } + catch (QString ev) + { + qDebug() << "[Error] " << " ev:" << ev ; + } + qDebug() << "[INFO] " << __LINE__ << " run end"; + return result; +} + +//相机连接状态:正常连接或断开 +bool Hd_CameraModule_HIK_hard_GenTL::checkStatus() +{ + //status = moduleStatus; + return moduleStatus; +} + diff --git a/BaseModules/Hd_CameraModule_HIK_hard_GenTL/Hd_CameraModule_HIK_hard_GenTL.h b/BaseModules/Hd_CameraModule_HIK_hard_GenTL/Hd_CameraModule_HIK_hard_GenTL.h new file mode 100644 index 0000000..223066e --- /dev/null +++ b/BaseModules/Hd_CameraModule_HIK_hard_GenTL/Hd_CameraModule_HIK_hard_GenTL.h @@ -0,0 +1,42 @@ +#ifndef Hd_CameraModule_HIK_hard_GenTL_H +#define Hd_CameraModule_HIK_hard_GenTL_H +#include +#include +#include +#include +#include +#include +#include +#include + +#include "base.h" + +using namespace cv; +using namespace std; +#pragma execution_character_set("utf-8") + +class Hd_CameraModule_HIK_hard_GenTL :public Base +{ +public: + Hd_CameraModule_HIK_hard_GenTL(); + virtual ~Hd_CameraModule_HIK_hard_GenTL(); + //从类中读数据到实例对象 + bool readData(std::vector& mat, QByteArray& data); + //实例对象把数据写入到类 + bool writeData(std::vector& mat, QByteArray& data); + bool initParas(QByteArray& initData); + bool run(); + bool checkStatus(); +private: + //MyThread *m_thread = nullptr; + //QMutex* m_mutex; +}; + +extern "C" +{ +Q_DECL_EXPORT Hd_CameraModule_HIK_hard_GenTL * create(); +Q_DECL_EXPORT void destory(Hd_CameraModule_HIK_hard_GenTL * ptr); +} + +#endif // Hd_CameraModule_HIK_hard_H +//Hd_CameraModule_HIK_hard_GenTL diff --git a/BaseModules/Hd_CameraModule_HIK_hard_GenTL/base.h b/BaseModules/Hd_CameraModule_HIK_hard_GenTL/base.h new file mode 100644 index 0000000..90c0752 --- /dev/null +++ b/BaseModules/Hd_CameraModule_HIK_hard_GenTL/base.h @@ -0,0 +1,31 @@ +#ifndef __BASECLASS_H__ +#define __BASECLASS_H__ + +#include +#include +#include +#include +#include +#include + +class Base :public QObject +{ + Q_OBJECT +public: + bool init_flag; //是否初始化,false,true + bool status = true; //相机状态(判断相机是否断开连接) + std::string paras; //传输数据 + std::vector m_mat; //传输图片 + std::string moduleName; //模块名称 +public: + Base(){} + virtual ~Base(){} + virtual bool readData(std::vector&,QByteArray&){return true;} + virtual bool writeData(std::vector&,QByteArray&){return true;} + virtual bool initParas(QByteArray&){return true;} + virtual bool run() {return true;} + virtual bool checkStatus() { return true; } +}; + + +#endif