/****************************************************************************** Copyright(C):2015~2018 hzleaper FileName:baseStruct.h Author:zhikun wu Email:zk.wu@hzleaper.com Tools:vs2010 pc on company Created:2015/04/09 History:9:4:2015 10:33 *******************************************************************************/ #ifndef __BASE_STRUCT_H #define __BASE_STRUCT_H #include "baseDefine.h" #include "baseConstant.h" #include "iAlgorithm.h" #define BASE_MAX_FILE_PATH 260 #define BASE_MAX_FOLDER_NAME_SIZE 64 #define BASE_MAX_FILE_NAME_SIZE 64 enum emTpFolderNameList { TP_FOLDER_NAME_CONFIG = 0, TP_FOLDER_NAME_PICTURE = 1, TP_FOLDER_NAME_UI = 2, TP_FOLDER_NAME_MAX_NUM = 32, }; typedef struct tagTP_GLOBAL_DATA{ char tgdMainPath[BASE_MAX_FILE_PATH]; char tgdUserPath[BASE_MAX_FILE_PATH]; char tgdDllPath[BASE_MAX_FILE_PATH]; char tgdFolderNames[TP_FOLDER_NAME_MAX_NUM][BASE_MAX_FOLDER_NAME_SIZE]; // char tgdFileNames[TP_FILE_NAME_MAX_NUM][BASE_MAX_FILE_NAME_SIZE]; void* tgdpDllPaths;//pointer to a stringlist }TP_GLOBAL_DATA; inline ZStringA TPConfigFileWholePath(const TP_GLOBAL_DATA* pGlobal, const char* szFile) { ZStringA szFileName(pGlobal->tgdMainPath); szFileName.append(pGlobal->tgdFolderNames[TP_FOLDER_NAME_CONFIG]).append(szFile).append(TP_STR::cszJsonSuffix); return szFileName; } ///////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// enum emTpImageShowType { TP_IMAGE_SHOW_NO = 0, TP_IMAGE_SHOW_EVERY = 1, TP_IMAGE_SHOW_NEW = 2, }; typedef struct tagTP_CORE_SETTING{ int threadsCount; int imageShowType; }TP_CORE_SETTING; enum emTpDeviceType { DEV_CAM_NONE = 0, DEV_CAM_VIRTUAL = 100, DEV_CAM_VIRTUAL_FOLDER = 100, DEV_CAM_BITFLOW = 110, DEV_CAM_BITFLOW_BI = 110, DEV_CAM_GIGE = 120, DEV_CAM_USB = 130, DEV_CAM_HIK = 140, DEV_CAM_VIMBA = 150, DEV_CAM_BAUMER = 160, DEV_CAM_ADLINK = 170, DEV_CAM_DAHUA = 180, DEV_CAM_BASLER = 190, DEV_CAM_PTGRAY = 200, DEV_CAM_EURESYS = 220, DEV_CAM_DALSA = 230, }; static const QMap gCameraNamesMap = { { DEV_CAM_NONE, "Unknown(0)" }, { DEV_CAM_VIRTUAL, "Virtual Camera(100)" }, { DEV_CAM_VIRTUAL_FOLDER, "Virtual Camera(100)" }, { DEV_CAM_BITFLOW, "BitFlow(110)" }, { DEV_CAM_BITFLOW_BI, "BitFlow(110)" }, { DEV_CAM_GIGE, "Gige(120)" }, { DEV_CAM_USB, "USB Camera(130)" }, { DEV_CAM_HIK, "HIK(140)" }, { DEV_CAM_VIMBA, "Vimba(150)" }, { DEV_CAM_BAUMER, "Baumer(160)" }, { DEV_CAM_ADLINK, "AdLink(170)" }, { DEV_CAM_DAHUA, "DaHua(180)" }, { DEV_CAM_BASLER, "Basler(190)" }, { DEV_CAM_PTGRAY, "PtGray(200)" }, { DEV_CAM_EURESYS, "Euresys(220)" }, { DEV_CAM_DALSA, "Dalsa(230)" } }; #define TP_STRING_MAX_SIZE 256 enum emTpCameraStatus{ TP_CAMERA_STATUS_UNINIT = 0, // 未初始化(刚从配置文件加载) TP_CAMERA_STATUS_INITED = 1, // 已初始化(即加载DLL成功) TP_CAMERA_STATUS_OPENED = 2, // 已打开 TP_CAMERA_STATUS_STARTED = 3, // 运行中 TP_CAMERA_STATUS_STOPPED = 4, // 暂停 TP_CAMERA_STATUS_CLOSED = 5, // 已关闭 }; static const QMap gCameraStatusMap = { { TP_CAMERA_STATUS_UNINIT, "Uninitialized" }, { TP_CAMERA_STATUS_INITED, "Initialized" }, { TP_CAMERA_STATUS_OPENED, "Opened" }, { TP_CAMERA_STATUS_STARTED, "Running" }, { TP_CAMERA_STATUS_STOPPED, "Paused" }, { TP_CAMERA_STATUS_CLOSED, "Closed" } }; typedef struct tagTP_CAMERA_OPTION { tagTP_CAMERA_OPTION() :id(0), deviceType(0), save(0), loop(0), width(0), height(0), zoom(0), format(TP_COLOR_NONE), algorithm(0), exposure(0), boardType(0), boardNum(0), gain(0), bIgnoreImage(false), bNeedRgbSwapped(false), bAutoOpen(true), bAutoPush(true), status(TP_CAMERA_STATUS_UNINIT) { } int id; int deviceType; BYTE save; BYTE loop;// BYTE reserve[2]; QString showName; QString uniqueName; int width; int height; int zoom; emTpColorFormat format; QString folder; QString saveImgSuffix; int algorithm; QString relyOnCamera; long exposure; int boardType; int boardNum; long gain; QString dllsuffix; QString sBoardName; QString sBoardConfigFile; // used inner bool bIgnoreImage; QStringList* pSerials; bool bNeedRgbSwapped; QString macAddress; bool bAutoOpen; QString cameraFilePath; bool bAutoPush; // 默认一旦得到图片,就直接push进pool。 // camera status - used for app inside emTpCameraStatus status; bool operator==(const tagTP_CAMERA_OPTION& rhs) { return (id == rhs.id) && (deviceType == rhs.deviceType) && (save == rhs.save) && (loop == rhs.loop) && (showName == rhs.showName) && (uniqueName == rhs.uniqueName) && (zoom == rhs.zoom) && (format == rhs.format) && (folder == rhs.folder) && (saveImgSuffix == rhs.saveImgSuffix) && (algorithm == rhs.algorithm) && (relyOnCamera == rhs.relyOnCamera) && (exposure == rhs.exposure) && (boardType == rhs.boardType) && (boardNum == rhs.boardNum) && (gain == rhs.gain) && (dllsuffix == rhs.dllsuffix) && (sBoardName == rhs.sBoardName) && (sBoardConfigFile == rhs.sBoardConfigFile) && (bAutoPush == rhs.bAutoPush) && (bNeedRgbSwapped == rhs.bNeedRgbSwapped); } }TP_CAMERA_OPTION; enum emTpCommType { TP_COMM_TYPE_NO = 0, TP_COMM_TYPE_SERIAL = 1, TP_COMM_TYPE_USB = 2, TP_COMM_TYPE_TCP_CLIENT = 3, // 主机作为客户端 TP_COMM_TYPE_TCP_SERVER = 4, // 主机作为服务端 TP_COMM_TYPE_TCP_CLIENT_SESSION = 5, // 主机作为服务端,接受的客户端会话 }; static const QMap gCommNamesMap = { { TP_COMM_TYPE_NO, "Unknown" }, { TP_COMM_TYPE_SERIAL, "Serial Port" }, { TP_COMM_TYPE_USB, "USB Port" }, { TP_COMM_TYPE_TCP_CLIENT, "TCP Client" }, { TP_COMM_TYPE_TCP_SERVER, "TCP Server" }, { TP_COMM_TYPE_TCP_CLIENT_SESSION, "TCP Client Session" } }; enum emTpCommStatus{ TP_COMM_STATUS_DISABLE = 0, // 禁用状态 TP_COMM_STATUS_OPENNING = 1, // 打开中或者连接建立中 TP_COMM_STATUS_CONNECTED = 2, // 已打开或者连接已建立 TP_COMM_STATUS_CLOSED = 3, // 已关闭 TP_COMM_STATUS_CLOSING = 4, // 正在关闭 }; typedef struct tagTP_COMM_SETTING_NODE { tagTP_COMM_SETTING_NODE() :type(TP_COMM_TYPE_NO), enable(0), bound(115200), triggerInterval(0), usb_pid(0), usb_vid(0), heartBeatInterval(5000), strHostAddress("127.0.0.1"), hostPort(9040), strListenIp("*"), listenPort(9040), nMaxClients(0), nClientPort(0), status(TP_COMM_STATUS_DISABLE) {} emTpCommType type; int enable; QString strName; //used for serial port int bound; int triggerInterval; int meterDecodeInterval; int usb_pid; int usb_vid; int heartBeatInterval; // used for tcp client QString strHostAddress; int hostPort; // used for tcp server QString strListenIp; int listenPort; int nMaxClients; // used for tcp server client session int nClientPort; // node status - used for app inside emTpCommStatus status; bool operator==(const tagTP_COMM_SETTING_NODE& rhs) { return (type == rhs.type) && (enable == rhs.enable) && (strName == rhs.strName) && (bound == rhs.bound) && (triggerInterval == rhs.triggerInterval) && (meterDecodeInterval == rhs.meterDecodeInterval) && (usb_pid == rhs.usb_pid) && (usb_vid == rhs.usb_vid) && (heartBeatInterval == rhs.heartBeatInterval) && (strHostAddress == rhs.strHostAddress) && (hostPort == rhs.hostPort) && (strListenIp == rhs.strListenIp) && (listenPort == rhs.listenPort) && (nMaxClients == rhs.nMaxClients) && (nClientPort == rhs.nClientPort); } }TP_COMM_SETTING_NODE; enum emTpDeviceTriggerMode { DEV_TRIGGER_MODE_STOP = 0, DEV_TRIGGER_MODE_OUT = 1, DEV_TRIGGER_MODE_AUTO = 2, DEV_TRIGGER_MODE_FIXED_AUTO = 3, DEV_TRIGGER_MODE_SOFT = 4, // DEV_TRIGGER_MODE_MANUAL = 3, }; enum emTpTriggerDirection { TRIGGER_DIRECT_FOREWARD = 0, TRIGGER_DIRECT_BACKWARD = 1, TRIGGER_DIRECT_REPEAT = 2, }; typedef struct tagTP_CAMERAPOOL_OPTION { emTpDeviceTriggerMode triggerMode; emTpTriggerDirection triggerDirection; int frameRate; int fixedFrames; }TP_CAMERAPOOL_OPTION; typedef struct tagTP_CAMERA_WIN { tagTP_CAMERA_WIN() :images(1), buffers(2), bitsPerPixel(32), index(0), bufferW(0), bufferH(0), mirror(0), bCacheOriginImage(false), bNeedRgbSwapped(false) {} QString key;//widget name QString device;//camera key quint8 images; quint8 buffers; quint8 bitsPerPixel; quint8 index; int bufferW; int bufferH; int mirror;//0:no, 1:horizontal, 2:vertical, 3: both bool bCacheOriginImage; bool bNeedRgbSwapped; bool operator==(const tagTP_CAMERA_WIN& rhs) { return (key == rhs.key) && (device == rhs.device) && (images == rhs.images) && (buffers == rhs.buffers) && (bitsPerPixel == rhs.bitsPerPixel) && (index == rhs.index) && (bufferW == rhs.bufferW) && (bufferH == rhs.bufferH) && (mirror == rhs.mirror) && (bCacheOriginImage == rhs.bCacheOriginImage) && (bNeedRgbSwapped == rhs.bNeedRgbSwapped); } }TP_CAMERA_WIN; enum emTpUiDataType { TP_UI_DATA_FROM_CORECTRL = 0, TP_UI_DATA_FROM_ALGORITHM = 0x10000, TP_UI_DATA_FROM_CAMERA = 0x20000, TP_UI_DATA_FROM_COMMUNICATE = 0x30000, }; Q_DECLARE_METATYPE(emTpUiDataType) typedef struct tagTP_IO_OUT_CONTROL { BYTE index; BYTE state;//0 or 1 WORD mSecToSwitch;//0 for no Switch; }TP_IO_OUT_CONTROL; static const QMap gColorNameMap = { { TP_COLOR_NONE, "None" }, { TP_COLOR_Y800, "GRAY8" }, { TP_COLOR_RGB24, "RGB24" }, { TP_COLOR_RGB32, "RGB32" }, { TP_COLOR_Y16, "GRAY16" }, { TP_COLOR_RGB48, "RGB48" }, { TP_COLOR_BGR24, "BGR24" }, { TP_COLOR_BGR32, "BGR32" } }; #define TP_LOG_TAIL " - " << __FUNCTION__ #define TP_DEBUG(msg) qDebug() << msg << TP_LOG_TAIL; #define TP_WARN(msg) qWarning() << msg << TP_LOG_TAIL; #define TP_ERROR(msg) qCritical() << msg << TP_LOG_TAIL; //global functions namespace TP_FUNCS { #define F_INLINE inline F_INLINE QString ImageFileName(DWORD nFrameNumber, const TP_CAMERA_OPTION* pCamOpt, const char* szSuffix) { QStringList invaldcha = (QStringList() << "\\" << "/" << "*" << "?" << "<" << ">" << "|" << ":"); QDateTime dt = QDateTime::currentDateTime(); QString strCamName = pCamOpt->uniqueName; foreach(const QString &str, invaldcha) { strCamName.remove(str); } QString strName = pCamOpt->folder + strCamName + "_" + dt.toString("yyyy_MM_dd_hh_mm_ss_zzz") + "_" + QString::number(nFrameNumber) + szSuffix/*".BMP"*/; return strName; } F_INLINE QString ImageFileName(DWORD nFrameNumber, const TP_CAMERA_OPTION* pCamOpt) { QStringList invaldcha = (QStringList() << "\\" << "/" << "*" << "?" << "<" << ">" << "|" << ":"); QDateTime dt = QDateTime::currentDateTime(); QString strCamName = pCamOpt->uniqueName; //foreach(const QString &str, invaldcha) { // strCamName.remove(str); //} strCamName.remove(":"); QString strName = pCamOpt->folder + strCamName + "_" + dt.toString("yyyy_MM_dd_hh_mm_ss_zzz") + "_" + QString::number(nFrameNumber) + pCamOpt->saveImgSuffix; return strName; } F_INLINE emTpColorFormat FromQImageFormat(const QImage &image) { if (QImage::Format_RGB32 == image.format()) { return TP_COLOR_RGB32; } else if (QImage::Format_RGB888 == image.format()) { return TP_COLOR_RGB24; } else if (QImage::Format_Indexed8 == image.format()) { return TP_COLOR_Y800; } else if (QImage::Format_RGB16 == image.format()) { return TP_COLOR_Y16; } else if (QImage::Format_ARGB32 == image.format()) { return TP_COLOR_RGB48; } else { return TP_COLOR_NONE; } } F_INLINE QImage::Format ToQImageFormat(emTpColorFormat colorFormat) { if (TP_COLOR_RGB32 == colorFormat) { return QImage::Format_RGB32; } else if (TP_COLOR_RGB24 == colorFormat) { return QImage::Format_RGB888; } else if (TP_COLOR_Y800 == colorFormat) { return QImage::Format_Indexed8; } else if (TP_COLOR_Y16 == colorFormat) { return QImage::Format_RGB16; } else if (TP_COLOR_RGB48 == colorFormat) { return QImage::Format_ARGB32; } else { return QImage::Format_Invalid; } } F_INLINE int BitsPerPixels(emTpColorFormat colorFormat) { if (TP_COLOR_RGB32 == colorFormat) { return 32; } else if (TP_COLOR_RGB24 == colorFormat) { return 24; } else if (TP_COLOR_Y800 == colorFormat) { return 8; } else if (TP_COLOR_Y16 == colorFormat) { return 16; } else { return 0; } } F_INLINE bool isValidImgSuffix(const QString& str) { static QRegExp rx("(\\w*|\\w*\\*)\\.(?:bmp|jpeg|jpg|png)", Qt::CaseInsensitive); return rx.exactMatch(str); } // IPV4 only F_INLINE bool isValidIPAddress(const QString& str) { // [0,255].[0,255].[0,255].[0,255] static QRegExp rx("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?).){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"); return rx.exactMatch(str); } } #endif