#include "stdafx.h"
#include "GlobalMember.h"

// 工作模式
bool g_bWorkMode = false; // true:回放, false实时
BOOL g_bMulticastSocketConnect = FALSE;
BOOL g_bReplayPlay = FALSE; // true: 回放中处于播放态, false: 回放中处于暂停态
int g_ChartTabNum = 1; // 图表分析窗口中tab页的编号,1为第一页,以此类推
BOOL g_bShowEvaluation = FALSE; // 载荷评价对话框是否展开
BOOL g_bVideoCapture = FALSE; //视频录制

HWND g_mainDlgHwnd = nullptr;  
HWND g_ReplayDlgHwnd = nullptr; 
HWND g_MapGuideHwnd = nullptr; 
HWND g_QBTargetHwnd = nullptr;
HWND g_PhotoCtrlDlgHwnd = nullptr;
HWND g_QBFunctionsHwnd = nullptr;
HWND g_QBTargetTrackFunctionsHwnd = nullptr;
HWND g_SendControlCommandDlgHwnd = nullptr;
HWND g_JoyStickControlDlgHwnd = nullptr;
HWND g_CH96CtrlDlgHwnd = nullptr;
HWND g_MulticastSocketReceiveDlgHwnd = nullptr;
HWND g_mapMatchDlg = nullptr;
HWND g_IMPDLGhwnd;//IMP窗口句柄

// 视频解码器 及 图像存储空间
H264Decode g_EO_Decoder;
H264Decode g_IR_Decoder;
unsigned char g_CH96_ImgBuffer[1920 * 1088 * 3];
unsigned char g_IR_ImgBuffer[720 * 576 * 3];
BOOL g_bEOImgUpdate = FALSE; // 界面EO图像是否更新,TRUE:更新  FALSE:未更新
BOOL g_bIRImgUpdate = FALSE; // 界面IR图像是否更新,TRUE:更新  FALSE:未更新
// 解码器对象
DecoderInterface *g_CH96_h264decoder = nullptr;
//数据转发
CTCPSocket			g_TCPTrans2Server;
BYTE g_tcpData[276];
bool g_tcpStarted=false;
CUDPSocket			g_UDPTrans2Server;
bool g_udpStarted = false;
unsigned int g_frameCountTX=0;
// 当计算机性能较差时,采用硬解码,同时不使用图像库
cv::Mat g_ImgforLowComputer = cv::Mat(1080, 1920, CV_8UC3, cv::Scalar(0, 0, 0));
// 表征计算机性能的BOOL变量
BOOL g_bGoodComputer = FALSE;

// 复接数据
struProtocal_FJ g_ImgFJData;
struProtocal_FJ g_SocketFJData; // 组播复接数据
struProtocal_FJ g_PhotoFJData;
struTranslateProtocal_FJ g_ImgTransFJData;  // 转换后
struTranslateProtocal_FJ g_PhotoTransFJData; // 转换后

struSocketProtocal g_LocationSocketData; // 位置信息组播数据


Protocal96TXD g_CH96FJData; // CH96原始复接数据
Data96TXD g_CH96TransFJData; // CH96显示用复接数据
struQB_FJ g_CH96QBData; // CH96目标定位用情报数据

struQB_FJ g_IRFJData;

QBStru g_QB;

// 跟踪偏移量
CPoint g_TrackOffset(0, 0); 
BOOL g_bTracking = FALSE;

// 摇杆控制量——伺服移动速度
extern int g_ServoSpeedUpDown = 0; // [-512, 512]
extern int g_ServoSpeedLeftRight = 0; // [-512, 512]

//主界面指令盘点击偏移量
CPoint g_CtrlAzimuth(0, 0); //方位角
CPoint g_CtrlPitch(0, 0); //俯仰角

//主窗口控制指令实时显示变量
CString g_sCtrlInstruction;


