You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

474 lines
15 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/******************************************************************************
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<emTpDeviceType, QString> 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<emTpCameraStatus, QString> 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<emTpCommType, QString> 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<emTpColorFormat, QString> 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