236 lines
9.6 KiB
C++
236 lines
9.6 KiB
C++
/**
|
||
*该类用于与Xilinx FPGA芯片(K7) XDMA框架进行交互
|
||
*
|
||
*/
|
||
|
||
#ifndef DATAINJECT_H
|
||
#define DATAINJECT_H
|
||
#include "../Common/IO/GIOParams.h"
|
||
#include "../Common/IO/FileStream/Raw/FileStream.h"
|
||
//#include "../Common/OpenGLView.h"
|
||
#include "../Common/qlog.h"
|
||
#include "../Common/IO/DeviceStream/GdPCIE/PcieFun.h"
|
||
#include <QLineEdit>
|
||
#include <QFuture>
|
||
#include <QThreadPool>
|
||
#include <QtConcurrent/QtConcurrent>
|
||
#include <QLabel>
|
||
#include <QSlider>
|
||
#include <atomic>
|
||
class GLWidget;
|
||
class MainWindow;
|
||
|
||
|
||
|
||
class DataInject: public QObject
|
||
{
|
||
Q_OBJECT
|
||
public:
|
||
explicit DataInject(QObject* parent = 0);
|
||
|
||
virtual ~DataInject();
|
||
|
||
/***********************************************图像注入接口****************************************************/
|
||
/**
|
||
* @brief 【接口1】StartInject 开始进行数据注入
|
||
* @param injectParam [in]参数设置(包括采集卡光纤端口号 图像分辨率、帧率、参数行数、图像类型)
|
||
* @param openglview [in]显示控件(可为nullptr)
|
||
* @param uiFileProgressLabel [in] 文件播放进度显示label控件(可为nullptr)
|
||
* @return [out] 是否成功开始注入
|
||
*/
|
||
bool StartInject(GFrameFormat* injectParam, void* openglview = nullptr, void* uiFileProgressLabel = nullptr);
|
||
|
||
|
||
/**
|
||
* @brief 【接口2】 停止注入
|
||
* @param channelIndex 采集卡光纤端口号
|
||
*/
|
||
void StopInject(int channelIndex);
|
||
|
||
|
||
/** --------------------该接口为非必要接口------------------------
|
||
* @brief 【接口3】更新模拟热像仪参数,可实时更新或多次更新(只有在需要模拟热像仪参数注入时才调用,属于非必要接口)
|
||
* @param 采集卡光纤端口号
|
||
* @param isInjectParamSimulate [in]是否注入该模拟参数
|
||
* @param param [in]模拟热像仪参数
|
||
*/
|
||
void UpdateParamSimulate(int channelindex, bool isInjectParamSimulate, THERMAL_IMG_PARAMS param);
|
||
|
||
|
||
/***********************************************控制命令注入接口**************************************************/
|
||
/**
|
||
* @brief 【接口4】 控制命令下发注入---与接口1/2/3独立
|
||
* @param iChannelIndex [in] 光纤通道号: 0 ~ 7
|
||
* @param cmdData [in] 控制命令
|
||
* @return
|
||
*/
|
||
void WriteControlCmd(int iChannelIndex, QByteArray cmdData);
|
||
|
||
|
||
|
||
/** --------------------该接口为非必要接口------------------------
|
||
* @brief 获取延时信息 返回结构体
|
||
*/
|
||
InjectDelayStatusInfo* GetDelayStatus(int channelIndex);
|
||
|
||
|
||
/** --------------------该接口为非必要接口------------------------
|
||
* @brief 是否正在注入
|
||
* @return
|
||
*/
|
||
bool IsStartInject(int channelIndex) {return m_bIsStartInjectMap.value(channelIndex);}
|
||
|
||
/** --------------------该接口为非必要接口------------------------
|
||
* @brief 将外部的全屏控件的指针传进来
|
||
* @param channelIndex
|
||
* @param fullScreenOpenglview
|
||
*/
|
||
void SetFullScreenWgt(int channelIndex, void* fullScreenOpenglview = nullptr);
|
||
|
||
/** --------------------该接口为非必要接口------------------------
|
||
* @brief 设置是否保存程序运行期间的日志信息
|
||
* @param isSaved
|
||
*/
|
||
void SetSaveLog(bool isSaved) {m_bIsSaveLog = isSaved; }
|
||
|
||
/** --------------------该接口为非必要接口------------------------
|
||
* @brief SetOsdHidden
|
||
* @param isHidden
|
||
*/
|
||
void SetOsdHidden(bool isHidden) {m_bIsHiddenOsd = isHidden ; }
|
||
|
||
|
||
private:
|
||
static void OnProgress(int nFrameIndex, int nFrameCount, void* pOwner, int iChannelIndex);
|
||
void SetProgress(int nFrameIndex, int nFrameCount, int iChannelIndex);
|
||
void CalcuImgFps(int channelIndex); //计算图像帧率
|
||
|
||
//参数初始化 点击"选择文件"按键
|
||
bool Init(GFrameFormat* injectParam, void* openglview = nullptr, void* uiFileProgressLabel = nullptr);
|
||
|
||
bool BrowseRawFile(QString& filePathEdit);
|
||
int GetByteOfPixel(ePixelType ePT);
|
||
QString CurrentTime();
|
||
inline void SleepAccurate(int milliseconds);
|
||
|
||
//开启文件数据读取线程
|
||
bool StartThread_DealRawFileData();
|
||
void StopThread_DealRawFileData();
|
||
//开启注入线程
|
||
bool StartThread_InjectData();
|
||
void StopThread_InjectData();
|
||
|
||
//开启图像处理和显示进程
|
||
bool StartThread_ImgProcessData();
|
||
void StopThread_ImgProcessData();
|
||
//实体
|
||
void ThreadFun_FetchRawFileData(int distribute);
|
||
// void ThreadFun_FetchRawFileData02();
|
||
void ThreadFun_InjectData();
|
||
void ThreadFun_ImgProcessData01();
|
||
void ThreadFun_ImgProcessData02();
|
||
void ThreadFun_WriteCmdControlData(); //命令控制注入
|
||
|
||
|
||
|
||
|
||
private:
|
||
typedef void (DataInject::*ThreadRunFunPtr)();
|
||
static void ThreadEntry(ThreadRunFunPtr pRunFun, void* pOwner);
|
||
QString ShowHex(char* str, int length); //Hex to String
|
||
|
||
typedef void (DataInject::*InjectThreadRunFunPtr)(int channelIndex);
|
||
static void InjectThreadEntry(InjectThreadRunFunPtr pRunFun, void* pOwner, int channelIndex);
|
||
|
||
|
||
//文件处理线程
|
||
bool m_bDealRawThreadRunning;
|
||
std::thread* m_ptrThread_DealRaw01;
|
||
std::thread* m_ptrThread_DealRaw02;
|
||
|
||
//注入线程
|
||
bool m_bInjectThreadRunning;
|
||
std::thread* m_ptrThread_InjectData;
|
||
|
||
//图像处理显示线程
|
||
bool m_bImgProcessThreadRunning;
|
||
std::thread* m_ptrThread_ImgProcess01;
|
||
std::thread* m_ptrThread_ImgProcess02;
|
||
|
||
|
||
//命令注入线程
|
||
bool m_bWriteCmdThreadRunning;
|
||
std::thread* m_ptrThread_WriteCmd;
|
||
|
||
// QObject* m_pParentWgt;
|
||
QVector<QVector<QRgb> > m_varColorTable;
|
||
QTimer m_varTimer;
|
||
//注入延时状态数组
|
||
InjectDelayStatusInfo m_szInjectStatus[ChannelCacheNum];
|
||
|
||
//***********
|
||
QMap<int, GLWidget*>m_pOpenGlMap; //opengl显示控件集合
|
||
QMap<int, QLabel*>m_pLabelMap; //注入状态label对应的Map
|
||
QMap<int, GCycleQueue*> m_pGCycleQueueMap; //循环队列
|
||
QMap<int, QLog*> m_pDataInjectLogMap; //数据注入日志Map
|
||
QMap<int, QLog*> m_pCmdInjectLogMap; //命令注入日志Map
|
||
QMap<int, GFrameFormat> m_frameFormatMap;
|
||
QMap<int, bool> m_bIsStartInjectMap; //是否开始注入状态
|
||
QMap<int, int> m_uiHostWriteBuffNoMap; //上位机在上一个循环中最后写到的BuffNo索引值 取值: 0~(ChannelCacheNum-1)
|
||
QMap<int, GLWidget*>m_pFullScreenOpenGlMap; //全屏对应的OpenGL
|
||
QMap<int, int > m_iFileStreamCurrIndexMap; //key: ChannelIndex value: 录像文件当前帧编号
|
||
QMap<int, int > m_iFileStreamTotalCountMap; //key: ChannelIndex value: 录像文件总帧数
|
||
QMap<int, bool > m_bIsInjectParamSimulateMap; //key: ChannelIndex value: 是否模拟参数行注入
|
||
QMap<int, THERMAL_IMG_PARAMS> m_varThermalImgParamsMap; //key: ChannelIndex value: 模拟热像仪参数行
|
||
QMap<int, DynamicArray*> m_varInjectCMDMap; // /key: ChannelIndex value:动态数组 命令注入
|
||
//********************
|
||
//对于每帧图像的大小有3种不同的表达:
|
||
//01.iVideoFileFrameSize ---- 即将注入的视频文件(RAW)的每帧图像的大小 iVideoFileFrameSize = 图像宽 x (图像高 + 参数行数)
|
||
//02.iInjectFrameTotalSize ------实际注入的每帧图像的总大小 iInjectFrameTotalSize = iVideoFileFrameSize + 界面模拟注入参数(图像宽 * 1 * 图像格式字节数)
|
||
//03.iFPGABufferCacheSize(采集卡DDR每帧Buff的缓存首地址) ---- FPGA读DDR的Buff缓存的首地址需以2048字节对齐---->由iInjectFrameTotalSize向上对齐
|
||
//********************
|
||
QMap<int, uint> m_iVideoFileFrameSizeMap; //key: ChannelIndex value:录像视频文件 每帧图像图像Byte大小
|
||
QMap<int, uint> m_iInjectFrameTotalSizeMap; //key: ChannelIndex value: 每帧注入图像的总大小(包括文件参数行 + 模拟参数行)
|
||
QMap<int, uint> m_iDDRBufferCacheSizeMap; //key: ChannelIndex value:FPGA 缓存区Buff大小
|
||
|
||
QMap<int, GCycleQueue*> m_pInjectDataQueueMap; //key: ChannelIndex value: 注入数据(文件)缓存队列
|
||
QMap<int, GCycleQueue*> m_varImgDisplayDataQueueMap; //key: ChannelIndex value: 图像显示(文件)缓存队列
|
||
QMap<int, FileStream*> m_pFileStreamMap; //key: ChannelIndex value: 文件读取对象
|
||
|
||
//帧率计算
|
||
QMap<int, uint> m_uiCurrFrameRateCountMap; //key: 通道号 value:当前帧数
|
||
QMap<int, int64_t> m_iFrameTimeStartMap; //key: 通道号 value:开始统计的时间戳
|
||
QMap<int, uint> m_uiCalcuFramesMap; //key: 通道号 value: 多少帧数计算一次 100
|
||
QMap<int, double> m_dInjectFrameRateMap; //key: 通道号 value:采集帧率
|
||
|
||
QMap<int, uint> m_uiInjectFrameNoGenerateMap; //key: 通道号 value:注入图像的帧编号(为验证长时间同时注入和采集的稳定性(是否丢帧),注入帧编号由上位机构造,从0开始)
|
||
|
||
byte* m_szY8ImgData_Thread01;
|
||
byte* m_szRGBAImgData_Thread01;
|
||
|
||
byte* m_szY8ImgData_Thread02;
|
||
byte* m_szRGBAImgData_Thread02;
|
||
|
||
uint m_iInjectEnableStatus; //注入使能状态
|
||
// uint uiThreadSleepTime; //线程休眠时间
|
||
bool m_bIsSaveLog; // 是否保存日志
|
||
bool m_bIsOpenInjectThread; //是否打开注入线程
|
||
|
||
MainWindow* m_pParent;
|
||
QLog* m_pLog; //所有通道共用同一Log
|
||
bool m_bIsHiddenOsd;
|
||
|
||
QLog* m_pReadFileLog; //所有通道共用同一Log
|
||
|
||
uint m_uiAXIFrequence = 0;
|
||
QMap<void*, uint> m_uiCpuCoreIndexUsedMap;
|
||
|
||
|
||
|
||
|
||
|
||
|
||
};
|
||
|
||
#endif // DATAINJECT_H
|