// 存储全部UDP接收数据文件
FILE* g_pFileSaveCH96txData = nullptr;		// 全部UDP接收数据
FILE* g_pFileSaveVideoDataCH96 = nullptr;			// 可见光 264编码部分
FILE* g_pFileSaveVideoForKCF = nullptr;			// KCF视频264部分
FILE* g_pFileSaveVideoH264Data = nullptr;  // 光电吊舱 264编码部分

// 数据处理互斥句柄
HANDLE g_hMutex_ProcessData = NULL;
HANDLE g_hMutex_ProcessDataSocket = NULL;
HANDLE g_hMutex_SaveFJData = NULL;
HANDLE g_hMutex_ShowFJData = NULL;
HANDLE g_hMutex_ProcessDataCH96 = NULL;
HANDLE g_hMutex_ProcessDataH264 = NULL;

// 图像显示处理互斥句柄
HANDLE g_hMutex_DisplayVideoCH96 = NULL;
HANDLE g_hMutex_DisplayIRVideo = NULL;
HANDLE g_hMutex_DisplayDCPhoto = NULL;
// 组播组包/发送互斥句柄
HANDLE g_hMutex_SocketSendLocation = NULL;
HANDLE g_hMutex_SocketSendIR = NULL;
HANDLE g_hMutex_SocketSendEO = NULL;

// UDP 收数(来自服务器)
BYTE g_receiveDataBuffer[g_MaxBufferLen];
BYTE g_receiveDataBuffer_middle[g_MaxBufferLen];
int g_validDataLen = 0;
// 接收到的有效数据:用于进行组播组包
BYTE g_receiveDataBufferSocket[g_MaxBufferLenSocket];
BYTE g_receiveDataBuffer_middleSocket[g_MaxBufferLenSocket];
int g_validDataLenSocket = 0;

// 解码图像存储队列
std::deque<cv::Mat> g_CH96VideoDeque;

// 目标定位用复接数据存储队列
std::deque<struQB_FJ> g_TgtLocStructDeque;  // 目标定位 复接数据 队列 容量 

//主界面数引功能全局控制变量
float g_Guide_Azimuth = 0; //方位角
float g_Guide_Pitch = -90;      //俯仰角
bool g_bGuide_Button = false; //主界面数引键默认抬起

// ProcessData线程开关变量
bool g_bProcessDataFlag = false;
bool g_bProcessDataSocketFlag = false;

// 手动搜索控制指令盘变量
double g_MS_Ratio = 0; // 比率
double g_MS_Angle = 0; // 角度

// 精确飞机位置姿态
double g_UAVLon = 0;
double g_UAVLat = 0;
double g_UAVAlt = 0;
double g_UAVRoll = 0;
double g_UAVYaw = 0;
double g_UAVPitch = 0;

//定义UDP据发送对象
CUDPSocket g_UdpSend2Payload;  
CUDPSocket g_UdpSendTgtInfo;
CUDPSocket g_UdpSend2Mobile;
bool g_bCreatUDP;
bool g_bCreatTgtInfoUDP;
bool g_bCreatSend2Mobile;
BYTE g_payloadCtrlInstruction[32]; // 发送指令
int g_payloadCtrlProtocol = 0;     // 载荷控制开关指令
BYTE g_payloadCtrlInstructionFromVK[8]; // 收到来自视频键盘的控制指令
BOOL g_bCtrlFromSoftware = FALSE; // 判断指令是否来自视频键盘或者软件软键盘 TURE:视频键盘 FALSE:视频键盘

bool g_CtrlFocusThroughMouseWheel = false;  // 是否通过滚轮控制载荷焦距

BOOL g_bShowEOInBigArea = TRUE;  // 变换显示,在大区域显示可见光或红外

// 定义收取目标定位信息结构体
MostSimpleTgtInfo tgtRecvInfo;

// 载荷软件存储文件
CString g_DataSavePath = "";

