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

/******************************************************************************
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