// 地图导引模块中高程设置变量
float g_DEMSetting = 0.0;

// 设置跟踪阈值全局变量
int g_ThresholdSetting = 6; // 范围[0,10],默认6

BOOL g_bMapDirectGuide = FALSE;  // 是否是地图直接导引标志

// 数码照片名称
CString g_str_DCname = "";
CString g_DCPath = "";
cv::Mat g_DCImg;

// 目标定位
HANDLE g_hMutex_TgtLoc = NULL;// 目标定位互斥句柄
double g_LLA[3] = {0, 0, 0};// 定位结果
double g_VD[2] = {0, 0}; // 动目标定位速度方向
double g_TgtLocReliability = 0.0; // 定位结果可信度
BOOL g_bMoveTarget = FALSE; // TRUE:动目标定位   FALSE:静目标定位
BOOL g_bWithLaser = TRUE; //  
BOOL g_bStartTargetLoc = FALSE;
BOOL g_bReStartTargetLoc = FALSE; // TRUE: 重新开始目标定位 FALSE: 不重新开始目标定位
CString g_strTargetLocResult_Lon = ""; // 目标定位经度
CString g_strTargetLocResult_Lat = ""; // 目标定位纬度

// 语言变量,获取语言内容时先用char格式获取,再将char转为CString

// [TITLE]
char g_char_TitleReplay[30];							// 视频回放标题
CString g_str_TitleReplay = "";

// [WARNING]
char g_char_WarningTitle[100];						// 信息提示
CString g_str_WarningTitle = "";
char g_char_WarningStorage[100];				// 磁盘空间
CString g_str_WarningStorage= "";
char g_char_WarningUDPReceive[100];		// UDP收数提示(测控、情报)
CString g_str_WarningUDPReceive = "";
char g_char_WarningSerialReceive[100];		// 串口收数提示
CString g_str_WarningSerialReceive = "";
char g_char_WarningPayloadControl[100];		// 载荷控制连接提示
CString g_str_WarningPayloadControl = "";
char g_char_WarningLRFCode[100];				// 激光编码密码登陆提示
CString g_str_WarningLRFCode = "";
char g_char_WarningLRFNumber[100];			// 激光编码周期范围提示
CString g_str_WarningLRFNumber = "";
char g_char_WarningInputNumber[100];		// 输入数字提示(数引)
CString g_str_WarningInputNumber = "";
char g_char_WarningMapAltSet[100];			// 地图高程设定提示
CString g_str_WarningMapAltSet = "";
// [STATIC]
char g_char_CommandSend[30];					// 发送指令
CString g_str_CommandSend;
char g_char_CommandResponse[30];			// 回报指令
CString g_str_CommandResponse;
char g_char_State[30];									// 载荷状态
CString g_str_State;
char g_char_FilePath[30];								// 文件路径
CString g_str_FilePath;
char g_char_EOCommand[30];						// 可见光相机指令
CString g_str_EOCommand = "";
char g_char_IRCommand[30];						// 红外相机指令
CString g_str_IRCommand = "";
char g_char_Drift[30];									// 陀螺修正
CString g_str_Drift = "";
char g_char_AVTGate[30];							// 波门位移
CString g_str_AVTGate = "";
char g_char_LogIn[30];									// 密码登陆
CString g_str_LogIn = "";
char g_char_LaserNum[30];							// 编码序号:
CString g_str_LaserNum = "";
char g_char_LaserPeriod[30];						// 编码周期:
CString g_str_LaserPeriod = "";

// [COMMAND]——按照协议顺序编写
char g_char_TargetLonSet[30];						// 目标经度装订
CString g_str_TargetLonSet = "";
char g_char_TargetLatSet[30];						// 目标纬度导引
CString g_str_TargetLatSet = "";
char g_char_TargetAltSet[30];						// 目标高度导引
CString g_str_TargetAltSet = "";
char g_char_GeographyTracking[30];				// 地理坐标跟踪
CString g_str_GeographyTracking = "";
char g_char_ManualSlew[30];						// 手动搜索
CString g_str_ManualSlew = "";
char g_char_VerticalView[30];						// 锁定
CString g_str_VerticalView = "";
char g_char_AutoScan[30];							// 扫描
CString g_str_AutoScan = "";
char g_char_AngleLock[30];							// 数引
CString g_str_AngleLock = "";
char g_char_TurretReset[30];						// 平台复位
CString g_str_TurretReset = "";
char g_char_DriftRight[30];							// 陀螺右修
CString g_str_DriftRight = "";
char g_char_DriftLeft[30];							// 陀螺左修
CString g_str_DriftLeft = "";
char g_char_DriftUp[30];								// 陀螺上修
CString g_str_DriftUp = "";
char g_char_DriftDown[30];							// 陀螺下修
CString g_str_DriftDown = "";
char g_char_TurretStow[30];							// 载荷升
CString g_str_TurretStow = "";
char g_char_TurretFWD[30];						// 载荷降
CString g_str_TurretFWD = "";
char g_char_EOAutoTracking[30];					// EO自动跟踪
CString g_str_EOAutoTracking = "";
char g_char_IRAutoTracking[30];					// IR自动跟踪
CString g_str_IRAutoTracking = "";
char g_char_CorrelationTracking[30];				// 相关跟踪
CString g_str_CorrelationTracking = "";
char g_char_CentroidBlackTracking[30];		// 重心黑
CString g_str_CentroidBlackTracking = "";
char g_char_CentroidWhiteTracking[30];		// 重心白
CString g_str_CentroidWhiteTracking = "";
char g_char_OSDONOFF[30];						// 字符叠加/消隐
CString g_str_OSDONOFF = "";
char g_char_OffsetTracking[30];					// 偏心跟踪
CString g_str_OffsetTracking = "";
char g_char_StaticTargetTracking[30];			// 静态目标跟踪
CString g_str_StaticTargetTracking = "";
char g_char_MoveTargetTracking[30];			// 动态目标跟踪
CString g_str_MoveTargetTracking = "";
char g_char_ViewTracking[30];						// 场景跟踪
CString g_str_ViewTracking = "";
char g_char_AVTGateSizeBig[30];				// 大波门
CString g_str_AVTGateSizeBig = "";
char g_char_AVTGateSizeSmall[30];				// 小波门
CString g_str_AVTGateSizeSmall = "";
char g_char_AVTGateSizeMiddle[30];			// 中波门
CString g_str_AVTGateSizeMiddle = "";
char g_char_AVTGateSizeAuto[30];				// 自适应波门
CString g_str_AVTGateSizeAuto = "";
char g_char_ImgEnhanceON[30];					// 图像增强开
CString g_str_ImgEnhanceON = "";
char g_char_ImgEnhanceOFF[30];				// 图像增强关
CString g_str_ImgEnhanceOFF = "";
char g_char_AVTGateRight[30];					// 波门右移
CString g_str_AVTGateRight = "";
char g_char_AVTGateLeft[30];						// 波门左移
CString g_str_AVTGateLeft = "";
char g_char_AVTGateUp[30];						// 波门上移
CString g_str_AVTGateUp = "";
char g_char_AVTGateDown[30];					// 波门下移
CString g_str_AVTGateDown = "";
char g_char_LRFPowerON[30];					// 激光电源开
CString g_str_LRFPowerON = "";
char g_char_LRFPowerOFF[30];					// 激光电源关
CString g_str_LRFPowerOFF = "";
char g_char_LRFArmed[30];							// 激光测距开
CString g_str_LRFArmed = "";
char g_char_LRFSafe[30];							// 激光测距关
CString g_str_LRFSafe = "";
char g_char_LDArmed[30];							// 激光照射开
CString g_str_LDArmed = "";
char g_char_LDSafe[30];								// 激光照射关
CString g_str_LDSafe = "";
char g_char_LaserNo1[30];							// 激光编码1
CString g_str_LaserNo1 = "";
char g_char_LaserNo2[30];							// 激光编码2
CString g_str_LaserNo2 = "";
char g_char_LaserNo3[30];							// 激光编码3
CString g_str_LaserNo3 = "";
char g_char_LaserNo4[30];							// 激光编码4
CString g_str_LaserNo4 = "";
char g_char_LaserNo5[30];							// 激光编码5
CString g_str_LaserNo5 = "";
char g_char_LaserNo6[30];							// 激光编码6
CString g_str_LaserNo6 = "";
char g_char_LaserNo7[30];							// 激光编码7
CString g_str_LaserNo7 = "";
char g_char_LaserNo8[30];							// 激光编码8
CString g_str_LaserNo8 = "";
char g_char_LaserNo9[30];							// 激光编码9
CString g_str_LaserNo9 = "";
char g_char_LaserNo10[30];							// 激光编码10
CString g_str_LaserNo10 = "";
char g_char_LaserLoad[30];							// 激光编码加载
CString g_str_LaserLoad = "";
char g_char_ICRON[30];								// 低照度增强开
CString g_str_ICRON = "";
char g_char_ICROFF[30];								// 低照度增强关
CString g_str_ICROFF = "";
char g_char_DefogON[30];							// 透雾开
CString g_str_DefogON = "";
char g_char_DefogOFF[30];							// 透雾关
CString g_str_DefogOFF = "";
char g_char_EOFocusPlus[30];						// EO远焦
CString g_str_EOFocusPlus = "";
char g_char_EOFocusMinus[30];					// EO近焦
CString g_str_EOFocusMinus = "";
char g_char_EOZoomOut[30];						// EO视场大
CString g_str_EOZoomOut = "";
char g_char_EOZoomIn[30];							// EO视场小
CString g_str_EOZoomIn = "";
char g_char_EOLightManual[30];					// EO手动调光
CString g_str_EOLightManual = "";
char g_char_EOLightAuto[30];						// EO自动调光
CString g_str_EOLightAuto = "";
char g_char_EOLightPlus[30];						// EO亮度+
CString g_str_EOLightPlus = "";
char g_char_EOLightMinus[30];					// EO亮度-
CString g_str_EOLightMinus = "";
char g_char_EOPowerON[30];						// EO电源开
CString g_str_EOPowerON = "";
char g_char_EOPowerOFF[30];					// EO电源关
CString g_str_EOPowerOFF = "";
char g_char_EOWDRON[30];						// EO宽动态开
CString g_str_EOWDRON = "";
char g_char_EOWDROFF[30];						// EO宽动态关
CString g_str_EOWDROFF = "";
char g_char_EOFocusAuto[30];						// EO自动调焦
CString g_str_EOFocusAuto = "";
char g_char_EOFocusRealTime[30];				// EO实时调焦
CString g_str_EOFocusRealTime = "";

char g_char_IRFocusPlus[30];						// IR远焦
CString g_str_IRFocusPlus = "";
char g_char_IRFocusMinus[30];					// IR近焦
CString g_str_IRFocusMinus = "";
char g_char_IRFocusAuto[30];						// IR自动调焦
CString g_str_IRFocusAuto = "";
char g_char_IRFocusRealTime[30];				// IR实时调焦
CString g_str_IRFocusRealTime = "";
char g_char_IRZoomOut[30];						// IR视场大
CString g_str_IRZoomOut = "";
char g_char_IRZoomIn[30];							// IR视场小
CString g_str_IRZoomIn = "";
char g_char_BHWH[30];								// IR黑白热
CString g_str_BHWH = "";
char g_char_IRCalibration[30];						// IR校正
CString g_str_IRCalibration = "";
char g_char_IRLightManual[30];					// IR手动调光
CString g_str_IRLightManual = "";
char g_char_IRLightAuto[30];						// IR自动调光
CString g_str_IRLightAuto = "";
char g_char_IRLightPlus[30];						// IR亮度+
CString g_str_IRLightPlus = "";
char g_char_IRLightMinus[30];						// IR亮度-
CString g_str_IRLightMinus = "";
char g_char_IRContrastPlus[30];					// IR对比度+
CString g_str_IRContrastPlus = "";
char g_char_IRContrastMinus[30];				// IR对比度-
CString g_str_IRContrastMinus = "";
char g_char_DDEON[30];							// IR边缘锐化开
CString g_str_DDEON = "";
char g_char_DDEOFF[30];							// IR边缘锐化关
CString g_str_DDEOFF = "";
char g_char_IRPowerON[30];						// IR电源开
CString g_str_IRPowerON = "";
char g_char_IRPowerOFF[30];						// IR电源关
CString g_str_IRPowerOFF = "";
char g_char_ImgTypeSet[30];						// 设置图像类型
CString g_str_ImgTypeSet = "";
char g_char_ImgFlowSet[30];						// 设置图像码流
CString g_str_ImgFlowSet = "";

char g_char_DCWBManual[30];					// DC手动白平衡
CString g_str_DCWBManual = "";
char g_char_DCWBAuto[30];						// DC自动白平衡
CString g_str_DCWBAuto = "";
char g_char_SingleShoot[30];							// 单拍
CString g_str_SingleShoot = "";
char g_char_CC2s[30];									// 两秒连拍
CString g_str_CC2s = "";
char g_char_CC4s[30];									// 四秒连拍
CString g_str_CC4s = "";
char g_char_CCOverlap[30];							// 保证重叠率连拍
CString g_str_CCOverlap = "";
char g_char_CCAutoScan[30];						// 摆扫连拍
CString g_str_CCAutoScan = "";
char g_char_DCExposureAuto[30];				// DC自动曝光
CString g_str_DCExposureAuto = "";
char g_char_DCExposureManual[30];			// DC手动曝光
CString g_str_DCExposureManual = "";
char g_char_DCExposurePlus[30];				// DC曝光+
CString g_str_DCExposurePlus = "";
char g_char_DCExposureMinus[30];				// DC曝光-
CString g_str_DCExposureMinus = "";
char g_char_DCExposureVHR[30];				// DC速高比曝光
CString g_str_DCExposureVHR = "";

char g_char_ServoPowerON[30];					// 伺服电源开
CString g_str_ServoPowerON = "";
char g_char_ServoPowerOFF[30];					// 伺服电源关
CString g_str_ServoPowerOFF = "";

//[OTHER]
char g_char_LaserChoose[30];						// 未选择激光编码
CString g_str_LaserChoose = "";
char g_char_LaserLoadSuccess[30];				// 编码加载成功
CString g_str_LaserLoadSuccess ="";
char g_char_LaserLoadFail[30];					// 编码加载失败
CString g_str_LaserLoadFail = "";

// 创建全局WinSoc套接字
SOCKET g_socketFH96Data = -1;

// 采集图像
bool g_bCaptureImg = false;

// 互斥对象句柄
HANDLE g_hMutex_ImgStitch = nullptr;

// 定义图像队列
std::deque<QBStru> g_StitchImgDeque;

BOOL g_bRun = FALSE;
BOOL g_bStop = FALSE; 


/*****IMP*****/
CFrameIMPDown_ g_FrameIMPDown;//IMP协议类实例化
bool IMPDlgWindowVisible;//IMP对话框为可视状态
//CDlgIMP * g_DlgIMP;//IMP对话框
//波特率列表
CString gComBaudItems[BAUDITEMNUM] =
{
	"1200",
	"2400",
	"4800",
	"9600",
	"14400",
	"19200",
	"38400",
	"56000",
	"57600",
	"115200"
};