main
CaoYuHui 1 year ago
commit 93690fb1cd

365
.gitignore vendored

@ -0,0 +1,365 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# The folders defined by Robin to be ignored
Bin/
Lib/
Src/Debug/
Src/Release/
Src/FH98ViewOnPlane_Setup/
Src/ipch/
Src/XtremeToolKitPro/
Src/JoyStick/
Src/QB_ImgProcessFun/
Src/QB_ImgShowBase/

@ -0,0 +1,72 @@
#include "stdafx.h"
#include "QBStru.h"
// openCV Library
#include <opencv2/opencv.hpp>
using namespace cv;
// 解码后通用情报结构体数据回调
// 参数意义:
// 1. qbstru: 情报结构体指针
// 2. purpose用途目的
typedef void (CALLBACK* SendQBStruProc)(const QBStru* qbstru, int purpose);
// 作用:人工选定目标时,对外输出目标点像素坐标
typedef void (CALLBACK* SendCoordinateProc)(CPoint Value);
// 鼠标移动输出像素信息
typedef void (CALLBACK* SendPixInfoProc)(CPoint xy, double Lon, double Lat, double H);
// 回调文件保存路径
// 参数意义:
// 1. FilePath: 文件路径
// 2. type :文件类型
// type = -1: 未知
// type = 0: 单帧图像采集或图像连续采集(后面) 图像路径 bmp格式
// type = 1: 单帧图像采集或图像连续采集(后面) 复接数据路径 xml格式
// type = 2: 多帧图像采集(前面图像) 图像路径 bmp格式
// type = 3: 多帧图像采集(前面图像) 复接数据路径 xml格式
// type = 4: 系统级几何校正后图像路径 tif格式
// type = 5: 拼接图像自动几何校正前 bmp格式
// type = 6: 拼接图像自动几何校正后 tif格式
// type = 7: 目标图像
typedef void (CALLBACK* SendFilePath)(CString FilePath, int type);
// 回调输出信息
typedef void (CALLBACK* SendMessageProc)(CString msg);
//
// 回调输出图像(显示)
typedef void (CALLBACK* SendImgProc)(const cv::Mat &img);
//
// 回调输出最近一张图像4个角点图像坐标
typedef void (CALLBACK* SendNewImgProc)(const POINT *pt);
// 回调输出 目标定位导引 输出经纬度
typedef void (CALLBACK* SendTgrLocLeadLonLatProc)(double lon0, double lat0,
double lon1, double lat1,
double lon2, double lat2,
double lon3, double lat3,
double lon4, double lat4);
// 回调输出 输出火炮校射 炸点相对于目标的距离和角度
typedef void (CALLBACK* SendArtilleryReviseInfoProc)(float dist, float angle);
// 回调输出 通知简单图像显示对话框被双击
typedef void (CALLBACK* SendLButtonDblClkInfoProc)();
// 通知简单图像显示对话框被右键按下
typedef void (CALLBACK* SendButtonDownInfoProc)(int type);
// 输出双击图像时的脱靶量
typedef void (CALLBACK* SendPixXYOffsetProc)(CPoint xy, int flag);
// 输出双击点与对话框中点的夹角
typedef void (CALLBACK* SendAngleProc)(double angle);
// 当鼠标按下时,输出鼠标点与对话框中心点的距离比例系数和角度
typedef void (CALLBACK* SendDistRatioAndAngleProc)(double distRatio, double angle);

@ -0,0 +1,40 @@
#pragma once
#include <windows.h>
#ifdef _DECODER_INTERFACE_EXPORT_
#define _DECODER_INTERFACE_ _declspec(dllexport)
#else
#define _DECODER_INTERFACE_ _declspec(dllimport)
#endif
typedef enum DecoderType
{
DEC_SOFTWARE = 0,
DEC_HARDWARE = 1,
}EnumDecoderType;
typedef void (*DecodeCallbackFun)(unsigned char* data,int width,int height);
class _DECODER_INTERFACE_ DecoderInterface
{
public:
DecoderInterface(void){};
~DecoderInterface(void){};
virtual bool init(int srcWth,int srcHth,int dstWth = 0,int dstHth = 0,int oPixFmt = 0,HWND hwnd = 0) = 0;
virtual void decoding(unsigned char* in_buf,int in_len) = 0;
virtual void release() = 0;
virtual void setDecodingCallback(DecodeCallbackFun fun) = 0;
};
class _DECODER_INTERFACE_ DecoderFactory
{
public:
DecoderFactory(void);
~DecoderFactory(void);
static DecoderInterface* CreateDecoder(EnumDecoderType type = DEC_SOFTWARE);
static void DestroyDecoder(DecoderInterface* deoder);
};

@ -0,0 +1,306 @@
#pragma once
// 包含情报结构体文件
#include "QBStru.h"
// 回调函数定义
#include "CallBackDef.h"
// 声明 图像显示对话框类
class CImgShowDlg;
class AFX_CLASS_EXPORT CExportImgShowBase: public CObject
{
public:
// 构造函数
CExportImgShowBase(void);
// 析构函数
~CExportImgShowBase(void);
public:
/************************************************************************/
/* part 1窗口创建、销毁、图像显示、标注等 */
/************************************************************************/
// 1 功能:创建视频显示窗口
// 输入:
// 1. hParentWnd: 父窗口句柄
//
// 输出创建成功返回TRUE否则返回FALSE
BOOL CreateWnd(const HWND hParentWnd);
// 2 功能:移动(设置)窗口(整个视频显示窗口)至指定位置
// 输入:
// 1. clientRect移动至该区域
//
// 输出:无
void MoveWnd(const CRect &clientRect);
// 3 功能显示SW_SHOW 或隐藏 SW_HIDE 窗口
// 输入:
// 1. nCmdShowSW_SHOW 或 SW_HIDE
//
// 输出:无
void ShowWnd(const int nCmdShow);
// 4 功能:显示一帧图像
// 输入:
// 1. pImgInfo图像信息头
// 2. pImgData图像数据指针
// 3. LBbox经纬度盒子
// 4 isNeedFlip: 是否需要反转
// 5. isNeedClip是否需要裁剪标识
// 6. ShowRegion裁剪区域
// 7. Strecth_Ratio 图像拉伸比例默认为1即填满屏幕
// 8. 图像平移控制
//
// 输出显示成功返回TRUE否则返回FALSE
// 说明信号1
BOOL ShowImage(const BITMAPINFO* pImgInfo,
BYTE* pImgData,
GeoBoundingBox LBbox = GeoBoundingBox(),
BOOL isNeedFlip = FALSE,
BOOL isNeedClip = FALSE,
const CRect* pShowRegion = NULL,
float Strecth_Ratio = 1.0F,
POINT xyShift = POINT());
// 5 功能:显示并处理通用情报数据
// 输入:
// 1.qbData: 情报数据结构体变量指针
//
// 输出: 无
// 说明信号2
// 注意信号1优先级 > 信号2优先级
void DisposeQBData(const QBStru* qbData);
// 6 功能:标绘目标,其中输入为目标点像素坐标
// 输入:
// 1. pt目标点像素坐标
//
// 输出:在窗口标绘目标
// 注意事项:如果输入图像同时,对目标进行标绘,需要在 函数4ShowImage输入之后 输入本函数
void SetTargetPixelCoordinate(const CPoint &pt);
// 6.1 功能标绘图像中的一块区域其中输入为4个像素坐标点
// 输入:
// 1. pt4个角点像素坐标
//
// 输出:在窗口标绘目标
// 注意事项:如果输入图像同时,对目标进行标绘,需要在 函数4ShowImage输入之后 输入本函数
void SetQuadrangleCorners(const POINT *pts);
// 6.2 功能:标绘目标,其中输入为经纬度坐标
// 输入:
// 1. pt经纬度坐标
//
// 输出:在窗口标绘目标
// 注意事项:如果输入图像同时,对目标进行标绘,需要在 函数4ShowImage输入之后 输入本函数
void SetTgtLocLeadLonLat(double lon, double lat);
// 7 功能:删除视频显示窗口,同时释放所有占用资源
// 输入:无
//
// 输出:无
void DestroyWnd();
// 8 功能:清理内存及记忆
// 输入:无
//
// 输出:无
void ClearMemory();
/************************************************************************/
/* part 2设置回调函数像素点坐标、像素点信息、文件保存路径 */
/************************************************************************/
// 1 功能:设置回调函数,对外输出目标点像素坐标(目标点通过左键双击图像获得)
// 输入:
// 1. proc: 回调函数指针
//
// 输出设置成功返回TRUE否则返回FALSE
BOOL SetCallBackFun(SendCoordinateProc proc);
// 2 功能设置回调函数像素信息传递到外部CSU中
// 输入:
// 1.proc: 函数指针
//
// 输出: 设置成功返回TRUE否则返回FALSE
BOOL SetCallBackFun(SendPixInfoProc proc);
// 3 功能设置回调函数传递保存文件路径到外部CSU中
// 输入:
// 1.proc: 函数指针
//
// 输出: 设置成功返回TRUE否则返回FALSE
BOOL SetCallBackFun(SendFilePath proc);
// 5 功能设置回调函数目标定位导引经纬度到外部CSU中
// 输入:
// 1.proc: 函数指针
//
// 输出: 设置成功返回TRUE否则返回FALSE
BOOL SetCallBackFun(SendTgrLocLeadLonLatProc proc);
// 6 功能设置回调函数火炮校射信息输出到外部CSU中
// 输入:
// 1.proc: 函数指针
//
// 输出: 设置成功返回TRUE否则返回FALSE
BOOL SetCallBackFun(SendArtilleryReviseInfoProc proc);
/************************************************************************/
/* part 3图像处理显示控制、处理控制、保存控制 */
/************************************************************************/
// 4 功能:通过鼠标滚轮,实现图像放大缩小
BOOL OnMouseWheelZoomInOutImg(UINT nFlags, short zDelta, CPoint pt);
// 5 功能:取消目标标绘
void CancelTargetPlot();
// 6 功能:图像去雾
// 输入:
// 1. bAdjust 是否调节
// 2. A_MAX 控制去雾效果, A_MAX < 0 时,自适应计算(特别耗时)
// 有效范围【0,255】 异常值自适应;
// 3. degree 控制去雾效果, 有效范围【0,1】 异常值自适应
// 输出:无
void AdjustImgDehaze(BOOL bAdjust = FALSE, int A_MAX = -1, double degree = 0.78);
// 7 功能:图像亮度调节
// 输入:
// 1. bAdjust 是否调节
// 2. degree 调节力度[0 20]
// 输出:无
void AdjustImgIntensity(BOOL bAdjust = FALSE, int degree = 10);
// 8 功能:图像对比度调节
// 输入:
// 1. bAdjust 是否调节
// 2. degree 调节力度[0 20]
// 输出:无
void AdjustImgContrast(BOOL bAdjust = FALSE, int degree = 10);
// 9 功能:图像清晰度调节
// 输入:
// 1. bAdjust 是否调节
// 2. degree 调节力度[0 20]
// 输出:无
void AdjustImgDefinition(BOOL bAdjust = FALSE, int degree = 10);
// 10 功能:返回图像调节上一步图像状态,显示上一次处理图像
void ReturnToPreImgState();
// 11 功能:返回原始图像状态,显示原始图像
void ReturnToSrcImgState();
// 12 功能保存当前图像几何校正并保存为TIFF格式
void SaveImgToTiff();
// 13 功能:保存当前帧至本地文件
// 输入:
// 1. sSaveFolder 图像存储文件夹,为空或找不到时,按默认存储路径存储
// 说明:图像命名规则见设计文档
void SaveCurrentFrame(CString sSaveFolder = "");
// 14 功能是否需要记忆前面多帧18帧图像信息
// 输入:
// 1. bMem TRUE记忆 FALSE不记忆
// 输出:无
void MemPreMultiFrame(BOOL bMem = TRUE);
// 18 功能:设置图像编辑类型
// 输入:
// 1. type : 1定位标记
// 2: 文字标记
// 3: 火炮校射标记
// 其他值,无效
void SetImgEditType(int type);
// 19 功能:获取图像编辑模式
// 输入:无
// 返回:
// true: 图像增强模式
// false:图像标记模式
bool GetImgEditMode();
// 21 功能:几何校正图像并显示图像
void GeoCorrectAndShowImg();
// 22 功能:获取当前显示图像
// 输入:
// 输出:
// 1imgWidth 图像宽
// 2imgHeight 图像高
// 3bitCount 图像位数
// 4pImgData 图像数据指针
// 返回值:
// 成功返回true,失败返回false
bool GetCurrentImg(int &imgWidth, int &imgHeight, int& bitCount, uchar* &pImgData);
// 23 功能:获取图像边界地理坐标
// 输入:
// 输出:
// 1leftLon 西经
// 2topLat 北纬
// 3rigtLon 东经
// 4bottomLat 南纬
// 返回值:
// 成功返回true,失败返回false
bool GetImgBoundingBox(double &leftLon, double &topLat, double &rigtLon, double &bottomLat);
// 24 功能:获取当前显示图像中心经纬度
// 输入:
// 输出:
// 1lon 经度
// 2lat 纬度
// 返回值:
// 成功返回true,失败返回false
bool GetCurrentImgCerterLonLat(double &lon, double &lat);
// 25 功能:标注图像(矩形、区域边缘)
// 输入:
// 1. 区域边缘点 集合
void MarkRegionOnImg(std::vector<std::vector<cv::Point>> &valisContours);
// 26 功能:屏蔽右键菜单
// 输入:
// 1. bClose 默认true关闭
void CloseRightBtnDownMenu(bool bClose = true);
// 27 功能:设置空屏文字
// 输入:
// 1. str 主题文字
void SetThemeText(CString str);
// 28 功能:图像位置导引(同内部目标定位导引)
void LeadImgLoc();
private:
CImgShowDlg* m_ShowDlg; // MFC 对话框
};

@ -0,0 +1,812 @@
#ifndef MAP_PRJ_H
#define MAP_PRJ_H
#ifdef MAPPRJ_EXPORTS
#define MAPPRJ_API __declspec(dllexport)
#else
#define MAPPRJ_API __declspec(dllimport)
#endif
/*
* MapPrj.h
*
*
* 1
* 2LBHXYZ
* 3
* 4
* 5
* 6仿
*
* 1.0
*
* 2011511
* 1)20131110
DLLDLL
* 2)
*/
//功能求解高斯投影正变换大地坐标LB转高斯平面直角坐标XY
//输入: L 大地坐标的经度,以°为单位,经度范围【-180,180】
// B 大地坐标的纬度,以°为单位
// coordType 坐标系类型1为BJ54坐标2为xian80坐标系3为wgs84坐标系
// zoneWidth 投影带宽分6°带和3°带
//输出: X 高斯平面直角坐标系的北向坐标以m为单位
// Y 高斯平面直角坐标系的东向坐标以m为单位
MAPPRJ_API void LB2XY(double &X, double &Y,
const double L, const double B,
const int coordType = 3, const int zoneWidth = 6);
//功能求解高斯投影反变换高斯平面直角坐标XY转大地经纬度L、B
//输入: X 高斯平面直角坐标系的北向坐标以m为单位
// Y 高斯平面直角坐标系的东向坐标以m为单位注意Y包含投影带信息
// coordType 坐标系类型1为BJ54坐标2为xian80坐标系3为wgs84坐标系
// zoneWidth 投影带宽分6°带和3°带
//输出: L 大地坐标系的经度,以°为单位,经度范围【-180,180】
// B 大地坐标系的纬度,以°为单位
MAPPRJ_API void XY2LB(double &L, double &B, const double X, const double Y,
const int coordType = 3, const int zoneWidth = 6);
//功能:求解两点之间的水平距离和方位角
//输入: fromPtLon 起始点的经度,以°为单位
// fromPtLat 起始点的纬度,以°为单位
// toPtLon 终止点的经度,以°为单位
// toPtLat 终止点的纬度,以°为单位
// coordType 坐标系类型1为BJ54坐标2为xian80坐标系3为wgs84坐标系
//输出: distance 两点之间的水平距离, 以m为单位
// azAngle 起始点到终止点的方位角, 以°为单位
MAPPRJ_API void CalculateTwoPtsDistanceAzimuth(double &distance, double &azAngle, const double fromPtLon, const double fromPtLat,
const double toPtLon, const double toPtLat, const int coordType);
//功能:求解两点连线的方位角
//输入: fromPtLon 起始点的经度,以°为单位,经度范围【-180,180】
// fromPtLat 起始点的纬度,以°为单位
// toPtLon 终止点的经度,以°为单位,,经度范围【-180,180】
// toPtLat 终止点的纬度,以°为单位
// coordType 坐标系类型1为BJ54坐标2为xian80坐标系3为wgs84坐标系
//输出: azAngle 起始点到终止点的方位角, 以°为单位范围【0,360】
MAPPRJ_API void CalculateTwoPtsAzimuth(double &azAngle,
const double fromPtLon, const double fromPtLat,
const double toPtLon, const double toPtLat,
const int coordType);
//功能:求解两点间的水平距离
//输入: fromPtLon 起始点的经度,以°为单位,经度范围【-180,180】
// fromPtLat 起始点的纬度,以°为单位
// toPtLon 终止点的经度,以°为单位,经度范围【-180,180】
// toPtLat 终止点的纬度,以°为单位
// coordType 坐标系类型1为BJ54坐标2为xian80坐标系3为wgs84坐标系
//输出: dis 起始点到终止点的距离, 以m为单位
MAPPRJ_API void CalculateTwoPtsDistance(double &dis,
const double fromPtLon, const double fromPtLat,
const double toPtLon, const double toPtLat,
const int coordType);
//功能:求解两点间的斜距
//输入: ptForm[0] 起始点的经度,以°为单位,经度范围【-180,180】
// ptForm[1] 起始点的纬度,以°为单位
// ptForm[2] 起始点的高度以m为单位
//输入: ptTo[0] 结束点的经度,以°为单位,经度范围【-180,180】
// ptTo[1] 结束点的纬度,以°为单位
// ptTo[2] 结束点的高度以m为单位
// coordType 坐标系类型1为BJ54坐标2为xian80坐标系3为wgs84坐标系
//输出: dis 起始点与终止点的斜距, 以m为单位
MAPPRJ_API void CalculateTwoPtsSlopeDistance(double &dis,
const double *ptForm, const double *ptTo,
const int coordType);
//功能:计算目标点的经纬度
//输入: fromPtLon 起始点的经度,以°为单位
// fromPtLat 起始点的纬度,以°为单位
// azAngle 起始点到目标点的方位角,以°为单位
// distance 起始点与目标点的水平距离以m为单位
// coordType 坐标系类型1为BJ54坐标2为xian80坐标系3为wgs84坐标系
//输出: targetPtLon 目标点的经度,以°为单位
// targetPtLat 目标点的纬度,以°为单位
MAPPRJ_API void CalculatePtCoordinate(double &targetPtLon, double &targetPtLat,
const double fromPtLon, const double fromPtLat,
const double azAngle, const double distance,
const int coordType);
//功能:同一个椭球体的空间直角坐标系转大地坐标系
//输入空间直角坐标系椭球体类型type1为北京54坐标系2为西安80坐标系3为WGS84坐标系
//输出:经纬高
//功能WGS84坐标系转北京54坐标系,单点转换
//输入: XYZ 空间直角坐标,其中:
// XYZ[0]------X以m为单位
// XYZ[1]------Y以m为单位
// XYZ[2]------Z以m为单位
// type 椭球体类型,其中:
// 1------北京54
// 2------西安80
// 3------WGS84
//输出: LLA 大地坐标,其中:
// LLA[0]------经度,以°为单位
// LLA[1]------纬度,以°为单位
// LLA[2]------高度以m为单位
MAPPRJ_API void XYZ2LLA(double *LLA, const double *XYZ, const int type);
//功能:同一个椭球体的大地坐标系转空间直角坐标系
//输入: LLA 大地坐标,其中:
// LLA[0]------经度,以°为单位
// LLA[1]------纬度,以°为单位
// LLA[2]------高度以m为单位
// type 椭球体类型,其中:
// 1------北京54
// 2------西安80
// 3------WGS84
//输出: XYZ 空间直角坐标,其中:
// XYZ[0]------X以m为单位
// XYZ[1]------Y以m为单位
// XYZ[2]------Z以m为单位
MAPPRJ_API void LLA2XYZ(double *XYZ, const double *LLA, const int type);
//功能北京54坐标系转WGS84坐标系,单点转换
//输入: bj54 北京54坐标系下的经纬高其中
// bj54[0]------经度,以°为单位
// bj54[1]------纬度,以°为单位
// bj54[2]------高度以m为单位
// sevenParameter 七参数数值,其中:
// sevenParameter[0]------dX以m为单位
// sevenParameter[1]------dY以m为单位
// sevenParameter[2]------dZ以m为单位
// sevenParameter[3]------eX以秒为单位
// sevenParameter[4]------eY以秒为单位
// sevenParameter[5]------eZ以秒为单位
// sevenParameter[6]------k, 尺度比ppm百万分之几
//输出: wgs84 WGS84坐标系下的经纬高其中
// wgs84[0]------经度,以°为单位
// wgs84[1]------纬度,以°为单位
// wgs84[2]------高度以m为单位
MAPPRJ_API void Bj54ToWGS84_SevenParameter(double *wgs84, const double *bj54, const double *sevenParameter);
//功能北京54坐标系转西安80坐标系,单点转换
//输入: bj54 北京54坐标系下的经纬高其中
// bj54[0]------经度,以°为单位
// bj54[1]------纬度,以°为单位
// bj54[2]------高度以m为单位
// sevenParameter 七参数数值,其中:
// sevenParameter[0]------dX以m为单位
// sevenParameter[1]------dY以m为单位
// sevenParameter[2]------dZ以m为单位
// sevenParameter[3]------eX以秒为单位
// sevenParameter[4]------eY以秒为单位
// sevenParameter[5]------eZ以秒为单位
// sevenParameter[6]------k, 尺度比ppm百万分之几
//输出: xian80 西安80坐标系下的经纬高其中
// xian80[0]------经度,以°为单位
// xian80[1]------纬度,以°为单位
// xian80[2]------高度以m为单位
MAPPRJ_API void Bj54ToXian80_SevenParameter(double *xian80, const double *bj54, const double *sevenParameter);
//功能WGS84坐标系转北京54坐标系,单点转换
//输入: wgs84 WGS84坐标系下的经纬高其中
// wgs84[0]------经度,以°为单位
// wgs84[1]------纬度,以°为单位
// wgs84[2]------高度以m为单位
// sevenParameter 七参数数值,其中:
// sevenParameter[0]------dX以m为单位
// sevenParameter[1]------dY以m为单位
// sevenParameter[2]------dZ以m为单位
// sevenParameter[3]------eX以秒为单位
// sevenParameter[4]------eY以秒为单位
// sevenParameter[5]------eZ以秒为单位
// sevenParameter[6]------k, 尺度比ppm百万分之几
//输出: bj54 北京54坐标系下的经纬高其中
// bj54[0]------经度,以°为单位
// bj54[1]------纬度,以°为单位
// bj54[2]------高度以m为单位
MAPPRJ_API void WGS84ToBj54_SevenParameter(double *bj54, const double *wgs84, const double *sevenParameter);
//功能WGS84坐标系转西安80坐标系,单点转换
//输入: wgs84 WGS84坐标系下的经纬高其中
// wgs84[0]------经度,以°为单位
// wgs84[1]------纬度,以°为单位
// wgs84[2]------高度以m为单位
// sevenParameter 七参数数值,其中:
// sevenParameter[0]------dX以m为单位
// sevenParameter[1]------dY以m为单位
// sevenParameter[2]------dZ以m为单位
// sevenParameter[3]------eX以秒为单位
// sevenParameter[4]------eY以秒为单位
// sevenParameter[5]------eZ以秒为单位
// sevenParameter[6]------k, 尺度比ppm百万分之几
//输出: xian80 西安80坐标系下的经纬高其中
// xian80[0]------经度,以°为单位
// xian80[1]------纬度,以°为单位
// xian80[2]------高度以m为单位
MAPPRJ_API void WGS84ToXian80_SevenParameter(double *xian80, const double *wgs84, const double *sevenParameter);
//功能西安80坐标系转北京54坐标系,单点转换
//输入: xian80 西安80坐标系下的经纬高其中
// xian80[0]------经度,以°为单位
// xian80[1]------纬度,以°为单位
// xian80[2]------高度以m为单位
// sevenParameter 七参数数值,其中:
// sevenParameter[0]------dX以m为单位
// sevenParameter[1]------dY以m为单位
// sevenParameter[2]------dZ以m为单位
// sevenParameter[3]------eX以秒为单位
// sevenParameter[4]------eY以秒为单位
// sevenParameter[5]------eZ以秒为单位
// sevenParameter[6]------k, 尺度比ppm百万分之几
//输出: bj54 北京54坐标系下的经纬高其中
// bj54[0]------经度,以°为单位
// bj54[1]------纬度,以°为单位
// bj54[2]------高度以m为单位
MAPPRJ_API void Xian80ToBj54_SevenParameter(double *bj54, const double *xian80, const double *sevenParameter);
//功能西安80坐标系转WGS84坐标系,单点转换
//输入: xian80 西安80坐标系下的经纬高其中
// xian80[0]------经度,以°为单位
// xian80[1]------纬度,以°为单位
// xian80[2]------高度以m为单位
// sevenParameter 七参数数值,其中:
// sevenParameter[0]------dX以m为单位
// sevenParameter[1]------dY以m为单位
// sevenParameter[2]------dZ以m为单位
// sevenParameter[3]------eX以秒为单位
// sevenParameter[4]------eY以秒为单位
// sevenParameter[5]------eZ以秒为单位
// sevenParameter[6]------k, 尺度比ppm百万分之几
//输出: wgs84 WGS84坐标系下的经纬高其中
// wgs84[0]------经度,以°为单位
// wgs84[1]------纬度,以°为单位
// wgs84[2]------高度以m为单位
MAPPRJ_API void Xian80ToWgs84_SevenParameter(double *wgs84, const double *xian80, const double *sevenParameter);
//功能北京54坐标系转WGS84坐标系,单点转换
//输入: bj54 北京54坐标系下的经纬高其中
// bj54[0]------经度,以°为单位
// bj54[1]------纬度,以°为单位
// bj54[2]------高度以m为单位
// ThreeParameter 三参数数值,其中:
// ThreeParameter[0]------dX以m为单位
// ThreeParameter[1]------dY以m为单位
// ThreeParameter[2]------dZ以m为单位
//输出: wgs84 WGS84坐标系下的经纬高其中
// wgs84[0]------经度,以°为单位
// wgs84[1]------纬度,以°为单位
// wgs84[2]------高度以m为单位
MAPPRJ_API void Bj54ToWGS84_ThreeParameter(double *wgs84, const double *bj54, const double *ThreeParameter);
//功能WGS84坐标系转北京54坐标系,单点转换
//输入: wgs84 WGS84坐标系下的经纬高其中
// wgs84[0]------经度,以°为单位
// wgs84[1]------纬度,以°为单位
// wgs84[2]------高度以m为单位
// ThreeParameter 三参数数值,其中:
// ThreeParameter[0]------dX以m为单位
// ThreeParameter[1]------dY以m为单位
// ThreeParameter[2]------dZ以m为单位
//输出: bj54 北京54坐标系下的经纬高其中
// bj54[0]------经度,以°为单位
// bj54[1]------纬度,以°为单位
// bj54[2]------高度以m为单位
MAPPRJ_API void WGS84ToBj54_ThreeParameter(double *bj54, const double *wgs84, const double *ThreeParameter);
//功能:计算不同大地坐标系间转换的参数,采用布尔莎七参数模型
//输入: nowLLA 当前坐标系的大地坐标其中nowLLA的数组长度为3*ptNum
// nowLLA[0+3*i]------经度,以°为单位
// nowLLA[1+3*i]------纬度,以°为单位
// nowLLA[2+3*i]------高度以m为单位
// 0<= i < ptNum
// nowType 当前坐标系的椭球体类型,其中:
// 1------北京54
// 2------西安80
// 3------WGS84
// aimLLA 目标坐标系的大地坐标其中的数组长度为3*ptNum
// aimLLA[0+3*i]------经度,以°为单位
// aimLLA[1+3*i]------纬度,以°为单位
// aimLLA[2+3*i]------高度以m为单位
// 0<= i < ptNum
// aimType 目标坐标系的椭球体类型,其中:
// 1------北京54
// 2------西安80
// 3------WGS84
// ptNum 控制点的个数(即在当前坐标系和目标坐标系都有坐标的点的个数)
//输出: sevenParameter 七参数数值,其中:
// sevenParameter[0]------dX以m为单位
// sevenParameter[1]------dY以m为单位
// sevenParameter[2]------dZ以m为单位
// sevenParameter[3]------eX以秒为单位
// sevenParameter[4]------eY以秒为单位
// sevenParameter[5]------eZ以秒为单位
// sevenParameter[6]------k, 尺度比ppm百万分之几
MAPPRJ_API void CalculateSevenParameters(double *sevenParameter, const double *nowLLA, const int nowType,
const double *aimLLA, const int aimType, const int ptNum);
//功能:计算不同大地坐标系间转换的参数,采用布尔莎七参数模型
//输入: nowXYZ 当前坐标系的空间直角坐标其中nowXYZ的数组长度为3*ptNum
// nowXYZ[0+3*i]------X以m为单位
// nowXYZ[1+3*i]------Y以m为单位
// nowXYZ[2+3*i]------Z以m为单位
// 0<= i < ptNum
// aimXYZ 目标坐标系的空间直角坐标其中aimXYZ的数组长度为3*ptNum
// aimXYZ[0+3*i]------X以m为单位
// aimXYZ[1+3*i]------Y以m为单位
// aimXYZ[2+3*i]------Z以m为单位
// 0<= i < ptNum
// ptNum 控制点的个数(即在当前坐标系和目标坐标系都有坐标的点的个数)
//输出: sevenParameter 七参数数值,其中:
// sevenParameter[0]------dX以m为单位
// sevenParameter[1]------dY以m为单位
// sevenParameter[2]------dZ以m为单位
// sevenParameter[3]------eX以秒为单位
// sevenParameter[4]------eY以秒为单位
// sevenParameter[5]------eZ以秒为单位
// sevenParameter[6]------k, 尺度比ppm百万分之一
MAPPRJ_API void CalculateSevenParameters(double *sevenParameter, const double *nowXYZ, const double *aimXYZ, const int ptNum);
//功能:计算不同大地坐标系间转换的参数,采用三参数模型
//输入: nowLLA 当前坐标系的大地坐标,其中:
// nowLLA[0]------经度,以°为单位
// nowLLA[1]------纬度,以°为单位
// nowLLA[2]------高度以m为单位
// nowType 当前坐标系的椭球体类型,其中:
// 1------北京54
// 2------西安80
// 3------WGS84
// aimLLA 目标坐标系的大地坐标,其中:
// aimLLA[0]------经度,以°为单位
// aimLLA[1]------纬度,以°为单位
// aimLLA[2]------高度以m为单位
// aimType 目标坐标系的椭球体类型,其中:
// 1------北京54
// 2------西安80
// 3------WGS84
//输出: dx X轴的坐标平移量以m为单位
// dy Y轴的坐标平移量以m为单位
// dz Z轴的坐标平移量以m为单位
MAPPRJ_API void CalculateThreeParameters(double &dx, double &dy, double &dz, const double *nowLLA, const int nowType,
const double *aimLLA, const int aimType);
//功能:计算不同大地坐标系间转换的参数,采用三参数模型
//输入: nowXYZ 当前坐标系的空间直角坐标,其中:
// nowXYZ[0]------X以m为单位
// nowXYZ[1]------Y以m为单位
// nowXYZ[2]------Z以m为单位
// aimXYZ 目标坐标系的空间直角坐标,其中:
// aimXYZ[0]------X以m为单位
// aimXYZ[1]------Y以m为单位
// aimXYZ[2]------Z以m为单位
//输出: dx X轴的坐标平移量以m为单位
// dy Y轴的坐标平移量以m为单位
// dz Z轴的坐标平移量以m为单位
MAPPRJ_API void CalculateThreeParameters(double &dx, double &dy, double &dz, const double *nowXYZ, const double *aimXYZ);
//功能:计算不同平面直角坐标系间转换的参数,采用四参数模型
//输入: nowXY 当前坐标系的空间直角坐标其中nowXY的数组长度为2*ptNum
// nowXYZ[0+2*i]------X以m为单位
// nowXYZ[1+2*i]------Y以m为单位
// 0<= i < ptNum
// aimXY 目标坐标系的空间直角坐标其中aimXYZ的数组长度为2*ptNum
// aimXYZ[0+2*i]------X以m为单位
// aimXYZ[1+2*i]------Y以m为单位
// 0<= i < ptNum
// ptNum 控制点的个数(即在当前坐标系和目标坐标系都有坐标的点的个数)
//输出: fourParameters 四参数数值,其中:
// fourParameters[0]------xoX方向坐标平移量以m为单位
// fourParameters[1]------yoY方向坐标平移量以m为单位
// fourParameters[2]------p比例系数无单位
// fourParameters[3]------q比例系数无单位
MAPPRJ_API void CalculateFourParameters(double *fourParameters, const double *nowXY, const double *aimXY, const int ptNum);
//功能:计算不同平面直角坐标系间转换的参数,采用四参数模型
//输入: nowLLA 当前坐标系的大地坐标其中nowLLA的数组长度为2*ptNum
// nowXYZ[0+2*i]------经度,以°为单位
// nowXYZ[1+2*i]------纬度,以°为单位
// 0<= i < ptNum
// nowType 当前坐标系的椭球体类型,其中:
// 1------北京54
// 2------西安80
// 3------WGS84
// aimLLA 目标坐标系的大地坐标其中aimLLA的数组长度为2*ptNum
// aimLLA[0+2*i]------经度,以°为单位
// aimLLA[1+2*i]------纬度,以°为单位
// 0<= i < ptNum
// aimType 目标坐标系的椭球体类型,其中:
// 1------北京54
// 2------西安80
// 3------WGS84
// ptNum 控制点的个数(即在当前坐标系和目标坐标系都有坐标的点的个数)
//输出: fourParameters 四参数数值,其中:
// fourParameters[0]------xoX方向坐标平移量以m为单位
// fourParameters[1]------yoY方向坐标平移量以m为单位
// fourParameters[2]------p比例系数无单位
// fourParameters[3]------q比例系数无单位
MAPPRJ_API void CalculateFourParameters(double *fourParameters, const double *nowLLA, const int nowType,
const double *aimLLA, const int aimType, const int ptNum);
//功能北京54坐标系转WGS84坐标系,单点转换
//输入: bj54 北京54坐标系下的经纬高其中
// bj54[0]------经度,以°为单位
// bj54[1]------纬度,以°为单位
// bj54[2]------高度以m为单位
// fourParameter 四参数数值,其中:
// fourParameters[0]------xoX方向坐标平移量以m为单位
// fourParameters[1]------yoY方向坐标平移量以m为单位
// fourParameters[2]------p比例系数无单位
// fourParameters[3]------q比例系数无单位
//输出: wgs84 WGS84坐标系下的经纬高其中
// wgs84[0]------经度,以°为单位
// wgs84[1]------纬度,以°为单位
// wgs84[2]------高度以m为单位
MAPPRJ_API void Bj54ToWGS84_FourParameter(double *wgs84, const double *bj54, const double *fourParameter);
//功能北京54坐标系转西安80坐标系,单点转换
//输入: bj54 北京54坐标系下的经纬高其中
// bj54[0]------经度,以°为单位
// bj54[1]------纬度,以°为单位
// bj54[2]------高度以m为单位
// fourParameter 四参数数值,其中:
// fourParameters[0]------xoX方向坐标平移量以m为单位
// fourParameters[1]------yoY方向坐标平移量以m为单位
// fourParameters[2]------p比例系数无单位
// fourParameters[3]------q比例系数无单位
//输出: xian80 西安80坐标系下的经纬高其中
// xian80[0]------经度,以°为单位
// xian80[1]------纬度,以°为单位
// xian80[2]------高度以m为单位
MAPPRJ_API void Bj54ToXian80_FourParameter(double *xian80, const double *bj54, const double *fourParameter);
//功能WGS84坐标系转北京54坐标系,单点转换
//输入: wgs84 WGS84坐标系下的经纬高其中
// wgs84[0]------经度,以°为单位
// wgs84[1]------纬度,以°为单位
// wgs84[2]------高度以m为单位
// fourParameter 四参数数值,其中:
// fourParameters[0]------xoX方向坐标平移量以m为单位
// fourParameters[1]------yoY方向坐标平移量以m为单位
// fourParameters[2]------p比例系数无单位
// fourParameters[3]------q比例系数无单位
//输出: bj54 北京54坐标系下的经纬高其中
// bj54[0]------经度,以°为单位
// bj54[1]------纬度,以°为单位
// bj54[2]------高度以m为单位
MAPPRJ_API void WGS84ToBj54_FourParameter(double *bj54, const double *wgs84, const double *fourParameter);
//功能WGS84坐标系转西安80坐标系,单点转换
//输入: wgs84 WGS84坐标系下的经纬高其中
// wgs84[0]------经度,以°为单位
// wgs84[1]------纬度,以°为单位
// wgs84[2]------高度以m为单位
// fourParameter 四参数数值,其中:
// fourParameters[0]------xoX方向坐标平移量以m为单位
// fourParameters[1]------yoY方向坐标平移量以m为单位
// fourParameters[2]------p比例系数无单位
// fourParameters[3]------q比例系数无单位
//输出: xian80 西安80坐标系下的经纬高其中
// xian80[0]------经度,以°为单位
// xian80[1]------纬度,以°为单位
// xian80[2]------高度以m为单位
MAPPRJ_API void WGS84ToXian80_FourParameter(double *xian80, const double *wgs84, const double *fourParameter);
//功能西安80坐标系转北京54坐标系,单点转换
//输入: xian80 西安80坐标系下的经纬高其中
// xian80[0]------经度,以°为单位
// xian80[1]------纬度,以°为单位
// xian80[2]------高度以m为单位
// fourParameter 四参数数值,其中:
// fourParameters[0]------xoX方向坐标平移量以m为单位
// fourParameters[1]------yoY方向坐标平移量以m为单位
// fourParameters[2]------p比例系数无单位
// fourParameters[3]------q比例系数无单位
//输出: bj54 北京54坐标系下的经纬高其中
// bj54[0]------经度,以°为单位
// bj54[1]------纬度,以°为单位
// bj54[2]------高度以m为单位
MAPPRJ_API void Xian80ToBj54_FourParameter(double *bj54, const double *xian80, const double *fourParameter);
//功能西安80坐标系转WGS84坐标系,单点转换
//输入: xian80 西安80坐标系下的经纬高其中
// xian80[0]------经度,以°为单位
// xian80[1]------纬度,以°为单位
// xian80[2]------高度以m为单位
// fourParameter 四参数数值,其中:
// fourParameters[0]------xoX方向坐标平移量以m为单位
// fourParameters[1]------yoY方向坐标平移量以m为单位
// fourParameters[2]------p比例系数无单位
// fourParameters[3]------q比例系数无单位
//输出: wgs84 WGS84坐标系下的经纬高其中
// wgs84[0]------经度,以°为单位
// wgs84[1]------纬度,以°为单位
// wgs84[2]------高度以m为单位
MAPPRJ_API void Xian80ToWgs84_FourParameter(double *wgs84, const double *xian80, const double *fourParameter);
//功能:不同平面直角坐标之间的变换,单点转换
//输入: pFromCoord 一个平面直角坐标系下的X、Y坐标其中
// pFromCoord[0]------X坐标以m为单位
// pFromCoord[1]------Y坐标以m为单位
// fourParameter 四参数数值,其中:
// fourParameters[0]------xoX方向坐标平移量以m为单位
// fourParameters[1]------yoY方向坐标平移量以m为单位
// fourParameters[2]------p比例系数无单位
// fourParameters[3]------q比例系数无单位
//输出: pToCoord 目标平面直角坐标系下的X、Y坐标其中
// pToCoord[0]------X坐标以m为单位
// pToCoord[1]------Y坐标以m为单位
MAPPRJ_API void PlaneCoordTransform_FourParameter(double *pToCoord, const double *pFromCoord, const double *fourParameter);
#endif

@ -0,0 +1,625 @@
/*
* QBInfo.h
*
* 2.0 20170311
*/
#pragma once
#pragma pack(1)
// 昼夜光电侦察平台复接数据结构体 110字节,顺序不可调整
// struct struProtocal_FJ
// {
// // 帧头
// UINT8 Head[2]; // 帧头: EB 90
//
// // 载荷参数
// UINT8 ZH_Type; // 载荷识别码
// // 0x10数码相机侦察平台
// // 0x20昼夜光电侦察平台
// UINT8 ZH_CmdType; // 开关指令回报
// UINT8 ZH_WorkState; // 载荷工作状态
// UINT8 ZH_CtrlState0; // 主控状态字0
// UINT8 ZH_CtrlState1; // 主控状态字1
// UINT8 ZH_ServoState; // 伺服状态字
// UINT8 ZH_EOState0; // 可见光状态字0
//
// UINT8 ZH_IRState; // 昼夜光电侦察平台:红外状态字
// // 数码相机侦察平台:数码相机曝光时间
//
// UINT8 ZH_TrackState; // 跟踪器状态字
// UINT8 ZH_RecorderState; // 记录仪状态字
//
//
// INT16 ZH_Pitch; // 载荷俯仰角
// INT16 ZH_Azimuth; // 载荷方位角
// UINT16 ZH_LaserDist; // 激光测距值
// UINT16 ZH_EOFocalLen; // 可见光焦距
//
// UINT16 ZH_IRFocalLen; // 昼夜光电侦察平台:红外焦距
// // 数码相机侦察平台:照片总编号:自上电起所有拍照总数
//
// INT16 ZH_DeltaX; // 俯仰脱靶量
// INT16 ZH_DeltaY; // 方位脱靶量
//
// UINT8 ZH_EOState1; // 可见光状态字1
// UINT8 ZH_LaserIndicateState; // 激光照射状态字
//
// UINT8 ZH_ImgType; // 图像类型
// UINT8 ZH_ImgFlow; // 图像码率
//
// UINT8 ZH_SMOverlapRatio; // 数码照片重叠率 分辨率为0.5% 范围0%~100%
// UINT8 CHKSUM; // 和校验位 1~32字节累和低8位为0x00
//
// // 第二部分表4的部分内容即struProtocal_FKtoZH后半部分内容11-87
//
// // 飞机参数(部分)
// UINT8 UAV_Type; // 无人机型号
// UINT8 UAV_ID; // 无人机ID
// UINT8 UAV_States[11]; // 无人机飞行状态
// INT16 UAV_GyroPitch; // 垂直陀螺俯仰角
// INT16 UAV_GyroRoll; // 垂直陀螺滚转角
// UINT16 UAV_AirPresAlt; // 无人机气压高度
// UINT16 UAV_MagHeading; // 无人机磁航向角
//
// // 左右两个GPS测量数据(可测飞机滚转角)
// UINT8 GPS_LR_WorkState; // 卫导1定位测资状态
// UINT32 GPS_LR_UTC; // 卫导1时分秒
// UINT8 GPS_LR_Day; // 卫导1日
// UINT8 GPS_LR_Month; // 卫导1月
// UINT8 GPS_LR_Year; // 卫导1年
// INT32 GPS_LR_Lat; // 卫导1纬度
// INT32 GPS_LR_Lon; // 卫导1经度
// UINT16 GPS_LR_Alt; // 卫导1高度
// UINT16 GPS_LR_VHeading; // 卫导1地速方向实际运动方向
// UINT16 GPS_LR_HoriSpeed; // 卫导1水平速度
// INT16 GPS_LR_VertSpeed; // 卫导1天速垂直速度
// UINT16 GPS_LR_Heading; // 卫导1航向角机头方向
// INT16 GPS_LR_Roll; // 卫导1滚转角
//
// // 前后两个GPS测量数据(可测飞机俯仰角)
// UINT8 GPS_FB_WorkState; // 卫导2定位测资状态
// UINT32 GPS_FB_UTC; // 卫导2时分秒
// UINT8 GPS_FB_Day; // 卫导2日
// UINT8 GPS_FB_Month; // 卫导2月
// UINT8 GPS_FB_Year; // 卫导2年
// INT32 GPS_FB_Lat; // 卫导2纬度
// INT32 GPS_FB_Lon; // 卫导2经度
// UINT16 GPS_FB_Alt; // 卫导2高度
// UINT16 GPS_FB_VHeading; // 卫导2地速方向实际运动方向
// UINT16 GPS_FB_HoriSpeed; // 卫导2水平速度
// INT16 GPS_FB_VertSpeed; // 卫导2天速垂直速度
// UINT16 GPS_FB_Heading; // 卫导2航向角机头方向
// INT16 GPS_FB_Pitch; // 卫导2俯仰角
//
// UINT8 CHKSUM2; // 和校验位
// };
// 昼夜光电侦察平台复接数据结构体 110字节,顺序不可调整
struct struProtocal_FJ
{
// 帧头
UINT8 Head[2]; // 帧头: EB 90
// 载荷参数
UINT8 ZH_Type; // 载荷识别码
// 0x10数码相机侦察平台
// 0x20昼夜光电侦察平台
UINT8 ZH_CmdType; // 开关指令回报
UINT8 ZH_WorkState; // 载荷工作状态
UINT8 ZH_CtrlState0; // 主控状态字0
UINT8 ZH_CtrlState1; // 主控状态字1
UINT8 ZH_ServoState; // 伺服状态字
UINT8 ZH_EOState0; // 可见光状态字0
UINT8 ZH_IRState; // 昼夜光电侦察平台:红外状态字
// 数码相机侦察平台:数码相机曝光时间
UINT8 ZH_TrackState; // 跟踪器状态字
UINT8 ZH_RecorderState; // 记录仪状态字
INT16 ZH_Pitch; // 载荷俯仰角
INT16 ZH_Azimuth; // 载荷方位角
UINT16 ZH_LaserDist; // 激光测距值
UINT16 ZH_EOFocalLen; // 可见光焦距
UINT16 ZH_IRFocalLen; // 昼夜光电侦察平台:红外焦距
// 数码相机侦察平台:照片总编号:自上电起所有拍照总数
INT16 ZH_DeltaX; // 俯仰脱靶量
INT16 ZH_DeltaY; // 方位脱靶量
UINT8 ZH_EOState1; // 可见光状态字1
UINT8 ZH_LaserIndicateState; // 激光照射状态字(含义见载荷补充协议)
UINT8 ZH_ImgType; // 图像类型
UINT8 ZH_ImgFlow; // 图像码率
UINT8 ZH_SMOverlapRatio; // 数码照片重叠率 分辨率为0.5% 范围0%~100%
UINT8 CHKSUM; // 和校验位 1~32字节累和低8位为0x00
// 第二部分表4的部分内容即struProtocal_FKtoZH后半部分内容11-87
// 飞机参数(部分)
UINT8 UAV_Type; // 无人机型号
UINT8 UAV_ID; // 无人机ID
UINT8 UAV_States[11]; // 无人机飞行状态
INT16 UAV_GyroPitch; // 垂直陀螺俯仰角
INT16 UAV_GyroRoll; // 垂直陀螺滚转角
UINT16 UAV_AirPresAlt; // 无人机气压高度
UINT16 UAV_MagHeading; // 无人机磁航向角
// 左右两个GPS测量数据(可测飞机滚转角)
UINT8 GPS_LR_WorkState; // 卫导1定位测资状态
UINT32 GPS_LR_UTC; // 卫导1时分秒
UINT8 GPS_LR_Day; // 卫导1日
UINT8 GPS_LR_Month; // 卫导1月
UINT8 GPS_LR_Year; // 卫导1年
INT32 GPS_LR_Lat; // 卫导1纬度
INT32 GPS_LR_Lon; // 卫导1经度
UINT16 GPS_LR_Alt; // 卫导1高度
UINT16 GPS_LR_VHeading; // 卫导1地速方向实际运动方向
UINT16 GPS_LR_HoriSpeed; // 卫导1水平速度
INT16 GPS_LR_VertSpeed; // 卫导1天速垂直速度
UINT16 GPS_LR_Heading; // 卫导1航向角机头方向
INT16 GPS_LR_Roll; // 卫导1滚转角
// 前后两个GPS测量数据(可测飞机俯仰角)
UINT8 GPS_FB_WorkState; // 卫导2定位测资状态
UINT32 GPS_FB_UTC; // 卫导2时分秒
UINT8 GPS_FB_Day; // 卫导2日
UINT8 GPS_FB_Month; // 卫导2月
UINT8 GPS_FB_Year; // 卫导2年
INT32 GPS_FB_Lat; // 卫导2纬度
INT32 GPS_FB_Lon; // 卫导2经度
UINT16 GPS_FB_Alt; // 卫导2高度
UINT16 GPS_FB_VHeading; // 卫导2地速方向实际运动方向
UINT16 GPS_FB_HoriSpeed; // 卫导2水平速度
INT16 GPS_FB_VertSpeed; // 卫导2天速垂直速度
UINT16 GPS_FB_Heading; // 卫导2航向角机头方向
INT16 GPS_FB_Pitch; // 卫导2俯仰角
UINT8 CHKSUM2; // 和校验位
};
// 转换后的组播位置信息数据结构体
struct struSocketProtocal
{
UINT8 Socket_Head[2]; // 帧头
UINT8 Socket_Marker; // 帧标识
UINT8 Socket_Sender; // 发送方标识
UINT16 Socket_FrameCount; // 帧计数
INT32 UAV_Lon; // 自身经度
INT32 UAV_Lat; // 自身纬度
INT16 UAV_Alt; // 自身高度
INT32 Target_Lon; // 目标经度
INT32 Target_Lat; // 目标纬度
INT16 Target_Alt; // 目标高度
UINT8 CRC[2]; // CRC16校验
UINT8 Socket_End[2]; // 帧尾
};
// 转换后的图像复接数据结构体
struct struTranslateProtocal_FJ
{
bool bValid; // 结构体数据是否有效: TRUE—有效 FALSE—无效
// 载荷参数
UINT8 ZH_Type; // 载荷识别码 0x10—数码相机侦察平台 0x20—昼夜光电侦查平台
UINT8 ZH_CmdType; // 回报开关指令
//载荷工作状态——主界面显示
UINT8 ZH_StablePlatformWorkState; // 稳定平台工作状态000—手动跟踪 001—自动跟踪 010—锁定 011—数引 100—扫描 101—刹车昼夜光电平台垂直随动数码相机平台 110—初始化 111—偏心跟踪
UINT8 ZH_LaserRangeWorkState; // 激光测距仪工作状态000—正常 001—故障 010—关机 011—待机 100—测距开 101—测距关 111—休息
UINT8 ZH_ElevatorWorkState; // 升降机构工作状态00—顶端 01—底端 10—上升 11—下降
//状态字
UINT8 ZH_CtrlState0; // 主控状态字0
UINT8 ZH_CtrlState1; // 主控状态字1
UINT8 ZH_ServoState; // 伺服状态字
//可见光状态字0
UINT8 ZH_EOCameraWorkState; // EO相机状态 0—正常 1—故障
UINT8 ZH_EOCameraImgState; // EO图像状态 0—真实 1:—自检
//红外状态字
UINT8 ZH_IRCameraWorkState; // 红外相机状态: 0—正常 1—故障
UINT8 ZH_IRCameraImgState; // 红外图像状态: 0—真实 1:—自检
UINT8 ZH_IRCameraDigitalDouble; // 热像仪数字变倍0—正常 1—数字变倍2X
//配合11所调试激光状态字占用可见光状态字1字节
UINT8 ZH_LASERTEST_D7; // 全系统: 0-正常 1-故障
UINT8 ZH_LASERTEST_D6; // 温控: 0-正常 1-故障
UINT8 ZH_LASERTEST_D5; // 驱动: 0-正常 1-故障
UINT8 ZH_LASERTEST_D4; // 照射循环0-未完成 1-已完成
UINT8 ZH_LASERTEST_D3; // 主波: 0-有主波 1-无主波
UINT8 ZH_LASERTEST_D2; // 回波: 0-有回波 1-无回波
UINT8 ZH_LASERTEST_D1D0;//工作状态00待机 01测距 10照射 11休息
// 数码相机曝光时间
UINT ZH_SMExposalTime; // 数码照片曝光时间 200~5000us
// 跟踪器状态
UINT8 ZH_EOTrackState_Control; // 可见光接收球上主控数据0—正常 1—故障
UINT8 ZH_EOTrackState; // 可见光跟踪器状态000—正常 001—异常 010—目标丢失 011—相关跟踪 100—重心黑 101—重心白 110-冻结当前帧 111-显示当前帧
UINT8 ZH_IRTrackState_Control; // 红外接收球上主控数据0—正常 1—故障
UINT8 ZH_IRTrackState; // 红外跟踪器状态000—正常 001—异常 010—目标丢失 011—相关跟踪 100—重心黑 101—重心白 110-冻结当前帧 111-显示当前帧
float ZH_Pitch; // 载荷俯仰角
float ZH_Azimuth; // 载荷方位角
bool ZH_LaserOn; // 激光测距开关true为开
unsigned int ZH_LaserDist; // 激光测距值
float ZH_EOFocalLen; // 可见光焦距
float ZH_IRFocalLen; // 红外焦距
UINT ZH_SMSerialNumber; // 数码相机照片总编号
int ZH_DeltaX; // 俯仰脱靶量
int ZH_DeltaY; // 方位脱靶量
UINT8 ZH_ImgType; // 图像类型0x01—可见光 0x02—红外 0x03-数码照片 0x04—可见光&红外 0x07-可见光&数码照片
UINT8 ZH_ImgFlow; // 图像码流0x03—3Mbps 0x05—5Mbps 0x08—7.68Mbps
float ZH_SMOverlapRatio; // 数码照片重叠率
double ZH_EOPixelSize; // 可见光像元尺寸
double ZH_IRPixelSize; // 红外像元尺寸 非数字变倍15um
double ZH_SMPixelSize; // 数码照片像元尺寸
// 第二部分表4的部分内容即struProtocal_FKtoZH后半部分内容11-87
// 飞机参数(部分)
UINT8 UAV_Type; // 无人机型号
UINT8 UAV_ID; // 无人机ID
UINT8 UAV_States[11]; // 无人机飞行状态
float UAV_GyroPitch; // 垂直陀螺俯仰角
float UAV_GyroRoll; // 垂直陀螺滚转角
float UAV_AirPresAlt; // 无人机气压高度
float UAV_MagHeading; // 无人机磁航向角
// 左右两个GPS测量数据(可测飞机滚转角)
UINT8 GPS_LR_WorkState; // 卫导1定位测资状态
UINT8 GPS_LR_Location; // 卫导1定位
UINT8 GPS_LR_Attitude; // 卫导1测姿
unsigned int GPS_LR_UTC; // 卫导1时分秒
unsigned int GPS_LR_Day; // 卫导1日
unsigned int GPS_LR_Month;// 卫导1月
unsigned int GPS_LR_Year; // 卫导1年
float GPS_LR_Lon; // 卫导1经度
float GPS_LR_Lat; // 卫导1纬度
float GPS_LR_Alt; // 卫导1高度
float GPS_LR_VHeading; // 卫导1地速方向实际运动方向
float GPS_LR_HoriSpeed; // 卫导1水平速度
float GPS_LR_VertSpeed; // 卫导1天速垂直速度
float GPS_LR_Heading; // 卫导1航向角机头方向
float GPS_LR_Roll; // 卫导1滚转角
// 前后两个GPS测量数据(可测飞机俯仰角)
UINT8 GPS_FB_WorkState; // 卫导2定位测资状态
UINT8 GPS_FB_Location; // 卫导2定位
UINT8 GPS_FB_Attitude; // 卫导2测姿
unsigned int GPS_FB_UTC; // 卫导2时分秒
unsigned int GPS_FB_Day; // 卫导2日
unsigned int GPS_FB_Month; // 卫导2月
unsigned int GPS_FB_Year; // 卫导2年
float GPS_FB_Lon; // 卫导2经度
float GPS_FB_Lat; // 卫导2纬度
float GPS_FB_Alt; // 卫导2高度
float GPS_FB_VHeading; // 卫导2地速方向实际运动方向
float GPS_FB_HoriSpeed; // 卫导2水平速度
float GPS_FB_VertSpeed; // 卫导2天速垂直速度
float GPS_FB_Heading; // 卫导2航向角机头方向
float GPS_FB_Pitch; // 卫导2俯仰角
struTranslateProtocal_FJ()
{
bValid = false;
}
};
// 图像中心点定位结构体
struct struCenterLocation
{
bool bValid; // 是否有效
double Lon; // 经度
double Lat; // 纬度
double H; // 高度
struCenterLocation()
{
bValid = false;
Lon = 0;
Lat = 0;
H = 0;
}
};
// 情报处理复接数据结构体
struct struQB_FJ
{
// bool bValid; // 结构体数据是否有效: TRUE—有效 FALSE—无效
//
// // 载荷姿态和属性
// UINT8 ZH_StablePlatformWorkState; // 稳定平台工作状态000—手动跟踪 001—自动跟踪 010—锁定 011—数引 100—扫描 101—刹车 110—初始化 111—偏心跟踪
// UINT8 ZH_TrackState; // 跟踪器状态000—正常 001—异常 010—目标丢失 011—相关跟踪 100—重心黑 101—重心白
// float ZH_Pitch; // 载荷俯仰角
// float ZH_Azimuth; // 载荷方位角
// bool ZH_LaserOn; // 激光测距开关true为开
// double ZH_LaserDist; // 激光测距值
// float ZH_FocalLen; //焦距 mm
// float ZH_IRFocalLen; // IR焦距 mmCH96补充
// int ZH_DeltaX; //俯仰脱靶量
// int ZH_DeltaY; //方位脱靶量
// double ZH_PixelSize; //像元尺寸
// int ZH_ImgWidth; // 图像宽
// int ZH_ImgHeight; // 图像高
//
// // 飞机位置姿态GPS
// double UAV_GPS_Lon; // 无人机经度
// double UAV_GPS_Lat; // 无人机纬度
// float UAV_GPS_Alt; // 无人机高度
// float UAV_GPS_HSpeed; // 水平速度
// float UAV_Pitch; // 俯仰角
// float UAV_Yaw; // 航向角(机头方向)
// float UAV_Roll; // 滚转角
// float UAV_GroundHeight; // 无人机下视点地面高度地面计算获取30米高程
//
// // GPS时间
// unsigned int UAV_GPS_Year; // 卫导1年
// unsigned int UAV_GPS_Month; // 卫导1月
// unsigned int UAV_GPS_Day; // 卫导1日
// unsigned int UAV_GPS_UTC; // 卫导1时分秒
//
// // 附加部分
// struCenterLocation centerLoc; // 图像中心点地理坐标,目标定位时会用到
//
// struQB_FJ()
// {
// bValid = false;
// }
bool bValid; // 结构体数据是否有效: TRUE—有效 FALSE—无效
// 载荷姿态和属性
UINT8 ZH_StablePlatformWorkState; // 稳定平台工作状态000—手动跟踪 001—自动跟踪 010—锁定 011—数引 100—扫描 101—刹车 110—初始化 111—偏心跟踪
UINT8 ZH_TrackState; // 跟踪器状态000—正常 001—异常 010—目标丢失 011—相关跟踪 100—重心黑 101—重心白
float ZH_Pitch; // 载荷俯仰角
float ZH_Azimuth; // 载荷方位角
bool ZH_LaserOn; // 激光测距开关true为开
double ZH_LaserDist; // 激光测距值
float ZH_FocalLen; //焦距 mm
int ZH_DeltaX; //俯仰脱靶量
int ZH_DeltaY; //方位脱靶量
double ZH_PixelSize; //像元尺寸
int ZH_ImgWidth; // 图像宽
int ZH_ImgHeight; // 图像高
// 飞机位置姿态GPS
double UAV_GPS_Lon; // 无人机经度
double UAV_GPS_Lat; // 无人机纬度
float UAV_GPS_Alt; // 无人机高度
float UAV_GPS_HSpeed; // 水平速度
float UAV_Pitch; // 俯仰角
float UAV_Yaw; // 航向角(机头方向)
float UAV_Roll; // 滚转角
float UAV_GroundHeight; // 无人机下视点地面高度地面计算获取30米高程
// GPS时间
unsigned int UAV_GPS_Year; // 卫导1年
unsigned int UAV_GPS_Month; // 卫导1月
unsigned int UAV_GPS_Day; // 卫导1日
unsigned int UAV_GPS_UTC; // 卫导1时分秒
// 附加部分
struCenterLocation centerLoc; // 图像中心点地理坐标,目标定位时会用到
struQB_FJ()
{
bValid = false;
}
};
// 图像经纬度边界
struct GeoBoundingBox
{
double NorthLat; // 北纬
double SouthLat; // 南纬
double WestLon; // 西经
double EastLon; // 东经
GeoBoundingBox()
{
NorthLat = -200.0;
SouthLat = -200.0;
WestLon = -200.0;
EastLon = -200.0;
}
};
//图像信息结构
struct ImgStru
{
int ImgWidth; // 图像宽
int ImgHeight; // 图像高
int bitcount; // 位数
GeoBoundingBox BoundingBox; // 经纬度边界(存储几何校正后图像的地理边界信息)
unsigned char* buff; // 图像数据
ImgStru()
{
ImgWidth = 0;
ImgHeight = 0;
bitcount = 0;
buff = NULL;
}
~ImgStru()
{
if ( buff != NULL )
{
delete[] buff;
buff = NULL;
}
}
};
//图像数据输入图像、输出图像、TIF图像
struct ImgData
{
bool bValid; //是否有效
ImgStru srcImg; //输入图像数据
ImgStru dstImg; //输出图像数据
ImgStru geoImg; //TIF文件数据
};
// 情报结构体
struct QBStru
{
//struTranslateProtocal_FJ frameAll; // 全部复接数据
struQB_FJ framePart; // 部分复接数据
ImgData image; // 图像数据
QBStru()
{
//memset(&frameAll, 0, sizeof(struTranslateProtocal_FJ));
memset(&framePart, 0, sizeof(struQB_FJ));
memset(&image, 0, sizeof(ImgData));
}
};
// CH96协议
struct Protocal96TXD
{
//载荷参数
UINT8 head[2]; // 帧头1-2
UINT8 mem1; // 预留,载荷参数开始3
UINT8 SwitchCmd; // 开关指令4
UINT8 Status0; // 状态字0暂无5
UINT8 Status1; // 状态字1图像状态6
UINT16 EOFocus; // 可见光焦距值7-8
UINT8 Status2; // 状态字2伺服状态9
UINT32 FrameCount; // 帧计数值时码10-13
INT16 dx; // 俯仰脱靶量14-15
INT16 dy; // 方位脱靶量16-17
UINT16 IRFocus; // 红外焦距值18-19
UINT16 LaserDis; // 激光测距值20-21
UINT8 LaserState; // 激光状态测距开关22
UINT32 None_1; // 无23-26
UINT32 None_2; // 无27-30
INT16 ZH_Pitch; // 载荷俯仰角31-32
INT16 ZH_Azimuth; // 载荷方位角33-34
UINT16 PixelSize; // 像元大小35-36
UINT16 mem2[6]; // 压缩/所取图像/横向/纵向分辨率37-48
//飞机参数
INT16 PlaneID; //飞机ID49-501-2
INT16 Pitch; //飞机测姿俯仰角51-523-4
INT16 Roll; //飞机测姿滚转角53-545-6
INT16 Yaw; //飞机测姿航向角55-567-8
INT32 Satelite_lon; //飞机测姿经度57-609-12
INT32 Satelite_lat; //飞机测姿纬度61-6413-16
INT32 Satelite_height; //飞机测姿高度65-6817-20
INT16 Satelite_Ground_Speed; //飞机测姿地速69-7021-22
INT16 Satelite_Ground_Speed_Dir; //测姿GPS地速方向71-7223-24
INT16 Satelite_Sky_Speed; //测姿GPS天速73-7425-26
INT16 MTI_Pitch; //MTI俯仰角75-7627-28
INT16 MTI_Roll; //MTI滚转角77-7829-30
INT16 MTI_Yaw; //MTI航向角79-8031-32
INT32 MTI_lon; //MTI经度81-8433-36
INT32 MTI_lat; //MTI纬度85-8837-40
INT16 MTI_height; //MTI高度89-9041-42
INT16 MTI_Ground_Speed; //MTI地速91-9243-44
INT16 MTI_Ground_Speed_Dir; //MTI地速方向93-9445-46
INT16 MTI_Sky_Speed; //MTI天速95-9647-48
UINT32 UTC_Second; //UTC天秒97-10049-52
UINT8 UTC_Year; //UTC年10153
UINT8 UTC_Month; //UTC 月10254
UINT8 UTC_Day; //UTC 日10355
UINT8 NavigationState; //导航状态10456
UINT16 PressureHEG; //气压高度105-10657-58
INT16 AirSpeed; //空速107-10859-60
UINT8 Engine_Speed; //发动机转速10961
INT8 Left_Tmp; //左缸温11062
INT8 Right_Tmp; //右缸温11163
INT8 Pitch_Install_Err; //载荷俯仰安装误差11264
INT8 Roll_Install_Err; //载荷滚转安装误差11365
INT8 Yaw_Install_Err; //载荷偏航安装误差11466
UINT8 mem3; //预留11567
INT8 GPS_Parm[38]; //测姿GPS 参数116-14868-100
UINT16 CRC; //飞参数据校验149-150
};
struct Data96TXD
{
//载荷参数
UINT8 head[2]; // 帧头1-2
UINT8 mem1; // 预留,载荷参数开始3
UINT8 SwitchCmd; // 开关指令4
UINT8 Status0; // 状态字0暂无5
UINT8 Status1; // 状态字1图像状态6
float EOFocus; // 可见光焦距值7-8
UINT8 Status2; // 状态字2伺服状态9
UINT32 FrameCount; // 帧计数值时码10-13
int dx; // 俯仰脱靶量14-15
int dy; // 方位脱靶量16-17
float IRFocus; // 红外焦距值18-19
int LaserDis; // 激光测距值20-21
UINT8 LaserState; // 激光状态测距开关22
UINT32 None_1; // 无23-26
UINT32 None_2; // 无27-30
float ZH_Pitch; // 载荷俯仰角31-32
float ZH_Azimuth; // 载荷方位角33-34
float PixelSize; // 像元大小35-36
UINT16 mem2[6]; // 压缩/所取图像/横向/纵向分辨率37-48
//飞机参数
int PlaneID; //飞机ID49-501-2
float Pitch; //飞机测姿俯仰角51-523-4
float Roll; //飞机测姿滚转角53-545-6
float Yaw; //飞机测姿航向角55-567-8
double Satelite_lon; //飞机测姿经度57-609-12
double Satelite_lat; //飞机测姿纬度61-6413-16
double Satelite_height; //飞机测姿高度65-6817-20
float Satelite_Ground_Speed; //飞机测姿地速69-7021-22
float Satelite_Ground_Speed_Dir; //测姿GPS地速方向71-7223-24
float Satelite_Sky_Speed; //测姿GPS天速73-7425-26
float MTI_Pitch; //MTI俯仰角75-7627-28
float MTI_Roll; //MTI滚转角77-7829-30
float MTI_Yaw; //MTI航向角79-8031-32
double MTI_lon; //MTI经度81-8433-36
double MTI_lat; //MTI纬度85-8837-40
double MTI_height; //MTI高度89-9041-42
float MTI_Ground_Speed; //MTI地速91-9243-44
float MTI_Ground_Speed_Dir; //MTI地速方向93-9445-46
float MTI_Sky_Speed; //MTI天速95-9647-48
int UTC_Second; //UTC天秒97-10049-52
int UTC_Year; //UTC年10153
int UTC_Month; //UTC 月10254
int UTC_Day; //UTC 日10355
UINT8 NavigationState; //导航状态10456
float PressureHEG; //气压高度105-10657-58
float AirSpeed; //空速107-10859-60
int Engine_Speed; //发动机转速10961
int Left_Tmp; //左缸温11062
int Right_Tmp; //右缸温11163
float Pitch_Install_Err; //载荷俯仰安装误差11264
float Roll_Install_Err; //载荷滚转安装误差11365
float Yaw_Install_Err; //载荷偏航安装误差11466
UINT8 mem3; //预留11567
INT8 GPS_Parm[38]; //测姿GPS 参数116-14868-100
UINT16 CRC; //飞参数据校验149-150
};
#pragma pack()

@ -0,0 +1,403 @@
#ifndef QB_IMGPROCESS_H
#define QB_IMGPROCESS_H
#ifdef IMGPROCESS_EXPORTS
#define IMGPROCESS_API __declspec(dllexport)
#else
#define IMGPROCESS_API __declspec(dllimport)
#endif
// OpenCV
#include <opencv2\opencv.hpp>
using namespace cv;
// 情报数据通用结构
#include "QBStru.h"
// 1. 图像去雾控制 算法:王家星
//1.1 功能:图像去雾控制(暗通道先验)
//输入: 1. qbData 通用情报数据结构体
// 2. A_MAX 控制去雾效果, A_MAX < 0 时,自适应计算(特别耗时) 有效范围【0,255】
// 3. degree 控制去雾效果, 有效范围【0,1】
// 4. bSrcFirst 默认时优先处理srcImg, srcImg-->dstImg
// 否则优先处理dstImgdstImg——>dstImg
//输出: 1. qbData 含去雾后图像的情报数据结构体
// 2. 返回值处理成功返回true失败返回false
//说明: 首先判断图像数据有效性标识位,无效时直接返回,不做任何处理;
IMGPROCESS_API bool DoDehazeCtrl(QBStru *qbData,
int A_MAX = -1,
double degree = 0.78,
bool bSrcFirst = true);
//1.2 功能:图像去雾控制(函数重载)
//输入: 1. src 输入图像结构体
// 2. A_MAX 控制去雾效果, A_MAX < 0 时,自适应计算(特别耗时) 有效范围【0,255】
// 3. degree 控制去雾效果, 有效范围【0,1】
//输出: 1. dst 输出图像结构体
// 2. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoDehazeCtrl(ImgStru* src,
ImgStru* dst,
int A_MAX = -1,
double degree = 0.78);
// 2. 图像亮度控制 算法:王家星
//2.1 功能:图像亮度控制
//输入: 1. qbData 通用情报数据结构体
// 2. degree 控制亮度, 有效范围【0,20】值越小越暗越大越亮
// 3. bSrcFirst 默认时优先处理srcImg, srcImg-->dstImg
// 否则优先处理dstImg dstImg——>dstImg
//输出: 1. qbData 含亮度变化后图像的情报数据结构体
// 2. 返回值处理成功返回true失败返回false
//说明: 首先判断图像数据有效性标识位,无效时直接返回,不做任何处理;
IMGPROCESS_API bool DoIntensityCtrl(QBStru *qbData,
int degree = 10,
bool bSrcFirst = true);
//2.2 功能:图像亮度控制(函数重载)
//输入: 1. src 输入图像结构体
// 2. degree 控制亮度,有效范围【0,20】值越小越暗越大越亮
//输出: 1. dst 输出图像结构体
// 2. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoIntensityCtrl(ImgStru* src,
ImgStru* dst,
int degree = 10);
// 3. 图像对比度控制 算法:王家星
//3.1 功能:图像对比度控制
//输入: 1. qbData 通用情报数据结构体
// 2. degree 控制对比度
// 3. bSrcFirst 默认时优先处理srcImg, srcImg-->dstImg
// 否则优先处理dstImgdstImg——>dstImg
//输出: 1. qbData 含对比度变化后图像的情报数据结构体
// 2. 返回值处理成功返回true失败返回false
//说明: 首先判断图像数据有效性标识位,无效时直接返回,不做任何处理;
IMGPROCESS_API bool DoContrastCtrl(QBStru *qbData,
int degree = 10,
bool bSrcFirst = true);
//3.2 功能:图像对比度控制(函数重载)
//输入: 1. src 输入图像结构体
// 2. degree 对比度亮度,有效范围【0,20】值越大对比度越强
//输出: 1. dst 输出图像结构体
// 2. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoContrastCtrl(ImgStru* src,
ImgStru* dst,
int degree = 10);
// 4. 图像清晰度
//4.1 功能:图像清晰度控制
//输入: 1. qbData 通用情报数据结构体
// 2. degree 控制清晰度
// 3. bSrcFirst 默认时优先处理srcImg, srcImg-->dstImg
// 否则优先处理dstImgdstImg——>dstImg
//输出: 1. qbData 含清晰度变化后图像的情报数据结构体
// 2. 返回值处理成功返回true失败返回false
//说明: 首先判断图像数据有效性标识位,无效时直接返回,不做任何处理;
IMGPROCESS_API bool DoDefinitionCtrl(QBStru *qbData,
int degree = 10,
bool bSrcFirst = true);
//4.2 功能:图像清晰度控制(函数重载)
//输入: 1. src 输入图像结构体
// 2. degree 清晰度控制,有效范围【0,20】值越大清晰度越好
//输出: 1. dst 输出图像结构体
// 2. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoDefinitionCtrl(ImgStru* src,
ImgStru* dst,
int degree = 10);
// 5. 单帧图像目标定位 算法:王家星
//5.1 功能:计算图像中心点经纬度坐标、载荷等效俯仰角和方位角
//输入: 1. frame 输入复接数据
//
//输出: 1. Lon 图像中心点经度
// 2. Lat 图像中心点纬度
// 3. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoCalImgCenterCoordinate(double &Lon,
double &Lat,
double &H,
const struQB_FJ *frame);
//5.2 功能:计算图像中任意点经纬度坐标
//输入: 1. frame 输入复接数据
// 2. pt_x
// 3. pt_y
//
//输出: 1. Lon 经度
// 2. Lat 纬度
// 3. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoCalAnyPtCoordinate(double &Lon,
double &Lat,
double &H,
const struQB_FJ *frame,
int pt_x,
int pt_y);
// 6. 几何校正 算法:王家星
//6.1 功能:基于复接数据的图像系统级几何校正
//输入: 1. qbData 通用情报数据结构体
// 2. bSrcFirst 默认时优先对srcImg进行几何校正否则对dstImg进行几何校正
//输出: 1. qbData 含系统级几何校正后图像的情报数据结构体
// 2. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoSysGeoCorrect(QBStru *qbData,
bool bSrcFirst = true);
//6.2 功能:基于复接数据的图像系统级几何校正(重载)
//输入: 1. srcImg 输入图像数据
// 2. qbData 输入复接数据
//输出: 1. dstImg 输出图像数据
// 2. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoSysGeoCorrect(ImgStru *dstImg,
const ImgStru *srcImg,
const struQB_FJ *qbData);
//6.3 功能:基于地面控制点的几何精校正
//输入: 1. srcImg 输入图像数据
// 2. GCP_XY 控制点(像素坐标)
// 3. GCP_LonLat 控制点(经纬度坐标)
// 4. type: 变换类型 -1自适应 0线性 1二次多项式
//输出: 1. dstImg 输出图像数据
// 2. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoGCPGeoCorrectImg(ImgStru *dstImg,
const ImgStru *srcImg,
const std::vector<Point2d>& GCP_XY,
const std::vector<Point2d>& GCP_LonLat,
int type = -1);
//6.4 功能: OpenCV图像格式基于地面控制点的几何精校正
//输入: 1. srcImg 输入图像数据
// 2. GCP_XY 控制点(像素坐标)
// 3. GCP_LonLat 控制点(经纬度坐标)
// 4. type: 变换类型 -1自适应 0线性 1二次多项式
//输出: 1. dstImg 输出图像数据
// 2. LBbox 经纬度边界
// 3. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoGCPGeoCorrectImg( cv::Mat& dstImg,
GeoBoundingBox& LBbox,
const cv::Mat& srcImg,
const std::vector<cv::Point2d>& GCP_XY,
const std::vector<cv::Point2d>& GCP_LonLat,
int type = -1);
//6.5 功能:基于控制点的几何校正
//输入: 1. srcImg 输入图像数据
// 2. GCP_xy 控制点(畸变像素坐标)
// 3. GCP_XY 控制点(参考图像像素坐标)
//输出: 1. dstImg 输出图像数据
// 2. 返回值处理成功返回true失败返回false
IMGPROCESS_API bool DoCPBasedImgCorrect( cv::Mat &dstImg,
const cv::Mat &srcImg,
const std::vector<cv::Point2d>& GCP_xy,
const std::vector<cv::Point2d>& GCP_XY);
// 7. GeoTIFF文件生成保存 算法:王家星
//7.1 功能保存情报数据至本地文件GeoTiff格式
//输入: 1. qbData 通用情报数据结构体
// 2. savePath Tiff文件保存路径
//输出: 1. 返回值保存成功返回true失败返回false
//说明: 可能会先执行几何校正操作,再保存;
IMGPROCESS_API bool SaveToGeoTIFF(QBStru *qbData,
string savePath = "");
//7.2 功能保存图像数据至本地文件GeoTiff格式
//输入: 1. Img 通用情报数据结构体
// 2. savePath Tiff文件保存路径
//输出: 1. 返回值保存成功返回true失败返回false
IMGPROCESS_API bool SaveToGeoTIFF(const ImgStru *Img,
string savePath = "");
//7.3 功能保存图像数据至本地文件GeoTiff格式
//输入: 1. Img OpenCV图像
// 2. LBbox 经纬度边界
// 3. savePath Tiff文件保存路径
//输出: 1. 返回值保存成功返回true失败返回false
IMGPROCESS_API bool SaveToGeoTIFF(cv::Mat& Img,
GeoBoundingBox& LBbox,
string savePath = "");
// 8. 距离、方位量算 算法:王家星
//8.1 功能:计算图像(几何校正前)中两点间的距离和方位(重载)
//输入: 1. frameData 通用复接数据结构体
// 2. pt1 起点(像素坐标)
// 3. pt2 终点(像素坐标)
//输出: 1. distance 距离
// 2. azAngle 方位,起点点到终点
// 3. 返回值计算有效返回true否则返回false
IMGPROCESS_API bool CalculateTwoPtsDistanceAzimuth( double &distance,
double &azAngle,
const struQB_FJ *frameData,
cv::Point pt1,
cv::Point pt2);
//8.2 功能:计算图像中两点间的距离和方位
//输入: 1. qbData 通用情报数据结构体
// 2. pt1 起点(像素坐标)
// 3. pt2 终点(像素坐标)
// 4. flagsflags = 0标识pt1、pt2为几何校正前图像中的点
// flags = 1标识pt1、pt2为几何校正后图像中的点
//输出: 1. distance 距离
// 2. azAngle 方位,起点点到终点
// 3. 返回值计算有效返回true否则返回false
IMGPROCESS_API bool CalculateTwoPtsDistanceAzimuth( double &distance,
double &azAngle,
const QBStru *qbData,
cv::Point pt1,
cv::Point pt2,
int flags = 0);
// 9. 面积量算 算法:王家星
//9.1 功能:计算图像(几何校正前)中多点组成的多边形面积
//输入: 1. frameData 复接数据
// 2. points 指向点坐标的指针
// 3. count 点数目
//输出: 1. area :多边形面积
// 2. 返回值计算有效返回true否则返回false
IMGPROCESS_API bool CalculatePloygonArea(double &area,
const struQB_FJ *frameData,
cv::Point *points,
int count);
//9.2 功能:计算图像中多边形面积
//输入: 1. qbData 通用情报数据结构体
// 2. point 多点指针(像素坐标)
// 3. count 点数目
// 4. flagsflags = 0标识为几何校正前图像中的点
// flags = 1标识为几何校正后图像中的点
//输出: 1. area 面积(平方米)
// 2. 返回值计算有效返回true否则返回false
//说明: 各点应为顺序或者逆序,不能乱序
IMGPROCESS_API bool CalculatePloygonArea(double &area,
const QBStru *qbData,
cv::Point* point,
int count,
int flags = 0);
//10 功能:基于经纬度读取地面高程
//输入:
// 1. fLonDeg: 经度(度)
// 2. fLatDeg: 纬度(度)
// 3. sDir: 高程数据文件存储路径, 默认设为:"D:\\ElevationData"
//
//输出:
// 1. fElevator:高程(米)
//
//返回值若函数运行成功返回true否则返回false
IMGPROCESS_API bool GetElevation( float& fElevator, double dLonDeg, double dLatDeg, string sDir, bool bNearst = false);
IMGPROCESS_API void ClearDem();
// 11 图像融合算法
// 11.1 功能:函数 DoFastFuseImgRGBplusIR() 快速融合两幅输入图像
// 输入:
// img1 输入图像1RGB三通道
// img2 输入图像2IR三通道或单通道
// 输出:
// dst: 融合图像
// 返回值:
// 运算有效返回true否则返回false
IMGPROCESS_API bool DoFastFuseImgRGBplusIR(cv::Mat &dst, const cv::Mat RGBimg, const cv::Mat IRimg);
// 11.2 功能:函数 DoFuseImgRGBplusIR() 基于小波变换融合两幅输入图像
// 输入:
// img1 输入图像1RGB三通道
// img2 输入图像2IR三通道或单通道
// wname: 小波名称
// 支持小波:
// 1. haar
// 2. symN [1, 10]
// 3. dbN [1, 10]
// 4. coifN [1, 5]
// level小波分解层数
// 输出:
// dst: 融合图像
// 返回值:
// 运算有效返回true否则返回false
IMGPROCESS_API bool DoFuseImgRGBplusIR(cv::Mat &dst, const cv::Mat RGBimg, const cv::Mat IRimg, const string wname = "sym5", const unsigned int level = 10);
// 11.3 功能:函数 FuseImg() 基于小波变换融合两幅输入图像
// 输入:
// img1 输入图像1
// img2 输入图像2
// wname: 小波名称
// 支持小波:
// 1. haar
// 2. symN [1, 10]
// 3. dbN [1, 10]
// 4. coifN [1, 10]
// level小波分解层数
// 输出:
// dst: 融合图像
// 返回值:
// 运算有效返回true否则返回false
IMGPROCESS_API bool DoFuseImg(cv::Mat &dst, const cv::Mat img1, const cv::Mat img2, const string wname = "sym5", const unsigned int level = 10);
// 12 超分重建
// 功能:灰度图像(红外图像)超分辨率构建
// 输入:
// imgDeque 输入图像序列要求图像尺寸相同类型为CV_8UC1
// 输出:
// dst: 输出超分图像
// 返回重建中有效的图像数目
IMGPROCESS_API int GetSuperResolutionImg(cv::Mat &dst, const std::deque<cv::Mat> &imgDeque, double multiple = 2);
#endif

250
Src/.gitignore vendored

@ -0,0 +1,250 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
[Xx]64/
[Xx]86/
[Bb]uild/
bld/
[Bb]in/
[Oo]bj/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# DNX
project.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Un-comment the next line if you do not want to checkin
# your web deploy settings because they may include unencrypted
# passwords
#*.pubxml
*.publishproj
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directory
AppPackages/
BundleArtifacts/
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# LightSwitch generated files
GeneratedArtifacts/
ModelManifest.xml
# Paket dependency manager
.paket/paket.exe
# FAKE - F# Make
.fake/
#klocwork
.klocwork/
#GIS
GISControlDlg20140626/
.cpptest/
.parasoft
.parasoft.dat/

@ -0,0 +1,32 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.9.34728.123
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CH91PayloadSoftware", "CH91PayloadSoftware\CH91PayloadSoftware.vcxproj", "{89E02284-2466-4FFA-B5D4-12173645A4F1}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Decoder_H264_ALL", "Decoder_H264_ALL\Decoder_H264_ALL.vcxproj", "{5756743E-2CA9-41B7-A71D-0A4044E2F1A0}"
EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "FH98ViewOnPlane_Setup", "FH98ViewOnPlane_Setup\FH98ViewOnPlane_Setup.vdproj", "{DD324AC4-6BFF-4572-96FE-4BB937DDC038}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{89E02284-2466-4FFA-B5D4-12173645A4F1}.Debug|Win32.ActiveCfg = Debug|Win32
{89E02284-2466-4FFA-B5D4-12173645A4F1}.Debug|Win32.Build.0 = Debug|Win32
{89E02284-2466-4FFA-B5D4-12173645A4F1}.Release|Win32.ActiveCfg = Release|Win32
{89E02284-2466-4FFA-B5D4-12173645A4F1}.Release|Win32.Build.0 = Release|Win32
{5756743E-2CA9-41B7-A71D-0A4044E2F1A0}.Debug|Win32.ActiveCfg = Debug|Win32
{5756743E-2CA9-41B7-A71D-0A4044E2F1A0}.Debug|Win32.Build.0 = Debug|Win32
{5756743E-2CA9-41B7-A71D-0A4044E2F1A0}.Release|Win32.ActiveCfg = Release|Win32
{5756743E-2CA9-41B7-A71D-0A4044E2F1A0}.Release|Win32.Build.0 = Release|Win32
{DD324AC4-6BFF-4572-96FE-4BB937DDC038}.Debug|Win32.ActiveCfg = Debug
{DD324AC4-6BFF-4572-96FE-4BB937DDC038}.Release|Win32.ActiveCfg = Release
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

File diff suppressed because it is too large Load Diff

@ -0,0 +1,391 @@
//*************************************************************************
// BCMenu.h : header file
// Version : 3.02
// Date : March 2002
// Author : Brent Corkum
// Email : corkum@rocscience.com
// Latest Version : http://www.rocscience.com/~corkum/BCMenu.html
//
// Bug Fixes and portions of code supplied by:
//
// Ben Ashley,Girish Bharadwaj,Jean-Edouard Lachand-Robert,
// Robert Edward Caldecott,Kenny Goers,Leonardo Zide,
// Stefan Kuhr,Reiner Jung,Martin Vladic,Kim Yoo Chul,
// Oz Solomonovich,Tongzhe Cui,Stephane Clog,Warren Stevens,
// Damir Valiulin,David Kinder,Marc Loiry
//
// You are free to use/modify this code but leave this header intact.
// This class is public domain so you are free to use it any of
// your applications (Freeware,Shareware,Commercial). All I ask is
// that you let me know so that if you have a real winner I can
// brag to my buddies that some of my code is in your app. I also
// wouldn't mind if you sent me a copy of your application since I
// like to play with new stuff.
//*************************************************************************
#ifndef BCMenu_H
#define BCMenu_H
#include <afxtempl.h>
// BCMenuData class. Fill this class structure to define a single menu item:
class BCMenuData
{
wchar_t *m_szMenuText;
public:
BCMenuData () {menuIconNormal=-1;xoffset=-1;bitmap=NULL;pContext=NULL;
nFlags=0;nID=0;syncflag=0;m_szMenuText=NULL;global_offset=-1;threeD=FALSE;};
void SetAnsiString(LPCSTR szAnsiString);
void SetWideString(const wchar_t *szWideString);
const wchar_t *GetWideString(void) {return m_szMenuText;};
~BCMenuData ();
CString GetString(void);//returns the menu text in ANSI or UNICODE
int xoffset,global_offset;
BOOL threeD;
int menuIconNormal;
UINT nFlags,nID,syncflag;
CImageList *bitmap;
void *pContext; // used to attach user data
};
//struct CMenuItemInfo : public MENUITEMINFO {
struct CMenuItemInfo : public
//MENUITEMINFO
#ifndef UNICODE //SK: this fixes warning C4097: typedef-name 'MENUITEMINFO' used as synonym for class-name 'tagMENUITEMINFOA'
tagMENUITEMINFOA
#else
tagMENUITEMINFOW
#endif
{
CMenuItemInfo()
{
memset(this, 0, sizeof(MENUITEMINFO));
cbSize = sizeof(MENUITEMINFO);
}
};
// how the menu's are drawn, either original or XP style
typedef enum {BCMENU_DRAWMODE_ORIGINAL,BCMENU_DRAWMODE_XP} BC_MenuDrawMode;
// how seperators are handled when removing a menu (Tongzhe Cui)
typedef enum {BCMENU_NONE, BCMENU_HEAD, BCMENU_TAIL, BCMENU_BOTH} BC_Seperator;
// defines for unicode support
#ifndef UNICODE
#define AppendMenu AppendMenuA
#define InsertMenu InsertMenuA
#define InsertODMenu InsertODMenuA
#define AppendODMenu AppendODMenuA
#define AppendODPopupMenu AppendODPopupMenuA
#define ModifyODMenu ModifyODMenuA
#else
#define AppendMenu AppendMenuW
#define InsertMenu InsertMenuW
#define InsertODMenu InsertODMenuW
#define AppendODMenu AppendODMenuW
#define ModifyODMenu ModifyODMenuW
#define AppendODPopupMenu AppendODPopupMenuW
#endif
class BCMenu : public CMenu
{
DECLARE_DYNAMIC( BCMenu )
public:
BCMenu();
virtual ~BCMenu();
// Functions for loading and applying bitmaps to menus (see example application)
virtual BOOL LoadMenu(LPCTSTR lpszResourceName);
virtual BOOL LoadMenu(int nResource);
BOOL LoadToolbar(UINT nToolBar);
BOOL LoadToolbars(const UINT *arID,int n);
void AddFromToolBar(CToolBar* pToolBar, int nResourceID);
BOOL LoadFromToolBar(UINT nID,UINT nToolBar,int& xoffset);
BOOL AddBitmapToImageList(CImageList *list,UINT nResourceID);
static HBITMAP LoadSysColorBitmap(int nResourceId);
void LoadCheckmarkBitmap(int unselect,int select); // custom check mark bitmaps
// functions for appending a menu option, use the AppendMenu call (see above define)
BOOL AppendMenuA(UINT nFlags,UINT nIDNewItem=0,const char *lpszNewItem=NULL,int nIconNormal=-1);
BOOL AppendMenuA(UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CImageList *il,int xoffset);
BOOL AppendMenuA(UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CBitmap *bmp);
BOOL AppendMenuW(UINT nFlags,UINT nIDNewItem=0,wchar_t *lpszNewItem=NULL,int nIconNormal=-1);
BOOL AppendMenuW(UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CImageList *il,int xoffset);
BOOL AppendMenuW(UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CBitmap *bmp);
BOOL AppendODMenuA(LPCSTR lpstrText,UINT nFlags = MF_OWNERDRAW,UINT nID = 0,int nIconNormal = -1);
BOOL AppendODMenuW(wchar_t *lpstrText,UINT nFlags = MF_OWNERDRAW,UINT nID = 0,int nIconNormal = -1);
BOOL AppendODMenuA(LPCSTR lpstrText,UINT nFlags,UINT nID,CImageList *il,int xoffset);
BOOL AppendODMenuW(wchar_t *lpstrText,UINT nFlags,UINT nID,CImageList *il,int xoffset);
// for appending a popup menu (see example application)
BCMenu* AppendODPopupMenuA(LPCSTR lpstrText);
BCMenu* AppendODPopupMenuW(wchar_t *lpstrText);
// functions for inserting a menu option, use the InsertMenu call (see above define)
BOOL InsertMenuA(UINT nPosition,UINT nFlags,UINT nIDNewItem=0,const char *lpszNewItem=NULL,int nIconNormal=-1);
BOOL InsertMenuA(UINT nPosition,UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CImageList *il,int xoffset);
BOOL InsertMenuA(UINT nPosition,UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CBitmap *bmp);
BOOL InsertMenuW(UINT nPosition,UINT nFlags,UINT nIDNewItem=0,wchar_t *lpszNewItem=NULL,int nIconNormal=-1);
BOOL InsertMenuW(UINT nPosition,UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CImageList *il,int xoffset);
BOOL InsertMenuW(UINT nPosition,UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CBitmap *bmp);
BOOL InsertODMenuA(UINT nPosition,LPCSTR lpstrText,UINT nFlags = MF_OWNERDRAW,UINT nID = 0,int nIconNormal = -1);
BOOL InsertODMenuW(UINT nPosition,wchar_t *lpstrText,UINT nFlags = MF_OWNERDRAW,UINT nID = 0,int nIconNormal = -1);
BOOL InsertODMenuA(UINT nPosition,LPCSTR lpstrText,UINT nFlags,UINT nID,CImageList *il,int xoffset);
BOOL InsertODMenuW(UINT nPosition,wchar_t *lpstrText,UINT nFlags,UINT nID,CImageList *il,int xoffset);
// functions for modifying a menu option, use the ModifyODMenu call (see above define)
BOOL ModifyODMenuA(const char *lpstrText,UINT nID=0,int nIconNormal=-1);
BOOL ModifyODMenuA(const char *lpstrText,UINT nID,CImageList *il,int xoffset);
BOOL ModifyODMenuA(const char *lpstrText,UINT nID,CBitmap *bmp);
BOOL ModifyODMenuA(const char *lpstrText,const char *OptionText,int nIconNormal);
BOOL ModifyODMenuW(wchar_t *lpstrText,UINT nID=0,int nIconNormal=-1);
BOOL ModifyODMenuW(wchar_t *lpstrText,UINT nID,CImageList *il,int xoffset);
BOOL ModifyODMenuW(wchar_t *lpstrText,UINT nID,CBitmap *bmp);
BOOL ModifyODMenuW(wchar_t *lpstrText,wchar_t *OptionText,int nIconNormal);
// use this method for adding a solid/hatched colored square beside a menu option
// courtesy of Warren Stevens
BOOL ModifyODMenuA(const char *lpstrText,UINT nID,COLORREF fill,COLORREF border,int hatchstyle=-1,CSize *pSize=NULL);
BOOL ModifyODMenuW(wchar_t *lpstrText,UINT nID,COLORREF fill,COLORREF border,int hatchstyle=-1,CSize *pSize=NULL);
// for deleting and removing menu options
BOOL RemoveMenu(UINT uiId,UINT nFlags);
BOOL DeleteMenu(UINT uiId,UINT nFlags);
// sPos means Seperator's position, since we have no way to find the seperator's position in the menu
// we have to specify them when we call the RemoveMenu to make sure the unused seperators are removed;
// sPos = None no seperator removal;
// = Head seperator in front of this menu item;
// = Tail seperator right after this menu item;
// = Both seperators at both ends;
// remove the menu item based on their text, return -1 if not found, otherwise return the menu position;
int RemoveMenu(char* pText, BC_Seperator sPos=BCMENU_NONE);
int RemoveMenu(wchar_t* pText, BC_Seperator sPos=BCMENU_NONE);
int DeleteMenu(char* pText, BC_Seperator sPos=BCMENU_NONE);
int DeleteMenu(wchar_t* pText, BC_Seperator sPos=BCMENU_NONE);
// Destoying
virtual BOOL DestroyMenu();
// function for retrieving and setting a menu options text (use this function
// because it is ownerdrawn)
BOOL GetMenuText(UINT id,CString &string,UINT nFlags = MF_BYPOSITION);
BOOL SetMenuText(UINT id,CString string, UINT nFlags = MF_BYPOSITION);
// Getting a submenu from it's name or position
BCMenu* GetSubBCMenu(char* lpszSubMenuName);
BCMenu* GetSubBCMenu(wchar_t* lpszSubMenuName);
CMenu* GetSubMenu (LPCTSTR lpszSubMenuName);
CMenu* GetSubMenu (int nPos);
int GetMenuPosition(char* pText);
int GetMenuPosition(wchar_t* pText);
// Drawing:
virtual void DrawItem( LPDRAWITEMSTRUCT); // Draw an item
virtual void MeasureItem( LPMEASUREITEMSTRUCT ); // Measure an item
// Static functions used for handling menu's in the mainframe
static void UpdateMenu(CMenu *pmenu);
static BOOL IsMenu(CMenu *submenu);
static BOOL IsMenu(HMENU submenu);
static LRESULT FindKeyboardShortcut(UINT nChar,UINT nFlags,CMenu *pMenu);
// Function to set how menu is drawn, either original or XP style
static void SetMenuDrawMode(UINT mode){
BCMenu::original_drawmode=mode;
BCMenu::xp_drawmode=mode;
};
// Function to set how disabled items are drawn (mode=FALSE means they are not drawn selected)
static void SetSelectDisableMode(BOOL mode){
BCMenu::original_select_disabled=mode;
BCMenu::xp_select_disabled=mode;
};
static int BCMenu::GetMenuDrawMode(void);
static BOOL BCMenu::GetSelectDisableMode(void);
// how the bitmaps are drawn in XP Luna mode
static void SetXPBitmap3D(BOOL val){
BCMenu::xp_draw_3D_bitmaps=val;
};
static BOOL GetXPBitmap3D(void){return BCMenu::xp_draw_3D_bitmaps;}
// Customizing:
// Set icon size
void SetIconSize (int, int);
// set the color in the bitmaps that is the background transparent color
void SetBitmapBackground(COLORREF color);
void UnSetBitmapBackground(void);
// obsolete functions for setting how menu images are dithered for disabled menu options
BOOL GetDisableOldStyle(void);
void SetDisableOldStyle(void);
void UnSetDisableOldStyle(void);
static COLORREF LightenColor(COLORREF col,double factor);
static COLORREF DarkenColor(COLORREF col,double factor);
// Miscellaneous Protected Member functions
protected:
static BOOL IsNewShell(void);
static BOOL IsWinXPLuna(void);
static BOOL IsLunaMenuStyle(void);
static BOOL IsWindowsClassicTheme(void);
BCMenuData *BCMenu::FindMenuItem(UINT nID);
BCMenu *FindMenuOption(int nId,int& nLoc);
BCMenu *FindAnotherMenuOption(int nId,int& nLoc,CArray<BCMenu*,BCMenu*>&bcsubs,
CArray<int,int&>&bclocs);
BCMenuData *FindMenuOption(wchar_t *lpstrText);
void InsertSpaces(void);
void DrawCheckMark(CDC *pDC,int x,int y,COLORREF color);
void DrawRadioDot(CDC *pDC,int x,int y,COLORREF color);
BCMenuData *NewODMenu(UINT pos,UINT nFlags,UINT nID,CString string);
void SynchronizeMenu(void);
void BCMenu::InitializeMenuList(int value);
void BCMenu::DeleteMenuList(void);
BCMenuData *BCMenu::FindMenuList(UINT nID);
void DrawItem_Win9xNT2000 (LPDRAWITEMSTRUCT lpDIS);
void DrawItem_WinXP (LPDRAWITEMSTRUCT lpDIS);
BOOL Draw3DCheckmark(CDC *dc, const CRect& rc,BOOL bSelected,HBITMAP hbmCheck);
BOOL DrawXPCheckmark(CDC *dc, const CRect& rc, HBITMAP hbmCheck,COLORREF &colorout);
void DitherBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth,
int nHeight, HBITMAP hbm, int nXSrc, int nYSrc,COLORREF bgcolor);
void DitherBlt2(CDC *drawdc, int nXDest, int nYDest, int nWidth,
int nHeight, CBitmap &bmp, int nXSrc, int nYSrc,COLORREF bgcolor);
BOOL GetBitmapFromImageList(CDC* pDC,CImageList *imglist,int nIndex,CBitmap &bmp);
BOOL ImageListDuplicate(CImageList *il,int xoffset,CImageList *newlist);
static WORD NumBitmapColors(LPBITMAPINFOHEADER lpBitmap);
void ColorBitmap(CDC* pDC, CBitmap& bmp,CSize bitmap_size,CSize icon_size,COLORREF fill,COLORREF border,int hatchstyle=-1);
void RemoveTopLevelOwnerDraw(void);
int GetMenuStart(void);
void GetFadedBitmap(CBitmap &bmp);
void GetShadowBitmap(CBitmap &bmp);
int AddToGlobalImageList(CImageList *il,int xoffset,int nID);
int GlobalImageListOffset(int nID);
BOOL CanDraw3DImageList(int offset);
// Member Variables
protected:
CTypedPtrArray<CPtrArray, BCMenuData*> m_MenuList; // Stores list of menu items
// When loading an owner-drawn menu using a Resource, BCMenu must keep track of
// the popup menu's that it creates. Warning, this list *MUST* be destroyed
// last item first :)
CTypedPtrArray<CPtrArray, HMENU> m_SubMenus; // Stores list of sub-menus
// Stores a list of all BCMenu's ever created
static CTypedPtrArray<CPtrArray, HMENU> m_AllSubMenus;
// Global ImageList
static CImageList m_AllImages;
static CArray<int,int&> m_AllImagesID;
// icon size
int m_iconX,m_iconY;
COLORREF m_bitmapBackground;
BOOL m_bitmapBackgroundFlag;
BOOL disable_old_style;
static UINT original_drawmode;
static BOOL original_select_disabled;
static UINT xp_drawmode;
static BOOL xp_select_disabled;
static BOOL xp_draw_3D_bitmaps;
CImageList *checkmaps;
BOOL checkmapsshare;
int m_selectcheck;
int m_unselectcheck;
BOOL m_bDynIcons;
BOOL m_loadmenu;
};
class BCMenuToolBar : public CToolBar{
public:
BCMenuToolBar() : CToolBar() {m_iconX=m_iconY=0;}
BOOL LoadToolBar(LPCTSTR lpszResourceName);
BOOL LoadToolBar(UINT nIDResource){
return LoadToolBar(MAKEINTRESOURCE(nIDResource));
}
BOOL LoadBitmap(LPCTSTR lpszResourceName);
void GetIconSize(int &iconx,int &icony){iconx=m_iconX;icony=m_iconY;}
protected:
int m_iconX,m_iconY;
};
#define BCMENU_USE_MEMDC
#ifdef BCMENU_USE_MEMDC
//////////////////////////////////////////////////
// BCMenuMemDC - memory DC
//
// Author: Keith Rule
// Email: keithr@europa.com
// Copyright 1996-1997, Keith Rule
//
// You may freely use or modify this code provided this
// Copyright is included in all derived versions.
//
// History - 10/3/97 Fixed scrolling bug.
// Added print support.
// 25 feb 98 - fixed minor assertion bug
//
// This class implements a memory Device Context
class BCMenuMemDC : public CDC
{
public:
// constructor sets up the memory DC
BCMenuMemDC(CDC* pDC,LPCRECT lpSrcRect) : CDC()
{
ASSERT(pDC != NULL);
m_rect.CopyRect(lpSrcRect);
m_pDC = pDC;
m_pOldBitmap = NULL;
m_bMemDC = !pDC->IsPrinting();
if (m_bMemDC) // Create a Memory DC
{
CreateCompatibleDC(pDC);
m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
m_pOldBitmap = SelectObject(&m_bitmap);
SetWindowOrg(m_rect.left, m_rect.top);
}
else // Make a copy of the relevent parts of the current DC for printing
{
m_bPrinting = pDC->m_bPrinting;
m_hDC = pDC->m_hDC;
m_hAttribDC = pDC->m_hAttribDC;
}
}
// Destructor copies the contents of the mem DC to the original DC
~BCMenuMemDC()
{
if (m_bMemDC)
{
// Copy the offscreen bitmap onto the screen.
m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
this, m_rect.left, m_rect.top, SRCCOPY);
//Swap back the original bitmap.
SelectObject(m_pOldBitmap);
} else {
// All we need to do is replace the DC with an illegal value,
// this keeps us from accidently deleting the handles associated with
// the CDC that was passed to the constructor.
m_hDC = m_hAttribDC = NULL;
}
}
// Allow usage as a pointer
BCMenuMemDC* operator->() {return this;}
// Allow usage as a pointer
operator BCMenuMemDC*() {return this;}
private:
CBitmap m_bitmap; // Offscreen bitmap
CBitmap* m_pOldBitmap; // bitmap originally found in BCMenuMemDC
CDC* m_pDC; // Saves CDC passed in constructor
CRect m_rect; // Rectangle of drawing area.
BOOL m_bMemDC; // TRUE if CDC really is a Memory DC.
};
#endif
#endif
//*************************************************************************

@ -0,0 +1,138 @@
#include "stdafx.h"
#include "BackgroundUtil.h"
// Download by http://www.codefans.net
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBackgroundUtil::CBackgroundUtil()
{
}
CBackgroundUtil::~CBackgroundUtil()
{
m_BmpPattern.Detach();
m_BmpPalette.Detach();
}
BOOL CBackgroundUtil::SetBitmap(UINT uResourceID)
{
BITMAP bm;
BOOL bRet;
// Detach previous resources
m_BmpPattern.Detach();
m_BmpPalette.Detach();
// Default return value
bRet = TRUE;
// Load new bitmap
if (uResourceID != 0)
{
bRet = GetBitmapAndPalette(uResourceID, m_BmpPattern, m_BmpPalette);
// If all ok
if (bRet == TRUE)
{
// Get dimension
m_BmpPattern.GetBitmap(&bm);
// Width of the bitmap
m_nBmpWidth = bm.bmWidth;
// Height of the bitmap
m_nBmpHeight = bm.bmHeight;
}
}
return bRet;
} // End of SetBitmap
BOOL CBackgroundUtil::GetBitmapAndPalette(UINT nIDResource, CBitmap & bitmap, CPalette & pal)
{
LPCTSTR lpszResourceName = (LPCTSTR)nIDResource;
HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(),
lpszResourceName, IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION);
if (hBmp == NULL) return FALSE;
bitmap.Attach(hBmp);
// Create a logical palette for the bitmap
DIBSECTION ds;
BITMAPINFOHEADER &bmInfo = ds.dsBmih;
bitmap.GetObject(sizeof(ds), &ds);
int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount;
// Create a halftone palette if colors > 256.
CClientDC dc(NULL); // Desktop DC
if(nColors > 256)
pal.CreateHalftonePalette(&dc);
else
{
// Create the palette
RGBQUAD *pRGB = new RGBQUAD[nColors];
CDC memDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject( &bitmap );
::GetDIBColorTable( memDC, 0, nColors, pRGB );
UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
pLP->palVersion = 0x300;
pLP->palNumEntries = nColors;
for (int i=0; i < nColors; i++)
{
pLP->palPalEntry[i].peRed = pRGB[i].rgbRed;
pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
pLP->palPalEntry[i].peFlags = 0;
}
pal.CreatePalette( pLP );
delete[] pLP;
delete[] pRGB;
}
return TRUE;
} // End of GetBitmapAndPalette
BOOL CBackgroundUtil::TileBitmap(CDC* pDC, CRect rc)
{
CDC MemDC;
int x = 0, y = 0;
// If there is a bitmap loaded
if (m_BmpPattern.m_hObject != NULL)
{
MemDC.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = MemDC.SelectObject(&m_BmpPattern);
// Tile the bitmap
while (y < rc.Height())
{
while(x < rc.Width())
{
pDC->BitBlt(x, y, m_nBmpWidth, m_nBmpHeight, &MemDC, 0, 0, SRCCOPY);
x += m_nBmpWidth;
}
x = 0;
y += m_nBmpHeight;
}
MemDC.SelectObject(pOldBitmap);
return TRUE;
}
return FALSE; // Normal behaviour
} // End of TileBitmap

@ -0,0 +1,25 @@
#ifndef _BACKGROUNDUTIL_H_
#define _BACKGROUNDUTIL_H_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
class CBackgroundUtil
{
public:
BOOL SetBitmap(UINT uResourceID = 0);
CBackgroundUtil();
virtual ~CBackgroundUtil();
protected:
BOOL TileBitmap(CDC* pDC, CRect rc);
BOOL GetBitmapAndPalette(UINT nIDResource, CBitmap& bitmap, CPalette& pal);
// For background bitmap
CBitmap m_BmpPattern;
CPalette m_BmpPalette;
int m_nBmpWidth;
int m_nBmpHeight;
};
#endif

File diff suppressed because it is too large Load Diff

@ -0,0 +1,145 @@
#if !defined(AFX_BITMAPSLIDER_H__BED36788_B60C_4C9E_AC56_FE430B93A0FD__INCLUDED_)
#define AFX_BITMAPSLIDER_H__BED36788_B60C_4C9E_AC56_FE430B93A0FD__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// BitmapSlider.h : header file
//
/////////////////////////////////////////////////////////////////////////////
//
// CBitmapSlider v1.5
//
// It's free for everywhere - 16/September/2003 - Joon-ho Ryu
//
/////////////////////////////////////////////////////////////////////////////
#include "memdc.h" // "Flicker Free Drawing In MFC" by Keith Rule
#define WM_BITMAPSLIDER_MOVING WM_USER + 9425
#define WM_BITMAPSLIDER_MOVED WM_USER + 9426
class CBitmapSlider : public CStatic
{
// Construction
public:
CBitmapSlider();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CBitmapSlider)
//}}AFX_VIRTUAL
// Implementation
public:
void GetRange( int &nMin, int &nMax ) { nMin = m_nMin; nMax = m_nMax; };
int GetRangeMax() { return m_nMax; };
int GetRangeMin() { return m_nMin; };
int GetPos() { return m_nPos; };
void SetRange( int nMin, int nMax, BOOL bRedraw=FALSE );
void SetRangeMin(int nMin, BOOL bRedraw = FALSE);
void SetRangeMax( int nMax, BOOL bRedraw = FALSE );
void SetPos( int nPos );
int SetPageSize( int nSize );
BOOL SetBitmapChannel(
UINT nChannelID, UINT nActiveID=NULL, BOOL bTransparent=FALSE,
COLORREF clrpTransColor=0xFF000000, int iTransPixelX=0, int iTransPixelY=0 );
BOOL SetBitmapThumb(
UINT nThumbID, UINT nActiveID=NULL, BOOL bTransparent=FALSE,
COLORREF clrpTransColor=0xFF000000, int iTransPixelX=0, int iTransPixelY=0 );
void SetMargin( int nLeft, int nTop, int nRight, int nBottom );
void SetMarginTop( int nMargin ) { m_nMarginTop = nMargin; };
void SetMarginLeft( int nMargin ) { m_nMarginLeft = nMargin; };
void SetMarginRight( int nMargin ) { m_nMarginRight = nMargin; };
void SetMarginBottom( int nMargin ) { m_nMarginBottom = nMargin; };
void SetVertical( BOOL bVertical=TRUE ) { m_bVertical = bVertical; };
void Enable( BOOL bEnable = TRUE );
void DrawFocusRect( BOOL bDraw = TRUE, BOOL bRedraw = FALSE );
virtual ~CBitmapSlider();
// Generated message map functions
protected:
void RestoreBackground(
CDC *pDC, int nXDst, int nYDst, int nWidth, int nHeight, CBitmap *pBmSrc);
void CopyBackground(
CDC *pDC, int nXSrc, int nYSrc, int nWidth, int nHeight, CBitmap *pBmDst );
void DrawBitmap(
CDC* pDC, int xStart, int yStart, int wWidth, int wHeight,
CDC* pTmpDC, int xSource, int ySource,
CBitmap *bmMask = NULL, BOOL bTransparent = FALSE );
void DrawTransparentBitmap(
CDC* pDC, int xStart, int yStart, int wWidth, int wHeight,
CDC* pTmpDC, int xSource, int ySource, CBitmap *bmMask );
void PrepareMask(
CBitmap* pBmpSource, CBitmap* pBmpMask,
COLORREF clrpTransColor=0xFF000000, int iTransPixelX=0, int iTransPixelY=0 );
int Pixel2Pos( int nPixel );
int Pos2Pixel( int nPos );
int m_nMax, m_nMin, m_nPos, m_nPage;
CRect m_rect;
int m_nWidth, m_nHeight;
int m_nThumbWidth, m_nThumbHeight;
int m_nMarginLeft, m_nMarginRight, m_nMarginTop, m_nMarginBottom;
int m_nThumbBgX, m_nThumbBgY;
int m_nMouseOffset;
BOOL m_bVertical;
BOOL m_bChannelActive, m_bThumbActive;
BOOL m_bTransparentChannel, m_bTransparentThumb, m_bThumb, m_bChannel;
BOOL m_bLButtonDown, m_bFocus, m_bFocusRect, m_bDrawFocusRect;
BOOL m_bEnable;
CBitmap m_bmChannel, m_bmChannelMask, m_bmChannelActive, m_bmChannelActiveMask;
CBitmap m_bmThumb, m_bmThumbMask, m_bmThumbActive, m_bmThumbActiveMask, m_bmThumbBg;
//{{AFX_MSG(CBitmapSlider)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg UINT OnGetDlgCode();
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnSetFocus(CWnd* pOldWnd);
afx_msg void OnDestroy();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
// This is CStatic method
void SetBitmap( HBITMAP hBitmap ) {};
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_BITMAPSLIDER_H__BED36788_B60C_4C9E_AC56_FE430B93A0FD__INCLUDED_)

@ -0,0 +1,66 @@
// BkDialog.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "BkDialog.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CBkDialog::CBkDialog(CWnd* pParent /*=NULL*/)
{
//{{AFX_DATA_INIT(CBkDialog)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
CBkDialog::CBkDialog(UINT uResourceID, CWnd* pParent)
: CDialog(uResourceID, pParent)
{
}
CBkDialog::CBkDialog(LPCTSTR pszResourceID, CWnd* pParent)
: CDialog(pszResourceID, pParent)
{
}
CBkDialog::~CBkDialog()
{
}
void CBkDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CBkDialog)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CBkDialog, CDialog)
//{{AFX_MSG_MAP(CBkDialog)
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CBkDialog::OnEraseBkgnd(CDC* pDC)
{
CRect rc;
GetClientRect(rc);
m_pDC = pDC;
if (TileBitmap(pDC, rc) == TRUE)
return TRUE;
else
return CDialog::OnEraseBkgnd(pDC);
} // End of OnEraseBkgnd

@ -0,0 +1,50 @@
#ifndef _BKDIALOG_H_
#define _BKDIALOG_H_
#include "BackgroundUtil.h"
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CBkDialog dialog
class CBkDialog : public CDialog, public CBackgroundUtil
{
// Construction
public:
CDC* m_pDC;
~CBkDialog();
CBkDialog(LPCTSTR pszResourceID, CWnd* pParent = NULL);
CBkDialog(UINT uResourceID, CWnd* pParent = NULL);
CBkDialog(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CBkDialog)
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CBkDialog)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CBkDialog)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif

File diff suppressed because it is too large Load Diff

@ -0,0 +1,241 @@
//
// Class: CButtonST
//
// Note: Code for the PreSubclassWindow and OnSetStyle functions
// has been taken from the COddButton class
// published by Paolo Messina and Jerzy Kaczorowski
//
// Disclaimer
// ----------
// THIS SOFTWARE AND THE ACCOMPANYING FILES ARE DISTRIBUTED "AS IS" AND WITHOUT
// ANY WARRANTIES WHETHER EXPRESSED OR IMPLIED. NO REPONSIBILITIES FOR POSSIBLE
// DAMAGES OR EVEN FUNCTIONALITY CAN BE TAKEN. THE USER MUST ASSUME THE ENTIRE
// RISK OF USING THIS SOFTWARE.
//
// Terms of use
// ------------
// THIS SOFTWARE IS FREE FOR PERSONAL USE OR FREEWARE APPLICATIONS.
// IF YOU USE THIS SOFTWARE IN COMMERCIAL OR SHAREWARE APPLICATIONS YOU
// ARE GENTLY ASKED TO DONATE 1$ (ONE U.S. DOLLAR) TO THE AUTHOR:
#ifndef _BTNST_H
#define _BTNST_H
// Uncomment the following 2 lines to enable support for BCMenu class
#define BTNST_USE_BCMENU
#include "BCMenu.h"
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// Return values
#ifndef BTNST_OK
#define BTNST_OK 0
#endif
#ifndef BTNST_INVALIDRESOURCE
#define BTNST_INVALIDRESOURCE 1
#endif
#ifndef BTNST_FAILEDMASK
#define BTNST_FAILEDMASK 2
#endif
#ifndef BTNST_INVALIDINDEX
#define BTNST_INVALIDINDEX 3
#endif
#ifndef BTNST_INVALIDALIGN
#define BTNST_INVALIDALIGN 4
#endif
#ifndef BTNST_BADPARAM
#define BTNST_BADPARAM 5
#endif
// Dummy identifier for grayscale icon
#ifndef BTNST_AUTO_GRAY
#define BTNST_AUTO_GRAY (HICON)(0xffffffff - 1L)
#endif
class CButtonST : public CButton
{
public:
CButtonST();
~CButtonST();
enum {
ST_ALIGN_HORIZ = 0, // Icon/bitmap on the left, text on the right
ST_ALIGN_VERT, // Icon/bitmap on the top, text on the bottom
ST_ALIGN_HORIZ_RIGHT // Icon/bitmap on the right, text on the left
};
enum {
BTNST_COLOR_BK_IN = 0, // Background color when mouse is INside
BTNST_COLOR_FG_IN, // Text color when mouse is INside
BTNST_COLOR_BK_OUT, // Background color when mouse is OUTside
BTNST_COLOR_FG_OUT, // Text color when mouse is OUTside
BTNST_COLOR_BK_FOCUS, // Background color when the button is focused
BTNST_COLOR_FG_FOCUS, // Text color when the button is focused
BTNST_MAX_COLORS
};
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CButtonST)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual BOOL PreTranslateMessage(MSG* pMsg);
protected:
virtual void PreSubclassWindow();
virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
//}}AFX_VIRTUAL
public:
DWORD SetDefaultColors(BOOL bRepaint = TRUE);
DWORD SetColor(BYTE byColorIndex, COLORREF crColor, BOOL bRepaint = TRUE);
DWORD GetColor(BYTE byColorIndex, COLORREF* crpColor);
DWORD OffsetColor(BYTE byColorIndex, short shOffset, BOOL bRepaint = TRUE);
DWORD SetCheck(int nCheck, BOOL bRepaint = TRUE);
int GetCheck();
DWORD SetURL(LPCTSTR lpszURL = NULL);
void DrawTransparent(BOOL bRepaint = FALSE);
BOOL GetDefault();
DWORD SetAlwaysTrack(BOOL bAlwaysTrack = TRUE);
// 文字 提示
void SetTooltipText(int nText, BOOL bActivate = TRUE);
void SetTooltipText(LPCTSTR lpszText, BOOL bActivate = TRUE);
void ActivateTooltip(BOOL bEnable = TRUE);
DWORD SetBtnCursor(int nCursorId = NULL, BOOL bRepaint = TRUE);
// 设置为平面
DWORD SetFlat(BOOL bFlat = TRUE, BOOL bRepaint = TRUE);
// 设置图标文字位置
DWORD SetAlign(BYTE byAlign, BOOL bRepaint = TRUE);
DWORD DrawBorder(BOOL bDrawBorder = TRUE, BOOL bRepaint = TRUE);
DWORD DrawFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint = TRUE);
DWORD SetIcon(int nIconIn, int nIconOut = NULL);
DWORD SetIcon(HICON hIconIn, HICON hIconOut = NULL);
DWORD SetBitmaps(int nBitmapIn, COLORREF crTransColorIn, int nBitmapOut = NULL, COLORREF crTransColorOut = 0);
DWORD SetBitmaps(HBITMAP hBitmapIn, COLORREF crTransColorIn, HBITMAP hBitmapOut = NULL, COLORREF crTransColorOut = 0);
#ifdef BTNST_USE_BCMENU
DWORD SetMenu(UINT nMenu, HWND hParentWnd, BOOL bWinXPStyle = TRUE, UINT nToolbarID = NULL, CSize sizeToolbarIcon = CSize(16, 16), COLORREF crToolbarBk = RGB(255, 0, 255), BOOL bRepaint = TRUE);
#else
DWORD SetMenu(UINT nMenu, HWND hParentWnd, BOOL bRepaint = TRUE);
#endif
static short GetVersionI() {return 35;}
static LPCTSTR GetVersionC() {return (LPCTSTR)_T("3.5");}
BOOL m_bShowDisabledBitmap;
protected:
//{{AFX_MSG(CButtonST)
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnSysColorChange();
afx_msg BOOL OnClicked();
afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);
afx_msg void OnEnable(BOOL bEnable);
afx_msg void OnCancelMode();
afx_msg UINT OnGetDlgCode();
//}}AFX_MSG
#ifdef BTNST_USE_BCMENU
afx_msg LRESULT OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu);
afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct);
#endif
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
HICON CreateGrayscaleIcon(HICON hIcon);
virtual DWORD OnDrawBackground(CDC* pDC, LPCRECT pRect);
virtual DWORD OnDrawBorder(CDC* pDC, LPCRECT pRect);
BOOL m_bIsFlat; // Is a flat button?
BOOL m_bMouseOnButton; // Is mouse over the button?
BOOL m_bDrawTransparent; // Draw transparent?
BOOL m_bIsPressed; // Is button pressed?
BOOL m_bIsFocused; // Is button focused?
BOOL m_bIsDisabled; // Is button disabled?
BOOL m_bIsDefault; // Is default button?
BOOL m_bIsCheckBox; // Is the button a checkbox?
BYTE m_byAlign; // Align mode
BOOL m_bDrawBorder; // Draw border?
BOOL m_bDrawFlatFocus; // Draw focus rectangle for flat button?
COLORREF m_crColors[BTNST_MAX_COLORS]; // Colors to be used
HWND m_hParentWndMenu; // Handle to window for menu selection
BOOL m_bMenuDisplayed; // Is menu displayed ?
#ifdef BTNST_USE_BCMENU
BCMenu m_menuPopup; // BCMenu class instance
#else
HMENU m_hMenu; // Handle to associated menu
#endif
private:
LRESULT OnSetCheck(WPARAM wParam, LPARAM lParam);
LRESULT OnGetCheck(WPARAM wParam, LPARAM lParam);
LRESULT OnSetStyle(WPARAM wParam, LPARAM lParam);
LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
void CancelHover();
void FreeResources(BOOL bCheckForNULL = TRUE);
void PrepareImageRect(BOOL bHasTitle, RECT* rpItem, CRect* rpTitle, BOOL bIsPressed, DWORD dwWidth, DWORD dwHeight, CRect* rpImage);
HBITMAP CreateBitmapMask(HBITMAP hSourceBitmap, DWORD dwWidth, DWORD dwHeight, COLORREF crTransColor);
void DrawTheIcon(CDC* pDC, BOOL bHasTitle, RECT* rpItem, CRect* rpTitle, BOOL bIsPressed, BOOL bIsDisabled);
void DrawTheBitmap(CDC* pDC, BOOL bHasTitle, RECT *rItem, CRect *rCaption, BOOL bIsPressed, BOOL bIsDisabled);
void PaintBk(CDC* pDC);
void InitToolTip();
HCURSOR m_hCursor; // Handle to cursor
CToolTipCtrl m_ToolTip; // Tooltip
CDC m_dcBk;
CBitmap m_bmpBk;
CBitmap* m_pbmpOldBk;
BOOL m_bAlwaysTrack; // Always hilight button?
int m_nCheck; // Current value for checkbox
UINT m_nTypeStyle; // Button style
TCHAR m_szURL[_MAX_PATH]; // URL to open when clicked
#pragma pack(1)
typedef struct _STRUCT_ICONS
{
HICON hIcon; // Handle to icon
DWORD dwWidth; // Width of icon
DWORD dwHeight; // Height of icon
} STRUCT_ICONS;
#pragma pack()
#pragma pack(1)
typedef struct _STRUCT_BITMAPS
{
HBITMAP hBitmap; // Handle to bitmap
DWORD dwWidth; // Width of bitmap
DWORD dwHeight; // Height of bitmap
HBITMAP hMask; // Handle to mask bitmap
COLORREF crTransparent; // Transparent color
} STRUCT_BITMAPS;
#pragma pack()
STRUCT_ICONS m_csIcons[2];
STRUCT_BITMAPS m_csBitmaps[2];
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif

@ -0,0 +1,153 @@
// CH91PayloadSoftware.cpp : 定义应用程序的类行为。
//
#include "stdafx.h"
#include "CH91PayloadSoftware.h"
#include "CH91PayloadSoftwareDlg.h"
#include "cDESUtils.h"
#include "cPhysicsInfoUtils.h"
#include "cMD5Encode.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CCH91PayloadSoftwareApp
BEGIN_MESSAGE_MAP(CCH91PayloadSoftwareApp, CWinApp)
//ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()
// CCH91PayloadSoftwareApp 构造
CCH91PayloadSoftwareApp::CCH91PayloadSoftwareApp()
{
// 支持重新启动管理器
m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}
// 唯一的一个 CCH91PayloadSoftwareApp 对象
CCH91PayloadSoftwareApp theApp;
// CCH91PayloadSoftwareApp 初始化
BOOL CCH91PayloadSoftwareApp::InitInstance()
{
/************************************************************************/
/* DES加解密 软件防拷贝 */
/************************************************************************/
cPhysicsInfoUtils m_physicsInfoUtils;
string strSerialNum; //硬盘序列号
string strMAC; //网卡MAC地址
string strCPUId; //CPU序列号
m_physicsInfoUtils.GetHardDiskSerial(strSerialNum); //获取硬盘序列号
m_physicsInfoUtils.GetMAC(strMAC); //获取MAC地址
m_physicsInfoUtils.GetCPU_iD(strCPUId); //获取CPU序列号
cDESUtils m_desUtils;
string str1 = strSerialNum + strMAC + strCPUId;
Md5Encode m_Md5Encoder;
str1 = m_Md5Encoder.Encode(str1);
//str1 = "A1335FA36BDA99F1E5D53DD08FDF7898";
string str2 = "FEIPENGZHIKONG2021.";//密钥
str1 = m_desUtils.H(str1);//十六进制转换为二进制
str2 = m_desUtils.H(str2);//十六进制转换为二进制
m_desUtils.generateKeys(str2);//生成子密钥
string str3 = m_desUtils.encrypt(str1);//明文加密
str3 = m_desUtils.G(str3);//二进制转换为十六进制
CString strSoftwareCode = str3.c_str();
CString m_strRegisterPath = GetSoftwareCurrentDirectory() + _T("\\Register.txt");//注册码文件
if (PathFileExists(m_strRegisterPath))//注册码文件存在
{
CStdioFile fileRegister;
fileRegister.Open(m_strRegisterPath, CFile::modeRead);
CString strRegisterCode;
fileRegister.ReadString(strRegisterCode);
fileRegister.Close();
if (!(strRegisterCode == strSoftwareCode))
{
MessageBox(NULL, "请联系航天飞鹏完成软件注册!", "提示", MB_OK);
return FALSE;
}
}else //注册码文件不存在
{
MessageBox(NULL, "请联系航天飞鹏完成软件注册!", "提示", MB_OK);
return FALSE;
}
// 在初始对话框之前设置线程语言
// // 设置线程语言为“中文”
// SetThreadLocale(MAKELCID(MAKELANGID(
// LANG_CHINESE,
// SUBLANG_CHINESE_SIMPLIFIED),
// SORT_DEFAULT));
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
AfxEnableControlContainer();
// 创建 shell 管理器,以防对话框包含
// 任何 shell 树视图控件或 shell 列表视图控件。
CShellManager *pShellManager = new CShellManager;
// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
// 设置线程语言为“英文”
SetThreadLocale(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
CCH91PayloadSoftwareDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
// “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
// “取消”来关闭对话框的代码
}
// 删除上面创建的 shell 管理器。
if (pShellManager != NULL)
{
delete pShellManager;
}
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}

@ -0,0 +1,32 @@
// CH91PayloadSoftware.h : PROJECT_NAME 应用程序的主头文件
//
#pragma once
#ifndef __AFXWIN_H__
#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
#endif
#include "resource.h" // 主符号
// CCH91PayloadSoftwareApp:
// 有关此类的实现,请参阅 CH91PayloadSoftware.cpp
//
class CCH91PayloadSoftwareApp : public CWinApp
{
public:
CCH91PayloadSoftwareApp();
// 重写
public:
virtual BOOL InitInstance();
// 实现
DECLARE_MESSAGE_MAP()
};
extern CCH91PayloadSoftwareApp theApp;

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CH91PayloadSoftware", "CH91PayloadSoftware.vcxproj", "{89E02284-2466-4FFA-B5D4-12173645A4F1}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{89E02284-2466-4FFA-B5D4-12173645A4F1}.Debug|Win32.ActiveCfg = Debug|Win32
{89E02284-2466-4FFA-B5D4-12173645A4F1}.Debug|Win32.Build.0 = Debug|Win32
{89E02284-2466-4FFA-B5D4-12173645A4F1}.Release|Win32.ActiveCfg = Release|Win32
{89E02284-2466-4FFA-B5D4-12173645A4F1}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

@ -0,0 +1,286 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{89E02284-2466-4FFA-B5D4-12173645A4F1}</ProjectGuid>
<RootNamespace>CH91PayloadSoftware</RootNamespace>
<Keyword>MFCProj</Keyword>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\OpenCVProjectD.props" />
<Import Project="..\boost-156.props" />
<Import Project="..\gdal.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\OpenCVProjectR.props" />
<Import Project="..\boost-156.props" />
<Import Project="..\gdal.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<OutDir>..\..\Bin\</OutDir>
<IntDir>$(Configuration)\</IntDir>
<IncludePath>C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\boost_1_56;C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\opencv245\include;C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\gdal\include;$(IncludePath)</IncludePath>
<LibraryPath>C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\boost_1_56\stage\lib;C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\gdal\lib;C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\opencv245\lib\x86;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<OutDir>..\..\Bin\</OutDir>
<IntDir>..\..\Bin\</IntDir>
<IncludePath>C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\boost_1_56;C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\opencv245\include\opencv;C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\opencv245\include\opencv2;C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\opencv245\include;C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\gdal\include;$(IncludePath)</IncludePath>
<LibraryPath>C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\boost_1_56\stage\lib;C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\gdal\lib;C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\opencv245\lib\x86;$(LibraryPath)</LibraryPath>
<TargetName>FH98PayloadOnBoard</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ExceptionHandling>Async</ExceptionHandling>
<AdditionalIncludeDirectories>..\..\Include;..\XtremeToolKitPro;C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\gdal\include;C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\opencv245\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>QB_SimpleImgShowD.lib;QB_GoogleMapOperateD.lib;MapPrj.lib;QB_ImgShowBaseD.lib;QB_ImgProcessFunD.lib;QB_AutoMapD.lib;OIS_static_d.lib;Decoder_H264_ALLD.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<AdditionalLibraryDirectories>C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\opencv245\lib\x86;C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\gdal\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0804</Culture>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>Use</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ExceptionHandling>Async</ExceptionHandling>
<AdditionalIncludeDirectories>..\..\Include;..\XtremeToolKitPro;C:\ProgramFiles\opencv245\include;C:\ProgramFiles\gdal\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>QB_SimpleImgShow.lib;QB_GoogleMapOperate.lib;MapPrj.lib;QB_ImgShowBase.lib;QB_AutoMap.lib;QB_ImgProcessFun.lib;OIS_static.lib;Decoder_H264_ALLR.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\gdal\lib;C:\1、Htsdfp\2、GCS\3、FH-98机载相机监控软件2023\ProgramFiles\opencv245\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0804</Culture>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemGroup>
<None Include="..\bin\back_Azimuth.bmp" />
<None Include="ReadMe.txt" />
<None Include="res\BackGround_DlgKZ.bmp" />
<None Include="res\BackGround_DlgMain.bmp" />
<None Include="res\BackGround_DlgReplay2.bmp" />
<None Include="res\Background_Replay.bmp" />
<None Include="res\bitmap4.bmp" />
<None Include="res\bitmap5.bmp" />
<None Include="res\CH91PayloadSoftware.ico" />
<None Include="res\CH91PayloadSoftware.rc2" />
<None Include="res\FH98PayloadSoftware.ico" />
<None Include="res\icon2.ico" />
<None Include="res\icon4.ico" />
<None Include="res\image_file_48px_579573_easyicon.net.ico" />
<None Include="res\mp_channel.bmp" />
<None Include="res\mp_channel_active.bmp" />
<None Include="res\mp_thumb.bmp" />
<None Include="res\mp_thumb_active.bmp" />
<None Include="res\ReplayDlg.jpg" />
<None Include="res\Sky.bmp" />
<None Include="res\主_停止录像.ico" />
<None Include="res\主_参数设置.ico" />
<None Include="res\主_变换显示.ico" />
<None Include="res\主_图像监控.ico" />
<None Include="res\主_图片浏览.ico" />
<None Include="res\主_复接数据.ico" />
<None Include="res\主_情报处理.ico" />
<None Include="res\主_抓图.ico" />
<None Include="res\主_数引.ico" />
<None Include="res\主_监视侦查.ico" />
<None Include="res\主_组播发送.ico" />
<None Include="res\主_结果预览.ico" />
<None Include="res\主_视频回放.ico" />
<None Include="res\主_视频录像.ico" />
<None Include="res\主_载荷控制.ico" />
<None Include="res\主_载荷评价.ico" />
<None Include="res\停止.ico" />
<None Include="res\快进.ico" />
<None Include="res\慢放.ico" />
<None Include="res\打开文件.ico" />
<None Include="res\播放.ico" />
<None Include="res\暂停.ico" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="BackgroundUtil.h" />
<ClInclude Include="basetype.h" />
<ClInclude Include="BCMenu.h" />
<ClInclude Include="BitmapSlider.h" />
<ClInclude Include="BkDialog.h" />
<ClInclude Include="BtnST.h" />
<ClInclude Include="bufferloop.h" />
<ClInclude Include="CallBackDef.h" />
<ClInclude Include="cDESUtils.h" />
<ClInclude Include="CeXDib.h" />
<ClInclude Include="CH91PayloadSoftware.h" />
<ClInclude Include="CH91PayloadSoftwareDlg.h" />
<ClInclude Include="cMD5Encode.h" />
<ClInclude Include="CMDBtn.h" />
<ClInclude Include="ComControlFunction.h" />
<ClInclude Include="ControlDlgFH96Page1.h" />
<ClInclude Include="cPhysicsInfoUtils.h" />
<ClInclude Include="CTCPSocket.h" />
<ClInclude Include="CYHMudpSend.h" />
<ClInclude Include="DCFrameCkCmd.h" />
<ClInclude Include="DCOverrollDlg.h" />
<ClInclude Include="DecoderFactory.h" />
<ClInclude Include="Dlg13InstituteDCNew.h" />
<ClInclude Include="DlgCameraCtrl.h" />
<ClInclude Include="DlgIMP.h" />
<ClInclude Include="DlgWHTJDCNew.h" />
<ClInclude Include="FrameFKU_Camera.h" />
<ClInclude Include="FrameIMP_DOWN.h" />
<ClInclude Include="FrameRecieve.h" />
<ClInclude Include="IMPConect.h" />
<ClInclude Include="JoyKeybordControl.h" />
<ClInclude Include="JoyStickControlDlg.h" />
<ClInclude Include="JoyStickListener.h" />
<ClInclude Include="MasterHardDiskSerial.h" />
<ClInclude Include="MUDP.h" />
<ClInclude Include="MulticastSocketReceiveDlg.h" />
<ClInclude Include="CUDPSocket.h" />
<ClInclude Include="Decoder.h" />
<ClInclude Include="deinterlace.h" />
<ClInclude Include="DlgRecvDataFromQB.h" />
<ClInclude Include="EditInput.h" />
<ClInclude Include="ExportImgShowBase.h" />
<ClInclude Include="ExtendSliderCtrl.h" />
<ClInclude Include="GetElevation.h" />
<ClInclude Include="Global.h" />
<ClInclude Include="GlobalMember.h" />
<ClInclude Include="GlobalMessage.h" />
<ClInclude Include="memdc.h" />
<ClInclude Include="MemDC_Redefine.h" />
<ClInclude Include="MulticastSocket.h" />
<ClInclude Include="QBStru.h" />
<ClInclude Include="Resource.h" />
<ClInclude Include="SendControlCommand.h" />
<ClInclude Include="Serial.h" />
<ClInclude Include="ShadeButtonST.h" />
<ClInclude Include="ShowFJDataDlg.h" />
<ClInclude Include="ShowReplayDlg.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="BackgroundUtil.cpp" />
<ClCompile Include="BCMenu.cpp" />
<ClCompile Include="BitmapSlider.cpp" />
<ClCompile Include="BkDialog.cpp" />
<ClCompile Include="BtnST.cpp" />
<ClCompile Include="cDESUtils.cpp" />
<ClCompile Include="CeXDib.cpp" />
<ClCompile Include="CH91PayloadSoftware.cpp" />
<ClCompile Include="CH91PayloadSoftwareDlg.cpp" />
<ClCompile Include="cMD5Encode.cpp" />
<ClCompile Include="CMDBtn.cpp" />
<ClCompile Include="ComControlFunction.cpp" />
<ClCompile Include="ControlDlgFH96Page1.cpp" />
<ClCompile Include="cPhysicsInfoUtils.cpp" />
<ClCompile Include="CTCPSocket.cpp" />
<ClCompile Include="CYHMudpSend.cpp" />
<ClCompile Include="DCOverrollDlg.cpp" />
<ClCompile Include="Dlg13InstituteDCNew.cpp" />
<ClCompile Include="DlgCameraCtrl.cpp" />
<ClCompile Include="DlgIMP.cpp" />
<ClCompile Include="DlgWHTJDCNew.cpp" />
<ClCompile Include="FrameIMP_DOWN.cpp" />
<ClCompile Include="IMPConect.cpp" />
<ClCompile Include="JoyKeybordControl.cpp" />
<ClCompile Include="JoyStickControlDlg.cpp" />
<ClCompile Include="JoyStickListener.cpp" />
<ClCompile Include="MasterHardDiskSerial.cpp" />
<ClCompile Include="MUDP.cpp" />
<ClCompile Include="MulticastSocketReceiveDlg.cpp" />
<ClCompile Include="CUDPSocket.cpp" />
<ClCompile Include="Decoder.cpp" />
<ClCompile Include="deinterlace.cpp" />
<ClCompile Include="DlgRecvDataFromQB.cpp" />
<ClCompile Include="EditInput.cpp" />
<ClCompile Include="ExtendSliderCtrl.cpp" />
<ClCompile Include="GetElevation.cpp" />
<ClCompile Include="Global.cpp" />
<ClCompile Include="GlobalMember.cpp" />
<ClCompile Include="MulticastSocket.cpp" />
<ClCompile Include="SendControlCommand.cpp" />
<ClCompile Include="Serial.cpp" />
<ClCompile Include="ShadeButtonST.cpp" />
<ClCompile Include="ShowFJDataDlg.cpp" />
<ClCompile Include="ShowReplayDlg.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="CH91PayloadSoftware.rc" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<ProjectExtensions>
<VisualStudio>
<UserProperties RESOURCE_FILE="CH91PayloadSoftware.rc" />
</VisualStudio>
</ProjectExtensions>
</Project>

@ -0,0 +1,548 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="源文件">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="头文件">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="资源文件">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="全局">
<UniqueIdentifier>{2c47f6ec-5889-40dd-84a0-4a7a3824543e}</UniqueIdentifier>
</Filter>
<Filter Include="H264解码">
<UniqueIdentifier>{994b2653-405f-4e81-a574-2a5471597def}</UniqueIdentifier>
</Filter>
<Filter Include="载荷控制窗口">
<UniqueIdentifier>{b2e6a3ca-3198-428a-94ea-f0c9235fa3c8}</UniqueIdentifier>
</Filter>
<Filter Include="复接显示窗口">
<UniqueIdentifier>{1a537331-9999-4114-af76-816ee123721d}</UniqueIdentifier>
</Filter>
<Filter Include="主窗口">
<UniqueIdentifier>{f965b4eb-c120-4667-b38c-aa281f1b242d}</UniqueIdentifier>
</Filter>
<Filter Include="视频回放控制窗口">
<UniqueIdentifier>{1d5e7efa-7a87-4b0a-9ffd-9e5feab4f388}</UniqueIdentifier>
</Filter>
<Filter Include="按钮美化">
<UniqueIdentifier>{6f6d3966-ef1a-4d34-9c4d-8e1d9ca56239}</UniqueIdentifier>
</Filter>
<Filter Include="通信相关">
<UniqueIdentifier>{8556a374-d901-40be-a311-fd36ec5ffa24}</UniqueIdentifier>
</Filter>
<Filter Include="通信相关\UDP类">
<UniqueIdentifier>{3624c3f4-0761-4c84-8fff-a1d9ef6a811c}</UniqueIdentifier>
</Filter>
<Filter Include="通信相关\串口类">
<UniqueIdentifier>{5a735158-3c0e-4272-bbdb-d7081a4ba28b}</UniqueIdentifier>
</Filter>
<Filter Include="通信相关\组播类">
<UniqueIdentifier>{7fe17581-e651-4b10-a392-97613d13cccd}</UniqueIdentifier>
</Filter>
<Filter Include="红外反交错">
<UniqueIdentifier>{0b65e705-1cec-4541-a95c-317bb8c969e4}</UniqueIdentifier>
</Filter>
<Filter Include="载荷控制窗口\手动指令盘&amp;发送指令">
<UniqueIdentifier>{3a07efef-8012-4426-b5ea-b321ad162dee}</UniqueIdentifier>
</Filter>
<Filter Include="资源文件\读取高程">
<UniqueIdentifier>{e366088b-ea63-4916-81b7-d77bd588678e}</UniqueIdentifier>
</Filter>
<Filter Include="摇杆及视频键盘">
<UniqueIdentifier>{465d4127-69ef-48a2-a925-b10ecda8dc3b}</UniqueIdentifier>
</Filter>
<Filter Include="摇杆及视频键盘\摇杆">
<UniqueIdentifier>{39c8d198-f92f-43a2-8a58-0e15ba92b402}</UniqueIdentifier>
</Filter>
<Filter Include="摇杆及视频键盘\视频键盘">
<UniqueIdentifier>{8342d623-5967-4829-bc07-540180ee9b82}</UniqueIdentifier>
</Filter>
<Filter Include="载荷控制窗口\CH96控制页面">
<UniqueIdentifier>{7c9ecd9b-bd1f-490b-8d0d-248a8b6fab48}</UniqueIdentifier>
</Filter>
<Filter Include="组播收数">
<UniqueIdentifier>{d0afe885-b4d7-4411-b9b1-19695f56ae4f}</UniqueIdentifier>
</Filter>
<Filter Include="帧解析类">
<UniqueIdentifier>{89832b67-f355-4634-ad59-819a3c35319e}</UniqueIdentifier>
</Filter>
<Filter Include="通信相关\TCP类">
<UniqueIdentifier>{98e31955-0ba4-4b74-9db1-8a712a10792a}</UniqueIdentifier>
</Filter>
<Filter Include="加解密">
<UniqueIdentifier>{ab6ee3f8-60f1-43e8-9f15-bbb160de9c67}</UniqueIdentifier>
</Filter>
<Filter Include="IMP">
<UniqueIdentifier>{f06cd1e0-85bf-45a0-867a-ee5a88d8e499}</UniqueIdentifier>
</Filter>
<Filter Include="通信相关\串口类\串口控制相关">
<UniqueIdentifier>{ac0ffa33-f9fc-4e75-9781-73b28c12be43}</UniqueIdentifier>
</Filter>
<Filter Include="IMP\对话框">
<UniqueIdentifier>{14c6a6db-8887-4abf-aeee-f39bfcb37fc6}</UniqueIdentifier>
</Filter>
<Filter Include="IMP\通信">
<UniqueIdentifier>{04315dca-4ce2-425a-bcc9-d26fe11219c5}</UniqueIdentifier>
</Filter>
<Filter Include="IMP\协议">
<UniqueIdentifier>{8eb1f68d-8c2d-485d-b3bd-9859d81467d5}</UniqueIdentifier>
</Filter>
<Filter Include="CYH新增">
<UniqueIdentifier>{be9a2dce-ba4c-44fd-9db6-fefe7b53caa0}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<None Include="ReadMe.txt" />
<None Include="res\CH91PayloadSoftware.rc2">
<Filter>资源文件</Filter>
</None>
<None Include="res\CH91PayloadSoftware.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\播放.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\快进.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\慢放.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\停止.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\暂停.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\打开文件.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\ReplayDlg.jpg">
<Filter>资源文件</Filter>
</None>
<None Include="res\Sky.bmp">
<Filter>资源文件</Filter>
</None>
<None Include="res\主_变换显示.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\主_复接数据.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\主_结果预览.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\主_视频回放.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\主_视频录像.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\主_数引.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\主_载荷控制.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\主_抓图.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\主_停止录像.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\Background_Replay.bmp">
<Filter>资源文件</Filter>
</None>
<None Include="res\BackGround_DlgReplay2.bmp">
<Filter>资源文件</Filter>
</None>
<None Include="res\BackGround_DlgKZ.bmp">
<Filter>资源文件</Filter>
</None>
<None Include="res\BackGround_DlgMain.bmp">
<Filter>资源文件</Filter>
</None>
<None Include="res\mp_channel.bmp">
<Filter>资源文件</Filter>
</None>
<None Include="res\mp_channel_active.bmp">
<Filter>资源文件</Filter>
</None>
<None Include="res\mp_thumb.bmp">
<Filter>资源文件</Filter>
</None>
<None Include="res\mp_thumb_active.bmp">
<Filter>资源文件</Filter>
</None>
<None Include="res\bitmap4.bmp">
<Filter>资源文件</Filter>
</None>
<None Include="..\bin\back_Azimuth.bmp">
<Filter>资源文件</Filter>
</None>
<None Include="res\bitmap5.bmp">
<Filter>资源文件</Filter>
</None>
<None Include="res\主_图像监控.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\icon2.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\主_监视侦查.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\icon4.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\主_参数设置.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\主_组播发送.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\image_file_48px_579573_easyicon.net.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\主_图片浏览.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\主_载荷评价.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\主_情报处理.ico">
<Filter>资源文件</Filter>
</None>
<None Include="res\FH98PayloadSoftware.ico">
<Filter>资源文件</Filter>
</None>
</ItemGroup>
<ItemGroup>
<ClInclude Include="CH91PayloadSoftware.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="stdafx.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="targetver.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="Resource.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="Global.h">
<Filter>全局</Filter>
</ClInclude>
<ClInclude Include="GlobalMember.h">
<Filter>全局</Filter>
</ClInclude>
<ClInclude Include="GlobalMessage.h">
<Filter>全局</Filter>
</ClInclude>
<ClInclude Include="MulticastSocket.h">
<Filter>通信相关\组播类</Filter>
</ClInclude>
<ClInclude Include="Decoder.h">
<Filter>H264解码</Filter>
</ClInclude>
<ClInclude Include="Serial.h">
<Filter>通信相关\串口类</Filter>
</ClInclude>
<ClInclude Include="ShowFJDataDlg.h">
<Filter>复接显示窗口</Filter>
</ClInclude>
<ClInclude Include="GetElevation.h">
<Filter>资源文件\读取高程</Filter>
</ClInclude>
<ClInclude Include="CUDPSocket.h">
<Filter>通信相关\UDP类</Filter>
</ClInclude>
<ClInclude Include="CH91PayloadSoftwareDlg.h">
<Filter>主窗口</Filter>
</ClInclude>
<ClInclude Include="ShowReplayDlg.h">
<Filter>视频回放控制窗口</Filter>
</ClInclude>
<ClInclude Include="BCMenu.h">
<Filter>按钮美化</Filter>
</ClInclude>
<ClInclude Include="BtnST.h">
<Filter>按钮美化</Filter>
</ClInclude>
<ClInclude Include="MemDC_Redefine.h">
<Filter>按钮美化</Filter>
</ClInclude>
<ClInclude Include="BackgroundUtil.h">
<Filter>按钮美化</Filter>
</ClInclude>
<ClInclude Include="BkDialog.h">
<Filter>按钮美化</Filter>
</ClInclude>
<ClInclude Include="ShadeButtonST.h">
<Filter>按钮美化</Filter>
</ClInclude>
<ClInclude Include="CeXDib.h">
<Filter>按钮美化</Filter>
</ClInclude>
<ClInclude Include="BitmapSlider.h">
<Filter>按钮美化</Filter>
</ClInclude>
<ClInclude Include="memdc.h">
<Filter>按钮美化</Filter>
</ClInclude>
<ClInclude Include="ExtendSliderCtrl.h">
<Filter>视频回放控制窗口</Filter>
</ClInclude>
<ClInclude Include="EditInput.h">
<Filter>主窗口</Filter>
</ClInclude>
<ClInclude Include="QBStru.h">
<Filter>全局</Filter>
</ClInclude>
<ClInclude Include="DlgRecvDataFromQB.h">
<Filter>主窗口</Filter>
</ClInclude>
<ClInclude Include="deinterlace.h">
<Filter>红外反交错</Filter>
</ClInclude>
<ClInclude Include="SendControlCommand.h">
<Filter>载荷控制窗口\手动指令盘&amp;发送指令</Filter>
</ClInclude>
<ClInclude Include="JoyStickListener.h">
<Filter>摇杆及视频键盘\摇杆</Filter>
</ClInclude>
<ClInclude Include="JoyKeybordControl.h">
<Filter>摇杆及视频键盘\视频键盘</Filter>
</ClInclude>
<ClInclude Include="JoyStickControlDlg.h">
<Filter>摇杆及视频键盘\摇杆</Filter>
</ClInclude>
<ClInclude Include="DecoderFactory.h">
<Filter>H264解码</Filter>
</ClInclude>
<ClInclude Include="CallBackDef.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="ExportImgShowBase.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="ControlDlgFH96Page1.h">
<Filter>载荷控制窗口\CH96控制页面</Filter>
</ClInclude>
<ClInclude Include="MulticastSocketReceiveDlg.h">
<Filter>组播收数</Filter>
</ClInclude>
<ClInclude Include="MUDP.h">
<Filter>组播收数</Filter>
</ClInclude>
<ClInclude Include="basetype.h">
<Filter>帧解析类</Filter>
</ClInclude>
<ClInclude Include="bufferloop.h">
<Filter>帧解析类</Filter>
</ClInclude>
<ClInclude Include="FrameRecieve.h">
<Filter>帧解析类</Filter>
</ClInclude>
<ClInclude Include="FrameFKU_Camera.h">
<Filter>帧解析类</Filter>
</ClInclude>
<ClInclude Include="DlgCameraCtrl.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="CMDBtn.h">
<Filter>按钮美化</Filter>
</ClInclude>
<ClInclude Include="CTCPSocket.h">
<Filter>通信相关\TCP类</Filter>
</ClInclude>
<ClInclude Include="cMD5Encode.h">
<Filter>加解密</Filter>
</ClInclude>
<ClInclude Include="cPhysicsInfoUtils.h">
<Filter>加解密</Filter>
</ClInclude>
<ClInclude Include="MasterHardDiskSerial.h">
<Filter>加解密</Filter>
</ClInclude>
<ClInclude Include="cDESUtils.h">
<Filter>加解密</Filter>
</ClInclude>
<ClInclude Include="ComControlFunction.h">
<Filter>通信相关\串口类\串口控制相关</Filter>
</ClInclude>
<ClInclude Include="IMPConect.h">
<Filter>IMP\通信</Filter>
</ClInclude>
<ClInclude Include="DlgIMP.h">
<Filter>IMP\对话框</Filter>
</ClInclude>
<ClInclude Include="FrameIMP_DOWN.h">
<Filter>IMP\协议</Filter>
</ClInclude>
<ClInclude Include="Dlg13InstituteDCNew.h">
<Filter>CYH新增</Filter>
</ClInclude>
<ClInclude Include="DCFrameCkCmd.h">
<Filter>CYH新增</Filter>
</ClInclude>
<ClInclude Include="CYHMudpSend.h">
<Filter>CYH新增</Filter>
</ClInclude>
<ClInclude Include="DlgWHTJDCNew.h">
<Filter>CYH新增</Filter>
</ClInclude>
<ClInclude Include="DCOverrollDlg.h">
<Filter>CYH新增</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="CH91PayloadSoftware.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="stdafx.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="Global.cpp">
<Filter>全局</Filter>
</ClCompile>
<ClCompile Include="GlobalMember.cpp">
<Filter>全局</Filter>
</ClCompile>
<ClCompile Include="MulticastSocket.cpp">
<Filter>通信相关\组播类</Filter>
</ClCompile>
<ClCompile Include="Decoder.cpp">
<Filter>H264解码</Filter>
</ClCompile>
<ClCompile Include="Serial.cpp">
<Filter>通信相关\串口类</Filter>
</ClCompile>
<ClCompile Include="ShowFJDataDlg.cpp">
<Filter>复接显示窗口</Filter>
</ClCompile>
<ClCompile Include="GetElevation.cpp">
<Filter>资源文件\读取高程</Filter>
</ClCompile>
<ClCompile Include="CUDPSocket.cpp">
<Filter>通信相关\UDP类</Filter>
</ClCompile>
<ClCompile Include="CH91PayloadSoftwareDlg.cpp">
<Filter>主窗口</Filter>
</ClCompile>
<ClCompile Include="ShowReplayDlg.cpp">
<Filter>视频回放控制窗口</Filter>
</ClCompile>
<ClCompile Include="BCMenu.cpp">
<Filter>按钮美化</Filter>
</ClCompile>
<ClCompile Include="BtnST.cpp">
<Filter>按钮美化</Filter>
</ClCompile>
<ClCompile Include="BackgroundUtil.cpp">
<Filter>按钮美化</Filter>
</ClCompile>
<ClCompile Include="BkDialog.cpp">
<Filter>按钮美化</Filter>
</ClCompile>
<ClCompile Include="ShadeButtonST.cpp">
<Filter>按钮美化</Filter>
</ClCompile>
<ClCompile Include="CeXDib.cpp">
<Filter>按钮美化</Filter>
</ClCompile>
<ClCompile Include="BitmapSlider.cpp">
<Filter>按钮美化</Filter>
</ClCompile>
<ClCompile Include="ExtendSliderCtrl.cpp">
<Filter>视频回放控制窗口</Filter>
</ClCompile>
<ClCompile Include="EditInput.cpp">
<Filter>主窗口</Filter>
</ClCompile>
<ClCompile Include="DlgRecvDataFromQB.cpp">
<Filter>主窗口</Filter>
</ClCompile>
<ClCompile Include="deinterlace.cpp">
<Filter>红外反交错</Filter>
</ClCompile>
<ClCompile Include="SendControlCommand.cpp">
<Filter>载荷控制窗口\手动指令盘&amp;发送指令</Filter>
</ClCompile>
<ClCompile Include="JoyStickListener.cpp">
<Filter>摇杆及视频键盘\摇杆</Filter>
</ClCompile>
<ClCompile Include="JoyKeybordControl.cpp">
<Filter>摇杆及视频键盘\视频键盘</Filter>
</ClCompile>
<ClCompile Include="JoyStickControlDlg.cpp">
<Filter>摇杆及视频键盘\摇杆</Filter>
</ClCompile>
<ClCompile Include="ControlDlgFH96Page1.cpp">
<Filter>载荷控制窗口\CH96控制页面</Filter>
</ClCompile>
<ClCompile Include="MulticastSocketReceiveDlg.cpp">
<Filter>组播收数</Filter>
</ClCompile>
<ClCompile Include="MUDP.cpp">
<Filter>组播收数</Filter>
</ClCompile>
<ClCompile Include="DlgCameraCtrl.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="CMDBtn.cpp">
<Filter>按钮美化</Filter>
</ClCompile>
<ClCompile Include="CTCPSocket.cpp">
<Filter>通信相关\TCP类</Filter>
</ClCompile>
<ClCompile Include="cMD5Encode.cpp">
<Filter>加解密</Filter>
</ClCompile>
<ClCompile Include="cPhysicsInfoUtils.cpp">
<Filter>加解密</Filter>
</ClCompile>
<ClCompile Include="MasterHardDiskSerial.cpp">
<Filter>加解密</Filter>
</ClCompile>
<ClCompile Include="cDESUtils.cpp">
<Filter>加解密</Filter>
</ClCompile>
<ClCompile Include="ComControlFunction.cpp">
<Filter>通信相关\串口类\串口控制相关</Filter>
</ClCompile>
<ClCompile Include="IMPConect.cpp">
<Filter>IMP\通信</Filter>
</ClCompile>
<ClCompile Include="DlgIMP.cpp">
<Filter>IMP\对话框</Filter>
</ClCompile>
<ClCompile Include="FrameIMP_DOWN.cpp">
<Filter>IMP\协议</Filter>
</ClCompile>
<ClCompile Include="Dlg13InstituteDCNew.cpp">
<Filter>CYH新增</Filter>
</ClCompile>
<ClCompile Include="CYHMudpSend.cpp">
<Filter>CYH新增</Filter>
</ClCompile>
<ClCompile Include="DlgWHTJDCNew.cpp">
<Filter>CYH新增</Filter>
</ClCompile>
<ClCompile Include="DCOverrollDlg.cpp">
<Filter>CYH新增</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="CH91PayloadSoftware.rc">
<Filter>资源文件</Filter>
</ResourceCompile>
</ItemGroup>
</Project>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,210 @@
// CH91PayloadSoftwareDlg.h : 头文件
//
#pragma once
#include "MulticastSocket.h"
#include "ExportSimpleImgShow.h"
#include "ExportImgShowBase.h"
#include "JoyKeybordControl.h"
#include "JoyStickControlDlg.h"
#include "ControlDlgFH96Page1.h"
#include "ShowFJDataDlg.h"
#include "DlgRecvDataFromQB.h"
#include "CUDPSocket.h"
#include "ShowReplayDlg.h"
#include "MulticastSocketReceiveDlg.h"
#include "BtnST.h"
#include "EditInput.h"
#include "Serial.h"
#include "afxwin.h"
#include "afxcmn.h"
#include "DlgCameraCtrl.h"
#include "DlgIMP.h"
#include "Dlg13InstituteDCNew.h"
#include "DCOverrollDlg.h"
//#include "FrameIMP_DOWN.h"
// CCH91PayloadSoftwareDlg 对话框
class CCH91PayloadSoftwareDlg : public CDialogEx
{
// 构造
public:
CCH91PayloadSoftwareDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_CH91PAYLOADSOFTWARE_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
public:
// 分别代表 数据处理的线程的句柄和ID
HANDLE m_hThread_ProcessData;
DWORD m_ThreadID_ProcessData;
// 分别代表 数据处理的线程的句柄和ID
HANDLE m_hThread_ProcessDataH264;
DWORD m_ThreadID_ProcessDataH264;
// UDP实时接收数据
CUDPSocket m_UDPSocket_ZH;
// 图像显示模块
CExportSimpleImgShow *m_wndShowEO; // EO
// 对话框
CShowFJDataDlg* m_ShowFJDataDlg; // 显示FJ数据对话框
CShowReplayDlg* m_ShowReplayDlg; // 显示视频回放控制对话框
CDlgRecvDataFromQB* m_ShowDlgRecvDataFromQB; //显示情报席位目标定位数据对话框
CMulticastSocketReceiveDlg* m_MulticastSocketReceiveDlg; // 显示组播发送创建对话框
// 视频键盘类
CJoyKeybordControl m_JoyKeybord;
// 摇杆控制类(对话框模式,不显示)
CJoyStickControlDlg* m_JoyStickControlDlg;
// 显示组播接收信息
CString str_MulticastSocketInfo;
// rect变量
CRect rect_SmallRegion;
CRect rect_BigRegion;
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public: // 美化主界面按钮
CButtonST m_Btn_Replay; // 视频回放
CButtonST m_Btn_FJ; // 复接数据
CButtonST m_Btn_Trans; // 可见光,红外变换显示
CButtonST m_Btn_CaptureVideo; // 视频录像
CButtonST m_Btn_CaptureImg; // 抓图
CButtonST m_Btn_Result; // 录像及截图结果预览
CButtonST m_Btn_ReadImg; // 读取图片(数码照片)
CButtonST m_Btn_Guide; // 数引功能
CButtonST m_Btn_QBFunctions; // 参数设置
CButtonST m_Btn_SocketSend; // 组播发送
CButtonST m_Btn_SocketReceive; // 组播收数
CButtonST m_Btn_PhotoCtrl; // 图片浏览
CButtonST m_Btn_PayloadEvaluation; // 载荷评价
void DlgStyleChange();
public:
afx_msg void OnDestroy();
// 对控制页面的Tab页进行初始化
void OnInitControlDlg();
// 对解码器进行初始化
void OnInitCH96Decoder();
// 通过视频回放页面控制载荷类型,型号类型在配置文件中更改
LRESULT PayloadTypeSet(WPARAM wParam, LPARAM lParam);
// 可见光,红外显示复接数据
LRESULT ShowMsgOnDlgEO(WPARAM wParam, LPARAM lParam);
LRESULT ShowMsgOnDlgIR(WPARAM wParam, LPARAM lParam);
// 数码照片复接数据
LRESULT ShowMsgOnDlgDC(WPARAM wParam, LPARAM lParam);
// 回放进度停止时,清空图像缓存
void ShowEOImg(cv::Mat img);
LRESULT ShowGuideAzimuthOnDlg(WPARAM wParam, LPARAM lParam);
LRESULT ShowGuidePitchOnDlg(WPARAM wParam, LPARAM lParam);
// 在发送控制指令之后,将焦点设置在主界面上
LRESULT SetFocusOnMainDlg(WPARAM wParam, LPARAM lParam);
// 显示复接数据
void ShowImgFJData();
afx_msg void OnBnClickedBtnShowFj();
//afx_msg void OnBnClickedBtnSendKz();
// 显示发送指令内容
LRESULT ShowCtrlInstruction(WPARAM wParam, LPARAM lParam);
// 解析开关指令
CString TranlateBackSwitchInstructions(UINT8 switchInstruction);
//解析载荷工作状态
void ZHWorkState(UINT8 CurrentImgType, UINT8 SystemState, UINT8 LaserState);
afx_msg void OnBnClickedBtnLookupResult();
// 主界面数引控制
CEditInput str_Guide_Azimuth; //方位角
CEditInput str_Guide_Pitch; //俯仰角
float m_Guide_Azimuth; //方位角
float m_Guide_Pitch; //俯仰角
virtual BOOL PreTranslateMessage(MSG* pMsg);
afx_msg void OnTimer(UINT_PTR nIDEvent);
//afx_msg void OnBnClickedBtnCaptureImg();
//图像采集视频录像功能定义在Global中
bool m_bCaptureEOImg;
bool m_bCaptureIRImg;
// 主界面显示UDP组播连接及串位情况
afx_msg void OnBnClickedBtnReplay();
// 主界面方位角Picture Control
afx_msg void OnBnClickedBtnBigimage();
// 关联对话框变量
// 当前图像类型
CString str_CurrentImgType; // 两种 EO图像/IR图像
// 是否按下鼠标中键
BOOL m_bMButtonDown; // TRUE: 按下鼠标中键 FALSE: 抬起鼠标中键
private:
CUDPSocket m_UdpSend2Payload;
bool m_bCreatUDP;
//CControlDlgFH96Page1* m_CControlDlgFH96Page1Dlg;
CDlgCameraCtrl * p_DlgCameraCtrl;//吊舱控制页面
Dlg13InstituteDCNew * p_Dlg13InstituteDCNewCtrl;//13所吊舱新控制放页面
DCOverrollDlg *p_DlgDCOverroll;//吊舱控制总页面
public:
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
// 视频全屏显示
BOOL m_bVideoShowFullScreen; // TRUE: 视频全屏显示 FALSE: 视频非全屏显示
void VideoShowFullScreenONOFF();
// 串口类, 连接视频键盘
CSerial m_Serial; // 串口
void DlgLanguageSet();
afx_msg void OnBnClickedBtnMulticastsocketreceive();
afx_msg void OnBnClickedBtnCaptureVideo();
// 图像显示界面左键双击,目标跟踪
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
// 图像显示界面右键单击,手动模式
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
// 图像显示界面摁住鼠标中键拖动,控制伺服
afx_msg void OnMButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnMButtonUp(UINT nFlags, CPoint point);
// 计算拖动鼠标时,偏移量形成的角度
double GetOffsetAngle(int X, int Y);
//////IMP相关
CDlgIMP * g_DlgIMP;//IMP对话框
//CSerial m_SerialIMP; // IMP通信串口
//char pSerialPort[20];//串口号
//DWORD pSerialPortBaud;//端口号
//void onInitIMPFrame();//初始化IMP协议
//LRESULT OnUpdateIMPDownDataChecked(WPARAM param, LPARAM lparam); //处理IMP下行通过校验的遥测数据
};

@ -0,0 +1,89 @@
#include "stdafx.h"
#include "Global.h"
#include "CMDBtn.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CCMDBtn::CCMDBtn(void)
{
Cmd = 0x00;
Cmdpage = 0;
}
BEGIN_MESSAGE_MAP(CCMDBtn, CMFCButton)
//{{AFX_MSG_MAP(CMCBtn)
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CCMDBtn::~CCMDBtn(void)
{
}
void CCMDBtn::OnLButtonUp( UINT nFlags, CPoint point )
{
g_FrameCamera.ckCmd = 0x00;
g_FrameCamera.SendPrepare();
if(g_IsSending)
g_MUDPCamera.SendToY(g_FrameCamera.Addr(),8);
CButton::OnLButtonUp( nFlags, point );
}
void CCMDBtn::OnLButtonDown( UINT nFlags, CPoint point )
{
BYTE byFcCmd;
byFcCmd = GetFcCmdFromPane( Cmdpage, Cmd );
g_FrameCamera.ckCmd = byFcCmd;
g_FrameCamera.SendPrepare();
if(g_IsSending)
g_MUDPCamera.SendToY(g_FrameCamera.Addr(),8);
CButton::OnLButtonDown( nFlags, point );
}
BYTE CCMDBtn::GetFcCmdFromPane( int page, BYTE cmd )
{
BYTE B;
/*视频管理计算机指令-来之吊舱控制页面*/
if( page == 20)
{
switch ( cmd )
{
case 1:
B = 0xC4; break;//2M速率
case 2:
B = 0xC5; break;//4M速率
case 3:
B = 0xC6; break;//吊舱通道1
case 4:
B = 0xC7; break;//吊舱通道2
case 5:
B = 0xC8; break;//0-3拼图
case 6:
B = 0xC9; break;//4-6拼图
case 7:
B = 0xCB; break;//记录
case 8:
B = 0xCC; break;//停止记录
case 9:
B = 0xCD; break;//清空数据
case 10:
B = 0xC0; break;//L链输出/SPI输出
case 11:
B = 0xC1; break;//卫通输出/网络输出
case 12:
B = 0xC2; break;//双路输出/两路输出
default:
B = 0x00; break;
}
}
else if(page==0)
{
}
return B;
}

@ -0,0 +1,25 @@
#if !defined(AFX_CMDBTN_H__1806C3A3_0279_4B10_A383_905233E78AD1__INCLUDED_)
#define AFX_CMDBTN_H__1806C3A3_0279_4B10_A383_905233E78AD1__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CCMDBtn : public CMFCButton
{
public:
CCMDBtn();
BYTE Cmd;
int Cmdpage;
virtual ~CCMDBtn();
protected:
//{{AFX_MSG(CMCBtn)
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
public:
BYTE GetFcCmdFromPane(int page,BYTE cmd);
};
#endif // !defined(AFX_XPBTN_H__1806C3A3_0278_4B10_A383_905233E78AD1__INCLUDED_)

@ -0,0 +1,87 @@
#include "stdafx.h"
#include "CTCPSocket.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CTCPSocket::CTCPSocket() : CAsyncSocket(), RemoteIP( "127.0.0.1" ), RemotePort( 8888 ),
LocalIP( "127.0.0.1" ), LocalPort(8889), RevData(NULL), m_Param( NULL ), m_Length( -1 ),
m_bConnected( false )
{
memset(ReceiveBuf, 0, MAX_TCP_BUF_LEN);
}
CTCPSocket::~CTCPSocket()
{
try
{
CAsyncSocket::Close();
m_Param = NULL;
}
catch ( ... )
{
}
}
bool CTCPSocket::StartListening()
{
if ( !AfxSocketInit() )
{
return false;
}
if ( !Create() )
{
return false;
}
if ( Connect( RemoteIP, RemotePort )/*t_Error == 1*/)
{
//MessageBox(_T("Á¬½ÓTCP·þÎñÆ÷")+RemoteIP+_T("ʧ°Ü£¡"));
return false;
}
return true;
}
bool CTCPSocket::WriteBuffer( const void *buf, unsigned int len )
{
if(!m_bConnected)
{
return false;
}
int nRet = CAsyncSocket::Send( buf, len );
//Sleep( 1 );
if (SOCKET_ERROR == nRet)
{
return false;
}
return true;
}
void CTCPSocket::OnReceive( int nErrorCode )
{
CAsyncSocket::OnReceive( nErrorCode );
if( nErrorCode == 0 )
{
m_Length = ReceiveFrom( ReceiveBuf, MAX_TCP_BUF_LEN, RemoteIP, RemotePort );
if ( m_Length == SOCKET_ERROR )
{
return;
}
if ( RevData != NULL )
{
RevData(ReceiveBuf, m_Length, (UINT32)m_Param );
}
}
}
void CTCPSocket::OnConnect(int nErrorCode)
{
if(nErrorCode == 0)
{
m_bConnected = true;
}
}

@ -0,0 +1,65 @@
#ifndef _CTCP_SOCKET_H
#define _CTCP_SOCKET_H
#include <afxsock.h>
//#include <vector>
//using namespace std;
#define MAX_TCP_BUF_LEN 30745
typedef void ( CALLBACK *TCPRevDataCALLBACK )( unsigned char *buffer, int length, UINT32 data);
class CTCPSocket : public CAsyncSocket
{
public:
CTCPSocket();
virtual ~CTCPSocket();
public:
bool StartListening();
bool StopListening()
{
CAsyncSocket::Close();
return true;
}
void SetLocalIP( CString ip )
{
LocalIP = ip;
}
void SetLocalPort( unsigned int port )
{
LocalPort = port;
}
void SetRomoteIP( CString ip )
{
RemoteIP = ip;
}
void SetRemotePort( unsigned int port )
{
RemotePort = port;
}
void SetCallBack( TCPRevDataCALLBACK DataCallBack, LPVOID Param )
{
RevData = DataCallBack;
m_Param = Param;
}
bool WriteBuffer( const void *buf, unsigned int len );
protected:
virtual void OnReceive(int nErrorCode);
virtual void OnConnect(int nErrorCode);
private:
CString RemoteIP;
unsigned int RemotePort;
CString LocalIP;
unsigned int LocalPort;
TCPRevDataCALLBACK RevData;
LPVOID m_Param;
bool m_bConnected;
int m_Length;
unsigned char ReceiveBuf[MAX_TCP_BUF_LEN];
};
#endif

@ -0,0 +1,99 @@
#include "stdafx.h"
#include "CUDPSocket.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
CUDPSocket::CUDPSocket() : CAsyncSocket(), RemoteIP( "127.0.0.1" ), RemotePort( 8888 ),
LocalIP( "127.0.0.1" ), LocalPort(8889), SendHDNum( 0 ),
m_Param(NULL),RevData(NULL),
ReceiveNum( 0 ), bRecSearchHead( false ),m_Length( -1 )
{
memset(ReceiveBuf, 0, MAX_UDP_BUF_LEN);
}
void CUDPSocket::SetParams(CString localIP,unsigned int localPort,CString remoteIP,unsigned int remotePort)
{
memset(ReceiveBuf, 0, MAX_UDP_BUF_LEN);
LocalIP = localIP;
LocalPort = localPort;
RemoteIP = remoteIP;
RemotePort = remotePort;
}
CUDPSocket::~CUDPSocket()
{
try
{
CAsyncSocket::Close();
m_Param = NULL;
}
catch ( ... )
{
}
}
bool CUDPSocket::StartListening(bool flag)
{
RemoteIP.ReleaseBuffer();
LocalIP.ReleaseBuffer();
if ( !AfxSocketInit() )
{
return false;
}
if(flag)
{
if ( !Create( LocalPort, SOCK_DGRAM, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE ) )
{
return false;
}
Bind(LocalPort,LocalIP);
}
else
{
if ( !Create( LocalPort, SOCK_DGRAM, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,LocalIP ) )
{
return false;
}
}
DWORD dwFlag = 0;
IOCtl( FIONBIO, &dwFlag );
return true;
}
bool CUDPSocket::WriteBuffer( const void *buf, unsigned int len )
{
if(SendTo( buf, len, RemotePort, RemoteIP ) < 0)
{
return false;
}
return true;
}
void CUDPSocket::OnReceive( int nErrorCode )
{
m_Length = ReceiveFrom( ReceiveBuf, MAX_UDP_BUF_LEN, RemoteIP, RemotePort );
if ( m_Length == SOCKET_ERROR )
{
return;
}
if ( RevData != NULL )
{
RevData(ReceiveBuf, m_Length, m_Param );
}
CAsyncSocket::OnReceive( nErrorCode );
}
void CUDPSocket::SetCallBack( UDPRevDataCALLBACK DataCallBack, LPVOID Param )
{
m_Param = Param;
RevData = DataCallBack;
}

@ -0,0 +1,62 @@
#ifndef _CUDP_SOCKET_H
#define _CUDP_SOCKET_H
#include <afxsock.h>
#include <vector>
using namespace std;
#define MAX_UDP_BUF_LEN 30745//25600 30745 SMData´óС
//#define WM_RECEIVE_NET_DATA (WM_USER + 88)
//typedef void ( CALLBACK *UDPRevDataCALLBACK )( unsigned char *rxdata, DWORD lLen, UINT32 Param );
typedef void ( CALLBACK *UDPRevDataCALLBACK )(const void* buffer, int length, LPVOID data);
class CUDPSocket : public CAsyncSocket
{
private:
CString RemoteIP;
unsigned int RemotePort;
CString LocalIP;
unsigned int LocalPort;
unsigned char SendHDNum;
unsigned int ReceiveNum;
bool bRecSearchHead;
int m_Length;
char ReceiveBuf[MAX_UDP_BUF_LEN];
UDPRevDataCALLBACK RevData;
LPVOID m_Param;
public:
CUDPSocket();
void SetParams(CString localIP,unsigned int localPort,CString remoteIP,unsigned int remotePort);
virtual ~CUDPSocket();
bool StartListening(bool flag = false);
bool StopListening()
{
CAsyncSocket::Close();
return true;
}
void SetLocalIP( CString ip )
{
LocalIP = ip;
}
void SetLocalPort( unsigned int port )
{
LocalPort = port;
}
void SetRomoteIP( CString ip )
{
RemoteIP = ip;
}
void SetRemotePort( unsigned int port )
{
RemotePort = port;
}
void SetCallBack( UDPRevDataCALLBACK DataCallBack, LPVOID Param );
bool WriteBuffer( const void *buf, unsigned int len );
protected:
virtual void OnReceive( int nErrorCode );
};
#endif //CUdpSocket

@ -0,0 +1,34 @@
#include "StdAfx.h"
#include "CYHMudpSend.h"
/*×é²¥·¢ËÍ*/
CYHMudpSend::CYHMudpSend()
{
}
CYHMudpSend::~CYHMudpSend()
{
}
bool CYHMudpSend::initMUDP(const char *IP,u_short Port)
{
WSAStartup(MAKEWORD(2, 2), &wsaData);
sock = socket(AF_INET, SOCK_DGRAM, 0);
n = 0;
setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&n, sizeof(n));
addr.sin_addr.S_un.S_addr = inet_addr(IP);
addr.sin_family = AF_INET;
addr.sin_port = htons(Port);
return true;
}
bool CYHMudpSend::SendData(BYTE* const bufs,int length)
{
char* buf = (char*)bufs;
//sendto(sock, buf, strlen(buf) + 1, 0, (sockaddr*)&addr, sizeof(sockaddr));
sendto(sock, buf, length, 0, (sockaddr*)&addr, sizeof(sockaddr));
return true;
}

@ -0,0 +1,19 @@
#pragma once
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
class CYHMudpSend
{
public:
CYHMudpSend();
~CYHMudpSend();
public:
WSADATA wsaData;
SOCKET sock;
int n;
sockaddr_in addr;
public:
bool initMUDP(const char* IP, u_short Port);
bool SendData(BYTE* const,int);
};

@ -0,0 +1,72 @@
#include "stdafx.h"
#include "QBStru.h"
// openCV Library
#include <opencv2/opencv.hpp>
using namespace cv;
// 解码后通用情报结构体数据回调
// 参数意义:
// 1. qbstru: 情报结构体指针
// 2. purpose用途目的
typedef void (CALLBACK* SendQBStruProc)(const QBStru* qbstru, int purpose);
// 作用:人工选定目标时,对外输出目标点像素坐标
typedef void (CALLBACK* SendCoordinateProc)(CPoint Value);
// 鼠标移动输出像素信息
typedef void (CALLBACK* SendPixInfoProc)(CPoint xy, double Lon, double Lat, double H);
// 回调文件保存路径
// 参数意义:
// 1. FilePath: 文件路径
// 2. type :文件类型
// type = -1: 未知
// type = 0: 单帧图像采集或图像连续采集(后面) 图像路径 bmp格式
// type = 1: 单帧图像采集或图像连续采集(后面) 复接数据路径 xml格式
// type = 2: 多帧图像采集(前面图像) 图像路径 bmp格式
// type = 3: 多帧图像采集(前面图像) 复接数据路径 xml格式
// type = 4: 系统级几何校正后图像路径 tif格式
// type = 5: 拼接图像自动几何校正前 bmp格式
// type = 6: 拼接图像自动几何校正后 tif格式
// type = 7: 目标图像
typedef void (CALLBACK* SendFilePath)(CString FilePath, int type);
// 回调输出信息
typedef void (CALLBACK* SendMessageProc)(CString msg);
//
// 回调输出图像(显示)
typedef void (CALLBACK* SendImgProc)(const cv::Mat &img);
//
// 回调输出最近一张图像4个角点图像坐标
typedef void (CALLBACK* SendNewImgProc)(const POINT *pt);
// 回调输出 目标定位导引 输出经纬度
typedef void (CALLBACK* SendTgrLocLeadLonLatProc)(double lon0, double lat0,
double lon1, double lat1,
double lon2, double lat2,
double lon3, double lat3,
double lon4, double lat4);
// 回调输出 输出火炮校射 炸点相对于目标的距离和角度
typedef void (CALLBACK* SendArtilleryReviseInfoProc)(float dist, float angle);
// 回调输出 通知简单图像显示对话框被双击
typedef void (CALLBACK* SendLButtonDblClkInfoProc)();
// 通知简单图像显示对话框被右键按下
typedef void (CALLBACK* SendButtonDownInfoProc)(int type);
// 输出双击图像时的脱靶量
typedef void (CALLBACK* SendPixXYOffsetProc)(CPoint xy, int flag);
// 输出双击点与对话框中点的夹角
typedef void (CALLBACK* SendAngleProc)(double angle);
// 当鼠标按下时,输出鼠标点与对话框中心点的距离比例系数和角度
typedef void (CALLBACK* SendDistRatioAndAngleProc)(double distRatio, double angle);

@ -0,0 +1,333 @@
#include "stdafx.h"
#include "CeXDib.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CCeXDib::CCeXDib()
{
m_hDib = NULL;
m_dwLineWidth = 0;
m_wColors = 0;
m_hMemDC = NULL;
m_hBitmap = NULL;
m_lpBits = NULL;
FreeResources();
}
CCeXDib::~CCeXDib()
{
FreeResources();
}
void CCeXDib::FreeResources()
{
if (m_hMemDC) ::DeleteDC(m_hMemDC);
if (m_hBitmap) ::DeleteObject(m_hBitmap);
if (m_hDib) delete m_hDib;
m_hDib = NULL;
m_hMemDC = NULL;
m_hBitmap = NULL;
m_lpBits = NULL;
memset(&m_bi, 0, sizeof(m_bi));
} // End of FreeResources
HDIB CCeXDib::Create(DWORD dwWidth, DWORD dwHeight, WORD wBitCount)
{
LPBITMAPINFOHEADER lpbi = NULL; // Pointer to BITMAPINFOHEADER
DWORD dwLen = 0; // Size of memory block
FreeResources();
// Following <switch> is taken from
// CDIBSectionLite class by Chris Maunder
switch (wBitCount)
{
case 1: m_wColors = 2; break;
#ifdef _WIN32_WCE
case 2: m_wColors = 4; break; // winCE only
#endif
case 4: m_wColors = 16; break;
case 8: m_wColors = 256; break;
case 16:
case 24:
case 32: m_wColors = 0; break; // 16,24 or 32 bpp have no color table
default:
m_wColors = 0;
} // switch
/*
// Make sure bits per pixel is valid
if (wBitCount <= 1) wBitCount = 1;
else if (wBitCount <= 4) wBitCount = 4;
else if (wBitCount <= 8) wBitCount = 8;
else wBitCount = 24;
switch (wBitCount)
{
case 1:
m_wColors = 2;
break;
case 4:
m_wColors = 16;
break;
case 8:
m_wColors = 256;
break;
default:
m_wColors = 0;
break;
} // switch
*/
m_dwLineWidth = WIDTHBYTES(wBitCount * dwWidth);
// Initialize BITMAPINFOHEADER
m_bi.biSize = sizeof(BITMAPINFOHEADER);
m_bi.biWidth = dwWidth; // fill in width from parameter
m_bi.biHeight = dwHeight; // fill in height from parameter
m_bi.biPlanes = 1; // must be 1
m_bi.biBitCount = wBitCount; // from parameter
m_bi.biCompression = BI_RGB;
m_bi.biSizeImage = m_dwLineWidth * dwHeight;
m_bi.biXPelsPerMeter = 0;
m_bi.biYPelsPerMeter = 0;
m_bi.biClrUsed = 0;
m_bi.biClrImportant = 0;
// Calculate size of memory block required to store the DIB. This
// block should be big enough to hold the BITMAPINFOHEADER, the color
// table, and the bits.
dwLen = GetSize();
m_hDib = new HDIB[dwLen]; // Allocate memory block to store our bitmap
if (m_hDib == NULL) return NULL;
// Use our bitmap info structure to fill in first part of
// our DIB with the BITMAPINFOHEADER
lpbi = (LPBITMAPINFOHEADER)(m_hDib);
*lpbi = m_bi;
return m_hDib; // Return handle to the DIB
} // End of Create
DWORD CCeXDib::GetSize()
{
return m_bi.biSize + m_bi.biSizeImage + GetPaletteSize();
} // End of GetSize
DWORD CCeXDib::GetPaletteSize()
{
return (m_wColors * sizeof(RGBQUAD));
} // End of GetPaletteSize
LPBYTE CCeXDib::GetBits()
{
if (m_hDib) return ((LPBYTE)m_hDib + *(LPDWORD)m_hDib + GetPaletteSize());
return NULL;
} // End of GetBits
DWORD CCeXDib::GetWidth()
{
return m_bi.biWidth;
} // End of GetWidth
DWORD CCeXDib::GetHeight()
{
return m_bi.biHeight;
} // End of GetHeight
DWORD CCeXDib::GetLineWidth()
{
return m_dwLineWidth;
} // End of GetLineWidth
void CCeXDib::BlendPalette(COLORREF crColor, DWORD dwPerc)
{
if (m_hDib == NULL || m_wColors == 0) return;
LPBYTE iDst = (LPBYTE)(m_hDib) + sizeof(BITMAPINFOHEADER);
long i,r,g,b;
RGBQUAD* pPal = (RGBQUAD*)iDst;
r = GetRValue(crColor);
g = GetGValue(crColor);
b = GetBValue(crColor);
if (dwPerc > 100) dwPerc = 100;
for (i = 0; i < m_wColors; i++)
{
pPal[i].rgbBlue = (BYTE)((pPal[i].rgbBlue * (100 - dwPerc) + b * dwPerc) / 100);
pPal[i].rgbGreen = (BYTE)((pPal[i].rgbGreen * (100 - dwPerc) + g * dwPerc) / 100);
pPal[i].rgbRed = (BYTE)((pPal[i].rgbRed * (100 - dwPerc) + r * dwPerc) / 100);
} // for
} // End of BlendPalette
void CCeXDib::Clear(BYTE byVal)
{
if (m_hDib) memset(GetBits(), byVal, m_bi.biSizeImage);
} // End of Clear
void CCeXDib::SetPixelIndex(DWORD dwX, DWORD dwY, BYTE byI)
{
if ((m_hDib == NULL) || (m_wColors == 0) ||
((long)dwX < 0) || ((long)dwY < 0) || (dwX >= (DWORD)m_bi.biWidth) || (dwY >= (DWORD)m_bi.biHeight)) return;
LPBYTE iDst = GetBits();
iDst[(m_bi.biHeight - dwY - 1) * m_dwLineWidth + dwX] = byI;
} // End of SetPixelIndex
void CCeXDib::Clone(CCeXDib* src)
{
Create(src->GetWidth(), src->GetHeight(), src->GetBitCount());
if (m_hDib) memcpy(m_hDib, src->m_hDib, GetSize());
} // End of Clone
WORD CCeXDib::GetBitCount()
{
return m_bi.biBitCount;
} // End of GetBitCount
void CCeXDib::SetPaletteIndex(BYTE byIdx, BYTE byR, BYTE byG, BYTE byB)
{
if (m_hDib && m_wColors)
{
LPBYTE iDst = (LPBYTE)(m_hDib) + sizeof(BITMAPINFOHEADER);
if ((byIdx >= 0) && (byIdx < m_wColors))
{
long ldx = byIdx * sizeof(RGBQUAD);
iDst[ldx++] = (BYTE)byB;
iDst[ldx++] = (BYTE)byG;
iDst[ldx++] = (BYTE)byR;
iDst[ldx] = (BYTE)0;
} // if
} // if
} // End of SetPaletteIndex
void CCeXDib::Draw(HDC hDC, DWORD dwX, DWORD dwY)
{
HBITMAP hBitmap = NULL;
HBITMAP hOldBitmap = NULL;
HDC hMemDC = NULL;
if (m_hBitmap == NULL)
{
m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)m_hDib, DIB_RGB_COLORS, &m_lpBits, NULL, 0);
if (m_hBitmap == NULL) return;
if (m_lpBits == NULL)
{
::DeleteObject(m_hBitmap);
m_hBitmap = NULL;
return;
} // if
} // if
memcpy(m_lpBits, GetBits(), m_bi.biSizeImage);
if (m_hMemDC == NULL)
{
m_hMemDC = CreateCompatibleDC(hDC);
if (m_hMemDC == NULL) return;
} // if
hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);
BitBlt(hDC, dwX, dwY, m_bi.biWidth, m_bi.biHeight, m_hMemDC, 0, 0, SRCCOPY);
SelectObject(m_hMemDC, hOldBitmap);
} // End of Draw
void CCeXDib::SetGrayPalette()
{
RGBQUAD pal[256];
RGBQUAD* ppal;
LPBYTE iDst;
int ni;
if (m_hDib == NULL || m_wColors == 0) return;
ppal = (RGBQUAD*)&pal[0];
iDst = (LPBYTE)(m_hDib) + sizeof(BITMAPINFOHEADER);
for (ni = 0; ni < m_wColors; ni++)
{
pal[ni] = RGB2RGBQUAD(RGB(ni,ni,ni));
} // for
pal[0] = RGB2RGBQUAD(RGB(0,0,0));
pal[m_wColors-1] = RGB2RGBQUAD(RGB(255,255,255));
memcpy(iDst, ppal, GetPaletteSize());
} // End of SetGrayPalette
RGBQUAD CCeXDib::RGB2RGBQUAD(COLORREF cr)
{
RGBQUAD c;
c.rgbRed = GetRValue(cr); /* get R, G, and B out of DWORD */
c.rgbGreen = GetGValue(cr);
c.rgbBlue = GetBValue(cr);
c.rgbReserved=0;
return c;
} // End of RGB2RGBQUAD
WORD CCeXDib::GetNumColors()
{
return m_wColors;
} // End of GetNumColors
BOOL CCeXDib::WriteBMP(LPCTSTR bmpFileName)
{
BITMAPFILEHEADER hdr;
HANDLE hFile;
DWORD nByteWrite;
if (*bmpFileName == _T('\0') || m_hDib == 0) return 0;
hFile=CreateFile( // open if exist ini file
bmpFileName, // pointer to name of the file
GENERIC_WRITE, // access mode
0, // share mode
NULL, // pointer to security descriptor
CREATE_ALWAYS, // how to create
FILE_ATTRIBUTE_NORMAL, // file attributes
NULL // handle to file with attributes to copy
);
if (hFile == INVALID_HANDLE_VALUE) return FALSE;
// Fill in the fields of the file header
hdr.bfType = BFT_BITMAP;
hdr.bfSize = GetSize() + sizeof(BITMAPFILEHEADER);
hdr.bfReserved1 = hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER)+
m_bi.biSize + GetPaletteSize();
// Write the file header
WriteFile( // write ini (sync mode <-> no overlapped)
hFile, // handle of file to write
(LPSTR) &hdr, // address of buffer that contains data
sizeof(BITMAPFILEHEADER), // number of bytes to write
&nByteWrite, // address of number of bytes written
NULL // address of structure for data
);
// Write the DIB header and the bits
WriteFile( // write ini (sync mode <-> no overlapped)
hFile, // handle of file to write
(LPSTR) m_hDib, // address of buffer that contains data
GetSize(), // number of bytes to write
&nByteWrite, // address of number of bytes written
NULL // address of structure for data
);
CloseHandle(hFile); // free file handle
return TRUE;
} // End of WriteBMP

@ -0,0 +1,96 @@
//
// Class: CCeXDib
//
// Compiler: Visual C++
// eMbedded Visual C++
// Tested on: Visual C++ 6.0
// Windows CE 3.0
//
// Author: Davide Calabro' davide_calabro@yahoo.com
// http://www.softechsoftware.it
//
// Note: This class uses code snippets taken from a similar class written
// for the Win32 enviroment by Davide Pizzolato (ing.davide.pizzolato@libero.it)
//
// Disclaimer
// ----------
// THIS SOFTWARE AND THE ACCOMPANYING FILES ARE DISTRIBUTED "AS IS" AND WITHOUT
// ANY WARRANTIES WHETHER EXPRESSED OR IMPLIED. NO REPONSIBILITIES FOR POSSIBLE
// DAMAGES OR EVEN FUNCTIONALITY CAN BE TAKEN. THE USER MUST ASSUME THE ENTIRE
// RISK OF USING THIS SOFTWARE.
//
// Terms of use
// ------------
// THIS SOFTWARE IS FREE FOR PERSONAL USE OR FREEWARE APPLICATIONS.
// IF YOU USE THIS SOFTWARE IN COMMERCIAL OR SHAREWARE APPLICATIONS YOU
// ARE GENTLY ASKED TO DONATE 1$ (ONE U.S. DOLLAR) TO THE AUTHOR:
//
// Davide Calabro'
// P.O. Box 65
// 21019 Somma Lombardo (VA)
// Italy
//
//
#ifndef _CEXDIB_H_
#define _CEXDIB_H_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#ifndef HDIB
#define HDIB HANDLE
#endif
#ifndef WIDTHBYTES
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)
#endif
#ifndef BFT_BITMAP
#define BFT_BITMAP 0x4d42 // 'BM'
#endif
class CCeXDib
{
public:
CCeXDib();
virtual ~CCeXDib();
HDIB Create(DWORD dwWidth, DWORD dwHeight, WORD wBitCount);
void Clone(CCeXDib* src);
void Draw(HDC hDC, DWORD dwX, DWORD dwY);
LPBYTE GetBits();
void Clear(BYTE byVal = 0);
void SetGrayPalette();
void SetPaletteIndex(BYTE byIdx, BYTE byR, BYTE byG, BYTE byB);
void SetPixelIndex(DWORD dwX, DWORD dwY, BYTE byI);
void BlendPalette(COLORREF crColor, DWORD dwPerc);
WORD GetBitCount();
DWORD GetLineWidth();
DWORD GetWidth();
DWORD GetHeight();
WORD GetNumColors();
BOOL WriteBMP(LPCTSTR bmpFileName);
private:
void FreeResources();
DWORD GetPaletteSize();
DWORD GetSize();
RGBQUAD RGB2RGBQUAD(COLORREF cr);
HDIB m_hDib;
BITMAPINFOHEADER m_bi;
DWORD m_dwLineWidth;
WORD m_wColors;
HBITMAP m_hBitmap; // Handle to bitmap
HDC m_hMemDC; // Handle to memory DC
LPVOID m_lpBits; // Pointer to actual bitmap bits
};
#endif

@ -0,0 +1,185 @@
//功能:实现串口操作的一些函数
#include "StdAfx.h"
#include "ComControlFunction.h"
//查找系统可用的串口号将所有的串口号保存在pPortList数组里
//输出串口数portNumber串口号数组pPortList
//pPortList保存各串口的串口数字
BOOL ScanPCCom( int *pPortList, int& portNumber )
{
portNumber = 0; //系统配置的串口总数
//扫描PC机存在的串口从注册表读取存在的串口。
UINT nComNum = 0;
HKEY hKEY = NULL;
LONG hResult = ::RegOpenKeyEx( HKEY_LOCAL_MACHINE, _T( "HARDWARE\\DEVICEMAP\\SERIALCOMM" ), 0, KEY_READ, &hKEY );
if ( hResult != ERROR_SUCCESS ) //如果无法打开hKEY,则中止程序的执行
{
return FALSE;
}
TCHAR strInf[30];
memset( strInf, 0, sizeof( TCHAR ) * 30 );
DWORD type_1 = REG_SZ;
DWORD cbData_1 = 10;
DWORD aa = 30, num = 0;
DWORD a1 = 0, a2 = 0, a3 = 0, a4 = 0, a5 = 0, a6 = 0, a7 = 0;
//hResult = ::RegQueryInfoKey( hKEY, strInf, &a7, NULL, &a3, &a1, &a2, &num, &a4, &a5, &a6, NULL );
hResult = ::RegQueryInfoKeyA( hKEY, NULL, NULL, NULL, &a3, &a1, NULL, &num, &a4, &a5, NULL, NULL );
if ( hResult != ERROR_SUCCESS )
{
RegCloseKey( hKEY );
return FALSE;
}
BYTE portName[15];
memset( portName, 0, 15 );
CString csr = _T( "" );
for ( DWORD i = 0 ; i < num ; ++i )
{
aa = 30 ;
cbData_1 = 10;
hResult = ::RegEnumValue( hKEY, i, strInf, &aa, NULL, &type_1, portName, &cbData_1 );
if ( hResult != ERROR_SUCCESS )
{
continue;
}
csr.Format( _T( "%s" ), portName );
csr.Delete( 0, 3 );
pPortList[portNumber] = atoi( csr );
++portNumber; //系统配置的串口总数
++nComNum;
}
RegCloseKey( hKEY );
return TRUE;
}
//判断串口是否被占有串口可用返回true否则返回false
bool OnCheckComPort( const CString& portName )
{
CString str = _T( "//./" ) + portName;
HANDLE hCom = CreateFile( str, //打开串口1
GENERIC_READ | GENERIC_WRITE, //允许读和写操作
0, //独占方式
0, OPEN_EXISTING, //打开一个存在的串口
0, 0 );
if ( hCom == INVALID_HANDLE_VALUE ) //打开串口失败
{
return false;
}
else
{
CloseHandle( hCom );
hCom = NULL;
return true;
}
}
//判断串口是否为空
//串口为空返回true,否则返回false
bool CheckComPortIsEmpty( const CString strPort )
{
if ( strPort.Compare( _T( "" ) ) == 0 )
{
return true;
}
return false;
}
//功能检测2个串口是否相同相同返回True否则返回false
bool CompareTwoComPort( const CString port1, const CString port2 )
{
if ( ( port1.Compare( port2 ) ) == 0 )
{
return true;
}
else
{
return false;
}
}
//判断串口是否可用
//可用返回true,否则返回false
bool CheckComPortCanWork( const CString strPort )
{
if ( strPort.GetLength() <= 4 )
{
return false;
}
CString str = strPort;
str.Delete( 0, 4 ); //删除“串口”字符
CString strSelectCom = _T( "" );
strSelectCom.Format( "COM%d", atoi( str ) );
if ( !OnCheckComPort( strSelectCom ) ) //串口被占用返回false
{
return false;
}
else //串口可用返回true
{
return true;
}
}
//判断串口名称是否正确正确的名称为“串口XX”——前面为“串口”后面为数字
//串口名称正确返回true, 否则返回false
bool CheckComPortName( const CString strPort )
{
if ( strPort.GetLength() < 5 )
{
return false;
}
CString str = strPort;
if ( str.Left( 4 ) != _T( "串口" ) )
{
return false;
}
str = strPort;
str.Delete( 0, 4 );
for ( int i = 0; i < str.GetLength(); ++i )
{
if ( ( str.GetAt( i ) < '0' ) || ( str.GetAt( i ) > '9' ) )
{
return false;
}
}
return true;
}
//从串口数组中进行查找,查找出配置文件设置的串口号
//输入数组portArray数组长度arrLength查找元素itemValue
//输出元素的位置pos
//返回值查找成功返回true否则返回false
bool FindItemFromComList( int& pos, const int *portArray, const int& arrLength, const int& itemValue )
{
for ( int i = 0; i < arrLength; ++i )
{
if ( itemValue == portArray[i] )
{
pos = i;
return true;
}
}
return false;
}

@ -0,0 +1,41 @@
//功能:实现串口操作的一些函数
#ifndef COM_CONTROL_FUNCTION_H
#define COM_CONTROL_FUNCTION_H
//查找系统可用的串口号将所有的串口号保存在pPortList数组里
//输出串口数portNumber串口号数组pPortList
//pPortList保存各串口的串口数字
extern BOOL ScanPCCom( int *pPortList, int& portNumber );
//判断串口是否被占有串口可用返回true否则返回false
extern bool OnCheckComPort( const CString& portName );
//功能检测2个串口是否相同相同返回True否则返回false
extern bool CompareTwoComPort( const CString port1, const CString port2 );
//判断串口是否可用
//可用返回true,否则返回false
extern bool CheckComPortCanWork( const CString strPort );
//判断串口是否为空
//串口为空返回true,否则返回false
extern bool CheckComPortIsEmpty( const CString strPort );
//判断串口名称是否正确正确的名称为“串口XX”
//串口名称正确返回true, 否则返回false
extern bool CheckComPortName( const CString strPort );
//从串口数组中进行查找,查找出配置文件设置的串口号
//输入数组portArray数组长度arrLength查找元素itemValue
//输出元素的位置pos
//返回值查找成功返回true否则返回false
extern bool FindItemFromComList( int& pos, const int *portArray, const int& arrLength, const int& itemValue );
const int MaxComPortNumber = 1024;
#endif

@ -0,0 +1,475 @@
// ControlDlgFH96Page1.cpp : 实现文件
//
#include "stdafx.h"
#include "CH91PayloadSoftware.h"
#include "ControlDlgFH96Page1.h"
#include "afxdialogex.h"
#include "Global.h"
#include "GlobalMember.h"
#include "GlobalMessage.h"
// CControlDlgFH96Page1 对话框
IMPLEMENT_DYNAMIC(CControlDlgFH96Page1, CDialogEx)
CControlDlgFH96Page1::CControlDlgFH96Page1(CWnd* pParent /*=NULL*/)
: CDialogEx(CControlDlgFH96Page1::IDD, pParent)
{
// 数引变量初始化
m_Guide_Pitch = -90;
m_Guide_Azimuth = 0;
}
CControlDlgFH96Page1::~CControlDlgFH96Page1()
{
}
void CControlDlgFH96Page1::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT_GUIDE_AZIMUTH_FH96, str_Guide_Azimuth);
DDX_Control(pDX, IDC_EDIT_GUIDE_PITCH_FH96, str_Guide_Pitch);
DDX_Text(pDX, IDC_EDIT_GUIDE_AZIMUTH_FH96, m_Guide_Azimuth);
DDX_Text(pDX, IDC_EDIT_GUIDE_PITCH_FH96, m_Guide_Pitch);
}
BEGIN_MESSAGE_MAP(CControlDlgFH96Page1, CDialogEx)
ON_MESSAGE(WM_SHOW_MAP_GUIDE_POS, CControlDlgFH96Page1::ShowMapZHGuide)
END_MESSAGE_MAP()
// CControlDlgFH96Page1 消息处理程序
BOOL CControlDlgFH96Page1::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 获取句柄
g_CH96CtrlDlgHwnd = GetSafeHwnd();
// 关联发送指令&&手动控制显示
CRect rc_SendCommandControl;
GetDlgItem(IDC_STATIC_MANUALSLEW_FH96)->GetWindowRect(rc_SendCommandControl);
ScreenToClient(rc_SendCommandControl);
m_SendControlCommandDlg = new CSendControlCommand();
if (m_SendControlCommandDlg != NULL)
{
m_SendControlCommandDlg->Create(IDD_DLG_SENDCONTROLCOMMAND, this);
}
m_SendControlCommandDlg->MoveWindow(&rc_SendCommandControl);
m_SendControlCommandDlg->ShowWindow(SW_SHOW);
// 设置对话框界面
DlgStyleSet();
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
// 获取载荷控制指令
int CControlDlgFH96Page1::GetPayloadCtrlProtocol()
{
return g_payloadCtrlProtocol;
}
// 设置载荷控制指令
void CControlDlgFH96Page1::SetPayloadCtrlProtocol(int Protocol)
{
g_payloadCtrlProtocol = Protocol;
}
// 地图载荷导引显示函数
LRESULT CControlDlgFH96Page1::ShowMapZHGuide(WPARAM wParam, LPARAM lParam)
{
m_Guide_Azimuth = int(g_Guide_Azimuth * 100) * 0.01f;
m_Guide_Pitch = int(g_Guide_Pitch * 100) * 0.01f;
UpdateData(FALSE);
// 数引
SetPayloadCtrlProtocol(4);
g_sCtrlInstruction = "数引";
g_Guide_Azimuth = m_Guide_Azimuth;
g_Guide_Pitch = m_Guide_Pitch;
g_bMapDirectGuide = TRUE; // 是否是地图直接导引的标志位
return 0;
}
BOOL CControlDlgFH96Page1::PreTranslateMessage(MSG* pMsg)
{
// 键盘消息
if (pMsg->message == WM_KEYDOWN)
{
// 忽略ESC和回车键
if (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN)
{
return TRUE;
}
}
//如果左键按下,则发送数据(按下、重复类)
if (pMsg->message == WM_LBUTTONDOWN)
{
g_bCtrlFromSoftware = TRUE;
// 速度配置——重复
if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_SPEEDCONFIG_FH96))
{
g_payloadCtrlProtocol = 1;
}
// 锁定模式
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_LOCKMODE_FH96))
{
g_payloadCtrlProtocol = 2;
}
// 扫描模式
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_SCANMODE_FH96))
{
g_payloadCtrlProtocol = 3;
}
// 数字引导模式——抬起
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_DIGITALBOOTMODE_FH96))
{
// 如果输入的内容为空或者只有1负号则值为零
CString _Azimuth;
CString _Pitch;
GetDlgItem(IDC_EDIT_GUIDE_AZIMUTH_FH96)->GetWindowText(_Azimuth);
GetDlgItem(IDC_EDIT_GUIDE_PITCH_FH96)->GetWindowText(_Pitch);
if (_Azimuth == "" || _Azimuth == "-" )
{
GetDlgItem(IDC_EDIT_GUIDE_AZIMUTH_FH96)->SetWindowText("0");
}
if (_Pitch == "" || _Pitch == "-")
{
GetDlgItem(IDC_EDIT_GUIDE_PITCH_FH96)->SetWindowText("-90");
}
UpdateData(TRUE);
if (m_Guide_Azimuth <=180 && m_Guide_Azimuth >= -180 && m_Guide_Pitch <= 10 && m_Guide_Pitch >= -110)
{
g_Guide_Azimuth = m_Guide_Azimuth;
g_Guide_Pitch = m_Guide_Pitch;
g_payloadCtrlProtocol = 4;
}
else
{
GetDlgItem(IDC_EDIT_GUIDE_AZIMUTH_FH96)->SetWindowText("0");
GetDlgItem(IDC_EDIT_GUIDE_PITCH_FH96)->SetWindowText("-90");
MessageBox(_T("请输入正确范围内的角度!"));
}
}
// 平台复位——抬起
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_TURRETRESET_FH96))
{
g_payloadCtrlProtocol = 5;
}
//补漂方位-——重复
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_COMPENSATEDRIFT_AZUMITHMINUS_FH96))
{
g_payloadCtrlProtocol = 6;
}
//补漂方位+——重复
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_COMPENSATEDRIFT_AZUMITHADD_FH96))
{
g_payloadCtrlProtocol = 7;
}
//补漂俯仰-——重复
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_COMPENSATEDRIFT_PITCHMINUS_FH96))
{
g_payloadCtrlProtocol = 8;
}
//补漂俯仰+——重复
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_COMPENSATEDRIFT_PITCHADD_FH96))
{
g_payloadCtrlProtocol = 9;
}
// 手动模式——抬起
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_MANUALMODE_FH96))
{
g_payloadCtrlProtocol = 10;
}
// 跟踪模式——抬起
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_TRACKMODE_FH96))
{
g_payloadCtrlProtocol = 11;
}
// 红外白热——抬起
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_IRWH_FH96))
{
g_payloadCtrlProtocol = 12;
}
// 红外黑热——抬起
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_IRBH_FH96))
{
g_payloadCtrlProtocol = 13;
}
//焦距+——重复
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_FOCUSADD_FH96))
{
g_payloadCtrlProtocol = 14;
}
//焦距-——重复
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_FOCUSMINUS_FH96))
{
g_payloadCtrlProtocol = 15;
}
// 红外小视场——抬起
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_IRFOVMINUS_FH96))
{
g_payloadCtrlProtocol = 16;
}
// 红外大视场——抬起
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_IRFOVADD_FH96))
{
g_payloadCtrlProtocol = 17;
}
// OSD ON/OFF——抬起
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_OSDON_FH96))
{
g_payloadCtrlProtocol = 18;
}
// 图像切换——抬起
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_IMGSWITCH_FH96))
{
g_payloadCtrlProtocol = 19;
}
// 画中画开——抬起
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_PIPON_FH96))
{
g_payloadCtrlProtocol = 20;
}
// 画中画关——抬起
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_PIPOFF_FH96))
{
g_payloadCtrlProtocol = 21;
}
// 图像稳定关——抬起
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_IMGSTABLIZEOFF_FH96))
{
g_payloadCtrlProtocol = 22;
}
// 图像稳定开——抬起
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_IMGSTABLIZEON_FH96))
{
g_payloadCtrlProtocol = 23;
}
//可见光透雾1——重复
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_DEFOGONE_FH96))
{
g_payloadCtrlProtocol = 24;
}
//可见光透雾2——重复
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_DEFOGTWO_FH96))
{
g_payloadCtrlProtocol = 25;
}
//可见光透雾3——重复
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_DEFOGTHREE_FH96))
{
g_payloadCtrlProtocol = 26;
}
//可见光透雾关——重复
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_DEFOGOFF_FH96))
{
g_payloadCtrlProtocol = 27;
}
//开始连续照相
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_CONTINUOUSSHOOT_FH96))
{
g_payloadCtrlProtocol = 28;
}
//停止照相
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_STOPSHOOT_FH96))
{
g_payloadCtrlProtocol = 29;
}
//拍一张照
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_SINGLESHOOT_FH96))
{
g_payloadCtrlProtocol = 30;
}
//激光测距开
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_LASERRANGINGON_FH96))
{
g_payloadCtrlProtocol = 31;
}
//激光测距关
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_LASERRANGINGOFF_FH96))
{
g_payloadCtrlProtocol = 32;
}
//激光电源开
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_LASERPOWERON_FH96))
{
g_payloadCtrlProtocol = 33;
}
//激光电源关
else if (WindowFromPoint(pMsg->pt) == GetDlgItem(IDC_BTN_LASERPOWEROFF_FH96))
{
g_payloadCtrlProtocol = 34;
}
else
{
}
}
else if (pMsg->message == WM_LBUTTONUP) // 如果左键抬起,则发送数据(抬起类)
{
g_payloadCtrlProtocol = 0;
g_bCtrlFromSoftware = FALSE;
// 发送消息,将焦点置于主界面
if(WindowFromPoint(pMsg->pt) != GetDlgItem(IDC_EDIT_GUIDE_AZIMUTH_FH96) && WindowFromPoint(pMsg->pt) != GetDlgItem(IDC_EDIT_GUIDE_PITCH_FH96))
{
::PostMessage(g_mainDlgHwnd, WM_SETFOCUS_AFTERCONTROL, 0, 0);
}
}
return CDialogEx::PreTranslateMessage(pMsg);
}
void CControlDlgFH96Page1::OnDestroy()
{
CDialogEx::OnDestroy();
// 停止发送控制指令
if (true == g_bCreatUDP)
{
g_UdpSend2Payload.SetCallBack(NULL, nullptr);
g_UdpSend2Payload.StopListening();
}
}
// 设置对话框界面
void CControlDlgFH96Page1::DlgStyleSet()
{
//速度配置
m_Btn_SpeedConfig.SubclassDlgItem(IDC_BTN_SPEEDCONFIG_FH96, this);
m_Btn_SpeedConfig.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_SpeedConfig.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
// 锁定模式
m_Btn_LockMode.SubclassDlgItem(IDC_BTN_LOCKMODE_FH96, this);
m_Btn_LockMode.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_LockMode.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
// 扫描模式
m_Btn_ScanMode.SubclassDlgItem(IDC_BTN_SCANMODE_FH96, this);
m_Btn_ScanMode.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_ScanMode.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
// 平台复位
m_Btn_TurretReset.SubclassDlgItem(IDC_BTN_TURRETRESET_FH96, this);
m_Btn_TurretReset.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_TurretReset.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
// 补漂方位-
m_Btn_CompensateDrift_AzumithMinus.SubclassDlgItem(IDC_BTN_COMPENSATEDRIFT_AZUMITHMINUS_FH96, this);
m_Btn_CompensateDrift_AzumithMinus.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_CompensateDrift_AzumithMinus.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
// 补漂方位+
m_Btn_CompensateDrift_AzumithAdd.SubclassDlgItem(IDC_BTN_COMPENSATEDRIFT_AZUMITHADD_FH96, this);
m_Btn_CompensateDrift_AzumithAdd.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_CompensateDrift_AzumithAdd.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
// 补漂俯仰-
m_Btn_CompensateDrift_PitchMinus.SubclassDlgItem(IDC_BTN_COMPENSATEDRIFT_PITCHMINUS_FH96, this);
m_Btn_CompensateDrift_PitchMinus.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_CompensateDrift_PitchMinus.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
// 补漂俯仰+
m_Btn_CompensateDrift_PitchAdd.SubclassDlgItem(IDC_BTN_COMPENSATEDRIFT_PITCHADD_FH96, this);
m_Btn_CompensateDrift_PitchAdd.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_CompensateDrift_PitchAdd.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
// 手动模式
m_Btn_ManualMode.SubclassDlgItem(IDC_BTN_MANUALMODE_FH96, this);
m_Btn_ManualMode.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_ManualMode.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
// 跟踪模式
m_Btn_TrackMode.SubclassDlgItem(IDC_BTN_TRACKMODE_FH96, this);
m_Btn_TrackMode.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_TrackMode.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
// 红外白热
m_Btn_IRWH.SubclassDlgItem(IDC_BTN_IRWH_FH96, this);
m_Btn_IRWH.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_IRWH.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
// 红外黑热
m_Btn_IRBH.SubclassDlgItem(IDC_BTN_IRBH_FH96, this);
m_Btn_IRBH.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_IRBH.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//焦距+
m_Btn_FocusAdd.SubclassDlgItem(IDC_BTN_FOCUSADD_FH96, this);
m_Btn_FocusAdd.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_FocusAdd.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//焦距-
m_Btn_FocusMinus.SubclassDlgItem(IDC_BTN_FOCUSMINUS_FH96, this);
m_Btn_FocusMinus.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_FocusMinus.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//红外小视场
m_Btn_IRFOVMinus.SubclassDlgItem(IDC_BTN_IRFOVMINUS_FH96, this);
m_Btn_IRFOVMinus.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_IRFOVMinus.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//红外大视场
m_Btn_IRFOVAdd.SubclassDlgItem(IDC_BTN_IRFOVADD_FH96, this);
m_Btn_IRFOVAdd.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_IRFOVAdd.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//OSD ON/OFF
m_Btn_OSDON.SubclassDlgItem(IDC_BTN_OSDON_FH96, this);
m_Btn_OSDON.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_OSDON.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//图像切换
m_Btn_ImgSwitch.SubclassDlgItem(IDC_BTN_IMGSWITCH_FH96, this);
m_Btn_ImgSwitch.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_ImgSwitch.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//画中画开
m_Btn_PIPON.SubclassDlgItem(IDC_BTN_PIPON_FH96, this);
m_Btn_PIPON.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_PIPON.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//画中画关
m_Btn_PIPOFF.SubclassDlgItem(IDC_BTN_PIPOFF_FH96, this);
m_Btn_PIPOFF.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_PIPOFF.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//图像稳定关
m_Btn_ImgStablizeOFF.SubclassDlgItem(IDC_BTN_IMGSTABLIZEOFF_FH96, this);
m_Btn_ImgStablizeOFF.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_ImgStablizeOFF.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//图像稳定开
m_Btn_ImgStablizeON.SubclassDlgItem(IDC_BTN_IMGSTABLIZEON_FH96, this);
m_Btn_ImgStablizeON.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_ImgStablizeON.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//可见光透雾1
m_Btn_DEFOGOne.SubclassDlgItem(IDC_BTN_DEFOGONE_FH96, this);
m_Btn_DEFOGOne.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_DEFOGOne.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//可见光透雾2
m_Btn_DEFOGTwo.SubclassDlgItem(IDC_BTN_DEFOGTWO_FH96, this);
m_Btn_DEFOGTwo.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_DEFOGTwo.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//可见光透雾3
m_Btn_DEFOGThree.SubclassDlgItem(IDC_BTN_DEFOGTHREE_FH96, this);
m_Btn_DEFOGThree.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_DEFOGThree.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//可见光透雾关
m_Btn_DEFOGOFF.SubclassDlgItem(IDC_BTN_DEFOGOFF_FH96, this);
m_Btn_DEFOGOFF.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_DEFOGOFF.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//开始连续照相
m_Btn_ContinuousShoot.SubclassDlgItem(IDC_BTN_CONTINUOUSSHOOT_FH96, this);
m_Btn_ContinuousShoot.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_ContinuousShoot.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//停止照相
m_Btn_StopShoot.SubclassDlgItem(IDC_BTN_STOPSHOOT_FH96, this);
m_Btn_StopShoot.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_StopShoot.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//拍一张照
m_Btn_SingleShoot.SubclassDlgItem(IDC_BTN_SINGLESHOOT_FH96, this);
m_Btn_SingleShoot.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_SingleShoot.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//激光测距开
m_Btn_LaserRangingON.SubclassDlgItem(IDC_BTN_LASERRANGINGON_FH96, this);
m_Btn_LaserRangingON.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_LaserRangingON.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//激光测距关
m_Btn_LaserRangingOFF.SubclassDlgItem(IDC_BTN_LASERRANGINGOFF_FH96, this);
m_Btn_LaserRangingOFF.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_LaserRangingOFF.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//激光电源开
m_Btn_LaserPowerON.SubclassDlgItem(IDC_BTN_LASERPOWERON_FH96, this);
m_Btn_LaserPowerON.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_LaserPowerON.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//激光电源关
m_Btn_LaserPowerOFF.SubclassDlgItem(IDC_BTN_LASERPOWEROFF_FH96, this);
m_Btn_LaserPowerOFF.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_LaserPowerOFF.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
//数字引导
m_Btn_DigitalBootMode.SubclassDlgItem(IDC_BTN_DIGITALBOOTMODE_FH96, this);
m_Btn_DigitalBootMode.SetShade(CShadeButtonST::SHS_METAL);
m_Btn_DigitalBootMode.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
}

@ -0,0 +1,78 @@
#pragma once
#include "afxwin.h"
#include "afxcmn.h"
#include "ShadeButtonST.h"
#include "SendControlCommand.h"
#include "EditInput.h"
// CControlDlgFH96Page1 对话框
class CControlDlgFH96Page1 : public CDialogEx
{
DECLARE_DYNAMIC(CControlDlgFH96Page1)
public:
CControlDlgFH96Page1(CWnd* pParent = NULL); // 标准构造函数
virtual ~CControlDlgFH96Page1();
// 对话框数据
enum { IDD = IDD_DLG_CONTROL_96_1 };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
private:
CSendControlCommand* m_SendControlCommandDlg;
public:
virtual BOOL OnInitDialog();
void SetPayloadCtrlProtocol(int Protocol);
int GetPayloadCtrlProtocol();
void DlgStyleSet();
BOOL PreTranslateMessage(MSG* pMsg);
void OnDestroy();
// 地图载荷导引显示函数
LRESULT ShowMapZHGuide(WPARAM wParam, LPARAM lParam);
//指令
public:
CShadeButtonST m_Btn_SpeedConfig; //速度配置
CShadeButtonST m_Btn_LockMode; // 锁定模式
CShadeButtonST m_Btn_ScanMode; // 扫描模式
CShadeButtonST m_Btn_TurretReset; // 平台复位
CShadeButtonST m_Btn_CompensateDrift_AzumithMinus; // 补漂方位-
CShadeButtonST m_Btn_CompensateDrift_AzumithAdd; // 补漂方位+
CShadeButtonST m_Btn_CompensateDrift_PitchMinus; // 补漂俯仰-
CShadeButtonST m_Btn_CompensateDrift_PitchAdd; // 补漂俯仰+
CShadeButtonST m_Btn_ManualMode; // 手动模式
CShadeButtonST m_Btn_TrackMode; // 跟踪模式
CShadeButtonST m_Btn_IRWH; // 红外白热
CShadeButtonST m_Btn_IRBH; // 红外黑热
CShadeButtonST m_Btn_FocusAdd; //焦距+
CShadeButtonST m_Btn_FocusMinus; //焦距-
CShadeButtonST m_Btn_IRFOVMinus; //红外小视场
CShadeButtonST m_Btn_IRFOVAdd; //红外大视场
CShadeButtonST m_Btn_OSDON; //OSD ON/OFF
CShadeButtonST m_Btn_ImgSwitch; //图像切换
CShadeButtonST m_Btn_PIPON; //画中画开
CShadeButtonST m_Btn_PIPOFF; //画中画关
CShadeButtonST m_Btn_ImgStablizeOFF; //图像稳定关
CShadeButtonST m_Btn_ImgStablizeON; //图像稳定开
CShadeButtonST m_Btn_DEFOGOne; //可见光透雾1
CShadeButtonST m_Btn_DEFOGTwo; //可见光透雾2
CShadeButtonST m_Btn_DEFOGThree; //可见光透雾3
CShadeButtonST m_Btn_DEFOGOFF; //可见光透雾关
CShadeButtonST m_Btn_ContinuousShoot; //开始连续照相
CShadeButtonST m_Btn_StopShoot; //停止照相
CShadeButtonST m_Btn_SingleShoot; //拍一张照
CShadeButtonST m_Btn_LaserRangingON; //激光测距开
CShadeButtonST m_Btn_LaserRangingOFF; // 激光测距关
CShadeButtonST m_Btn_LaserPowerON; // 激光电源开
CShadeButtonST m_Btn_LaserPowerOFF; // 激光电源关
CShadeButtonST m_Btn_DigitalBootMode; // 数字引导模式
// 主界面数引控制
CEditInput str_Guide_Azimuth; //方位角
CEditInput str_Guide_Pitch; //俯仰角
float m_Guide_Azimuth; //方位角
float m_Guide_Pitch; //俯仰角
};

@ -0,0 +1,36 @@
// ControlDlgFH96Page2.cpp : 实现文件
//
#include "stdafx.h"
#include "CH91PayloadSoftware.h"
#include "ControlDlgFH96Page2.h"
#include "afxdialogex.h"
#include "Global.h"
#include "GlobalMember.h"
#include "GlobalMessage.h"
// CControlDlgFH96Page2 对话框
IMPLEMENT_DYNAMIC(CControlDlgFH96Page2, CDialogEx)
CControlDlgFH96Page2::CControlDlgFH96Page2(CWnd* pParent /*=NULL*/)
: CDialogEx(CControlDlgFH96Page2::IDD, pParent)
{
}
CControlDlgFH96Page2::~CControlDlgFH96Page2()
{
}
void CControlDlgFH96Page2::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CControlDlgFH96Page2, CDialogEx)
END_MESSAGE_MAP()
// CControlDlgFH96Page2 消息处理程序

@ -0,0 +1,24 @@
#pragma once
#include "afxwin.h"
#include "afxcmn.h"
#include "ShadeButtonST.h"
#include "SendControlCommand.h"
// CControlDlgFH96Page2 对话框
class CControlDlgFH96Page2 : public CDialogEx
{
DECLARE_DYNAMIC(CControlDlgFH96Page2)
public:
CControlDlgFH96Page2(CWnd* pParent = NULL); // 标准构造函数
virtual ~CControlDlgFH96Page2();
// 对话框数据
enum { IDD = IDD_DLG_CONTROL_96_2 };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
};

@ -0,0 +1,214 @@
#ifndef _CDCFrameCkCmdFrame_
#define _CDCFrameCkCmdFrame_
//数据注入指令从控发送数据协议
#pragma once
//#include "framelib/basetype.h"
//#include "framelib/DataInject.h"
#pragma pack(1)
typedef struct struProtocalDataInject_DC
{
UINT8 DCtype; //吊舱类型
union
{
struct
{
UINT8 SwitchCmd; //开关指令
INT16 param1; //参数1
INT16 param2; //参数2
UINT8 reserve[9]; //保留
}DC_13Ins;//13所吊舱控制指令
struct
{
BYTE param; //参数
BYTE param2; //参数
BYTE param3; //参数
BYTE param4; //参数
BYTE param5; //参数
BYTE param6; //参数
BYTE param7; //参数
BYTE param8; //参数
BYTE param9; //参数
BYTE param10; //参数
BYTE param11; //参数
BYTE param12; //参数
BYTE param13; //参数
BYTE param14; //参数
}DC_WHTJ; //天进吊舱控制指令
BYTE DataIn[14];//14个字节
};
}ProtocalDataInject_DC;
typedef struct struDataInject_DC
{
UINT8 DCtype; //吊舱类型
union
{
struct
{
UINT8 SwitchCmd; //开关指令
double param1; //参数1
double param2; //参数2
UINT8 reserve[9]; //保留
}DC_13Ins;//13所吊舱控制指令
struct
{
BYTE param; //参数
BYTE param2; //参数
BYTE param3; //参数
BYTE param4; //参数
BYTE param5; //参数
BYTE param6; //参数
BYTE param7; //参数
BYTE param8; //参数
BYTE param9; //参数
BYTE param10; //参数
BYTE param11; //参数
BYTE param12; //参数
BYTE param13; //参数
BYTE param14; //参数
}DC_WHTJ;//天进吊舱控制指令
BYTE DC_Data[14];//14个字节
};
}DataInject_DC;
//数据注入指令从控发送数据帧---13所吊舱
typedef struct struDCFrameCkCmd
{
UINT8 FrameHead[2]; //帧头EB 90
UINT8 fcode; //数据注入指令码
ProtocalDataInject_DC protocalDataInject_DC;
UINT16 crc16; //校验位
}DCFrameCkCmd;
#pragma pack()
//数据结构体
typedef struct struDCFrameCkCmdData
{
UINT8 fcode; //数据注入指令码
DataInject_DC dataInject_DC;
UINT16 crc16; //校验位
}DCFrameCkCmdData;
#pragma pack()
class CDCFrameCkCmdFrame : public CFrameAbstract
{
public:
DCFrameCkCmdData Data;
public:
CDCFrameCkCmdFrame()
{
//具体数据长度
_tcscpy(Name, _T("DateInject_CK_DC"));//数据注入 从控 吊舱
FrameLength = 20;
HeadLength = 2;
Head[0] = 0xEB;
Head[1] = 0x90;
memcpy(Addr(), Head, HeadLength);//把Head的第一位到HeadLength位的值赋值给Addr()
CheckLength = 2;
CheckPos = FrameLength - 2;
FrameType = ftFKu;
memset(&Data,0,sizeof(DCFrameCkCmdData));//将Data中的数据全都初始化为0
}
virtual ~CDCFrameCkCmdFrame(){}
virtual void Encode()
{
DCFrameCkCmd *pBuff = (DCFrameCkCmd*) Addr();
pBuff->fcode = Data.fcode;
pBuff->protocalDataInject_DC.DCtype = Data.dataInject_DC.DCtype;
switch(Data.dataInject_DC.DCtype)
{
case 0x01:
pBuff->protocalDataInject_DC.DC_13Ins.SwitchCmd = Data.dataInject_DC.DC_13Ins.SwitchCmd;
pBuff->protocalDataInject_DC.DC_13Ins.param1 = Data.dataInject_DC.DC_13Ins.param1;
pBuff->protocalDataInject_DC.DC_13Ins.param2 = Data.dataInject_DC.DC_13Ins.param2;
memset(&(pBuff->protocalDataInject_DC.DC_13Ins.reserve),0,sizeof(pBuff->protocalDataInject_DC.DC_13Ins.reserve));
break;
case 0x02:
pBuff->protocalDataInject_DC.DC_WHTJ.param = Data.dataInject_DC.DC_WHTJ.param;
pBuff->protocalDataInject_DC.DC_WHTJ.param2 = Data.dataInject_DC.DC_WHTJ.param2;
pBuff->protocalDataInject_DC.DC_WHTJ.param3 = Data.dataInject_DC.DC_WHTJ.param3;
pBuff->protocalDataInject_DC.DC_WHTJ.param4 = Data.dataInject_DC.DC_WHTJ.param4;
pBuff->protocalDataInject_DC.DC_WHTJ.param5 = Data.dataInject_DC.DC_WHTJ.param5;
pBuff->protocalDataInject_DC.DC_WHTJ.param6 = Data.dataInject_DC.DC_WHTJ.param6;
pBuff->protocalDataInject_DC.DC_WHTJ.param7 = Data.dataInject_DC.DC_WHTJ.param7;
pBuff->protocalDataInject_DC.DC_WHTJ.param8 = Data.dataInject_DC.DC_WHTJ.param8;
pBuff->protocalDataInject_DC.DC_WHTJ.param9 = Data.dataInject_DC.DC_WHTJ.param9;
pBuff->protocalDataInject_DC.DC_WHTJ.param10 = Data.dataInject_DC.DC_WHTJ.param10;
pBuff->protocalDataInject_DC.DC_WHTJ.param11 = Data.dataInject_DC.DC_WHTJ.param11;
pBuff->protocalDataInject_DC.DC_WHTJ.param12 = Data.dataInject_DC.DC_WHTJ.param12;
pBuff->protocalDataInject_DC.DC_WHTJ.param13 = Data.dataInject_DC.DC_WHTJ.param13;
pBuff->protocalDataInject_DC.DC_WHTJ.param14 = Data.dataInject_DC.DC_WHTJ.param14;
break;
default:
break;
}
/*
switch(Data.fcode)
{
case 0x70:
if(Data.details.DataZ70.DCtype == 0x01){
EncodeUZ70( &( pBuff->details ),&( Data.details ));
}
if(Data.details.DataZ70_TJDC.DCTpye == 0x02){
EncodeUZ70_TJDC( &( pBuff->details ),&( Data.details ));
}
break;
default:
break;
}
*/
}
virtual void Decode()
{
DCFrameCkCmd *pBuff = (DCFrameCkCmd*) Addr();
Data.fcode = pBuff->fcode;
Data.dataInject_DC.DCtype = pBuff->protocalDataInject_DC.DCtype;
switch(pBuff->protocalDataInject_DC.DCtype)
{
case 0x01:
Data.dataInject_DC.DC_13Ins.SwitchCmd = pBuff->protocalDataInject_DC.DC_13Ins.SwitchCmd;
Data.dataInject_DC.DC_13Ins.param1 = pBuff->protocalDataInject_DC.DC_13Ins.param1;
Data.dataInject_DC.DC_13Ins.param2 = pBuff->protocalDataInject_DC.DC_13Ins.param2;
memset(&(Data.dataInject_DC.DC_13Ins.reserve),0,sizeof(Data.dataInject_DC.DC_13Ins.reserve));
break;
case 0x02:
Data.dataInject_DC.DC_WHTJ.param = pBuff->protocalDataInject_DC.DC_WHTJ.param;
Data.dataInject_DC.DC_WHTJ.param2 = pBuff->protocalDataInject_DC.DC_WHTJ.param2;
Data.dataInject_DC.DC_WHTJ.param3 = pBuff->protocalDataInject_DC.DC_WHTJ.param3;
Data.dataInject_DC.DC_WHTJ.param4 = pBuff->protocalDataInject_DC.DC_WHTJ.param4;
Data.dataInject_DC.DC_WHTJ.param5 = pBuff->protocalDataInject_DC.DC_WHTJ.param5;
Data.dataInject_DC.DC_WHTJ.param6 = pBuff->protocalDataInject_DC.DC_WHTJ.param6;
Data.dataInject_DC.DC_WHTJ.param7 = pBuff->protocalDataInject_DC.DC_WHTJ.param7;
Data.dataInject_DC.DC_WHTJ.param8 = pBuff->protocalDataInject_DC.DC_WHTJ.param8;
Data.dataInject_DC.DC_WHTJ.param9 = pBuff->protocalDataInject_DC.DC_WHTJ.param9;
Data.dataInject_DC.DC_WHTJ.param10 = pBuff->protocalDataInject_DC.DC_WHTJ.param10;
Data.dataInject_DC.DC_WHTJ.param11 = pBuff->protocalDataInject_DC.DC_WHTJ.param11;
Data.dataInject_DC.DC_WHTJ.param12 = pBuff->protocalDataInject_DC.DC_WHTJ.param12;
Data.dataInject_DC.DC_WHTJ.param13 = pBuff->protocalDataInject_DC.DC_WHTJ.param13;
Data.dataInject_DC.DC_WHTJ.param14 = pBuff->protocalDataInject_DC.DC_WHTJ.param14;
break;
default:
break;
}
Data.crc16 = pBuff->crc16;
}
//void Phrase(const BYTE* Src, const UINT32 Count)
//{
//}
virtual struCHECK CheckCRC(BYTE* const p)
{
//return MakeCheckSum_WuHanTJDC(p,31);
return MakeCheckCRC(p+2,16);
}
};
#endif//_CDCFrameCkCmdFrame_

@ -0,0 +1,321 @@
// DCOverrollDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "DCOverrollDlg.h"
#include "afxdialogex.h"
// DCOverrollDlg 对话框
IMPLEMENT_DYNAMIC(DCOverrollDlg, CDialogEx)
DCOverrollDlg::DCOverrollDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(DCOverrollDlg::IDD, pParent)
{
//m_bkBrush.CreateSolidBrush(BKGCLR);
m_CurSelect = 99;
}
DCOverrollDlg::~DCOverrollDlg()
{
/*关闭定时器*/
DelateTimer();
}
//定时器回调函数
void FAR PASCAL m_DCOverrollTimer(WORD IDEvent, WORD uReserved, DWORD dwUser, DWORD dwReserved1, DWORD dwReserve2)
{
DCOverrollDlg *m_pView = (DCOverrollDlg *)dwUser;
m_pView->DC0verrollStep(dwUser);
}
void DCOverrollDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
//DDX_Control(pDX, IDC_STATIC_DC, m_DCFrameInfoTab);
DDX_Control(pDX, IDC_STATIC_DC, m_ShowPosition);
}
BEGIN_MESSAGE_MAP(DCOverrollDlg, CDialogEx)
//ON_COMMAND(ID_13Ins, &DCOverrollDlg::OnUpdate13Ins)
//ON_UPDATE_COMMAND_UI(ID_WHTJ, &DCOverrollDlg::OnUpdateWHTJ)
ON_WM_CTLCOLOR()
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BTN_SHOW, &DCOverrollDlg::OnBnClickedBtnShow)
ON_CBN_SELCHANGE(IDC_DC_CHOSET, &DCOverrollDlg::OnCbnSelchangeDcChoset)
ON_BN_CLICKED(IDC_RADIO1, &DCOverrollDlg::OnBnClickedRadio1)
ON_BN_CLICKED(IDC_RADIO2, &DCOverrollDlg::OnBnClickedRadio2)
ON_MESSAGE(WM_PROCESS_DC_CMD, ProcessDCCMD)
END_MESSAGE_MAP()
HBRUSH DCOverrollDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
/*
if(nCtlColor==CTLCOLOR_STATIC)
{
pDC->SetBkColor(RGB(0,0,0));
pDC->SetTextColor(TXTCLR);
pDC->SetBkMode(TRANSPARENT);
}*/
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return m_bkBrush;
}
// DCOverrollDlg 消息处理程序
BOOL DCOverrollDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
DlgDCOverroll_Hwnd = GetSafeHwnd();//获得自身的窗口句柄
//CRect m_crect;
//GetDlgItem(IDC_STATIC_DC_PUBLCI)->GetWindowRect(m_crect);
//ScreenToClient(&m_crect);
//this->MoveWindow(m_crect.left, m_crect.top, m_crect.Width()*1.05, m_crect.Height()*12);
this->CenterWindow();
///*根据屏幕分辨率最大化显示*/
//int cx = 0.65*GetSystemMetrics(SM_CXMAXIMIZED);
//int cy = 0.5*GetSystemMetrics(SM_CYMAXIMIZED);
//CRect rcRect(0,0,cx,cy);
//this->MoveWindow(rcRect,true);
//this->CenterWindow();
//CSize tabSize(180,25);
//m_DCFrameInfoTab.SetItemSize(tabSize);
//m_DCFrameInfoTab.SetNormalColor(RGB(230,230,230));
//m_DCFrameInfoTab.SetSelectedColor(0x32CD32);
CreateAllDlg();
((CComboBox *)GetDlgItem(IDC_DC_CHOSET))->InsertString(0, "13所吊舱控制");
((CComboBox *)GetDlgItem(IDC_DC_CHOSET))->InsertString(1, "天进吊舱控制");
((CComboBox *)GetDlgItem(IDC_DC_CHOSET))->SetCurSel(0);
((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(true);
/*启动定时器*/
//先关闭
DelateTimer();
//再启动
if((DCDC0verrollTimerId = timeSetEvent(20, 10, (LPTIMECALLBACK)m_DCOverrollTimer, (DWORD)this, TIME_PERIODIC)) == 0)
{
MessageBox( "通用控制吊舱定时器启动错误!" );
}
return 0;
}
BOOL DCOverrollDlg::CreateAllDlg()
{
CRect m_crect;
GetDlgItem(IDC_STATIC_DC_PUBLCI)->GetWindowRect(m_crect);//获得IDC_STATIC_DC_PUBLCI的位置
ScreenToClient(&m_crect);
CRect m_crect2;
GetDlgItem(IDC_STATIC_DC)->GetWindowRect(m_crect2);//获得IDC_STATIC_DC的位置
ScreenToClient(&m_crect2);
//吊舱新的控制方式 默认显示
if(!m_13InstituteDCNewDlg.GetSafeHwnd())
{
m_13InstituteDCNewDlg.Create(IDD_DIALOG_DC_13INSTITUTE_NEW,this);
}
m_13InstituteDCNewDlg.MoveWindow(m_crect2);//将IDD_DIALOG_DC_13INSTITUTE_NEW移到IDC_STATIC_DC_PUBLCI所在的位置
m_13InstituteDCNewDlg.ShowWindow(SW_SHOW);
if(!m_WHTJDCNewDlg.GetSafeHwnd())
{
m_WHTJDCNewDlg.Create(IDD_DIALOG_DC_WuHanTJ_NEW,this);
}
m_WHTJDCNewDlg.MoveWindow(m_crect2);//将IDD_DIALOG_DC_13INSTITUTE_NEW移到IDC_STATIC_DC_PUBLCI所在的位置
m_WHTJDCNewDlg.ShowWindow(SW_HIDE);
CRect m_RectShow; //显示部分的面积区域
GetWindowRect(&m_RectLarge);
GetDlgItem(IDC_STATIC_DC_PUBLCI)->GetWindowRect(&m_RectShow);
m_RectSmall.left = m_RectLarge.left;
m_RectSmall.top = m_RectLarge.top;
m_RectSmall.right = m_RectShow.right;
m_RectSmall.bottom = m_RectLarge.bottom;
SetWindowPos(NULL,0,0,m_RectSmall.Width(),m_RectSmall.Height(),SWP_NOMOVE|SWP_NOZORDER);
return true;
}
//定时器处理函数
void DCOverrollDlg::DC0verrollStep(DWORD)
{
}
void DCOverrollDlg::DelateTimer()
{
if(DCDC0verrollTimerId!=0)
{
timeKillEvent(DCDC0verrollTimerId);
DCDC0verrollTimerId = 0;
}
}
void DCOverrollDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
/*关闭定时器*/
DelateTimer();
m_CurSelect = 99;
CDialogEx::OnClose();
}
void DCOverrollDlg::OnBnClickedBtnShow()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
GetDlgItemText(IDC_BTN_SHOW, str);
if(str == _T("扩展显示>>"))
{
SetDlgItemText(IDC_BTN_SHOW, _T("隐藏显示<<"));
SetWindowPos(NULL, 0, 0, m_RectLarge.Width(), m_RectLarge.Height(),SWP_NOMOVE|SWP_NOZORDER);
}
else if(str == _T("隐藏显示<<"))
{
SetDlgItemText(IDC_BTN_SHOW, _T("扩展显示>>"));
SetWindowPos(NULL, 0, 0, m_RectSmall.Width(), m_RectSmall.Height(),SWP_NOMOVE|SWP_NOZORDER);
}
}
//LRESULT DCOverrollDlg::ProcessDCCMD(WPARAM wParam, LPARAM lParam)
//{
// if(!gCurGCSCtrlFlag)
// {
// return 0;
// }
// if(m_CurSelect == 1)
// {
// m_WHTJDCNewDlg.UpdateTJDCAction((int)lParam);
// }
// else if(m_CurSelect == 0 || m_CurSelect == 99)//默认控制13所吊舱
// {
// m_13InstituteDCNewDlg.UpdateDC13Action((int)lParam);
// }
//
// return 0;
//}
void DCOverrollDlg::OnCbnSelchangeDcChoset()
{
// TODO: 在此添加控件通知处理程序代码
// TODO: 在此添加控件通知处理程序代码
//int a = m_DCFrameInfoTab.GetCurSel();
UpdateData( true );
int iCount =((CComboBox *)GetDlgItem(IDC_DC_CHOSET))->GetCurSel();
if(m_CurSelect != iCount)
{
m_CurSelect = iCount;
if(m_CurSelect == 0)
{
/*
//吊舱旧的控制方式
//删除天进吊舱对话框
m_WuHanTJDCDlg.ShowWindow(SW_HIDE);
m_WuHanTJDCDlg.DelateTimer();
m_WuHanTJDCDlg.m_DCCommonDateProcess.DelateTimer();
//显示13所吊舱控制对话框
m_13InstituteDCDlg.ShowWindow(SW_SHOW);
m_13InstituteDCDlg.InitializeTimer();
*/
//吊舱新的控制方式
//显示13所吊舱控制对话框
m_13InstituteDCNewDlg.ShowWindow(SW_SHOW);
//隐藏天进吊舱控制对话框
m_WHTJDCNewDlg.ShowWindow(SW_HIDE);
Sleep(120);
}
if(m_CurSelect == 1)
{
/*
//吊舱旧的控制方式
//删除13所吊舱对话框
m_13InstituteDCDlg.ShowWindow(SW_HIDE);
m_13InstituteDCDlg.DelateTimer();
m_13InstituteDCDlg.m_DCCommonDateProcess.DelateTimer();
//显示天进吊舱控制对话框
m_WuHanTJDCDlg.ShowWindow(SW_SHOW);
m_WuHanTJDCDlg.InitializeTimer();
*/
//吊舱新的控制方式
//隐藏13所吊舱控制对话框
m_13InstituteDCNewDlg.ShowWindow(SW_HIDE);
//显示天进吊舱控制对话框
m_WHTJDCNewDlg.ShowWindow(SW_SHOW);
Sleep(120);
}
if(m_CurSelect == 99)//默认显示13所吊舱
{
/*
//吊舱旧的控制方式
m_WuHanTJDCDlg.DelateTimer();
m_WuHanTJDCDlg.ShowWindow(SW_HIDE);
m_WuHanTJDCDlg.m_DCCommonDateProcess.DelateTimer();
m_13InstituteDCDlg.DelateTimer();
m_13InstituteDCDlg.ShowWindow(SW_HIDE);
m_13InstituteDCDlg.m_DCCommonDateProcess.DelateTimer();
*/
//吊舱新的控制方式
//隐藏13所吊舱控制对话框
m_13InstituteDCNewDlg.ShowWindow(SW_HIDE);
//隐藏天进吊舱控制对话框
m_WHTJDCNewDlg.ShowWindow(SW_HIDE);
Sleep(120);
}
}
}
void DCOverrollDlg::OnBnClickedRadio1()
{
m_CurSelect = 0;
//显示13所吊舱控制对话框
m_13InstituteDCNewDlg.ShowWindow(SW_SHOW);
//隐藏天进吊舱控制对话框
m_WHTJDCNewDlg.ShowWindow(SW_HIDE);
Sleep(120);
}
void DCOverrollDlg::OnBnClickedRadio2()
{
m_CurSelect = 1;
//隐藏13所吊舱控制对话框
m_13InstituteDCNewDlg.ShowWindow(SW_HIDE);
//显示天进吊舱控制对话框
m_WHTJDCNewDlg.ShowWindow(SW_SHOW);
Sleep(120);
}
LRESULT DCOverrollDlg::ProcessDCCMD(WPARAM wParam, LPARAM lParam)
{
if(m_CurSelect == 1)
{
m_WHTJDCNewDlg.UpdateTJDCAction((int)lParam);
}
//else if(m_CurSelect == 0 || m_CurSelect == 99)//默认控制13所吊舱
//{
// m_13InstituteDCNewDlg.UpdateDC13Action((int)lParam);
//}
return 0;
}

@ -0,0 +1,61 @@
#pragma once
#include "resource.h"
#include "DlgWHTJDCNew.h" //武汉天进对话框类新
#include "Dlg13InstituteDCNew.h" //13所吊舱对话框类新
#include "afxwin.h"
#include "CMDBtn.h"
#include "BtnST.h"
#include "afxdlgs.h"
// DCOverrollDlg 对话框
class DCOverrollDlg : public CDialogEx
{
DECLARE_DYNAMIC(DCOverrollDlg)
private:
CBrush m_bkBrush; //界面背景画刷
public:
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
public:
DCOverrollDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~DCOverrollDlg();
// 对话框数据
enum { IDD = IDD_DIALOG_DC };
virtual BOOL OnInitDialog();
BOOL CreateAllDlg();
//CXTabCtrl m_DCFrameInfoTab;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
//吊舱新的控制方式
Dlg13InstituteDCNew m_13InstituteDCNewDlg; //13所吊舱新控制界面对话框
DlgWHTJDCNew m_WHTJDCNewDlg; //武汉天进吊舱新控制界面对话框
private:
CRect m_RectLarge; //整个,整体全部面积区域
CRect m_RectSmall; //隐藏之后的面积区域
public:
//CMFCToolBar m_wndToolBar;
//afx_msg void OnUpdate13Ins();
//afx_msg void OnUpdateWHTJ(CCmdUI *pCmdUI);
void DC0verrollStep(DWORD); //定时器处理函数
int DCDC0verrollTimerId; //定时ID
int m_CurSelect;
void DelateTimer(); //删除定时器
afx_msg void OnBnClickedButton1();
afx_msg void OnClose();
afx_msg void OnBnClickedBtnShow();
LRESULT ProcessDCCMD(WPARAM param, LPARAM lparam); //
afx_msg void OnCbnSelchangeDcChoset();
CStatic m_ShowPosition;
afx_msg void OnBnClickedRadio1();
afx_msg void OnBnClickedRadio2();
};

@ -0,0 +1,2 @@
#include "stdafx.h"
#include "Decoder.h"

@ -0,0 +1,157 @@
#pragma once
#include "stdafx.h"
#include <map>
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <stdint.h>
#include <tchar.h>
#include <string>
#include <direct.h>
#include <iostream>
#include <algorithm>
//BOOST
#include <boost/filesystem.hpp>
#include <boost/algorithm/string.hpp>
#include "boost/shared_ptr.hpp"
//#include <boost/thread.hpp>
#include <boost/format.hpp>
//////////////////////////////////////////////////////////////////////////
//Definitions
//////////////////////////////////////////////////////////////////////////
typedef int (*pinit_h264ToBMP)(uint32_t width, uint32_t height, uint32_t pps);
typedef BOOL (*ppost_BMP_RGB)(const uint8_t *h264_data, uint32_t h264_data_size,unsigned char *decodebuf);
typedef void (*pFree_all)();
struct H264Decode
{
pinit_h264ToBMP m_DLL_init_h264ToBMP_without_encoder;
ppost_BMP_RGB m_DLL_post_BMP_RGB;
pFree_all m_Dll_pFree_all;
HINSTANCE m_h264Dll;
unsigned char* m_tmpBuf;
bool Init(int decodeId)
{
char dllname[255];
sprintf(dllname,"h264ToBMP_%d.dll",decodeId);
std::string destfilename = boost::str(boost::format("h264ToBMP_%d.dll") % decodeId);
boost::filesystem::path destPath(destfilename);
boost::filesystem::path basePath("h264ToBMP.dll");
if (!boost::filesystem::is_regular_file(destPath))
{
//winXP下如果已存文件再copy一下会出现问题如果catch住就可以避免其发生
try
{
boost::filesystem::copy_file(basePath, destPath);
}catch(boost::filesystem::filesystem_error)
{
}
}
m_h264Dll = LoadLibrary(destfilename.c_str());
if (nullptr == m_h264Dll)
{
return false;
}
m_DLL_init_h264ToBMP_without_encoder = (pinit_h264ToBMP) GetProcAddress(m_h264Dll, "init_h264ToBMP_without_encoder");
m_DLL_post_BMP_RGB = (ppost_BMP_RGB) GetProcAddress(m_h264Dll, "post_BMP_RGB");
m_Dll_pFree_all = (pFree_all) GetProcAddress(m_h264Dll, "free_all");
m_tmpBuf = new unsigned char[2500*1500];
return true;
}
int InitDecoder(int width, int height, int pps)
{
if (m_h264Dll != nullptr)
{
int ret = m_DLL_init_h264ToBMP_without_encoder(width, height, pps);
return ret;
}
else
{
return 0;
}
}
int DecodeVideo(const char* data,int msgLen,unsigned char* imgbuf)
{
try
{
if (m_h264Dll != nullptr)
{
static bool firstTime = true;
int length = msgLen;
if (true == firstTime)
{
firstTime = false;
uint8_t sps_frame[16] = { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80, 0x1E, 0x89, 0x95, 0x41, 0x68, 0x22, 0xD0, 0x04 };//GAODE NEW
memcpy(m_tmpBuf, sps_frame, 15);
memcpy(m_tmpBuf + 15, data, msgLen);
length = msgLen + 15;
}
else
{
memcpy(m_tmpBuf, data, msgLen);
}
if (m_tmpBuf != nullptr && length > 0 && imgbuf != nullptr)
{
// 此处容易在测控状态不好的情况下报错。
try
{
int got_bmp = m_DLL_post_BMP_RGB(m_tmpBuf, length, imgbuf);
return got_bmp;
}
catch (...)
{
}
}
else
{
return 0;
}
}
else
{
return 0;
}
}
catch (CMemoryException* e)
{
e;
return 0;
}
catch (CFileException* e)
{
e;
return 0;
}
catch (CException* e)
{
e;
return 0;
}
return 1;
}
void DeInit()
{
delete m_tmpBuf;
m_tmpBuf = nullptr;
m_h264Dll = nullptr;
m_Dll_pFree_all();
}
};

@ -0,0 +1,40 @@
#pragma once
#include <windows.h>
#ifdef _DECODER_INTERFACE_EXPORT_
#define _DECODER_INTERFACE_ _declspec(dllexport)
#else
#define _DECODER_INTERFACE_ _declspec(dllimport)
#endif
typedef enum DecoderType
{
DEC_SOFTWARE = 0,
DEC_HARDWARE = 1,
}EnumDecoderType;
typedef void (*DecodeCallbackFun)(unsigned char* data,int width,int height);
class _DECODER_INTERFACE_ DecoderInterface
{
public:
DecoderInterface(void){};
~DecoderInterface(void){};
virtual bool init(int srcWth,int srcHth,int dstWth = 0,int dstHth = 0,int oPixFmt = 0,HWND hwnd = 0) = 0;
virtual void decoding(unsigned char* in_buf,int in_len) = 0;
virtual void release() = 0;
virtual void setDecodingCallback(DecodeCallbackFun fun) = 0;
};
class _DECODER_INTERFACE_ DecoderFactory
{
public:
DecoderFactory(void);
~DecoderFactory(void);
static DecoderInterface* CreateDecoder(EnumDecoderType type = DEC_SOFTWARE);
static void DestroyDecoder(DecoderInterface* deoder);
};

File diff suppressed because it is too large Load Diff

@ -0,0 +1,106 @@
#pragma once
#include "resource.h"
#include "global.h"
#include <MMSystem.h>
#include "afxwin.h"
#include "DCFrameCkCmd.h"
#include "CYHMudpSend.h"//自定义组播发送
#include "CMDBtn.h"
// Dlg13InstituteDCNew 对话框
class Dlg13InstituteDCNew : public CDialogEx
{
DECLARE_DYNAMIC(Dlg13InstituteDCNew)
public:
Dlg13InstituteDCNew(CWnd* pParent = NULL); // 标准构造函数
virtual ~Dlg13InstituteDCNew();
// 对话框数据
enum { IDD = IDD_DIALOG_DC_13INSTITUTE_NEW };
virtual BOOL OnInitDialog();
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
void TimeStep(DWORD); //定时器处理函数
int mTimerId; //定时ID
int num; //指令计数
bool injectstart; //吊舱装订开始的标志
public:
UINT8 SwitchCmd; //开关指令
INT16 PitchControl; //俯仰控制量
INT16 DirControl; //方位控制量
INT16 PitchRecord; //俯仰量记录
INT16 DirRecord; //方位量记录
public:
void Update13InsNewCmdBuffer(HWND);//更新控制指令到吊舱协议
void UpdateDataZ70_13Ins();//更新buffer到帧结构体
void UpdateFrame(int&);
void UpdateFrame2(int&);
void UpdateFrame3(int&);
void UpdateFrame4(int&);
void UpdateFrame5();
void UpdateFrame6();
void UpdateFrame7();
void UpdateFrame8();
void UpdateFrame9(int&);
void UpdateFrame10(int&);
void UpdateFrame11(int&);
void UpdateFrame12(int&);
void UpdateFrame13(int&);
void UpdateFrame14();
void UpdateFrame15();
void UpdateFrame16(int&);
void UpdateFrame17(int&);
void UpdateFrame18(int&);
void UpdateFrame19(int&);
void UpdateFrame20();
void UpdateFrame21();
void UpdateFrame22(int&);
void UpdateFrame23(int&);
void UpdateFrame24(int&);
void UpdateFrame25(int&);
void UpdateFrame26(int&);
void UpdateFrame27(int&);
void UpdateFrame28(int&);
void UpdateFrame29(int&);
void UpdateFrame30(int&);
void UpdateFrame31(int&);
void UpdateFrame32(int&);
void UpdateFrame33(int&);
void UpdateFrame34(int&);
void UpdateFrame35();//俯仰+范围50~-110
void UpdateFrame36();//俯仰-
void UpdateFrame37();//方位+范围180~-180
void UpdateFrame38();//方位-
//void UpdateFrame39(int&);
//void UpdateFrame40(int&);
//void UpdateDC13Action(int);
public:
HANDLE hCheckThread;//线程
DWORD ThreadCheckIDRegion;
afx_msg LRESULT OnUpdate13DCFrame(WPARAM wParam, LPARAM lParam);
int InfraredOrVisibleLight;//红外可见光切换
virtual BOOL PreTranslateMessage(MSG* pMsg);
//CFont m_oFont;//字体
CMFCButton DC13InsBtn[38];
CCMDBtn m_DCFlyCmd[12];
double Param1;
double Param2;
BYTE DC13InsCmdBuffer[5];
public:
CBrush m_brush;
CFont m_font;
public:
//afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
CDCFrameCkCmdFrame DCFrameCkCmd13;//数据注入指令从控发送数据帧---13所吊舱
CYHMudpSend m_MudpSend;
};

@ -0,0 +1,95 @@
// DlgCameraCtrl.cpp : 实现文件
//
#include "stdafx.h"
#include "CH91PayloadSoftware.h"
#include "DlgCameraCtrl.h"
#include "afxdialogex.h"
// CDlgCameraCtrl 对话框
IMPLEMENT_DYNAMIC(CDlgCameraCtrl, CDialogEx)
CDlgCameraCtrl::CDlgCameraCtrl(CWnd* pParent /*=NULL*/)
: CDialogEx(CDlgCameraCtrl::IDD, pParent)
{
m_btn_camera_1.Cmd = 0x66;
m_btn_camera_2.Cmd = 0x67;
m_btn_camera_3.Cmd = 0x68;
m_btn_camera_4.Cmd = 0x69;
m_btn_camera_5.Cmd = 0x75;
m_btn_camera_6.Cmd = 0x76;
m_btn_camera_7.Cmd = 0x77;
m_btn_camera_8.Cmd = 0x78;
//m_btn_camera_9.Cmd = 0x79;
m_btn_camera_10.Cmd = 0x7A;
//m_btn_camera_11.Cmd = 0x7B;
m_btn_camera_12.Cmd = 0x7C;
m_btn_camera_13.Cmd = 0x7D;
m_btn_camera_14.Cmd = 0x66;//图像切换
m_btn_camera_15.Cmd = 0x67;//画中画开
m_btn_camera_16.Cmd = 0x68;//画中画关
m_btn_camera_17.Cmd = 0x6A;//红外大
m_btn_camera_18.Cmd = 0x69;//红外小
m_btn_camera_19.Cmd = 0x7B;//复位
m_btn_camera_20.Cmd = 0x7A;//锁定
m_btn_camera_21.Cmd = 0x79;//扫描
m_btn_camera_22.Cmd = 0x6B;//跟踪
m_btn_camera_23.Cmd = 0xC4;//2M速率
m_btn_camera_24.Cmd = 0xC5;//4M速率
m_btn_camera_25.Cmd = 0xCB;//开始记录
m_btn_camera_26.Cmd = 0xCC;//停止记录
m_btn_camera_27.Cmd = 0xCD;//清除数据
m_btn_camera_28.Cmd = 0xC8;//0-3图拼接
m_btn_camera_29.Cmd = 0xC9;//4-6图拼接
m_btn_camera_30.Cmd = 0xC6;//吊舱通道1
m_btn_camera_31.Cmd = 0xC7;//吊舱通道2
}
CDlgCameraCtrl::~CDlgCameraCtrl()
{
}
void CDlgCameraCtrl::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_BTN_CAMERA_1, m_btn_camera_1);
DDX_Control(pDX, IDC_BTN_CAMERA_2, m_btn_camera_2);
DDX_Control(pDX, IDC_BTN_CAMERA_3, m_btn_camera_3);
DDX_Control(pDX, IDC_BTN_CAMERA_4, m_btn_camera_4);
DDX_Control(pDX, IDC_BTN_CAMERA_5, m_btn_camera_5);
DDX_Control(pDX, IDC_BTN_CAMERA_6, m_btn_camera_6);
DDX_Control(pDX, IDC_BTN_CAMERA_7, m_btn_camera_7);
DDX_Control(pDX, IDC_BTN_CAMERA_8, m_btn_camera_8);
//DDX_Control(pDX, IDC_BTN_CAMERA_9, m_btn_camera_9);
DDX_Control(pDX, IDC_BTN_CAMERA_10, m_btn_camera_10);
//DDX_Control(pDX, IDC_BTN_CAMERA_11, m_btn_camera_11);
DDX_Control(pDX, IDC_BTN_CAMERA_12, m_btn_camera_12);
DDX_Control(pDX, IDC_BTN_CAMERA_13, m_btn_camera_13);
DDX_Control(pDX, IDC_BTN_CAMERA_14, m_btn_camera_14);
DDX_Control(pDX, IDC_BTN_CAMERA_15, m_btn_camera_15);
DDX_Control(pDX, IDC_BTN_CAMERA_16, m_btn_camera_16);
DDX_Control(pDX, IDC_BTN_CAMERA_17, m_btn_camera_17);
DDX_Control(pDX, IDC_BTN_CAMERA_18, m_btn_camera_18);
DDX_Control(pDX, IDC_BTN_CAMERA_19, m_btn_camera_19);
DDX_Control(pDX, IDC_BTN_CAMERA_20, m_btn_camera_20);
DDX_Control(pDX, IDC_BTN_CAMERA_21, m_btn_camera_21);
DDX_Control(pDX, IDC_BTN_CAMERA_22, m_btn_camera_22);
DDX_Control(pDX, IDC_BTN_CAMERA_23, m_btn_camera_23);
DDX_Control(pDX, IDC_BTN_CAMERA_24, m_btn_camera_24);
DDX_Control(pDX, IDC_BTN_CAMERA_25, m_btn_camera_25);
DDX_Control(pDX, IDC_BTN_CAMERA_26, m_btn_camera_26);
DDX_Control(pDX, IDC_BTN_CAMERA_27, m_btn_camera_27);
DDX_Control(pDX, IDC_BTN_CAMERA_28, m_btn_camera_28);
DDX_Control(pDX, IDC_BTN_CAMERA_29, m_btn_camera_29);
DDX_Control(pDX, IDC_BTN_CAMERA_30, m_btn_camera_30);
DDX_Control(pDX, IDC_BTN_CAMERA_31, m_btn_camera_31);
}
BEGIN_MESSAGE_MAP(CDlgCameraCtrl, CDialogEx)
END_MESSAGE_MAP()
// CDlgCameraCtrl 消息处理程序

@ -0,0 +1,53 @@
#pragma once
#include "CMDBtn.h"
// CDlgCameraCtrl 对话框
class CDlgCameraCtrl : public CDialogEx
{
DECLARE_DYNAMIC(CDlgCameraCtrl)
public:
CDlgCameraCtrl(CWnd* pParent = NULL); // 标准构造函数
virtual ~CDlgCameraCtrl();
// 对话框数据
enum { IDD = IDD_DLG_CAMERA_CTRL };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
CCMDBtn m_btn_camera_1;
CCMDBtn m_btn_camera_2;
CCMDBtn m_btn_camera_3;
CCMDBtn m_btn_camera_4;
CCMDBtn m_btn_camera_5;
CCMDBtn m_btn_camera_6;
CCMDBtn m_btn_camera_7;
CCMDBtn m_btn_camera_8;
//CCMDBtn m_btn_camera_9;
CCMDBtn m_btn_camera_10;
//CCMDBtn m_btn_camera_11;
CCMDBtn m_btn_camera_12;
CCMDBtn m_btn_camera_13;
CCMDBtn m_btn_camera_14;//图像切换
CCMDBtn m_btn_camera_15;//画中画开
CCMDBtn m_btn_camera_16;//画中画关
CCMDBtn m_btn_camera_17;//红外大
CCMDBtn m_btn_camera_18;//红外小
CCMDBtn m_btn_camera_19;//复位
CCMDBtn m_btn_camera_20;//锁定
CCMDBtn m_btn_camera_21;//扫描
CCMDBtn m_btn_camera_22;//跟踪
CCMDBtn m_btn_camera_23;//2M速率
CCMDBtn m_btn_camera_24;//4M速率
CCMDBtn m_btn_camera_25;//开始记录
CCMDBtn m_btn_camera_26;//停止记录
CCMDBtn m_btn_camera_27;//清除数据
CCMDBtn m_btn_camera_28;//0-3图拼接
CCMDBtn m_btn_camera_29;//4-6图拼接
CCMDBtn m_btn_camera_30;//吊舱通道1
CCMDBtn m_btn_camera_31;//吊舱通道2
};

@ -0,0 +1,134 @@
// DlgIMP.cpp : 实现文件
//
#include "stdafx.h"
#include "CH91PayloadSoftware.h"
#include "DlgIMP.h"
#include "afxdialogex.h"
// CDlgIMP 对话框
IMPLEMENT_DYNAMIC(CDlgIMP, CDialogEx)
CDlgIMP::CDlgIMP()
: CDialogEx(CDlgIMP::IDD)
{
}
CDlgIMP::~CDlgIMP()
{
}
void CDlgIMP::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CDlgIMP, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON1, &CDlgIMP::OnBnClickedButton1)
ON_MESSAGE(WM_UPDATE_IMP_SERIAL_CONNECT, ImpSerialConnectMessage) //IMP通信开始消息
ON_MESSAGE(WM_UPDATE_IMPDOWN_CHECKED, OnUpdateIMPDownDataChecked) //更新IMP下行遥测数据
END_MESSAGE_MAP()
BOOL CDlgIMP::OnInitDialog()
{
CDialogEx::OnInitDialog();
g_IMPDLGhwnd = GetSafeHwnd();
return TRUE;
}
// DlgIMP 消息处理程序
void CDlgIMP::SetIMPData(CFrameIMPDown_ data)
{
CString tstr;
tstr.Format(_T("%d"),data.Data.Bytes);
GetDlgItem(IDC_EDIT2)->SetWindowTextA(tstr);
}
void CDlgIMP::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
}
//IMP串口有数据后进行校验
void OnReadFromCommIMP( char *buffer,const DWORD size)
{
//buffer = (unsigned char*)buffer;
const BYTE* buffer2 = (BYTE*)buffer;
if(size>0)
{
BYTE DCBufferCmd[6];
memset(DCBufferCmd,0,sizeof(DCBufferCmd));
DCBufferCmd[0] = buffer2[0] ;
DCBufferCmd[1] = buffer2[1] ;
DCBufferCmd[2] = buffer2[2] ;
int a = sizeof(buffer2);
/********进入校验校验通过就给g_FrameIMPDown赋值********/
g_FrameIMPDown.Phrase(buffer2, size);
::SendMessageA(g_IMPDLGhwnd,WM_UPDATE_IMPDOWN_CHECKED,0,0);
}
}
LRESULT CDlgIMP::ImpSerialConnectMessage(WPARAM param, LPARAM lparam)
{
// 卸载串口
if (TRUE == m_SerialIMP.IsInitialized())
{
m_SerialIMP.DeInit();
}
else
{
//串口通信设置
char pSerialPort[20];//串口号
DWORD pSerialPortBaud;//端口号
memset(pSerialPort, 0, 20);
/*自定义消息发送CString类型数据时消息发送时采用如下方式
//::SendMessageA(g_IMPDLGhwnd,WM_UPDATE_IMP_SERIAL_CONNECT,(WPARAM)mComPortIMP.AllocSysString(), (LPARAM)mComBaudIMP.AllocSysString());
//解析时采用如下方式WPARAM转CSTring
*/
CString sPort = (CString)((BSTR)param);
CString sBaud = (CString)((BSTR)lparam);
SysFreeString((BSTR)param);
SysFreeString((BSTR)lparam);
GetSerialPortNumber(pSerialPort,sPort);
pSerialPortBaud = atoi(sBaud);//波特率
if (!OnCheckComPort(pSerialPort)) //串口被占用返回false
{
return 0;
}
if(m_SerialIMP.Initialize(pSerialPort, pSerialPortBaud, 8, 0, 0)) //开启串口通信
{
m_SerialIMP.SetComReadCallback( OnReadFromCommIMP );
//m_SerialIMP.SetNotCheckCallback(nullptr,NULL);
BYTE buffersend[10];
memset(buffersend,1,10);
m_SerialIMP.WriteABuffer(buffersend,sizeof(buffersend));
}
return 0;
}
}
//处理通过校验的IMP下行数据
LRESULT CDlgIMP::OnUpdateIMPDownDataChecked(WPARAM param, LPARAM lparam)
{
//数据解析与显示
//if(p_DlgIMP->IsWindowVisible())
//{
// p_DlgIMP->SetIMPData(g_FrameIMPDown);
//}
if(IMPDlgWindowVisible)
{
SetIMPData(g_FrameIMPDown);
}
return 0;
}

@ -0,0 +1,36 @@
#pragma once
#include "Global.h"
#include "resource.h"
#include "GlobalMessage.h"
#include "ComControlFunction.h"
#include "Serial.h"
// CDlgIMP 对话框
class CDlgIMP : public CDialogEx
{
DECLARE_DYNAMIC(CDlgIMP)
public:
CDlgIMP();
virtual ~CDlgIMP();
// 对话框数据
enum { IDD = IDD_DLG_IMP };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
void SetIMPData(CFrameIMPDown_ data);
afx_msg void OnBnClickedButton1();
afx_msg LRESULT ImpSerialConnectMessage(WPARAM param, LPARAM lparam); //IMP通信开始
virtual BOOL OnInitDialog();
CSerial m_SerialIMP; // IMP通信串口
char pSerialPort[20];//串口号
DWORD pSerialPortBaud;//端口号
//void onInitIMPFrame();//初始化IMP协议
afx_msg LRESULT OnUpdateIMPDownDataChecked(WPARAM param, LPARAM lparam); //处理IMP下行通过校验的遥测数据
};

@ -0,0 +1,60 @@
// DlgRecvDataFromQB.cpp : 实现文件
//
#include "stdafx.h"
#include "CH91PayloadSoftware.h"
#include "DlgRecvDataFromQB.h"
#include "afxdialogex.h"
#include "GlobalMember.h"
// CDlgRecvDataFromQB 对话框
IMPLEMENT_DYNAMIC(CDlgRecvDataFromQB, CDialogEx)
CDlgRecvDataFromQB::CDlgRecvDataFromQB(CWnd* pParent /*=NULL*/)
: CDialogEx(CDlgRecvDataFromQB::IDD, pParent)
, m_targetLon(0)
{
}
CDlgRecvDataFromQB::~CDlgRecvDataFromQB()
{
}
void CDlgRecvDataFromQB::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_TARGETLON, m_targetLon);
DDX_Text(pDX, IDC_EDIT_TARGETLAT, m_targetLat);
DDX_Text(pDX, IDC_EDIT_TARGETALT, m_targetAlt);
}
BEGIN_MESSAGE_MAP(CDlgRecvDataFromQB, CDialogEx)
ON_BN_CLICKED(IDC_BTN_ADDTOMAP, &CDlgRecvDataFromQB::OnBnClickedBtnAddtomap)
END_MESSAGE_MAP()
// CDlgRecvDataFromQB 消息处理程序
BOOL CDlgRecvDataFromQB::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化
g_QBTargetHwnd = GetSafeHwnd();
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CDlgRecvDataFromQB::UpdateTargetData()
{
}
// 单击“添加”之后,将目标点显示到地图上
void CDlgRecvDataFromQB::OnBnClickedBtnAddtomap()
{
::PostMessageA(g_MapGuideHwnd, WM_SHOW_TARGET_ONMAP, 0, 0);
}

@ -0,0 +1,30 @@
#pragma once
#include "resource.h"
#include "GlobalMessage.h"
// CDlgRecvDataFromQB 对话框
class CDlgRecvDataFromQB : public CDialogEx
{
DECLARE_DYNAMIC(CDlgRecvDataFromQB)
public:
CDlgRecvDataFromQB(CWnd* pParent = NULL); // 标准构造函数
virtual ~CDlgRecvDataFromQB();
// 对话框数据
enum { IDD = IDD_DLG_RECVFROMQB };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
double m_targetLon; // 情报席位目标定位经度
double m_targetLat; // 情报席位目标定位纬度
double m_targetAlt; // 情报席位目标定位高度
virtual BOOL OnInitDialog();
// 解析情报席位目标定位信息
void UpdateTargetData();
afx_msg void OnBnClickedBtnAddtomap();
};

File diff suppressed because it is too large Load Diff

@ -0,0 +1,126 @@
#pragma once
#include "resource.h"
#include "global.h"
#include <MMSystem.h>
#include "afxwin.h"
#include "DCFrameCkCmd.h"
#include "CYHMudpSend.h"//自定义组播发送
#include "CMDBtn.h"
//#include "MCBtn.h"
// DlgWHTJDCNew 对话框
class DlgWHTJDCNew : public CDialogEx
{
DECLARE_DYNAMIC(DlgWHTJDCNew)
public:
DlgWHTJDCNew(CWnd* pParent = NULL); // 标准构造函数
virtual ~DlgWHTJDCNew();
// 对话框数据
enum { IDD = IDD_DIALOG_DC_WuHanTJ_NEW };
virtual BOOL OnInitDialog();
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
CCMDBtn m_DCFlyCmd[12];
CMFCButton DC13InsBtn[44];
BYTE TJDCCmdBuffer[15];
public:
UINT8 SwitchCmd; //开关指令
INT16 PitchControl; //俯仰控制量
INT16 DirControl; //方位控制量
INT16 PitchRecord; //俯仰量记录
INT16 DirRecord; //方位量记录
double Param1;
double Param2;
UINT8 CharacterSuperpositionSet;//字符叠加设置
INT16 DirAndPitchCrlSize;//方位俯仰控制量
CString m_TarTakTemSizeSetWidth;
CString m_TarTakTemSizeSetHigth;
UINT8 FogThroughMode; //透雾模式
UINT8 PseudoColorSwitch;//伪色彩切换
CString m_FocalDistanceSet;//焦距设置
CString m_DigitalGuidancePitch;//数引模式 俯仰
CString m_DigitalGuidanceDir;//数引模式 方位
CString m_SCanModelAngle;//扫描设置 角度
CString m_SCanModelSpeed;//扫描设置 速度
CString m_DirSCanSetCentre;//方位扫描设置 中心
CString m_DirSCanSetRange;//方位扫描设置 范围
CString m_PitchSCanSetCentre;//俯仰扫描设置 中心
CString m_PitchSCanSetRange;//俯仰扫描设置 范围
int FocalDistanceSIZE;//调焦/变倍等级1-7
public:
void UpdateWHTJDCCmdBuffer(HWND);//更新控制指令到吊舱协议
void DlgWHTJDCNew::UpdateDataZ70_TJDC();//更新数据注入指令Z70
void UpdateFrame(); //俯仰+ 长按
void UpdateFrame2(); //俯仰- 长按
void UpdateFrame3(); //方位+ 长按
void UpdateFrame4(); //方位- 长按
void UpdateFrame5(int&); //复位
void UpdateFrame6(int&); //图像切换
void UpdateFrame7(); //焦距+ 长按
void UpdateFrame8(); //焦距- 长按
void UpdateFrame9(int&); //可见光跟踪
void UpdateFrame10(int&); //拍一张照
void UpdateFrame11(int&); //停止照相
void UpdateFrame12(int&); //字符叠加设置
void UpdateFrame13(int&); //选点跟踪
void UpdateFrame13_1(); //选点跟踪执行
void UpdateFrame14(int&); //设置参数保存
void UpdateFrame15(int&); //单次激光测距
void UpdateFrame16(int&); //连续照相
void UpdateFrame17(int&); //开始录像
void UpdateFrame18(int&); //停止录像
void UpdateFrame19(int&); //取消跟踪
void UpdateFrame20(int&); //跟踪模板大小设置
void UpdateFrame21(int&); //查询反馈
void UpdateFrame22(int&); //开启激光测距
void UpdateFrame23(int&); //伪色彩切换
void UpdateFrame24(int&); //红外快门补偿
void UpdateFrame25(int&); //电子放大
void UpdateFrame26(int&); //红外图像增强
void UpdateFrame27(int&); //云台扫描
void UpdateFrame28(int&); //垂直下视
void UpdateFrame29(int&); //停止激光测距
void UpdateFrame30(); //变倍+ 长按
void UpdateFrame31(int&); //透雾模式
void UpdateFrame32(int&); //关伺服
void UpdateFrame33(int&); //方位弱随动
void UpdateFrame34(); //变倍- 长按
void UpdateFrame35(int&); //低照度模式
void UpdateFrame36(int&); //焦距设置
void UpdateFrame37(int&); //收藏模式
void UpdateFrame38(int&); //方位锁定
void UpdateFrame39(int&); //数字引导 72
void UpdateFrame40(int&); //吊舱扫描设置
void UpdateFrame41(int&); //姿态指引 7C
void UpdateFrame43(int&); //方位扫描设置
void UpdateFrame44(int&); //俯仰扫描设置
void UpdateFrame100(int&); //吊舱行为1
void UpdateFrame101(int&); //吊舱行为2
void UpdateTJDCAction(int); //吊舱行为控制
public:
HANDLE hCheckThread;//线程
DWORD ThreadCheckIDRegion;
afx_msg LRESULT OnUpdateWHTJDCFrame(WPARAM wParam, LPARAM lParam);
int InfraredOrVisibleLight;//红外可见光切换
virtual BOOL PreTranslateMessage(MSG* pMsg);
private:
CBrush m_brush;
//CFont m_font;
public:
CDCFrameCkCmdFrame DCFrameCkCmdWHTJ;//数据注入指令从控发送数据帧---武汉天进吊舱
afx_msg void OnCbnSelchangeComboTjdc2();//伺服控制步长选择
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};

@ -0,0 +1,89 @@
// EditInput.cpp : 实现文件
//
#include "stdafx.h"
#include "CH91PayloadSoftware.h"
#include "EditInput.h"
// CEditInput
IMPLEMENT_DYNAMIC(CEditInput, CEdit)
CEditInput::CEditInput()
{
}
CEditInput::~CEditInput()
{
}
BEGIN_MESSAGE_MAP(CEditInput, CEdit)
ON_WM_CHAR()
END_MESSAGE_MAP()
void CEditInput::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// 保证小数点最多只能出现一次
if (nChar == '.')
{
CString str;
// 获取原来编辑框中的字符串
GetWindowText(str);
if (str.Find('.') != -1)
{
//字符串中已经有小数点,不输入
}
else
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
}
//负号只能出现一次,并且只能在第一个字符出现
else if (nChar == '-')
{
CString str;
GetWindowText(str);
if (str.IsEmpty() )
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
else
{
int nSource, nDestination;
//当前选中编辑框中的内容
GetSel(nSource, nDestination);
//当光标位于第一个位置时
if (nSource == 0)
{
//nDestination = nSource时表示未选中
//光标位于最前方并且str中已经有'-'不操作
if (str[0] == '-' && nDestination == 0)
{
}
else
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
else
{
}
}
}
//小数点负号还应该允许输入数字backspace, delete
else if( (nChar>='0' && nChar<='9') || (nChar == 0x08) || (nChar == 0x10) )
{
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
//其余不响应
else
{
}
//CEdit::OnChar(nChar, nRepCnt, nFlags);
}

@ -0,0 +1,20 @@
#pragma once
// CEditInput
class CEditInput : public CEdit
{
DECLARE_DYNAMIC(CEditInput)
public:
CEditInput();
virtual ~CEditInput();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
};

@ -0,0 +1,306 @@
#pragma once
// 包含情报结构体文件
#include "QBStru.h"
// 回调函数定义
#include "CallBackDef.h"
// 声明 图像显示对话框类
class CImgShowDlg;
class AFX_CLASS_EXPORT CExportImgShowBase: public CObject
{
public:
// 构造函数
CExportImgShowBase(void);
// 析构函数
~CExportImgShowBase(void);
public:
/************************************************************************/
/* part 1窗口创建、销毁、图像显示、标注等 */
/************************************************************************/
// 1 功能:创建视频显示窗口
// 输入:
// 1. hParentWnd: 父窗口句柄
//
// 输出创建成功返回TRUE否则返回FALSE
BOOL CreateWnd(const HWND hParentWnd);
// 2 功能:移动(设置)窗口(整个视频显示窗口)至指定位置
// 输入:
// 1. clientRect移动至该区域
//
// 输出:无
void MoveWnd(const CRect &clientRect);
// 3 功能显示SW_SHOW 或隐藏 SW_HIDE 窗口
// 输入:
// 1. nCmdShowSW_SHOW 或 SW_HIDE
//
// 输出:无
void ShowWnd(const int nCmdShow);
// 4 功能:显示一帧图像
// 输入:
// 1. pImgInfo图像信息头
// 2. pImgData图像数据指针
// 3. LBbox经纬度盒子
// 4 isNeedFlip: 是否需要反转
// 5. isNeedClip是否需要裁剪标识
// 6. ShowRegion裁剪区域
// 7. Strecth_Ratio 图像拉伸比例默认为1即填满屏幕
// 8. 图像平移控制
//
// 输出显示成功返回TRUE否则返回FALSE
// 说明信号1
BOOL ShowImage(const BITMAPINFO* pImgInfo,
BYTE* pImgData,
GeoBoundingBox LBbox = GeoBoundingBox(),
BOOL isNeedFlip = FALSE,
BOOL isNeedClip = FALSE,
const CRect* pShowRegion = NULL,
float Strecth_Ratio = 1.0F,
POINT xyShift = POINT());
// 5 功能:显示并处理通用情报数据
// 输入:
// 1.qbData: 情报数据结构体变量指针
//
// 输出: 无
// 说明信号2
// 注意信号1优先级 > 信号2优先级
void DisposeQBData(const QBStru* qbData);
// 6 功能:标绘目标,其中输入为目标点像素坐标
// 输入:
// 1. pt目标点像素坐标
//
// 输出:在窗口标绘目标
// 注意事项:如果输入图像同时,对目标进行标绘,需要在 函数4ShowImage输入之后 输入本函数
void SetTargetPixelCoordinate(const CPoint &pt);
// 6.1 功能标绘图像中的一块区域其中输入为4个像素坐标点
// 输入:
// 1. pt4个角点像素坐标
//
// 输出:在窗口标绘目标
// 注意事项:如果输入图像同时,对目标进行标绘,需要在 函数4ShowImage输入之后 输入本函数
void SetQuadrangleCorners(const POINT *pts);
// 6.2 功能:标绘目标,其中输入为经纬度坐标
// 输入:
// 1. pt经纬度坐标
//
// 输出:在窗口标绘目标
// 注意事项:如果输入图像同时,对目标进行标绘,需要在 函数4ShowImage输入之后 输入本函数
void SetTgtLocLeadLonLat(double lon, double lat);
// 7 功能:删除视频显示窗口,同时释放所有占用资源
// 输入:无
//
// 输出:无
void DestroyWnd();
// 8 功能:清理内存及记忆
// 输入:无
//
// 输出:无
void ClearMemory();
/************************************************************************/
/* part 2设置回调函数像素点坐标、像素点信息、文件保存路径 */
/************************************************************************/
// 1 功能:设置回调函数,对外输出目标点像素坐标(目标点通过左键双击图像获得)
// 输入:
// 1. proc: 回调函数指针
//
// 输出设置成功返回TRUE否则返回FALSE
BOOL SetCallBackFun(SendCoordinateProc proc);
// 2 功能设置回调函数像素信息传递到外部CSU中
// 输入:
// 1.proc: 函数指针
//
// 输出: 设置成功返回TRUE否则返回FALSE
BOOL SetCallBackFun(SendPixInfoProc proc);
// 3 功能设置回调函数传递保存文件路径到外部CSU中
// 输入:
// 1.proc: 函数指针
//
// 输出: 设置成功返回TRUE否则返回FALSE
BOOL SetCallBackFun(SendFilePath proc);
// 5 功能设置回调函数目标定位导引经纬度到外部CSU中
// 输入:
// 1.proc: 函数指针
//
// 输出: 设置成功返回TRUE否则返回FALSE
BOOL SetCallBackFun(SendTgrLocLeadLonLatProc proc);
// 6 功能设置回调函数火炮校射信息输出到外部CSU中
// 输入:
// 1.proc: 函数指针
//
// 输出: 设置成功返回TRUE否则返回FALSE
BOOL SetCallBackFun(SendArtilleryReviseInfoProc proc);
/************************************************************************/
/* part 3图像处理显示控制、处理控制、保存控制 */
/************************************************************************/
// 4 功能:通过鼠标滚轮,实现图像放大缩小
BOOL OnMouseWheelZoomInOutImg(UINT nFlags, short zDelta, CPoint pt);
// 5 功能:取消目标标绘
void CancelTargetPlot();
// 6 功能:图像去雾
// 输入:
// 1. bAdjust 是否调节
// 2. A_MAX 控制去雾效果, A_MAX < 0 时,自适应计算(特别耗时)
// 有效范围【0,255】 异常值自适应;
// 3. degree 控制去雾效果, 有效范围【0,1】 异常值自适应
// 输出:无
void AdjustImgDehaze(BOOL bAdjust = FALSE, int A_MAX = -1, double degree = 0.78);
// 7 功能:图像亮度调节
// 输入:
// 1. bAdjust 是否调节
// 2. degree 调节力度[0 20]
// 输出:无
void AdjustImgIntensity(BOOL bAdjust = FALSE, int degree = 10);
// 8 功能:图像对比度调节
// 输入:
// 1. bAdjust 是否调节
// 2. degree 调节力度[0 20]
// 输出:无
void AdjustImgContrast(BOOL bAdjust = FALSE, int degree = 10);
// 9 功能:图像清晰度调节
// 输入:
// 1. bAdjust 是否调节
// 2. degree 调节力度[0 20]
// 输出:无
void AdjustImgDefinition(BOOL bAdjust = FALSE, int degree = 10);
// 10 功能:返回图像调节上一步图像状态,显示上一次处理图像
void ReturnToPreImgState();
// 11 功能:返回原始图像状态,显示原始图像
void ReturnToSrcImgState();
// 12 功能保存当前图像几何校正并保存为TIFF格式
void SaveImgToTiff();
// 13 功能:保存当前帧至本地文件
// 输入:
// 1. sSaveFolder 图像存储文件夹,为空或找不到时,按默认存储路径存储
// 说明:图像命名规则见设计文档
void SaveCurrentFrame(CString sSaveFolder = "");
// 14 功能是否需要记忆前面多帧18帧图像信息
// 输入:
// 1. bMem TRUE记忆 FALSE不记忆
// 输出:无
void MemPreMultiFrame(BOOL bMem = TRUE);
// 18 功能:设置图像编辑类型
// 输入:
// 1. type : 1定位标记
// 2: 文字标记
// 3: 火炮校射标记
// 其他值,无效
void SetImgEditType(int type);
// 19 功能:获取图像编辑模式
// 输入:无
// 返回:
// true: 图像增强模式
// false:图像标记模式
bool GetImgEditMode();
// 21 功能:几何校正图像并显示图像
void GeoCorrectAndShowImg();
// 22 功能:获取当前显示图像
// 输入:
// 输出:
// 1imgWidth 图像宽
// 2imgHeight 图像高
// 3bitCount 图像位数
// 4pImgData 图像数据指针
// 返回值:
// 成功返回true,失败返回false
bool GetCurrentImg(int &imgWidth, int &imgHeight, int& bitCount, uchar* &pImgData);
// 23 功能:获取图像边界地理坐标
// 输入:
// 输出:
// 1leftLon 西经
// 2topLat 北纬
// 3rigtLon 东经
// 4bottomLat 南纬
// 返回值:
// 成功返回true,失败返回false
bool GetImgBoundingBox(double &leftLon, double &topLat, double &rigtLon, double &bottomLat);
// 24 功能:获取当前显示图像中心经纬度
// 输入:
// 输出:
// 1lon 经度
// 2lat 纬度
// 返回值:
// 成功返回true,失败返回false
bool GetCurrentImgCerterLonLat(double &lon, double &lat);
// 25 功能:标注图像(矩形、区域边缘)
// 输入:
// 1. 区域边缘点 集合
void MarkRegionOnImg(std::vector<std::vector<cv::Point>> &valisContours);
// 26 功能:屏蔽右键菜单
// 输入:
// 1. bClose 默认true关闭
void CloseRightBtnDownMenu(bool bClose = true);
// 27 功能:设置空屏文字
// 输入:
// 1. str 主题文字
void SetThemeText(CString str);
// 28 功能:图像位置导引(同内部目标定位导引)
void LeadImgLoc();
private:
CImgShowDlg* m_ShowDlg; // MFC 对话框
};

@ -0,0 +1,153 @@
#pragma once
// 输出双击图像时的脱靶量
// flag = 0: 脱靶量
// flag = 1: 对话框坐标
typedef void (CALLBACK* SendPixXYOffsetProc)(CPoint xy, int flag);
// 输出双击点与对话框中点的夹角
typedef void (CALLBACK* SendAngleProc)(double angle);
// 当鼠标按下时,输出鼠标点与对话框中心点的距离比例系数和角度
typedef void (CALLBACK* SendDistRatioAndAngleProc)(double distRatio, double angle);
// 通知简单图像显示对话框被左键双击
typedef void (CALLBACK* SendLButtonDblClkInfoProc)();
// 通知简单图像显示对话框被右键按下 1Ctrl
typedef void (CALLBACK* SendButtonDownInfoProc)(int type);
// 声明 图像显示对话框类
class CSimpleImgShowDlg;
class AFX_CLASS_EXPORT CExportSimpleImgShow: public CObject
{
public:
CExportSimpleImgShow(void);
~CExportSimpleImgShow(void);
public:
/************************************************************************/
/* part 1窗口创建、销毁、图像显示、标注等 */
/************************************************************************/
// 1 功能:创建视频显示窗口
// 输入:
// 1. hParentWnd: 父窗口句柄
//
// 输出创建成功返回TRUE否则返回FALSE
BOOL CreateWnd(const HWND hParentWnd);
// 2 功能:移动(设置)窗口(整个视频显示窗口)至指定位置
// 输入:
// 1. clientRect移动至该区域
//
// 输出:无
void MoveWnd(const CRect &clientRect);
// 3 功能显示SW_SHOW 或隐藏 SW_HIDE 窗口
// 输入:
// 1. nCmdShowSW_SHOW 或 SW_HIDE
//
// 输出:无
void ShowWnd(const int nCmdShow);
// 4 功能:显示一帧图像
// 输入:
// 1. pImgInfo图像信息头
// 2. pImgData图像数据指针
//
// 输出显示成功返回TRUE否则返回FALSE
BOOL ShowImage(const BITMAPINFO* pImgInfo, BYTE* pImgData);
// 5 功能:删除视频显示窗口,同时释放所有占用资源
// 输入:无
//
// 输出:无
void DestroyWnd();
// 6 功能:设置回调函数
// 输入:
// 1. fun 函数指针
//
// 输出:无
void SetCallBackFun(SendPixXYOffsetProc fun);
// 7 功能:设置回调函数
// 输入:
// 1. fun 函数指针
//
// 输出:无
void SetCallBackFun(SendAngleProc fun);
// 8 功能:设置回调函数
// 输入:
// 1. fun 函数指针
//
// 输出:无
void SetCallBackFun(SendDistRatioAndAngleProc fun);
// 9 功能:设置回调函数
// 输入:
// 1. fun 函数指针
//
// 输出:无
void SetCallBackFun(SendLButtonDblClkInfoProc fun);
// 10 功能:设置是否显著标记对话框
// 输入:
// 1. bMark: 是否标记
// 2. bEnhance: 增强该功能
//
// 输出:无
void MarkDialog(bool bMark, bool bEnhance = false);
// 11 功能:设置回调函数
// 输入:
// 1. fun 函数指针
//
// 输出:无
void SetCallBackFun(SendButtonDownInfoProc fun);
// 12 功能:获取当前显示图像
// 输入:
// 无
// 输出:
// 1imgWidth 图像宽
// 2imgHeight 图像高
// 3bitCount 图像位数
// 4pImgData 图像数据指针
// 返回值:
// 成功返回true,失败返回false
bool GetCurrentImg(int &imgWidth, int &imgHeight, int& bitCount, unsigned char* &pImgData);
// 13 功能:设置空屏文字
// 输入:
// 1. str 主题文字
// 输出:
// 无
// 返回值:
// 无
void SetThemeText(CString str);
// 13 功能:关闭右键菜单
void CloseRightBtnDownMenu(bool bClose = true);
// 14 功能:清空显示
void ClearImg();
private:
CSimpleImgShowDlg* m_ShowDlg; // MFC 对话框
};

@ -0,0 +1,48 @@
// MySlider.cpp : 实现文件
//
#include "stdafx.h"
#include "ExtendSliderCtrl.h"
// CMySlider
IMPLEMENT_DYNAMIC(CExtendSliderCtrl, CSliderCtrl)
CExtendSliderCtrl::CExtendSliderCtrl()
{
}
CExtendSliderCtrl::~CExtendSliderCtrl()
{
}
BEGIN_MESSAGE_MAP(CExtendSliderCtrl, CSliderCtrl)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
// CMySlider 消息处理程序
void CExtendSliderCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CSliderCtrl::OnLButtonDown(nFlags, point);
CRect rectClient, rectChannel;
GetClientRect(rectClient);
GetChannelRect(rectChannel);
int nMax = 0;
int nMin = 0;
GetRange(nMin, nMax);
int nPos = (nMax - nMin) * (point.x - rectClient.left - rectChannel.left) / (rectChannel.right - rectChannel.left);
// 移动到鼠标位置
SetPos(nPos);
}

@ -0,0 +1,22 @@
#pragma once
// CExtendSliderCtrl
class CExtendSliderCtrl : public CSliderCtrl
{
DECLARE_DYNAMIC(CExtendSliderCtrl)
public:
CExtendSliderCtrl();
virtual ~CExtendSliderCtrl();
protected:
DECLARE_MESSAGE_MAP()
public:
// 功能:让滑块移动到鼠标点击处
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};

@ -0,0 +1,83 @@
#ifndef __FRAME_FK_U_CAMERA
#define __FRAME_FK_U_CAMERA
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "FrameRecieve.h"
#pragma pack(1)
typedef struct struProtocalKB {
UINT8 head[2]; //帧头0x
UINT8 reserved; //预留
UINT8 data[3]; //开关指令
UINT8 curPage; //指令页
UINT8 CHKSUM; //校验字节
}ProtocalKB;
#pragma pack()
class CFrameFK_U_CAMERA : public CFrameAbstract {
public:
int fk_counter;
CFrameFK_U_CAMERA()
{
strcpy(Name, "机载相机");
FrameLength = 8;
HeadLength = 2;
Head[0] = 0xEB;
Head[1] = 0x98;
memcpy(Addr(), Head, HeadLength);
CheckLength = 1;
CheckPos = FrameLength -1;
FrameType = ftFKd;
fk_counter = 0;
DINeedRespond = FALSE;
ckCmd = 0x00;
memset(&Data,0,sizeof(ProtocalKB));
}
public:
ProtocalKB Data;
BOOL DINeedRespond;
virtual struCHECK CheckCRC(BYTE* const p)//子帧校验
{
return getCRC8(p,7);
}
virtual BYTE* SendPrepare()
{
return CFrameAbstract::SendPrepare();
}
public:
BYTE ckCmd;//从控指令
public:
virtual ~CFrameFK_U_CAMERA(){
}
protected:
virtual BOOL OnCheck(){
if(CheckCRC(Addr()).C0 == Addr()[7])
return true;
else
return false;
}
virtual void Decode()
{
}
virtual void Encode()
{
ProtocalKB *pBuff = (ProtocalKB*) Addr();
pBuff->head[0] = 0xEB;
pBuff->head[1] = 0x98;
pBuff->reserved = 0x00;
memset(pBuff->data,ckCmd,3);
pBuff->curPage = 0x01;
}
};
#endif

@ -0,0 +1,110 @@
#include "StdAfx.h"
#include "FrameIMP_Down.h"
CFrameIMPDown_::CFrameIMPDown_(void)
{
_tcscpy(Name, _T("IMP下行"));
FrameLength = 6;
HeadLength = 1;
Head[0] = 0x55;
memcpy(Addr(), Head, HeadLength);
CheckLength = 1;
CheckPos = FrameLength - 2;
memset(&Data,0,sizeof(DataIMPDown));
memset(recvDataValue, 0, 6);
}
CFrameIMPDown_::~CFrameIMPDown_(void)
{
}
BOOL CFrameIMPDown_::FullFrame()
{
int HeaderPos, HeaderPos2;
HeaderPos = FindHead(0, Length() - HeadLength); //找第一个帧头
if (0 == HeaderPos) {
//帧头在最前面
if (OnCheck()) //CRC校验
DoCheck();
else {
if (Length() < FrameLength) //数据长度不足未通过CRC校验
{
if (Size() < FrameLength) //误码未通过CRC校验
{
DoDropBYTE((UINT16)HeadLength); //丢弃帧头
}
return TRUE;
}
else //误码未通过CRC校验
{
HeaderPos2 = FindHead(HeadLength, Length() - HeadLength);
if (HeaderPos2 >= 0)
{
Drop((UINT16) HeaderPos2);
return FALSE;
}
else
{
DoDropBYTE((UINT16) (Length()-(HeadLength-1)));
return TRUE;
}
}
}
} else if (HeaderPos < 0) {
//没找到帧头
DoDropBYTE((UINT16) (Length()-(HeadLength-1)));
} else {
//丢弃帧头前的数据
DoDropBYTE((UINT16) HeaderPos);
}
return FALSE;
}
BOOL CFrameIMPDown_::OnCheck()
{
//数据帧校验
BYTE* p = Addr();
memcpy(recvDataValue, p, 5);
if (Length() < FrameLength)
{
return false;
}
struCHECK ck1=CheckCRC(p);
//if (p[CheckPos] == ck1.C0 && p[CheckPos + 1] == ck1.C1)//CRC校验
if (p[CheckPos] == ck1.C0 )//和校验
{
memcpy(recvDataValue, p, 5);
return true;
}
else
{
return false;
}
}
void CFrameIMPDown_::DoCheck()
{
CountFrameAll++;
CountFrameCheck++;
OnDataCheck();
Drop(FrameLength);
}
struCHECK CFrameIMPDown_::CheckCRC(BYTE* const p)
{
return MakeCheckSum(p+1, FrameLength - HeadLength - CheckLength - 1);//1为帧尾IMP有一个字节的帧尾
}
void CFrameIMPDown_::Decode()
{
ProtocalIMPDown* pBuffIMP = (ProtocalIMPDown*)Addr();
Data.head = pBuffIMP->head;
Data.Bytes = pBuffIMP->Bytes;
Data.StatusWord = pBuffIMP->StatusWord;
Data.FaultWord = pBuffIMP->FaultWord;
Data.CHKSUM = pBuffIMP->CHKSUM;
Data.EndFlag = pBuffIMP->EndFlag;
}

@ -0,0 +1,84 @@
#include "FrameRecieve.h"
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#ifdef __WIN_32_VC__
typedef unsigned char BYTE;
typedef unsigned char INT8U;
typedef unsigned short INT16U;
typedef unsigned int INT32U;
typedef char INT8S;
typedef short INT16S;
typedef int INT32S;
#endif
#pragma pack(1)
//超视距通用协议帧
typedef struct struProtocalIMPDown{
UINT8 head; //帧头0x
UINT8 Bytes; //字节数
UINT8 StatusWord; //状态字
UINT8 FaultWord; //故障字
UINT8 CHKSUM; //校验和
UINT8 EndFlag; //结束标志
}ProtocalIMPDown;
#pragma pack()
//超视距通用帧数据
typedef struct struDataIMPDown{
UINT8 head; //帧头0x
UINT8 Bytes; //预留
UINT8 StatusWord; //状态字
UINT8 FaultWord; //故障字
UINT8 CHKSUM; //校验和
UINT8 EndFlag; //结束标志
}DataIMPDown;
class CFrameIMPDown_ : public CFrameAbstract
{
public:
CFrameIMPDown_(void);
~CFrameIMPDown_(void);
protected:
virtual BOOL FullFrame();
virtual BOOL OnCheck();
void DoCheck();
virtual struCHECK CheckCRC(BYTE* const p);
virtual void Decode();
BYTE recvDataValue[6];
public:
DataIMPDown Data; //IMP下行协议数据
public:
float LimitedValueF(float val,float minimum, float maximum)
{
val = val>maximum?maximum:val;
val = val<minimum?minimum:val;
return val;
}
int LimitedValueI(int val,int minimum, int maximum)
{
val = val>maximum?maximum:val;
val = val<minimum?minimum:val;
return val;
}
double LimitedValueD(double val,double minimum, double maximum)
{
val = val>maximum?maximum:val;
val = val<minimum?minimum:val;
return val;
}
};

@ -0,0 +1,410 @@
#ifndef _FRAME_RECIEVE_H
#define _FRAME_RECIEVE_H
#include "basetype.h"
#include "bufferloop.h"
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
typedef enum {
ftFJu, //按飞机平台上行协议校验
ftFJd, //按飞机平台下行协议校验
ftEOu, //按稳定平台上行协议校验
ftEOd, //按稳定平台下行协议校验
ftCJu, //按测距测角上行协议校验
ftCJd, //按测距测角下行协议校验
ftQBu, //按情报上行协议校验
ftQBd, //按情报下行协议校验
ftCKd, //按测控下行协议校验
ftSFu, ftSFd, ftFKu, ftFKd, ftEOGCSu, ftEOSBu, ftTXd, ftTXd_8B, ftTXd_8B_SM, ftTXd_8B_SAR, //图像复接数据协议
ftEOU_8B,
ftMIMUu, //MIMU上行协议数据协议
ftMIMUd, //MIMU下行协议数据协议
ftGPSu, //GPS上行协议数据协议
ftGPSd, //GPS下行协议数据协议
ftBDu, //北斗上行协议数据协议
ftBDd, //北斗下行协议数据协议
ftPOWERu, //飞控计算机发送到电源管理器的数据帧
ftPOWERd, //电源管理器发送到飞控计算机的数据帧
ftOILu, //飞控计算机发送到油量传感器的数据帧
ftOILd, //油量传感器发送到飞控计算机的数据帧
ftMAGu, //飞控计算机发送到电子罗盘的数据帧
ftMAGd, //电子罗盘发送到飞控计算机的数据帧
ftGKu, //飞控计算机发送到高度/空速传感器的数据帧
ftGKd, //高度/空速传感器发送到飞控计算机的数据帧
ftNone //自定义校验
}TFrameType;
inline double RoundMax(double v, double vmax)
{
return fmod(v, vmax);
}
inline void ChangeFileNameExt(char *name, const char *ext)
{
char *p = strrchr(name, '.');
if(p) *(p+1) = 0;
strcat(name, ext);
}
//解析事件回调函数类型
class CFrameAbstract;
typedef void (CALLBACK *FLDropBYTECALLBACK)(CFrameAbstract* frm, UINT16 Count);
typedef void (CALLBACK *FLDropFrameCALLBACK)(CFrameAbstract* frm, UINT16 Count);
typedef void (CALLBACK *FLNotCheckCALLBACK)(CFrameAbstract* frm);
typedef void (CALLBACK *FLCheckCALLBACK)(CFrameAbstract* frm,LPVOID lp);
//数据帧编帧、解析抽象类
class CFrameAbstract : public CBufferLoop {
public:
CFrameAbstract() :
FrameLength(32), HeadLength(2), CheckLength(1), CheckPos(31), FrameType(ftNone),
bphrasing(FALSE), bFileOpen(FALSE), nFlushCount(0),
hFileOrg(NULL), hFileCheck(NULL), hFileNotCheck(NULL),
funcDropBYTE(NULL), funcDropFrame(NULL), funcNotCheck(NULL), funcCheck(NULL),
CountBYTEAll(0), CountBYTEDrop(0), CountFrameAll(0), CountFrameCheck(0), CountFrameNotCheck(0), CountFrameDrop(0),
funcDropBYTEParam(NULL), funcDropFrameParam(NULL), funcNotCheckParam(NULL), funcCheckParam(NULL)
{};
virtual ~CFrameAbstract(){
funcDropBYTE = NULL;
funcDropFrame = NULL;
funcNotCheck = NULL;
funcCheck = NULL;
funcDropBYTEParam = NULL;
funcDropFrameParam = NULL;
funcNotCheckParam = NULL;
funcCheckParam = NULL;
while (TRUE == bphrasing){
Sleep(100);
}
if(bFileOpen){
fclose(hFileOrg);
fclose(hFileCheck);
fclose(hFileNotCheck);
bFileOpen = FALSE;
}
}
protected:
UINT16 FrameLength; //帧长
UINT16 HeadLength; //帧头长度
UINT16 CheckLength; //帧内保存校验字节的长度
UINT16 CheckPos; //帧内保存校验字节的位置
TFrameType FrameType; //帧格式类型
public:
char Name[20];
BYTE Head[13];
BOOL bphrasing;
TFrameType GetFrameType(){return FrameType;}
UINT16 GetFrameLength(){return FrameLength;}
UINT16 GetHeadLength(){return HeadLength;}
private:
BOOL bFileOpen;
INT32 nFlushCount;
char strModuleName[1024];
char strAppPath[1024];
public:
char strDataPath[1024];
protected:
char strDataName[1024];
FILE * hFileOrg;
FILE * hFileCheck;
FILE * hFileNotCheck;
BOOL FullFrame() //因为没有整个256做校验排除长短帧进行查找两个
{
int HeaderPos, HeaderPos2;
HeaderPos = FindHead(0, Length() - HeadLength); //
if (0 == HeaderPos) {
//帧头在最前面
if (OnCheck()) //用256 257
DoCheck();
else {
HeaderPos2 = FindHead(HeadLength, Length() - HeadLength);
if (HeaderPos2 >= 0)
{
Drop((UINT16) HeaderPos2);
TRACE("Diu >= 0\n");
return FALSE;
}
else
{ TRACE("Diu < 0\n");
DoDropBYTE((UINT16) (Length()-(HeadLength-1)));
return TRUE;
}
}
}
else if (HeaderPos < 0)
{
//没找到帧头
DoDropBYTE((UINT16) (Length()-(HeadLength-1)));
}
else
{
//丢弃帧头前的数据
DoDropBYTE((UINT16) HeaderPos);
TRACE("Diu < 0\n");
}
return FALSE;
}
void DoCheck()
{
assert(FrameLength > 0);
CountFrameAll++;
CountFrameCheck++;
OnDataCheck();
Drop(FrameLength);
}
void DoNotCheck()
{
assert(FrameLength > 0);
CountFrameAll++;
CountBYTEDrop += FrameLength;
CountFrameNotCheck++;
OnDataNotCheck();
Drop(FrameLength);
}
void DoDropFrame(const int Count)
{
assert(Count > 0);
CountFrameAll++;
CountBYTEDrop += Count;
CountFrameDrop++;
OnDataDropFrame(Count);
Drop(Count);
}
void DoDropBYTE(const int Count)
{
if(Count <= 0) return;
assert(Count > 0);
CountBYTEDrop += Count;
OnDataDropBYTE(Count);
Drop(Count);
}
int FindHead(int Start, const int Length)
{
if((Start < 0) || (Length <=0 )) return -1;
assert((Start >= 0) && (Length > 0));
BYTE* p = Addr() + Start;
while (Start < (Length-HeadLength+1))
{
if (memcmp(p, Head, HeadLength) == 0)
return Start;
p++;
Start++;
}
return -1;
}
virtual BOOL OnCheck() //帧校验函数
{
return 1;
BYTE* p = Addr();
struCHECK ck=CheckCRC(p+2);
if (1 == CheckLength)
{
return (ck.C0== p[CheckPos]) ? TRUE : FALSE;
}
else if (2 == CheckLength)
{
return ((p[CheckPos]==ck.C1)&&(p[CheckPos+1]==ck.C0));
}
else
{
return false;
}
}
protected:
FLDropBYTECALLBACK funcDropBYTE;
FLDropFrameCALLBACK funcDropFrame;
FLNotCheckCALLBACK funcNotCheck;
FLCheckCALLBACK funcCheck;
INT32 CountBYTEAll; //接收到的全部字节数
INT32 CountBYTEDrop; //丢弃的字节数
INT32 CountFrameAll; //全部帧计数
INT32 CountFrameCheck; //有效帧计数
INT32 CountFrameNotCheck; //校验错的帧计数
INT32 CountFrameDrop; //短帧计数
virtual void OnDataDropBYTE(const int Count) //无效字节段事件函数,需用户自行编制处理函数
{
if (funcDropBYTE != NULL) funcDropBYTE(this, Count);
}
virtual void OnDataDropFrame(const int Count) //短帧事件函数,需用户自行编制处理函数
{
if (funcDropFrame != NULL) funcDropFrame(this, Count);
}
virtual void OnDataNotCheck() //帧校验错事件函数,需用户自行编制处理函数
{
//Decode();
if (funcNotCheck != NULL) funcNotCheck(this);
//Distribute();
//Show();
if(bFileOpen) fwrite(Addr(), FrameLength, 1, hFileNotCheck);
}
virtual void OnDataCheck() //有效帧事件函数,需用户自行编制处理函数
{
Decode();
if (funcCheck != NULL) funcCheck(this,funcCheckParam);
Distribute();
Show();
if(bFileOpen) fwrite(Addr(), FrameLength, 1, hFileCheck);
}
public:
UINT32 funcDropBYTEParam;
UINT32 funcDropFrameParam;
UINT32 funcNotCheckParam;
LPVOID funcCheckParam;
void SetDropBYTECallback(FLDropBYTECALLBACK fun, UINT32 Param = 0){ funcDropBYTE = fun; funcDropBYTEParam = Param;}
void SetDropFrameCallback(FLDropFrameCALLBACK fun, UINT32 Param = 0){ funcDropFrame = fun; funcDropFrameParam = Param;}
void SetNotCheckCallback(FLNotCheckCALLBACK fun, UINT32 Param = 0){ funcNotCheck = fun; funcNotCheckParam = Param;}
void SetCheckCallback(FLCheckCALLBACK fun,LPVOID Param = NULL){funcCheck = fun; funcCheckParam = Param;}
void SetSaveStatus(BOOL IsSave, const char *name = NULL)
{
if(IsSave){
GetModuleFileName(GetModuleHandle(NULL), strModuleName, 1024);
char *p = strrchr(strModuleName, '\\');
if(p) strncpy(strAppPath, strModuleName, p - strModuleName);
else strcpy(strAppPath, strModuleName);
time_t ltime;
struct tm *t;
time( &ltime );
t = localtime( &ltime );
sprintf(strDataPath, "%s\\RecordOrg-%04d%02d%02d", strAppPath, t->tm_year, t->tm_mon, t->tm_mday);
char temp[1024];
sprintf(temp, "%04d%02d%02d %02d%02d%02d", t->tm_year + 1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
CreateDirectory((LPCSTR)strDataPath, NULL);
if(name == NULL){
sprintf(strDataName, "%s\\%s-%s.dat", strDataPath, temp, Name);
}
else{
sprintf(strDataName, "%s\\%s-%s.dat", strDataPath, temp, name);
}
if((hFileOrg = fopen(strDataName, "wb")) != NULL){
strcpy(temp, strDataName);
ChangeFileNameExt(temp,"chk");
if((hFileCheck = fopen(temp, "wb")) != NULL){
strcpy(temp, strDataName);
ChangeFileNameExt(temp,"err");
if((hFileNotCheck = fopen(temp, "wb")) != NULL){
bFileOpen = TRUE;
}
else{
fclose(hFileCheck);
fclose(hFileOrg);
}
bFileOpen = TRUE;
}
else{
fclose(hFileOrg);
}
}
}
else{
if(bFileOpen){
fclose(hFileOrg);
fclose(hFileCheck);
fclose(hFileNotCheck);
bFileOpen = FALSE;
}
}
}
void ResetCount()
{
//用于计数清零
CountBYTEAll = 0L;
CountBYTEDrop = 0L;
CountFrameAll = 0L;
CountFrameCheck = 0L;
CountFrameNotCheck = 0L;
CountFrameDrop = 0L;
}
void Phrase(const BYTE* Src, const UINT32 Count)
{
cs->Enter();
int ReadCount;
UINT32 LeftCount = Count;
const BYTE* psrc = Src;
bphrasing = TRUE;
while (LeftCount > 0)
{
ReadCount = Append(psrc, LeftCount);//
psrc += ReadCount;
LeftCount -= ReadCount;
CountBYTEAll += ReadCount;
while (Length() >= (FrameLength+HeadLength)) //
if (FullFrame())
break;
}
try{
if(bFileOpen)
{
fwrite(Src, Count, 1, hFileOrg);
if((CountBYTEAll - nFlushCount) > 40960)
{
fflush(hFileOrg);
fflush(hFileCheck);
fflush(hFileNotCheck);
nFlushCount = CountBYTEAll;
}
}
}
catch (...)
{
cs->Leave();
bphrasing = FALSE;
}
cs->Leave();
bphrasing = FALSE;
}
INT32 GetCountBYTEAll(){return CountBYTEAll;}
INT32 GetCountBYTEDrop(){return CountBYTEDrop;}
INT32 GetCountFrameAll(){return CountFrameAll;}
INT32 GetCountFrameCheck(){return CountFrameCheck;}
INT32 GetCountFrameNotCheck(){return CountFrameNotCheck;}
INT32 GetCountFrameDrop(){return CountFrameDrop;}
//output
protected:
virtual void FrameCrc(BYTE* p)
{
struCHECK ck=CheckCRC(p);
if (CheckLength==1)
{
p[CheckPos]=ck.C0;
}
if (CheckLength==2)
{
p[CheckPos] = ck.C0;
p[CheckPos+1]=ck.C1;
}
}
public:
virtual BYTE* SendPrepare()
{
BYTE* po;
po = Addr();
Encode();
FrameCrc(po);
return(po);
}
virtual struCHECK CheckCRC(BYTE* const p) = 0;
protected:
virtual void Encode(){}
virtual void Decode(){}
virtual void Distribute(){}
public:
virtual void Show(){}
};
#endif // !defined(AFX_FRAMERECIEVE_H__79D92644_4FC6_49FB_A28B_59EF7305C25A__INCLUDED_)

@ -0,0 +1,255 @@
#include "StdAfx.h"
#include "GetElevation.h"
// tiff文件读取
#include "gdal_priv.h"
#include "cpl_conv.h" //for CPLMalloc()
// boost-1.56:准C++标准库
#include <boost/lexical_cast.hpp>
#include <boost/format.hpp>
#include <vector>
using namespace std;
// 定义高程图像存储结构体
#pragma pack(1)
struct struDemPic
{
struDemPic()
{
pDEMData = NULL;
};
virtual ~struDemPic()
{
if (pDEMData != NULL)
{
delete[] pDEMData;
pDEMData = NULL;
}
}
signed short int *pDEMData;
string strDemName;
double adfGeoTransform[6];
int iXSize;
int iYSize;
};
#pragma pack()
// 定义类型: DEM_PIC_LIST
typedef vector<struDemPic*> DEM_PIC_LIST;
// 全局变量
DEM_PIC_LIST g_DemPicList;
// 基于经纬度 计算tif文件名称
string GetDemName( const float fLonDeg, const float fLatDeg )
{
string sLatLon; // 输出
int iLon = (int) fLonDeg;
int iLat = (int) fLatDeg;
//判断经纬度在正常范围之内
if ((fLonDeg < -180) || (fLonDeg > 180))
{
return "";
}
if ((fLatDeg < -90) || (fLatDeg > 90))
{
return "";
}
string sLat, sLon;
// 纬度 南北纬 区别对待
boost::format fmt("S%02d");
if (fLatDeg <= 0)
{
fmt % ((-iLat) + 1);
sLat = fmt.str();
}
else
{
fmt = boost::format("N%02d");
fmt % iLat;
sLat = fmt.str();
}
// 经度 东西经 区别对待
if (fLonDeg <= 0)
{
fmt = boost::format("W%03d");
fmt % ((-iLon) + 1);
sLon = fmt.str();
}
else
{
fmt = boost::format("E%03d");
fmt % iLon;
sLon = fmt.str();
}
sLatLon = "ASTGTM_" + sLat + sLon + "_dem.tif";
return sLatLon;
}
// 搜寻文件路径是否已经存在
int FindDemDataSet( const string strDemName )
{
for ( unsigned int i = 0; i < g_DemPicList.size(); i++ )
{
if ( g_DemPicList[i]->strDemName == strDemName )
{
return i;
}
}
return -1;
}
bool GetDem( float& fElevator, const float fLonDeg, const float fLatDeg, struDemPic* pDemPic )
{
// 空值判断
if (pDemPic == NULL)
{
return false;
}
// 分辨率 判断
if (pDemPic->adfGeoTransform[1] <= 0 || pDemPic->adfGeoTransform[5] >= 0)
{
return false;
}
// 计算像素坐标
float px = float(( fLonDeg - pDemPic->adfGeoTransform[0] ) / pDemPic->adfGeoTransform[1]);
float py = float(( pDemPic->adfGeoTransform[3] - fLatDeg ) / fabs(pDemPic->adfGeoTransform[5]));
//防止越界
if ((px < 0) || (px > pDemPic->iXSize - 1) ||
(py < 0) || ( py > pDemPic->iYSize - 1))
{
return false;
}
// 规则:双线性内插 计算高程值
int yt = 0, yb = 0; // y 上下
int xl = 0, xr = 0; // x 左右
yt = int(py);
yb = yt + 1;
xl = int(px);
xr = xl + 1;
if ((xl < 0) || (xl > pDemPic->iXSize - 1) ||
(xr < 0) || (xr > pDemPic->iYSize - 1))
{
return false;
}
if ((yt < 0) || (yt > pDemPic->iXSize - 1) ||
(yb < 0) || (yb > pDemPic->iYSize - 1))
{
return false;
}
// 相邻四个像素的值
signed short int DNlt = *(pDemPic->pDEMData + yt * pDemPic->iXSize + xl);
signed short int DNrt = *(pDemPic->pDEMData + yt * pDemPic->iXSize + xr);
signed short int DNlb = *(pDemPic->pDEMData + yb * pDemPic->iXSize + xl);
signed short int DNrb = *(pDemPic->pDEMData + yb * pDemPic->iXSize + xr);
// 间距
float h, v;
h = py - yt;
v = px - xl;
fElevator = DNlt * (1 - h) * (1 - v) + DNlb * h * (1 - v)+ DNrt * (1 - h) * v + DNrb * h * v;
return true;
}
// 获取高程
bool GetDem( float& fElevator, float fLonDeg, float fLatDeg, string sDir)
{
// tif文件 名称
string strName = GetDemName(fLonDeg, fLatDeg);
if (strName == "")
{
return false;
}
// tif文件 路径名称
string strPathName;
if (sDir != "")
{
strPathName = sDir + "\\" + strName;
}
else
{
return false;
}
// 是否能在记录中找到
int idx = FindDemDataSet(strPathName);
if (idx >= 0)
{
return GetDem(fElevator, fLonDeg, fLatDeg, g_DemPicList[idx]);;
}
//如果在数据集数组中找不到 读取文件并添加到数据集
// 注册
GDALAllRegister();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
GDALDataset* tempdata = NULL;
tempdata = (GDALDataset*) GDALOpen(strPathName.c_str(), GA_ReadOnly);
if ( tempdata != NULL )
{
GDALDataType dataType = tempdata->GetRasterBand(1)->GetRasterDataType();
int iXSzie = tempdata->GetRasterBand(1)->GetXSize();
int iYSzie = tempdata->GetRasterBand(1)->GetYSize();
struDemPic* temp = new struDemPic;
temp->iXSize = iXSzie;
temp->iYSize = iYSzie;
tempdata->GetGeoTransform(temp->adfGeoTransform);
temp->pDEMData = new signed short int[iXSzie * iYSzie];
memset((void*) temp->pDEMData, 0, iXSzie * iYSzie * sizeof(signed short int));
tempdata->GetRasterBand(1)->RasterIO( GF_Read, 0, 0, iXSzie, iYSzie, temp->pDEMData, iXSzie, iYSzie, GDT_Int16, 0, 0 );
GDALClose(tempdata);
// 入队 存储
temp->strDemName = strPathName;
g_DemPicList.push_back(temp);
return GetDem(fElevator, fLonDeg, fLatDeg, g_DemPicList[g_DemPicList.size() - 1]);;
}
return false;
}
//功能:释放资源
void ReleaseDemMemory()
{
// 高程数集
for (unsigned int i = 0; i < g_DemPicList.size(); i++ )
{
if ( g_DemPicList[i] != NULL )
{
delete g_DemPicList[i];
}
}
g_DemPicList.clear();
}

@ -0,0 +1,51 @@
/*---------------------------------------------------------------------------
30
使windows
VS2008 VS2010 VS2013
gdal
boost
1 GetDem...
2ReleaseDemMemory()
1
2
......
:
V1.0 2016/12/15
----------------------------------------------------------------------------*/
#include "StdAfx.h"
#include <string>
using namespace std;
//1 功能:基于经纬度读取地面高程
//输入:
// 1. fLonDeg: 经度(度)
// 2. fLatDeg: 纬度(度)
// 3. sDir: 高程数据文件存储路径, 默认设为:"D:\\ElevationData"可根据实际情况修改高程tif文件文件名字遵循标准格式
// 举例ASTGTM_N20E095_dem.tif
//
//输出:
// 1. fElevator:高程(米)
//
//返回值若函数运行成功返回true否则返回false
bool GetDem( float& fElevator, float fLonDeg, float fLatDeg, string sDir = "D:\\ElevationData");
//2 功能释放DEM加载的资源
void ReleaseDemMemory();

File diff suppressed because it is too large Load Diff

@ -0,0 +1,145 @@
#pragma once
#include "stdafx.h"
#include "GlobalMember.h" // 全局变量
#include "MUDP.h"
#include "FrameFKU_Camera.h"
#include "MulticastSocket.h"
#define SAFE_DELETE(p) { if(p) { delete (p); (p) = nullptr; } }
#define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p) = nullptr; } }
extern CFrameFK_U_CAMERA g_FrameCamera;
extern CMUDP g_MUDPCamera;
extern BOOL g_IsSending;
// 获取指定磁盘剩余空间
extern long GetFreeVolumeLen(char *p = "C");
// 功能:获取软件当前工作目录
extern CString GetSoftwareCurrentDirectory();
//功能:在文件夹中查找文件,看其是否存在
extern bool SearchDirectory(const CString &strDir);
//功能计算4个字节的数值
extern unsigned int getFrameLen(BYTE B0, BYTE B1, BYTE B2, BYTE B3);
// 获取图像双击点偏移量
extern void CALLBACK GetEOImgCenterOffset(CPoint offset, int flag);
// 右键点击可见光或红外,转换为手动跟踪
extern void CALLBACK GetEOIRImgRightButtonDown(int type);
// 通过图像控制伺服
extern void CALLBACK GetDistRatioAndAngleThroughImg(double distRatio, double angle);
//地图模块回调函数
extern void CALLBACK GetLeadLonLat(double Lon, double Lat, double Alt);
// 回放模式输入数据
extern void ReplayInputData(const void* buffer, int length);
// UDP 实时收数(来自情报)
extern void CALLBACK UDPRevTgtInfo(const void* buffer, int length, UINT32 data);
// 数据处理——(线程函数)
extern void ProcessData();
// 位置信息结构体解析函数
extern void TransLocationSocketStruct(struSocketProtocal &dst, const struQB_FJ & src);
// 复接数据结构体解析函数
extern void TransFJStruct( struTranslateProtocal_FJ &dst, const struProtocal_FJ &src);
// 复接数据入队列
extern void PushToFrameDataDeque(const struQB_FJ &TgtLocStru);
// 转情报用EO复接数据
extern void TransToEOQBFJ(struQB_FJ &dst, const struTranslateProtocal_FJ &src);
// 转情报用IR复接数据
extern void TransToIRQBFJ(struQB_FJ &dst, const struTranslateProtocal_FJ &src);
// CH96获取数据
extern void GetFH96DataFromNet();
extern void SocketReceiveFH96Data(const void* buffer, int length);
extern void ProcessCH96Data();
// 获取CH96复接数据
extern void TransCH96FJData(Data96TXD &dst, Protocal96TXD &src);
// CH96复接数据转FH统型复接数据
extern void TransCH96FJDatatoQBData(struQB_FJ &QB_FJ, Data96TXD &CH96FJ);
// CH96解码回调函数
void CH96_h264DecodeResultCallbackFun(unsigned char* data,int width,int height);
// 基于飞机位置姿态和目标位置,计算载荷姿态
// 功能:载荷导引,计算载荷姿态角()
// 输入:
// 1. uavPos飞机位置double uavPos[GPS经度GPS纬度GPS高度]
// 2. tgtPos目标位置double tgtPos[GPS经度GPS纬度GPS高度]
// 3. uavAttitude: 飞机姿态double uavAttitude[俯仰,滚转,偏航]
// 输出:
// 1. loadPitch 载荷高低角,单位度
// 2. loadAzimuth 载荷方位角,单位度
// 返回值计算成功返回true,否则返回false。
extern bool CalLoadAttitudeForLoadGuide(double &loadPitch, double &loadAzimuth, const double *uavPos, const double *tgtPos, const double *uavAttitude);
// 获取飞机的经纬高和姿态
extern bool GetUAVLocAndPose(double &UAVLon, double &UAVLat,double &UAVAlt,
double &UAVRoll, double &UAVYaw,double &UAVPitch,
const struTranslateProtocal_FJ &src);
// 转情报用EO复接数据
extern void TransToEOQBFJ(struQB_FJ &dst, const struTranslateProtocal_FJ &src);
// 转情报用IR复接数据
extern void TransToIRQBFJ(struQB_FJ &dst, const struTranslateProtocal_FJ &src);
//
extern double getYaw(double XA, double YA);
extern bool CalAnyPtCoordinateWithoutErrorCompensate(double &Lon, double &Lat, double &H, const struQB_FJ *frame, int pt_x, int pt_y);
extern void CalLonLatOffset(double &LonOffset, double &LatOffset, const struQB_FJ *frame);
//功能3计算图像中心点经纬度坐标
//输入: 1. frame 输入复接数据
//
//输出: 1. Lon 图像中心点经度
// 2. Lat 图像中心点纬度
// 3. H 图像中心点高度
// 4. 返回值处理成功返回true失败返回false
// 说明:当有激光测距时,对地形无要求,当无激光测距时,定位地形应尽量平坦
extern bool CalImgCenterCoordinate(double &Lon, double &Lat, double &H, const struQB_FJ *frame);
//功能4计算图像中任意点经纬度坐标
//输入: 1. frame 输入复接数据
// 2. pt_x 列坐标
// 3. pt_y 行坐标
//
//输出: 1. Lon 经度
// 2. Lat 纬度
// 3. H 高度
// 4. 返回值处理成功返回true失败返回false
// 说明:当有激光测距时,对地形无要求;
// 当无激光测距时,定位地形应尽量平坦,此时,定位误差与目标高程与飞机垂点地面高程之差成正比。
extern bool CalAnyPtCoordinate(double &Lon, double &Lat, double &H, const struQB_FJ *frame, int pt_x, int pt_y);
// 功能:释放情报数据
extern void ReleaseQBData(QBStru *pQBData);
// 功能:克隆图像数据
extern void CloneImgStru(const ImgStru *src, ImgStru *dst);
extern void CloneQBData(const QBStru *src, QBStru *dst);
extern BYTE Buffer[512000];
//功能:获取原始视频数据
extern void GetH264VideoDataFromNet();
extern void SocketReceiveH264VideoData(const void* buffer, int length);
extern void ProcessH264VideoData();
extern void GetSerialPortNumber(char *port, const CString portID);//串口数字换算到标准的串口输出
extern bool IsNumber(CString str);//正数+负数
extern bool IsPositiveNumber(CString str);//正数
extern bool IsInteger(CString str);//整数
extern bool IsPositiveInteger(CString str);//正整数

@ -0,0 +1,502 @@
#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"
};
bool g_bBindData = false;//是否在装订的标志
//13所吊舱控制新
int g_commandNum; //控制指令序号
CDCFrameCkCmdFrame g_DCFrameCkCmd13; //数据注入指令从控发送数据帧---13所吊舱
//武汉天进吊舱控制
int g_WHTJDCCmdNum; //控制指令序号
int DCTypeSelected_video = 0; //吊舱类型选择_图像接收
bool SelectPointTrack;//选点跟踪
HWND DlgDCOverroll_Hwnd; //DCOverrollDlg句柄
float m_wndShowEO_Position_Max_x; //图像显示区域的坐标最大值x
float m_wndShowEO_Position_Max_y; //图像显示区域的坐标最大值y

@ -0,0 +1,518 @@
#pragma once
#include "stdafx.h"
#include "Decoder.h"
// 李振h264解码库
#include "DecoderFactory.h"
#include "deque"
#include "CUDPSocket.h"
#include "CTCPSocket.h"
#include <opencv2\opencv.hpp>
using namespace cv;
#include "QBStru.h"
#include "FrameIMP_DOWN.h"
#include "DlgIMP.h"
#include "DCFrameCkCmd.h"
// 命名
typedef unsigned __int8 UINT8;
typedef unsigned __int16 UINT16;
typedef unsigned __int32 UINT32;
//typedef __int8 INT8;
typedef __int16 INT16;
typedef __int32 INT32;
// 工作模式
extern bool g_bWorkMode; // true回放 false实时
extern BOOL g_bMulticastSocketConnect; // 表征组播连接已创建的变量 TURE创建连接 FALSE断开连接
extern BOOL g_bReplayPlay; // TRUE: 回放中处于播放态, FALSE: 回放中处于暂停态
extern int g_ChartTabNum; // 图表分析窗口中tab页的编号1为第一页以此类推
extern BOOL g_bShowEvaluation; // 载荷评价对话框是否展开
extern BOOL g_bVideoCapture; //视频录制
extern HWND g_mainDlgHwnd; // 主窗口句柄
extern HWND g_ReplayDlgHwnd; // 视频控制窗口句柄
extern HWND g_MapGuideHwnd; // 地图导引
extern HWND g_QBTargetHwnd; // 情报席位目标定位窗口句柄(待删除)
extern HWND g_PhotoCtrlDlgHwnd; // 图片显示窗口句柄
extern HWND g_QBFunctionsHwnd; // 其他功能窗口句柄
extern HWND g_QBTargetTrackFunctionsHwnd; // 目标跟踪功能窗口句柄
extern HWND g_SendControlCommandDlgHwnd; // 发送指令&&手动控制指令盘界面句柄
extern HWND g_JoyStickControlDlgHwnd; // 摇杆控制窗口句柄
extern HWND g_CH96CtrlDlgHwnd; // CH96控制页面
extern HWND g_MulticastSocketReceiveDlgHwnd; // 组播收数窗口句柄
extern HWND g_mapMatchDlg;
extern HWND g_IMPDLGhwnd;//IMP窗口句柄
// 视频解码器 及 图像存储空间
extern H264Decode g_EO_Decoder;
extern H264Decode g_IR_Decoder;
extern unsigned char g_CH96_ImgBuffer[1920 * 1088 * 3];
extern unsigned char g_IR_ImgBuffer[720 * 576 * 3];
extern BOOL g_bEOImgUpdate; // 界面EO图像是否更新TRUE更新 FALSE未更新
extern BOOL g_bIRImgUpdate; // 界面IR图像是否更新TRUE更新 FALSE未更新
// 解码器对象
extern DecoderInterface *g_CH96_h264decoder;
//数据转发
extern CTCPSocket g_TCPTrans2Server;
extern BYTE g_tcpData[276];
extern bool g_tcpStarted;
extern CUDPSocket g_UDPTrans2Server;
extern bool g_udpStarted;
extern unsigned int g_frameCountTX;
// 当计算机性能较差时,采用硬解码,同时不使用图像库
extern cv::Mat g_ImgforLowComputer;
// 表征计算机性能的BOOL变量
extern BOOL g_bGoodComputer;
// 复接数据
extern struProtocal_FJ g_ImgFJData; // 视频图像复接数据
extern struProtocal_FJ g_SocketFJData; // 组播复接数据
extern struProtocal_FJ g_PhotoFJData; // 数码照片复接数据
extern struTranslateProtocal_FJ g_ImgTransFJData; // 转换后
extern struTranslateProtocal_FJ g_PhotoTransFJData; // 转换后
extern struSocketProtocal g_LocationSocketData; // 位置信息组播数据
extern Protocal96TXD g_CH96FJData; // CH96原始复接数据
extern Data96TXD g_CH96TransFJData; // CH96显示用复接数据
extern struQB_FJ g_CH96QBData; // CH96目标定位用情报数据
extern QBStru g_QB;
extern struQB_FJ g_IRFJData;
// 跟踪偏移量
extern CPoint g_TrackOffset;
extern BOOL g_bTracking;
// 摇杆控制量——伺服移动速度
extern int g_ServoSpeedUpDown; // [-512, 512]
extern int g_ServoSpeedLeftRight; // [-512, 512]
// 主界面指令盘点击偏移量
extern CPoint g_CtrlAzimuth; //方位角
extern CPoint g_CtrlPitch; //俯仰角
//主窗口控制指令实时显示变量
extern CString g_sCtrlInstruction;
// 存储全部遥测数据的文件
extern FILE* g_pFileSaveCH96txData; // 全部数据
extern FILE* g_pFileSaveVideoDataCH96; // 可见光 264编码部分
extern FILE* g_pFileSaveVideoForKCF; // 为KCF分析录制视频
extern FILE* g_pFileSaveVideoH264Data; // 光电吊舱 264编码部分
// 接收到的有效数据: 预分配内存 大小
static const int g_MaxBufferLen = 102400 * 5;
extern BYTE g_receiveDataBuffer[g_MaxBufferLen];
extern BYTE g_receiveDataBuffer_middle[g_MaxBufferLen];
extern int g_validDataLen; // 有效长度
// 接收到的有效数据:用于进行组播组包
static const int g_MaxBufferLenSocket = 102400 * 5;
extern BYTE g_receiveDataBufferSocket[g_MaxBufferLenSocket];
extern BYTE g_receiveDataBuffer_middleSocket[g_MaxBufferLenSocket];
extern int g_validDataLenSocket;
// 数据处理互斥句柄
extern HANDLE g_hMutex_ProcessData;
extern HANDLE g_hMutex_ProcessDataSocket;
extern HANDLE g_hMutex_SaveFJData;
extern HANDLE g_hMutex_ShowFJData;
extern HANDLE g_hMutex_ProcessDataCH96;
extern HANDLE g_hMutex_ProcessDataH264;
// 图像显示处理互斥句柄
extern HANDLE g_hMutex_DisplayVideoCH96;
extern HANDLE g_hMutex_DisplayIRVideo;
extern HANDLE g_hMutex_DisplayDCPhoto;
// 组播组包/发送互斥句柄
extern HANDLE g_hMutex_SocketSendLocation;
extern HANDLE g_hMutex_SocketSendIR;
extern HANDLE g_hMutex_SocketSendEO;
// 解码图像存储队列
extern std::deque<cv::Mat> g_CH96VideoDeque;
// 目标定位用复接数据存储队列
extern std::deque<struQB_FJ> g_TgtLocStructDeque; // 目标定位 复接数据 队列 容量 3
//主界面数引功能全局控制变量
extern float g_Guide_Azimuth; //方位角
extern float g_Guide_Pitch; //俯仰角
extern bool g_bGuide_Button; //判断主界面数引键是否按下
// ProcessData线程开关变量
extern bool g_bProcessDataFlag;
extern bool g_bProcessDataSocketFlag;
// 手动搜索控制指令盘变量
extern double g_MS_Ratio; // 比率
extern double g_MS_Angle; // 角度
// 精确飞机位置姿态
extern double g_UAVLon;
extern double g_UAVLat;
extern double g_UAVAlt;
extern double g_UAVRoll;
extern double g_UAVYaw;
extern double g_UAVPitch;
//定义控制指令UDP数据发送对象
extern CUDPSocket g_UdpSend2Payload;
extern CUDPSocket g_UdpSendTgtInfo;
extern CUDPSocket g_UdpSend2Mobile;
extern bool g_bCreatUDP;
extern bool g_bCreatTgtInfoUDP;
extern bool g_bCreatSend2Mobile;
extern BYTE g_payloadCtrlInstruction[32]; // 发送指令
extern int g_payloadCtrlProtocol; // 载荷控制开关指令
extern BYTE g_payloadCtrlInstructionFromVK[8]; // 收到来自视频键盘的控制指令
extern BOOL g_bCtrlFromSoftware; // 判断指令是否来自视频键盘或者软件软键盘 TURE:软件 FALSE:视频键盘
extern bool g_CtrlFocusThroughMouseWheel; // 是否通过滚轮控制载荷焦距
extern BOOL g_bShowEOInBigArea; // 变换显示,在大区域显示可见光或红外
// 定义收取目标定位信息结构体
extern MostSimpleTgtInfo tgtRecvInfo;
// 载荷软件存储文件
extern CString g_DataSavePath; // 载荷软件存储文件的路径名称
// 地图导引模块中高程设置变量
extern float g_DEMSetting;
// 设置跟踪阈值全局变量
extern int g_ThresholdSetting; // 范围[0,10]默认6
extern BOOL g_bMapDirectGuide; // 是否是地图直接导引标志
// 数码照片名称
extern CString g_str_DCname;
extern CString g_DCPath;
extern cv::Mat g_DCImg;
// 目标定位
extern HANDLE g_hMutex_TgtLoc;// 目标定位互斥句柄
extern double g_LLA[3]; // WGS84下目标定位结果
extern double g_VD[2]; // 动目标定位速度方向
extern double g_TgtLocReliability; // 定位结果可信度
extern BOOL g_bMoveTarget; // TRUE动目标定位 FALSE静目标定位
extern BOOL g_bWithLaser; // TRUE: 有激光定位 FALSE: 无激光定位
extern BOOL g_bStartTargetLoc; // TRUE: 开始目标定位 FALSE: 停止目标定位
extern BOOL g_bReStartTargetLoc; // TRUE: 重新开始目标定位 FALSE: 不重新开始目标定位
extern CString g_strTargetLocResult_Lon; // 目标定位经度
extern CString g_strTargetLocResult_Lat; // 目标定位纬度
// 语言变量获取语言内容时先用char格式获取再将char转为CString
// [TITLE]
extern char g_char_TitleReplay[30]; // 视频回放标题
extern CString g_str_TitleReplay;
// [WARNING]
extern char g_char_WarningTitle[100]; // 信息提示
extern CString g_str_WarningTitle;
extern char g_char_WarningStorage[100]; // 磁盘空间提示
extern CString g_str_WarningStorage;
extern char g_char_WarningUDPReceive[100]; // UDP收数提示测控、情报
extern CString g_str_WarningUDPReceive;
extern char g_char_WarningSerialReceive[100]; // 串口收数提示
extern CString g_str_WarningSerialReceive;
extern char g_char_WarningPayloadControl[100]; // 载荷控制连接提示
extern CString g_str_WarningPayloadControl;
extern char g_char_WarningLRFCode[100]; // 激光编码密码登陆提示
extern CString g_str_WarningLRFCode;
extern char g_char_WarningLRFNumber[100]; // 激光编码周期范围提示
extern CString g_str_WarningLRFNumber;
extern char g_char_WarningInputNumber[100]; // 输入数字提示(数引)
extern CString g_str_WarningInputNumber;
extern char g_char_WarningMapAltSet[100]; // 地图高程设定提示
extern CString g_str_WarningMapAltSet;
// [STATIC]
extern char g_char_CommandSend[30]; // 发送指令
extern CString g_str_CommandSend;
extern char g_char_CommandResponse[30]; // 回报指令
extern CString g_str_CommandResponse;
extern char g_char_State[30]; // 载荷状态
extern CString g_str_State;
extern char g_char_FilePath[30]; // 文件路径
extern CString g_str_FilePath;
extern char g_char_EOCommand[30]; // 可见光相机指令
extern CString g_str_EOCommand;
extern char g_char_IRCommand[30]; // 红外相机指令
extern CString g_str_IRCommand;
extern char g_char_Drift[30]; // 陀螺修正
extern CString g_str_Drift;
extern char g_char_AVTGate[30]; // 波门位移
extern CString g_str_AVTGate;
extern char g_char_LogIn[30]; // 密码登陆
extern CString g_str_LogIn;
extern char g_char_LaserNum[30]; // 编码序号:
extern CString g_str_LaserNum;
extern char g_char_LaserPeriod[30]; // 编码周期:
extern CString g_str_LaserPeriod;
// [COMMAND]——按照协议顺序编写
extern char g_char_TargetLonSet[30]; // 目标经度装订
extern CString g_str_TargetLonSet;
extern char g_char_TargetLatSet[30]; // 目标纬度导引
extern CString g_str_TargetLatSet;
extern char g_char_TargetAltSet[30]; // 目标高度导引
extern CString g_str_TargetAltSet;
extern char g_char_GeographyTracking[30]; // 地理坐标跟踪
extern CString g_str_GeographyTracking;
extern char g_char_ManualSlew[30]; // 手动搜索
extern CString g_str_ManualSlew;
extern char g_char_VerticalView[30]; // 锁定
extern CString g_str_VerticalView;
extern char g_char_AutoScan[30]; // 扫描
extern CString g_str_AutoScan;
extern char g_char_AngleLock[30]; // 数引
extern CString g_str_AngleLock;
extern char g_char_TurretReset[30]; // 平台复位
extern CString g_str_TurretReset;
extern char g_char_DriftRight[30]; // 陀螺右修
extern CString g_str_DriftRight;
extern char g_char_DriftLeft[30]; // 陀螺左修
extern CString g_str_DriftLeft;
extern char g_char_DriftUp[30]; // 陀螺上修
extern CString g_str_DriftUp;
extern char g_char_DriftDown[30]; // 陀螺下修
extern CString g_str_DriftDown;
extern char g_char_TurretStow[30]; // 载荷升
extern CString g_str_TurretStow;
extern char g_char_TurretFWD[30]; // 载荷降
extern CString g_str_TurretFWD;
extern char g_char_EOAutoTracking[30]; // EO自动跟踪
extern CString g_str_EOAutoTracking;
extern char g_char_IRAutoTracking[30]; // IR自动跟踪
extern CString g_str_IRAutoTracking;
extern char g_char_CorrelationTracking[30]; // 相关跟踪
extern CString g_str_CorrelationTracking;
extern char g_char_CentroidBlackTracking[30]; // 重心黑
extern CString g_str_CentroidBlackTracking;
extern char g_char_CentroidWhiteTracking[30]; // 重心白
extern CString g_str_CentroidWhiteTracking;
extern char g_char_OSDONOFF[30]; // 字符叠加/消隐
extern CString g_str_OSDONOFF;
extern char g_char_OffsetTracking[30]; // 偏心跟踪
extern CString g_str_OffsetTracking;
extern char g_char_StaticTargetTracking[30]; // 静态目标跟踪
extern CString g_str_StaticTargetTracking;
extern char g_char_MoveTargetTracking[30]; // 动态目标跟踪
extern CString g_str_MoveTargetTracking;
extern char g_char_ViewTracking[30]; // 场景跟踪
extern CString g_str_ViewTracking;
extern char g_char_AVTGateSizeBig[30]; // 大波门
extern CString g_str_AVTGateSizeBig;
extern char g_char_AVTGateSizeSmall[30]; // 小波门
extern CString g_str_AVTGateSizeSmall;
extern char g_char_AVTGateSizeMiddle[30]; // 中波门
extern CString g_str_AVTGateSizeMiddle;
extern char g_char_AVTGateSizeAuto[30]; // 自适应波门
extern CString g_str_AVTGateSizeAuto;
extern char g_char_ImgEnhanceON[30]; // 图像增强开
extern CString g_str_ImgEnhanceON;
extern char g_char_ImgEnhanceOFF[30]; // 图像增强关
extern CString g_str_ImgEnhanceOFF;
extern char g_char_AVTGateRight[30]; // 波门右移
extern CString g_str_AVTGateRight;
extern char g_char_AVTGateLeft[30]; // 波门左移
extern CString g_str_AVTGateLeft;
extern char g_char_AVTGateUp[30]; // 波门上移
extern CString g_str_AVTGateUp;
extern char g_char_AVTGateDown[30]; // 波门下移
extern CString g_str_AVTGateDown;
extern char g_char_LRFPowerON[30]; // 激光电源开
extern CString g_str_LRFPowerON;
extern char g_char_LRFPowerOFF[30]; // 激光电源关
extern CString g_str_LRFPowerOFF;
extern char g_char_LRFArmed[30]; // 激光测距开
extern CString g_str_LRFArmed;
extern char g_char_LRFSafe[30]; // 激光测距关
extern CString g_str_LRFSafe;
extern char g_char_LDArmed[30]; // 激光照射开
extern CString g_str_LDArmed;
extern char g_char_LDSafe[30]; // 激光照射关
extern CString g_str_LDSafe;
extern char g_char_LaserNo1[30]; // 激光编码1
extern CString g_str_LaserNo1;
extern char g_char_LaserNo2[30]; // 激光编码2
extern CString g_str_LaserNo2;
extern char g_char_LaserNo3[30]; // 激光编码3
extern CString g_str_LaserNo3;
extern char g_char_LaserNo4[30]; // 激光编码4
extern CString g_str_LaserNo4;
extern char g_char_LaserNo5[30]; // 激光编码5
extern CString g_str_LaserNo5;
extern char g_char_LaserNo6[30]; // 激光编码6
extern CString g_str_LaserNo6;
extern char g_char_LaserNo7[30]; // 激光编码7
extern CString g_str_LaserNo7;
extern char g_char_LaserNo8[30]; // 激光编码8
extern CString g_str_LaserNo8;
extern char g_char_LaserNo9[30]; // 激光编码9
extern CString g_str_LaserNo9;
extern char g_char_LaserNo10[30]; // 激光编码10
extern CString g_str_LaserNo10;
extern char g_char_LaserLoad[30]; // 激光编码加载
extern CString g_str_LaserLoad;
extern char g_char_ICRON[30]; // 低照度增强开
extern CString g_str_ICRON;
extern char g_char_ICROFF[30]; // 低照度增强关
extern CString g_str_ICROFF;
extern char g_char_DefogON[30]; // 透雾开
extern CString g_str_DefogON;
extern char g_char_DefogOFF[30]; // 透雾关
extern CString g_str_DefogOFF;
extern char g_char_EOFocusPlus[30]; // EO远焦
extern CString g_str_EOFocusPlus;
extern char g_char_EOFocusMinus[30]; // EO近焦
extern CString g_str_EOFocusMinus;
extern char g_char_EOZoomOut[30]; // EO视场大
extern CString g_str_EOZoomOut;
extern char g_char_EOZoomIn[30]; // EO视场小
extern CString g_str_EOZoomIn;
extern char g_char_EOLightManual[30]; // EO手动调光
extern CString g_str_EOLightManual;
extern char g_char_EOLightAuto[30]; // EO自动调光
extern CString g_str_EOLightAuto;
extern char g_char_EOLightPlus[30]; // EO亮度+
extern CString g_str_EOLightPlus;
extern char g_char_EOLightMinus[30]; // EO亮度-
extern CString g_str_EOLightMinus;
extern char g_char_EOPowerON[30]; // EO电源开
extern CString g_str_EOPowerON;
extern char g_char_EOPowerOFF[30]; // EO电源关
extern CString g_str_EOPowerOFF;
extern char g_char_EOWDRON[30]; // EO宽动态开
extern CString g_str_EOWDRON;
extern char g_char_EOWDROFF[30]; // EO宽动态关
extern CString g_str_EOWDROFF;
extern char g_char_EOFocusAuto[30]; // EO自动调焦
extern CString g_str_EOFocusAuto;
extern char g_char_EOFocusRealTime[30]; // EO实时调焦
extern CString g_str_EOFocusRealTime;
extern char g_char_IRFocusPlus[30]; // IR远焦
extern CString g_str_IRFocusPlus;
extern char g_char_IRFocusMinus[30]; // IR近焦
extern CString g_str_IRFocusMinus;
extern char g_char_IRFocusAuto[30]; // IR自动调焦
extern CString g_str_IRFocusAuto;
extern char g_char_IRFocusRealTime[30]; // IR实时调焦
extern CString g_str_IRFocusRealTime;
extern char g_char_IRZoomOut[30]; // IR视场大
extern CString g_str_IRZoomOut;
extern char g_char_IRZoomIn[30]; // IR视场小
extern CString g_str_IRZoomIn;
extern char g_char_BHWH[30]; // IR黑白热
extern CString g_str_BHWH;
extern char g_char_IRCalibration[30]; // IR校正
extern CString g_str_IRCalibration;
extern char g_char_IRLightManual[30]; // IR手动调光
extern CString g_str_IRLightManual;
extern char g_char_IRLightAuto[30]; // IR自动调光
extern CString g_str_IRLightAuto;
extern char g_char_IRLightPlus[30]; // IR亮度+
extern CString g_str_IRLightPlus;
extern char g_char_IRLightMinus[30]; // IR亮度-
extern CString g_str_IRLightMinus;
extern char g_char_IRContrastPlus[30]; // IR对比度+
extern CString g_str_IRContrastPlus;
extern char g_char_IRContrastMinus[30]; // IR对比度-
extern CString g_str_IRContrastMinus;
extern char g_char_DDEON[30]; // IR边缘锐化开
extern CString g_str_DDEON;
extern char g_char_DDEOFF[30]; // IR边缘锐化关
extern CString g_str_DDEOFF;
extern char g_char_IRPowerON[30]; // IR电源开
extern CString g_str_IRPowerON;
extern char g_char_IRPowerOFF[30]; // IR电源关
extern CString g_str_IRPowerOFF;
extern char g_char_ImgTypeSet[30]; // 设置图像类型
extern CString g_str_ImgTypeSet;
extern char g_char_ImgFlowSet[30]; // 设置图像码流
extern CString g_str_ImgFlowSet;
extern char g_char_DCWBManual[30]; // DC手动白平衡
extern CString g_str_DCWBManual;
extern char g_char_DCWBAuto[30]; // DC自动白平衡
extern CString g_str_DCWBAuto;
extern char g_char_SingleShoot[30]; // 单拍
extern CString g_str_SingleShoot;
extern char g_char_CC2s[30]; // 两秒连拍
extern CString g_str_CC2s;
extern char g_char_CC4s[30]; // 四秒连拍
extern CString g_str_CC4s;
extern char g_char_CCOverlap[30]; // 保证重叠率连拍
extern CString g_str_CCOverlap;
extern char g_char_CCAutoScan[30]; // 摆扫连拍
extern CString g_str_CCAutoScan;
extern char g_char_DCExposureAuto[30]; // DC自动曝光
extern CString g_str_DCExposureAuto;
extern char g_char_DCExposureManual[30]; // DC手动曝光
extern CString g_str_DCExposureManual;
extern char g_char_DCExposurePlus[30]; // DC曝光+
extern CString g_str_DCExposurePlus;
extern char g_char_DCExposureMinus[30]; // DC曝光-
extern CString g_str_DCExposureMinus;
extern char g_char_DCExposureVHR[30]; // DC速高比曝光
extern CString g_str_DCExposureVHR;
extern char g_char_ServoPowerON[30]; // 伺服电源开
extern CString g_str_ServoPowerON;
extern char g_char_ServoPowerOFF[30]; // 伺服电源关
extern CString g_str_ServoPowerOFF;
//[OTHER]
extern char g_char_LaserChoose[30]; // 未选择激光编码
extern CString g_str_LaserChoose;
extern char g_char_LaserLoadSuccess[30]; // 编码加载成功
extern CString g_str_LaserLoadSuccess;
extern char g_char_LaserLoadFail[30]; // 编码加载失败
extern CString g_str_LaserLoadFail;
// 创建全局WinSoc套接字
extern SOCKET g_socketFH96Data;
// 采集图像
extern bool g_bCaptureImg;
// 互斥对象句柄
extern HANDLE g_hMutex_ImgStitch;
// 定义图像队列
extern std::deque<QBStru> g_StitchImgDeque;
extern BOOL g_bRun;
extern BOOL g_bStop;
/*****IMP*****/
extern CFrameIMPDown_ g_FrameIMPDown;//IMP协议类实例化
extern bool IMPDlgWindowVisible;//IMP对话框为可视状态
//extern CDlgIMP* g_DlgIMP;//IMP对话框
//串口相关
const unsigned BAUDITEMNUM =10; //波特率数目
const unsigned NCOUNTER=500; //失败尝试次数
//波特率列表
extern CString gComBaudItems[BAUDITEMNUM];
extern bool g_bBindData;//是否在装订的标志
//13所吊舱控制新
#define WM_13DC_UPDAFRAME WM_USER + 148 //
extern int g_commandNum; //控制指令序号
extern CDCFrameCkCmdFrame g_DCFrameCkCmd13; //数据注入指令从控发送数据帧---13所吊舱
//武汉天进吊舱控制
#define WM_WHTJDC_UPDAFRAME WM_USER + 149 //
extern int g_WHTJDCCmdNum; //控制指令序号
extern int DCTypeSelected_video; //吊舱类型选择_图像接收
extern bool SelectPointTrack;//选点跟踪
extern HWND DlgDCOverroll_Hwnd; //DCOverrollDlg句柄
extern float m_wndShowEO_Position_Max_x; //图像显示区域的坐标最大值x
extern float m_wndShowEO_Position_Max_y; //图像显示区域的坐标最大值y

@ -0,0 +1,103 @@
#ifndef GLOBAL_MESSAGE_H
#define GLOBAL_MESSAGE_H
// 显示可见光和红外信息
const UINT WM_SHOW_CH96_INFO = WM_USER + 5000;
const UINT WM_SHOW_IR_INFO = WM_USER + 5001;
const UINT WM_SHOW_DC_INFO = WM_USER + 5002;
// 显示发送指令内容
const UINT WM_SHOW_CTRL_INSTRUCTIONS = WM_USER + 5003;
// 双击表盘图像,显示载荷导引两个角
const UINT WM_SHOW_GUIDE_AZIMUTH = WM_USER + 5004;
const UINT WM_SHOW_GUIDE_PITCH = WM_USER + 5005;
// 目标跟踪消息响应函数
const UINT WM_SHOW_EO_TGT_TRACK = WM_USER + 5006;
const UINT WM_SHOW_IR_TGT_TRACK = WM_USER + 5007;
// 手动搜索指令盘响应函数
const UINT WM_SHOW_MANUAL_SEARCH = WM_USER + 5008;
// 主界面数引窗口显示地图上的载荷导引角
const UINT WM_SHOW_MAP_GUIDE_POS = WM_USER + 5009;
// 显示载荷视场
const UINT WM_UPDATA_GOOGLEMAP = WM_USER + 5010;
// 显示激光编码状态
const UINT WM_SHOW_LD_STATE = WM_USER + 5011;
// 显示情报席位目标定位数据对话框
const UINT WM_SHOW_QB_TARGET = WM_USER + 5012;
// 根据情报席位的目标经纬度将目标点显示在地图上
const UINT WM_SHOW_TARGET_ONMAP = WM_USER + 5013;
// 根据复接数据的方位俯仰脱靶量在其他功能界面上进行折线图显示
const UINT WM_SHOW_MISSDISTANCE_CHART = WM_USER + 5014;
// KCF分析中设定目标中心消息并将该消息传递给图像分析对话框
const UINT WM_SET_TARGET_IMAGE_CENTER = WM_USER + 5015;
// 载荷评价窗口子页面向父页面发送的结果保存的消息
const UINT WM_SAVE_EVALUATION_RESULTS = WM_USER + 5016;
// 在视频控制页面更改载荷类型消息
const UINT WM_SET_PAYLOAD_TYPE = WM_USER + 5017;
// 在CH92中的视频播放界面将DC修改为EO/IR
const UINT WM_RETURN_PAYLOAD_TYPE_WARNING = WM_USER + 5018;
// 显示EO图像监控分析
const UINT WM_SHOW_EO_MONITOR = WM_USER + 5019;
// 显示IR图像监控分析
const UINT WM_SHOW_IR_MONITOR = WM_USER + 5020;
// 向情报处理窗口发送消息,显示激光测距值等内容
const UINT WM_SHOW_LASERDIS_QBFUNCTIONSDLG = WM_USER + 5021;
// 显示激光定位结果
const UINT WM_SHOW_TARGET_LOCATE_RESULT = WM_USER + 5022;
// 向组播连接窗口发送消息,显示复接数据各字节内容
const UINT WN_SHOW_CH96_FJDATA = WM_USER + 5023;
// 目标定位模块向情报处理主窗口传递坐标转换消息
const UINT WM_SHOW_TARGETLOC_CHANGE = WM_USER + 5024;
// 当在控制页面发送指令之后,将焦点置于主界面
const UINT WM_SETFOCUS_AFTERCONTROL = WM_USER + 5025;
// 匹配定位采集图像
const UINT WM_CAPTURE_IMG_WHEN_MAPMATCH = WM_USER + 5026;
const UINT WM_LeadAndTag_TO_MAPMATCHLOCATE = WM_USER + 5027; // 定位导引
const UINT WM_SHOW_MAP_MATCH_LOCATE_IMG_INFO = WM_USER + 5028; // 显示单帧图像定位信息
const UINT WM_SHOW_MAP_MATCH_LOCATE_RESULT = WM_USER + 5029; // 显示单帧图像定位信息
// 开启视频拼接页面 开始 按钮有效性
const UINT WM_ENABLE_STITCHPAGE_START_BTN = WM_USER + 6000;
// 关闭视频拼接页面 开始 按钮有效性
const UINT WM_UNENABLE_STITCHPAGE_START_BTN = WM_USER + 6001;
// 开启视频拼接页面 暂停 按钮有效性
const UINT WM_ENABLE_STITCHPAGE_PAUSE_BTN = WM_USER + 6002;
// 关闭视频拼接页面 暂停 按钮有效性
const UINT WM_UNENABLE_STITCHPAGE_PAUSE_BTN = WM_USER + 6003;
// 开启视频拼接页面 停止 按钮有效性
const UINT WM_ENABLE_STITCHPAGE_STOP_BTN = WM_USER + 6004;
// 关闭视频拼接页面 停止 按钮有效性
const UINT WM_UNENABLE_STITCHPAGE_STOP_BTN = WM_USER + 6005;
// 图像拼接页面输出拼接图像
const UINT WM_OUTPUT_IMG = WM_USER + 6006;
// 图像拼接页面输出当前视场
const UINT WM_OUTPUT_QUADRANGLE = WM_USER + 6007;
//IMP
#define WM_UPDATE_IMPDOWN_CHECKED WM_USER + 7008
#define WM_UPDATE_IMP_SERIAL_CONNECT WM_USER + 7009
//吊舱
#define WM_PROCESS_DC_CMD WM_USER + 7010
#endif

@ -0,0 +1,12 @@
#include "StdAfx.h"
#include "IMPConect.h"
IMPConect::IMPConect(void)
{
}
IMPConect::~IMPConect(void)
{
}

@ -0,0 +1,7 @@
#pragma once
class IMPConect
{
public:
IMPConect(void);
~IMPConect(void);
};

@ -0,0 +1,226 @@
#include "StdAfx.h"
#include "JoyKeybordControl.h"
CJoyKeybordControl::CJoyKeybordControl(void)
{
}
CJoyKeybordControl::~CJoyKeybordControl(void)
{
}
// 串口收来自视频键盘的数
void GetSerialPortData(char *buffer,const DWORD size)
{
memcpy(g_payloadCtrlInstructionFromVK, buffer, size);
// 如果控制指令来自视频键盘
if (g_bCtrlFromSoftware == FALSE)
{
if (0x12 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 2;
g_sCtrlInstruction = g_str_VerticalView;
}
else if (0x13 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 3;
g_sCtrlInstruction = g_str_AutoScan;
}
else if (0x11 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 1;
g_sCtrlInstruction = g_str_ManualSlew;
}
else if (0x1C == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 10;
g_sCtrlInstruction = g_str_TurretStow;
}
else if (0x1D == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 11;
g_sCtrlInstruction = g_str_TurretFWD;
}
else if (0x23 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 14;
g_sCtrlInstruction = g_str_CorrelationTracking;
}
else if (0x24 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 15;
g_sCtrlInstruction = g_str_CentroidBlackTracking;
}
else if (0x25 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 16;
g_sCtrlInstruction = g_str_CentroidWhiteTracking;
}
else if (0x40 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 25;
g_sCtrlInstruction = g_str_LRFPowerON;
}
else if (0x41 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 26;
g_sCtrlInstruction = g_str_LRFPowerOFF;
}
else if (0x42 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 27;
g_sCtrlInstruction = g_str_LRFArmed;
}
else if (0x43 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 28;
g_sCtrlInstruction = g_str_LRFSafe;
}
else if (0xA2 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol =29;
g_sCtrlInstruction = g_str_LDArmed;
}
else if (0x45 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 30;
g_sCtrlInstruction = g_str_LDSafe;
}
else if (0x46 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 31;
g_sCtrlInstruction = g_str_LaserNo1;
}
else if (0x47 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 32;
g_sCtrlInstruction = g_str_LaserNo2;
}
else if (0x48 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 33;
g_sCtrlInstruction = g_str_LaserNo3;
}
else if (0x49 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 34;
g_sCtrlInstruction = g_str_LaserNo4;
}
else if (0x4A == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 35;
g_sCtrlInstruction = g_str_LaserNo5;
}
else if (0x4B == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 36;
g_sCtrlInstruction = g_str_LaserNo6;
}
else if (0x4C == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 37;
g_sCtrlInstruction = g_str_LaserNo7;
}
else if (0x4D == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 38;
g_sCtrlInstruction = g_str_LaserNo8;
}
else if (0x4E == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 39;
g_sCtrlInstruction = g_str_LaserNo9;
}
else if (0x4F == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 40;
g_sCtrlInstruction = g_str_LaserNo10;
}
else if (0x54 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 42;
g_sCtrlInstruction = g_str_ICRON;
}
else if (0x55 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 43;
g_sCtrlInstruction = g_str_ICROFF;
}
else if (0x56 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 44;
g_sCtrlInstruction = g_str_DefogON;
}
else if (0x58 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 45;
g_sCtrlInstruction = g_str_DefogOFF;
}
else if (0x52 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 48;
g_sCtrlInstruction = g_str_EOZoomOut;
}
else if (0x53 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 49;
g_sCtrlInstruction = g_str_EOZoomOut;
}
else if (0x83 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 62;
g_sCtrlInstruction = g_str_IRFocusPlus;
}
else if (0x84 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 63;
g_sCtrlInstruction = g_str_IRFocusMinus;
}
else if (0x85 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 65;
g_sCtrlInstruction = g_str_IRZoomOut;
}
else if (0x86 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 66;
g_sCtrlInstruction = g_str_IRZoomIn;
}
else if (0x87 == g_payloadCtrlInstructionFromVK[2])
{
g_payloadCtrlProtocol = 67;
g_sCtrlInstruction = g_str_BHWH;
}
else
{
g_payloadCtrlProtocol = 0;
}
}
}
void CJoyKeybordControl::OnInitJoyKeybord()
{
// 设置视频键盘串口初始化
CString fileSysName = GetSoftwareCurrentDirectory()+ "\\ini\\" + "config.ini";
char char_COMName[20];
GetPrivateProfileString("CONTROL_FROM_COM", "COMName", "0", char_COMName, 20, fileSysName);
if (!m_Serial.Initialize(char_COMName, 38400))
{
::MessageBoxA(NULL, g_str_WarningSerialReceive, g_str_WarningTitle, MB_OK);
}
else
{
m_Serial.SetComReadCallback(GetSerialPortData);
}
}
void CJoyKeybordControl::OnDestoryJoyKeybord()
{
// 卸载串口
if (TRUE == m_Serial.IsInitialized())
{
m_Serial.DeInit();
}
}

@ -0,0 +1,21 @@
#include "Serial.h"
#include "Global.h"
#include "GlobalMember.h"
#include "GlobalMessage.h"
#pragma once
class CJoyKeybordControl
{
public:
CJoyKeybordControl(void);
~CJoyKeybordControl(void);
private:
CSerial m_Serial;
public:
// 串口初始化并开始接受数据
void OnInitJoyKeybord();
// 串口关闭
void OnDestoryJoyKeybord();
};

@ -0,0 +1,159 @@
// JoyStickControlDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "CH91PayloadSoftware.h"
#include "JoyStickControlDlg.h"
#include "afxdialogex.h"
#include "GlobalMember.h"
#include "Global.h"
#include "GlobalMessage.h"
// CJoyStickControlDlg 对话框
IMPLEMENT_DYNAMIC(CJoyStickControlDlg, CDialogEx)
CJoyStickControlDlg::CJoyStickControlDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CJoyStickControlDlg::IDD, pParent)
{
}
CJoyStickControlDlg::~CJoyStickControlDlg()
{
}
void CJoyStickControlDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CJoyStickControlDlg, CDialogEx)
ON_WM_TIMER()
END_MESSAGE_MAP()
// CJoyStickControlDlg 消息处理程序
BOOL CJoyStickControlDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 获取窗口句柄
g_JoyStickControlDlgHwnd = GetSafeHwnd();
// 摇杆变量初始化
m_JoyStickListener = new JSParser::JoyStickListener();
m_JoyStickListener->init(g_JoyStickControlDlgHwnd);
// 设定时间变量
SetTimer(1, 2000, nullptr);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CJoyStickControlDlg::OnTimer(UINT_PTR nIDEvent)
{
//if (m_JoyStickListener->isInit())
//{
// // 更新摇杆主轴状态
// m_JoyStickListener->UpdateStick(stick_Height, stick_Width);
// // 更新摇杆按键状态
// m_JoyStickListener->UpdateButtons(m_JoyStickButtons);
// // 更新指令
// UpdateControl();
//}
//else
//{
// m_JoyStickListener->init(g_JoyStickControlDlgHwnd);
//}
CDialogEx::OnTimer(nIDEvent);
}
void CJoyStickControlDlg::UpdateControl()
{
if (g_bCtrlFromSoftware == FALSE)
{
// 手动跟踪,控制伺服
if (m_JoyStickButtons[0] == true)
{
g_payloadCtrlProtocol = 1002;
g_ServoSpeedUpDown = (int)(0 - stick_Height * 512);
g_ServoSpeedLeftRight = (int)(stick_Width * 512);
//TRACE("X:%d Y:%d\n",g_ServoSpeedUpDown,g_ServoSpeedLeftRight);
}
// EO自动跟踪控制波门
else if (m_JoyStickButtons[3] == true)
{
g_payloadCtrlProtocol = 16;
g_TrackOffset.y = (int)(0 - stick_Height * 540);
g_TrackOffset.x = (int)(stick_Width * 960);
}
// IR自动跟踪控制波门
else if (m_JoyStickButtons[2] == true)
{
g_payloadCtrlProtocol = 17;
g_TrackOffset.y = (int)(0 - stick_Height * 288);
g_TrackOffset.x = (int)(stick_Width * 360);
}
// EO自动对焦
else if (m_JoyStickButtons[1] == true)
{
g_payloadCtrlProtocol = 69;
}
// IR自动对焦
else if (m_JoyStickButtons[4] == true)
{
g_payloadCtrlProtocol = 78;
}
// EO视场小
else if (m_JoyStickButtons[6] == true)
{
g_payloadCtrlProtocol = 60;
}
// EO视场大
else if (m_JoyStickButtons[8] == true)
{
g_payloadCtrlProtocol = 59;
}
// IR视场小
else if (m_JoyStickButtons[10] == true)
{
g_payloadCtrlProtocol = 81;
}
// IR视场大
else if (m_JoyStickButtons[12] == true)
{
g_payloadCtrlProtocol = 80;
}
// 波门上移
else if (m_JoyStickButtons[14] == true)
{
g_payloadCtrlProtocol = 34;
}
// 波门下移
else if (m_JoyStickButtons[16] == true)
{
g_payloadCtrlProtocol = 35;
}
// 波门右移
else if (m_JoyStickButtons[15] == true)
{
g_payloadCtrlProtocol = 32;
}
// 波门左移
else if (m_JoyStickButtons[17] == true)
{
g_payloadCtrlProtocol = 33;
}
// 其他操作,发送空指令
else
{
g_payloadCtrlProtocol = 0;
}
}
}

@ -0,0 +1,41 @@
#pragma once
#include "JoyStickListener.h"
// CJoyStickControlDlg 对话框
class CJoyStickControlDlg : public CDialogEx
{
DECLARE_DYNAMIC(CJoyStickControlDlg)
public:
CJoyStickControlDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CJoyStickControlDlg();
// 对话框数据
enum { IDD = IDD_DLG_JOYSTICKCONTROL };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
JSParser::JoyStickListener* m_JoyStickListener;
// 摇杆主轴状态
float stick_Height;//摇杆纵向位移(-1,1)
float stick_Width;//摇杆横向位移(-1,1)
// // 摇杆控制量——EO波门位置
// extern int g_EOAVTGate_UpDown; // [-540, 540];
// extern int g_EOAVTGate_LeftRight; // [-960, 960];
// // 摇杆控制量——IR波门位置
// extern int g_IRAVTGate_UpDown; // [-256, 256];
// extern int g_IRAVTGate_LeftRight; // [-320, 320];
// 摇杆按钮状态
std::vector<bool> m_JoyStickButtons;
public:
virtual BOOL OnInitDialog();
afx_msg void OnTimer(UINT_PTR nIDEvent);
void UpdateControl();
};

@ -0,0 +1,123 @@
#include "stdafx.h"
#include "JoyStickListener.h"
using namespace JSParser;
JoyStickListener::JoyStickListener()
:m_pInputMgr(NULL)
,m_pJoystickMgr(NULL)
{
}
JoyStickListener::~JoyStickListener()
{
m_pInputMgr->destroyInputObject(m_pJoystickMgr);
OIS::InputManager::destroyInputSystem(m_pInputMgr);
}
void JoyStickListener::init(HWND hWnd)
{
OIS::ParamList pl;
//HWND _hWnd = AfxGetMainWnd()->GetSafeHwnd();
std::ostringstream wnd; wnd << (size_t)hWnd;
pl.insert(std::make_pair(std::string("WINDOW"), wnd.str()));
pl.insert(std::make_pair(std::string("w32_joystick"), std::string("DISCL_BACKGROUND"))); //ºǫ́ģʽ
pl.insert(std::make_pair(std::string("w32_joystick"), std::string("DISCL_NONEXCLUSIVE")));//·Ç¶Àռģʽ
try
{
m_pInputMgr = OIS::InputManager::createInputSystem( pl );
}
catch (...)
{
std::cout << "Fail to initialize InputSystem......" << std::endl;
}
if (m_pInputMgr != NULL)
{
try
{
//²¼¶ûÖµ±íʾ£¨·Ç£©»º³åģʽ
m_pJoystickMgr = static_cast<OIS::JoyStick*>(m_pInputMgr->createInputObject( OIS::OISJoyStick, true ));
}
catch(...)
{
m_pJoystickMgr = NULL;
std::cout << "Fail to initialize Joystick......" << std::endl;
}
if (m_pJoystickMgr != NULL)
{
//ÉèÖÃÒ¡¸ËÏûÏ¢¼àÌý
m_pJoystickMgr->setEventCallback(this);
m_pJoyStickState = m_pJoystickMgr->getJoyStickState();
m_pJoyStickState.clear();
}
}
}
void JoyStickListener::UpdateStick(float &a,float &e)
{
m_pJoystickMgr->capture();
m_pJoyStickState = m_pJoystickMgr->getJoyStickState();
a = double((m_pJoyStickState.mAxes[0]).abs) / OIS::JoyStick::MAX_AXIS;//×ÝÏò
e = double((m_pJoyStickState.mAxes[1]).abs) / OIS::JoyStick::MAX_AXIS;//ºáÏò
}
void JoyStickListener::UpdateButtons(std::vector<bool> &buttons)
{
m_pJoystickMgr->capture();
m_pJoyStickState = m_pJoystickMgr->getJoyStickState();
buttons = m_pJoyStickState.mButtons;
}
bool JoyStickListener::buttonPressed( const OIS::JoyStickEvent &arg, int button )
{
std::cout << "Button Pressed: " << button << std::endl;
return true;
}
bool JoyStickListener::buttonReleased( const OIS::JoyStickEvent &arg, int button )
{
std::cout << "Button Released: " << button << std::endl;
return true;
}
bool JoyStickListener::axisMoved( const OIS::JoyStickEvent &arg, int axis )
{
std::cout << "Joystick Axis[" << axis << "] Moved(Abs): " << arg.state.mAxes[axis].abs << std::endl;
return true;
}
bool JoyStickListener::povMoved( const OIS::JoyStickEvent &arg, int pov )
{
std::cout << "Pov[" << pov << "] Moved Direction: " << arg.state.mPOV[pov].direction << std::endl;
std::cout << "Pov Moved to ";
if(arg.state.mPOV[pov].direction & OIS::Pov::Centered)
std::cout << "Centered";
else if(arg.state.mPOV[pov].direction & OIS::Pov::East)
std::cout << "East";
else if(arg.state.mPOV[pov].direction & OIS::Pov::South)
std::cout << "South";
else if(arg.state.mPOV[pov].direction & OIS::Pov::West)
std::cout << "West";
else if(arg.state.mPOV[pov].direction & OIS::Pov::North)
std::cout << "North";
else if(arg.state.mPOV[pov].direction & OIS::Pov::NorthEast)
std::cout << "NorthEast";
else if(arg.state.mPOV[pov].direction & OIS::Pov::NorthWest)
std::cout << "NorthWest";
else if(arg.state.mPOV[pov].direction & OIS::Pov::SouthEast)
std::cout << "SouthEast";
else if(arg.state.mPOV[pov].direction & OIS::Pov::SouthWest)
std::cout << "SouthWest";
std::cout << std::endl;
return true;
}

@ -0,0 +1,50 @@
#ifndef __JOYSTICKLISTENER_H__
#define __JOYSTICKLISTENER_H__
#include "OIS.h"
#include "windows.h"
#include <math.h>
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <ios>
#include <sstream>
#include <vector>
namespace JSParser
{
class JoyStickListener : public OIS::JoyStickListener
{
public:
JoyStickListener();
~JoyStickListener();
void init(HWND hWnd);
bool buttonPressed( const OIS::JoyStickEvent &arg, int button );
bool buttonReleased( const OIS::JoyStickEvent &arg, int button );
//摇杆主轴
bool axisMoved( const OIS::JoyStickEvent &arg, int axis );
//摇杆上的多向按钮(帽)
bool povMoved( const OIS::JoyStickEvent &arg, int pov );
bool isInit() { return (m_pJoystickMgr == NULL) ? false : true; };
// 更新摇杆主轴状态
void UpdateStick(float &a,float &e);
// 更新摇杆按钮状态
void UpdateButtons(std::vector<bool> &buttons);
protected:
private:
OIS::InputManager* m_pInputMgr;
OIS::JoyStick* m_pJoystickMgr;
OIS::JoyStickState m_pJoyStickState;
};
}
#endif

@ -0,0 +1,111 @@
#include "stdafx.h"
#include "MUDP.h"
#include "Mmc.h"
CMUDP::CMUDP()
{
memset( m_strBuffer, 0, sizeof( m_strBuffer ) );
m_fun=NULL;
if (!AfxSocketInit()){
MessageBox(NULL,_T("网络组播套接字初始化失败"),"....", MB_OK | MB_ICONSTOP);
}
}
CMUDP::~CMUDP()
{
}
/////////////////////////////////////////////////////////////////////////////
// CMulticastSocket member functions
void CMUDP::OnReceive( int nErrorCode )
{
memset( m_strBuffer, 0, 32000 );
int nDataNum = ReceiveFrom( m_strBuffer, 32000, m_strSendersIP, m_nSendersPort );
if ( nDataNum == SOCKET_ERROR )
{
AfxMessageBox( "网络组播接收数据错误!" );
}
else
{
if (m_fun)
{
m_fun(m_strBuffer,nDataNum,m_param);
}
}
CAsyncSocket::OnReceive( nErrorCode );
}
BOOL CMUDP::LeaveGroup()
{
if ( setsockopt( m_hSocket, IPPROTO_IP, IP_DROP_MEMBERSHIP, ( char FAR * ) &m_mrMReq, sizeof( m_mrMReq ) ) < 0 )
{
return FALSE;
}
Close(); // Close receving socket
return TRUE;
}
BOOL CMUDP::SendToY( const void *strMessage, int nSize )
{
if ( SendTo( strMessage, nSize, ( SOCKADDR * ) &m_saHostGroup, sizeof( SOCKADDR ), 0 ) == SOCKET_ERROR )
{
return FALSE;
}
else
{
return TRUE;
}
}
BOOL CMUDP::InitGroup( CString GroupIP, UINT nGroupPort, UINT nTTL, BOOL bLoopback )
{
int nLoopBack = ( int ) bLoopback;
if ( !Create( nGroupPort, SOCK_DGRAM, FD_READ|FD_WRITE ) ){
Close();
return FALSE;
}
m_mrMReq.imr_multiaddr.s_addr = inet_addr(GroupIP );
m_mrMReq.imr_interface.s_addr = htons( INADDR_ANY );
memset( &m_saHostGroup, 0, sizeof( m_saHostGroup ) );
m_saHostGroup.sin_family = AF_INET;
m_saHostGroup.sin_addr.s_addr = inet_addr( GroupIP );
m_saHostGroup.sin_port = htons( ( USHORT ) nGroupPort );
BOOL bMultipleApps = TRUE;
if(SetSockOpt( SO_REUSEADDR, ( void * ) &bMultipleApps, sizeof( BOOL ), SOL_SOCKET ) < 0){
AfxMessageBox( "网络组播设置失败--1" );
Close();
return FALSE;
}
if (SetSockOpt( IP_MULTICAST_TTL, &nTTL, sizeof( int ), IPPROTO_IP ) < 0 ){
AfxMessageBox( "网络组播设置失败--2" );
Close();
return FALSE;
}
if (SetSockOpt(IP_MULTICAST_LOOP, &nLoopBack, sizeof( int ), IPPROTO_IP ) < 0 ){
AfxMessageBox( "网络组播设置失败--3" );
Close();
return FALSE;
}
if(SetSockOpt(IP_ADD_MEMBERSHIP,( char FAR * ) &m_mrMReq,sizeof( m_mrMReq ),IPPROTO_IP) < 0){
AfxMessageBox( "网络组播设置失败--4" );
Close();
return FALSE;
}
return TRUE;
}
void CMUDP::SetReadCallBack(MulticastCALLBACK fun, LPVOID lp)
{
m_fun=fun;
m_param = lp;
}

@ -0,0 +1,34 @@
#ifndef _M_UDP_
#define _M_UDP_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// MulticastSocket.h : header file
typedef void(CALLBACK*MulticastCALLBACK)(unsigned char* buffer, const DWORD size,LPVOID lp);
#include <afxsock.h>
class CMUDP : public CAsyncSocket
{
public:
CMUDP();
virtual ~CMUDP();
public:
BOOL InitGroup( CString, UINT, UINT, BOOL );
BOOL LeaveGroup();
BOOL SendToY( const void *, int );
void SetReadCallBack(MulticastCALLBACK fun, LPVOID lp);
public:
virtual void OnReceive(int nErrorCode);
private:
unsigned char m_strBuffer[32000]; // Receiving buffer for the packet that has arrived
SOCKADDR_IN m_saHostGroup; // SOCKADDR structure to hold IP/Port of the Host group to send data to it
ip_mreq m_mrMReq; // Contains IP and interface of the host group
UINT m_nSendersPort; // Holds Port No. of the socket from which last packet was received
CString m_strSendersIP; // Hold IP of the socket from which the last packet was received
MulticastCALLBACK m_fun;
LPVOID m_param;
};
#endif // !defined(AFX_MULTICASTSOCKET_H__269E2C7F_2037_11D3_8EF3_0000C0FD25F8__INCLUDED_)

@ -0,0 +1,802 @@
#include "StdAfx.h"
#include "MasterHardDiskSerial.h"
#include <iostream>
int MasterHardDiskSerial::ReadPhysicalDriveInNTWithAdminRights(void)
{
int iDone = FALSE;
int iDrive = 0;
for (iDrive = 0; iDrive < MAX_IDE_DRIVES; iDrive++)
{
HANDLE hPhysicalDriveIOCTL = 0;
// Try to get a handle to PhysicalDrive IOCTL, report failure
// and exit if can't.
char cszDriveName[256];
sprintf_s(cszDriveName, 256, "\\\\.\\PhysicalDrive%d", iDrive);
// Windows NT, Windows 2000, must have admin rights
hPhysicalDriveIOCTL = CreateFileA(cszDriveName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
{
SecureZeroMemory(m_cszErrorMessage, sizeof(m_cszErrorMessage));
sprintf_s(m_cszErrorMessage, 256, "%d ReadPhysicalDriveInNTWithAdminRights ERROR ,CreateFileA(%s) returned INVALID_HANDLE_VALUE", __LINE__, cszDriveName);
}
else
{
GETVERSIONOUTPARAMS VersionParams;
DWORD dwBytesReturned = 0;
// Get the version, etc of PhysicalDrive IOCTL
memset((void *)&VersionParams, 0, sizeof(VersionParams));
if (!DeviceIoControl(hPhysicalDriveIOCTL, DFP_GET_VERSION,
NULL,
0,
&VersionParams,
sizeof(VersionParams),
&dwBytesReturned, NULL))
{
DWORD dwErr = GetLastError();
SecureZeroMemory(m_cszErrorMessage, sizeof(m_cszErrorMessage));
sprintf_s(m_cszErrorMessage, 256, "%d ReadPhysicalDriveInNTWithAdminRights ERROR DeviceIoControl() %ld, DFP_GET_VERSION) returned 0, error is %d\n", __LINE__, (long long)hPhysicalDriveIOCTL, (int)dwErr);
}
// If there is a IDE device at number "iI" issue commands
// to the device
if (VersionParams.bIDEDeviceMap <= 0)
{
SecureZeroMemory(m_cszErrorMessage, sizeof(m_cszErrorMessage));
sprintf_s(m_cszErrorMessage, 256, "%d ReadPhysicalDriveInNTWithAdminRights ERROR No device found at iPosition %d (%d)", __LINE__, (int)iDrive, (int)VersionParams.bIDEDeviceMap);
}
else
{
BYTE bIDCmd = 0; // IDE or ATAPI IDENTIFY cmd
SENDCMDINPARAMS scip;
//SENDCMDOUTPARAMS OutCmd;
// Now, get the ID sector for all IDE devices in the system.
// If the device is ATAPI use the IDE_ATAPI_IDENTIFY command,
// otherwise use the IDE_ATA_IDENTIFY command
bIDCmd = (VersionParams.bIDEDeviceMap >> iDrive & 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
memset(&scip, 0, sizeof(scip));
memset(byIdOutCmd, 0, sizeof(byIdOutCmd));
if (DoIDENTIFY(hPhysicalDriveIOCTL,
&scip,
(PSENDCMDOUTPARAMS)&byIdOutCmd,
(BYTE)bIDCmd,
(BYTE)iDrive,
&dwBytesReturned))
{
DWORD dwDiskData[256];
int iIjk = 0;
USHORT *punIdSector = (USHORT *)((PSENDCMDOUTPARAMS)byIdOutCmd)->bBuffer;
for (iIjk = 0; iIjk < 256; iIjk++)
dwDiskData[iIjk] = punIdSector[iIjk];
PrintIdeInfo(iDrive, dwDiskData);
iDone = TRUE;
}
}
CloseHandle(hPhysicalDriveIOCTL);
}
}
return iDone;
}
int MasterHardDiskSerial::ReadPhysicalDriveInNTUsingSmart(void)
{
int iDone = FALSE;
int iDrive = 0;
for (iDrive = 0; iDrive < MAX_IDE_DRIVES; iDrive++)
{
HANDLE hPhysicalDriveIOCTL = 0;
// Try to get a handle to PhysicalDrive IOCTL, report failure
// and exit if can't.
char cszDriveName[256];
sprintf_s(cszDriveName, 256, "\\\\.\\PhysicalDrive%d", iDrive);
// Windows NT, Windows 2000, Windows Server 2003, Vista
hPhysicalDriveIOCTL = CreateFileA(cszDriveName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
// if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
// printf ("Unable to open physical iDrive %d, error code: 0x%lX\n",
// iDrive, GetLastError ());
if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
{
SecureZeroMemory(m_cszErrorMessage, sizeof(m_cszErrorMessage));
sprintf_s(m_cszErrorMessage, 256, "%d ReadPhysicalDriveInNTUsingSmart ERROR, CreateFileA(%s) returned INVALID_HANDLE_VALUE Error Code %d", __LINE__, cszDriveName, GetLastError());
}
else
{
GETVERSIONINPARAMS GetVersionParams;
DWORD dwBytesReturned = 0;
// Get the version, etc of PhysicalDrive IOCTL
memset((void *)&GetVersionParams, 0, sizeof(GetVersionParams));
if (!DeviceIoControl(hPhysicalDriveIOCTL, SMART_GET_VERSION,
NULL,
0,
&GetVersionParams, sizeof(GETVERSIONINPARAMS),
&dwBytesReturned, NULL))
{
DWORD dwErr = GetLastError();
SecureZeroMemory(m_cszErrorMessage, sizeof(m_cszErrorMessage));
sprintf_s(m_cszErrorMessage, 256, "\n%d ReadPhysicalDriveInNTUsingSmart ERROR DeviceIoControl(%ld, SMART_GET_VERSION) returned 0, error is %d", __LINE__, (long long)hPhysicalDriveIOCTL, (int)dwErr);
}
else
{
// Print the SMART version
// PrintVersion (& GetVersionParams);
// Allocate the command cszBuffer
ULONG CommandSize = sizeof(SENDCMDINPARAMS) + IDENTIFY_BUFFER_SIZE;
PSENDCMDINPARAMS Command = (PSENDCMDINPARAMS)malloc(CommandSize);
// Retrieve the IDENTIFY data
// Prepare the command
#define ID_CMD 0xEC // Returns ID sector for ATA
Command->irDriveRegs.bCommandReg = ID_CMD;
DWORD BytesReturned = 0;
if (!DeviceIoControl(hPhysicalDriveIOCTL,
SMART_RCV_DRIVE_DATA, Command, sizeof(SENDCMDINPARAMS),
Command, CommandSize,
&BytesReturned, NULL))
{
SecureZeroMemory(m_cszErrorMessage, sizeof(m_cszErrorMessage));
sprintf_s(m_cszErrorMessage, 256, "SMART_RCV_DRIVE_DATA IOCTL");
// Print the error
//PrintError ("SMART_RCV_DRIVE_DATA IOCTL", GetLastError());
}
else
{
// Print the IDENTIFY data
DWORD dwDiskData[256];
USHORT *punIdSector = (USHORT *)(PIDENTIFY_DATA)((PSENDCMDOUTPARAMS)Command)->bBuffer;
for (int iIjk = 0; iIjk < 256; iIjk++)
dwDiskData[iIjk] = punIdSector[iIjk];
PrintIdeInfo(iDrive, dwDiskData);
iDone = TRUE;
}
// Done
CloseHandle(hPhysicalDriveIOCTL);
free(Command);
}
}
}
return iDone;
}
char *MasterHardDiskSerial::flipAndCodeBytes(int iPos, int iFlip, const char *pcszStr, char *pcszBuf)
{
int iI;
int iJ = 0;
int iK = 0;
pcszBuf[0] = '\0';
if (iPos <= 0)
return pcszBuf;
if (!iJ)
{
char cP = 0;
// First try to gather all characters representing hex digits only.
iJ = 1;
iK = 0;
pcszBuf[iK] = 0;
for (iI = iPos; iJ && !(pcszStr[iI] == '\0'); ++iI)
{
char cC = tolower(pcszStr[iI]);
if (isspace(cC))
cC = '0';
++cP;
pcszBuf[iK] <<= 4;
if (cC >= '0' && cC <= '9')
pcszBuf[iK] |= (char)(cC - '0');
else if (cC >= 'a' && cC <= 'f')
pcszBuf[iK] |= (char)(cC - 'a' + 10);
else
{
iJ = 0;
break;
}
if (cP == 2)
{
if ((pcszBuf[iK] != '\0') && !isprint(pcszBuf[iK]))
{
iJ = 0;
break;
}
++iK;
cP = 0;
pcszBuf[iK] = 0;
}
}
}
if (!iJ)
{
// There are non-digit characters, gather them as is.
iJ = 1;
iK = 0;
for (iI = iPos; iJ && (pcszStr[iI] != '\0'); ++iI)
{
char cC = pcszStr[iI];
if (!isprint(cC))
{
iJ = 0;
break;
}
pcszBuf[iK++] = cC;
}
}
if (!iJ)
{
// The characters are not there or are not printable.
iK = 0;
}
pcszBuf[iK] = '\0';
if (iFlip)
// Flip adjacent characters
for (iJ = 0; iJ < iK; iJ += 2)
{
char t = pcszBuf[iJ];
pcszBuf[iJ] = pcszBuf[iJ + 1];
pcszBuf[iJ + 1] = t;
}
// Trim any beginning and end space
iI = iJ = -1;
for (iK = 0; (pcszBuf[iK] != '\0'); ++iK)
{
if (!isspace(pcszBuf[iK]))
{
if (iI < 0)
iI = iK;
iJ = iK;
}
}
if ((iI >= 0) && (iJ >= 0))
{
for (iK = iI; (iK <= iJ) && (pcszBuf[iK] != '\0'); ++iK)
pcszBuf[iK - iI] = pcszBuf[iK];
pcszBuf[iK - iI] = '\0';
}
return pcszBuf;
}
int MasterHardDiskSerial::ReadPhysicalDriveInNTWithZeroRights(void)
{
int iDone = FALSE;
int iDrive = 0;
for (iDrive = 0; iDrive < MAX_IDE_DRIVES; iDrive++)
{
HANDLE hPhysicalDriveIOCTL = 0;
// Try to get a handle to PhysicalDrive IOCTL, report failure
// and exit if can't.
char cszDriveName[256];
sprintf_s(cszDriveName, 256, "\\\\.\\PhysicalDrive%d", iDrive);
// Windows NT, Windows 2000, Windows XP - admin rights not required
hPhysicalDriveIOCTL = CreateFileA(cszDriveName, 0,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
{
SecureZeroMemory(m_cszErrorMessage, sizeof(m_cszErrorMessage));
sprintf_s(m_cszErrorMessage, 256, "%d ReadPhysicalDriveInNTWithZeroRights ERROR CreateFileA(%s) returned INVALID_HANDLE_VALUE", __LINE__, cszDriveName);
}
else
{
STORAGE_PROPERTY_QUERY query;
DWORD dwBytesReturned = 0;
char cszBuffer[10000];
memset((void *)&query, 0, sizeof(query));
query.PropertyId = StorageDeviceProperty;
query.QueryType = PropertyStandardQuery;
memset(cszBuffer, 0, sizeof(cszBuffer));
if (DeviceIoControl(hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERTY,
&query,
sizeof(query),
&cszBuffer,
sizeof(cszBuffer),
&dwBytesReturned, NULL))
{
STORAGE_DEVICE_DESCRIPTOR *descrip = (STORAGE_DEVICE_DESCRIPTOR *)&cszBuffer;
char cszSerialNumber[1000];
char cszModelNumber[1000];
char cszVendorId[1000];
char cszProductRevision[1000];
flipAndCodeBytes(descrip->VendorIdOffset,
0, cszBuffer, cszVendorId);
flipAndCodeBytes(descrip->ProductIdOffset,
0, cszBuffer, cszModelNumber);
flipAndCodeBytes(descrip->ProductRevisionOffset,
0, cszBuffer, cszProductRevision);
flipAndCodeBytes(descrip->SerialNumberOffset,
0, cszBuffer, cszSerialNumber);
if (0 == m_cszHardDriveSerialNumber[0] &&
// serial number must be alphanumeric
// (but there can be leading spaces on IBM drives)
(iswalnum(cszSerialNumber[0]) || iswalnum(cszSerialNumber[19])))
{
strcpy_s(m_cszHardDriveSerialNumber, 1024, cszSerialNumber);
strcpy_s(m_cszHardDriveModelNumber, 1024, cszModelNumber);
iDone = TRUE;
}
// Get the disk iDrive geometry.
memset(cszBuffer, 0, sizeof(cszBuffer));
if (!DeviceIoControl(hPhysicalDriveIOCTL,
IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
NULL,
0,
&cszBuffer,
sizeof(cszBuffer),
&dwBytesReturned,
NULL))
{
SecureZeroMemory(m_cszErrorMessage, sizeof(m_cszErrorMessage));
sprintf_s(m_cszErrorMessage, "%s ReadPhysicalDriveInNTWithZeroRights ERROR DeviceIoControl(), IOCTL_DISK_GET_DRIVE_GEOMETRY_EX) returned 0", cszDriveName);
}
else
{
DISK_GEOMETRY_EX *geom = (DISK_GEOMETRY_EX *)&cszBuffer;
int iFixed = (geom->Geometry.MediaType == FixedMedia);
__int64 i64Size = geom->DiskSize.QuadPart;
}
}
else
{
DWORD dwErr = GetLastError();
SecureZeroMemory(m_cszErrorMessage, sizeof(m_cszErrorMessage));
sprintf_s(m_cszErrorMessage, "DeviceIOControl IOCTL_STORAGE_QUERY_PROPERTY error = %d\n", dwErr);
}
CloseHandle(hPhysicalDriveIOCTL);
}
}
return iDone;
}
BOOL MasterHardDiskSerial::DoIDENTIFY(HANDLE hPhysicalDriveIOCTL, PSENDCMDINPARAMS pSCIP,
PSENDCMDOUTPARAMS pSCOP, BYTE bIDCmd, BYTE bDriveNum,
PDWORD lpcbBytesReturned)
{
// Set up data structures for IDENTIFY command.
pSCIP->cBufferSize = IDENTIFY_BUFFER_SIZE;
pSCIP->irDriveRegs.bFeaturesReg = 0;
pSCIP->irDriveRegs.bSectorCountReg = 1;
//pSCIP -> irDriveRegs.bSectorNumberReg = 1;
pSCIP->irDriveRegs.bCylLowReg = 0;
pSCIP->irDriveRegs.bCylHighReg = 0;
// Compute the iDrive number.
pSCIP->irDriveRegs.bDriveHeadReg = 0xA0 | ((bDriveNum & 1) << 4);
// The command can either be IDE identify or ATAPI identify.
pSCIP->irDriveRegs.bCommandReg = bIDCmd;
pSCIP->bDriveNumber = bDriveNum;
pSCIP->cBufferSize = IDENTIFY_BUFFER_SIZE;
return (DeviceIoControl(hPhysicalDriveIOCTL, DFP_RECEIVE_DRIVE_DATA,
(LPVOID)pSCIP,
sizeof(SENDCMDINPARAMS) - 1,
(LPVOID)pSCOP,
sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1,
lpcbBytesReturned, NULL));
}
int MasterHardDiskSerial::ReadIdeDriveAsScsiDriveInNT(void)
{
int iDone = FALSE;
int iController = 0;
for (iController = 0; iController < 2; iController++)
{
HANDLE hScsiDriveIOCTL = 0;
char cszDriveName[256];
// Try to get a handle to PhysicalDrive IOCTL, report failure
// and exit if can't.
sprintf_s(cszDriveName, "\\\\.\\Scsi%d:", iController);
// Windows NT, Windows 2000, any rights should do
hScsiDriveIOCTL = CreateFileA(cszDriveName,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, 0, NULL);
if (hScsiDriveIOCTL != INVALID_HANDLE_VALUE)
{
int iDrive = 0;
for (iDrive = 0; iDrive < 2; iDrive++)
{
char cszBuffer[sizeof(SRB_IO_CONTROL) + SENDIDLENGTH];
SRB_IO_CONTROL *cP = (SRB_IO_CONTROL *)cszBuffer;
SENDCMDINPARAMS *pin =
(SENDCMDINPARAMS *)(cszBuffer + sizeof(SRB_IO_CONTROL));
DWORD dwDummy;
memset(cszBuffer, 0, sizeof(cszBuffer));
cP->HeaderLength = sizeof(SRB_IO_CONTROL);
cP->Timeout = 10000;
cP->Length = SENDIDLENGTH;
cP->ControlCode = IOCTL_SCSI_MINIPORT_IDENTIFY;
strncpy((char *)cP->Signature, "SCSIDISK", 8);
pin->irDriveRegs.bCommandReg = IDE_ATA_IDENTIFY;
pin->bDriveNumber = iDrive;
if (DeviceIoControl(hScsiDriveIOCTL, IOCTL_SCSI_MINIPORT,
cszBuffer,
sizeof(SRB_IO_CONTROL) +
sizeof(SENDCMDINPARAMS) - 1,
cszBuffer,
sizeof(SRB_IO_CONTROL) + SENDIDLENGTH,
&dwDummy, NULL))
{
SENDCMDOUTPARAMS *pOut =
(SENDCMDOUTPARAMS *)(cszBuffer + sizeof(SRB_IO_CONTROL));
IDSECTOR *pId = (IDSECTOR *)(pOut->bBuffer);
if (pId->sModelNumber[0])
{
DWORD dwDiskData[256];
int iIjk = 0;
USHORT *punIdSector = (USHORT *)pId;
for (iIjk = 0; iIjk < 256; iIjk++)
dwDiskData[iIjk] = punIdSector[iIjk];
PrintIdeInfo(iController * 2 + iDrive, dwDiskData);
iDone = TRUE;
}
}
}
CloseHandle(hScsiDriveIOCTL);
}
}
return iDone;
}
void MasterHardDiskSerial::PrintIdeInfo(int iDrive, DWORD dwDiskData[256])
{
char cszSerialNumber[1024];
char cszModelNumber[1024];
char cszRevisionNumber[1024];
char bufferSize[32];
__int64 i64Sectors = 0;
__int64 i64Byte = 0;
// copy the hard iDrive serial number to the cszBuffer
ConvertToString(dwDiskData, 10, 19, cszSerialNumber);
ConvertToString(dwDiskData, 27, 46, cszModelNumber);
ConvertToString(dwDiskData, 23, 26, cszRevisionNumber);
sprintf_s(bufferSize, 32, "%u", dwDiskData[21] * 512);
if (0 == m_cszHardDriveSerialNumber[0] &&
// serial number must be alphanumeric
// (but there can be leading spaces on IBM drives)
(isalnum(cszSerialNumber[0]) || isalnum(cszSerialNumber[19])))
{
strcpy_s(m_cszHardDriveSerialNumber, 1024, cszSerialNumber);
strcpy_s(m_cszHardDriveModelNumber, 1024, cszModelNumber);
}
}
long MasterHardDiskSerial::getHardDriveComputerID()
{
int iDone = FALSE;
// char string [1024];
__int64 i64Id = 0;
OSVERSIONINFO version;
strcpy_s(m_cszHardDriveSerialNumber, 1024, "");
memset(&version, 0, sizeof(version));
version.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&version);
if (version.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
// this works under WinNT4 or Win2K if you have admin rights
iDone = ReadPhysicalDriveInNTWithAdminRights();
// this should work in WinNT or Win2K if previous did not work
// this is kind of a backdoor via the SCSI mini port driver into
// the IDE drives
if (!iDone)
iDone = ReadIdeDriveAsScsiDriveInNT();
// this works under WinNT4 or Win2K or WinXP if you have any rights
if (!iDone)
iDone = ReadPhysicalDriveInNTWithZeroRights();
// this works under WinNT4 or Win2K or WinXP or Windows Server 2003 or Vista if you have any rights
if (!iDone)
iDone = ReadPhysicalDriveInNTUsingSmart();
}
if (m_cszHardDriveSerialNumber[0] > 0)
{
char *cP = m_cszHardDriveSerialNumber;
// ignore first 5 characters from western digital hard drives if
// the first four characters are WD-W
if (!strncmp(m_cszHardDriveSerialNumber, "WD-W", 4))
cP += 5;
for (; cP && *cP; cP++)
{
if ('-' == *cP)
continue;
i64Id *= 10;
switch (*cP)
{
case '0':
i64Id += 0;
break;
case '1':
i64Id += 1;
break;
case '2':
i64Id += 2;
break;
case '3':
i64Id += 3;
break;
case '4':
i64Id += 4;
break;
case '5':
i64Id += 5;
break;
case '6':
i64Id += 6;
break;
case '7':
i64Id += 7;
break;
case '8':
i64Id += 8;
break;
case '9':
i64Id += 9;
break;
case 'a':
case 'A':
i64Id += 10;
break;
case 'b':
case 'B':
i64Id += 11;
break;
case 'c':
case 'C':
i64Id += 12;
break;
case 'd':
case 'D':
i64Id += 13;
break;
case 'e':
case 'E':
i64Id += 14;
break;
case 'f':
case 'F':
i64Id += 15;
break;
case 'g':
case 'G':
i64Id += 16;
break;
case 'h':
case 'H':
i64Id += 17;
break;
case 'i':
case 'I':
i64Id += 18;
break;
case 'j':
case 'J':
i64Id += 19;
break;
case 'k':
case 'K':
i64Id += 20;
break;
case 'l':
case 'L':
i64Id += 21;
break;
case 'm':
case 'M':
i64Id += 22;
break;
case 'n':
case 'N':
i64Id += 23;
break;
case 'o':
case 'O':
i64Id += 24;
break;
case 'p':
case 'P':
i64Id += 25;
break;
case 'q':
case 'Q':
i64Id += 26;
break;
case 'r':
case 'R':
i64Id += 27;
break;
case 's':
case 'S':
i64Id += 28;
break;
case 't':
case 'T':
i64Id += 29;
break;
case 'u':
case 'U':
i64Id += 30;
break;
case 'v':
case 'V':
i64Id += 31;
break;
case 'w':
case 'W':
i64Id += 32;
break;
case 'x':
case 'X':
i64Id += 33;
break;
case 'y':
case 'Y':
i64Id += 34;
break;
case 'z':
case 'Z':
i64Id += 35;
break;
}
}
}
i64Id %= 100000000;
if (strstr(m_cszHardDriveModelNumber, "IBM-"))
i64Id += 300000000;
else if (strstr(m_cszHardDriveModelNumber, "MAXTOR") ||
strstr(m_cszHardDriveModelNumber, "Maxtor"))
i64Id += 400000000;
else if (strstr(m_cszHardDriveModelNumber, "WDC "))
i64Id += 500000000;
else
i64Id += 600000000;
return (long)i64Id;
}
//int MasterHardDiskSerial::GetSerialNo(std::vector<char> &serialNumber)
int MasterHardDiskSerial::GetSerialNo(char *SerialNumber)
{
getHardDriveComputerID();
size_t numberLength = strlen(m_cszHardDriveSerialNumber);
if (numberLength == 0)
return -1;
//serialNumber.resize(numberLength);
//std::cout << "size " << serialNumber.size() << std::endl;
//memcpy(&serialNumber.front(), m_cszHardDriveSerialNumber, serialNumber.size()); //m_cszHardDriveSerialNumber;
memcpy(SerialNumber, m_cszHardDriveSerialNumber, numberLength);
return 0;
}
char *MasterHardDiskSerial::ConvertToString(DWORD dwDiskData[256],
int iFirstIndex,
int iLastIndex,
char *pcszBuf)
{
int iIndex = 0;
int iPosition = 0;
// each integer has two characters stored in it backwards
// Removes the spaces from the serial no
for (iIndex = iFirstIndex; iIndex <= iLastIndex; iIndex++)
{
// get high byte for 1st character
char ctemp = (char)(dwDiskData[iIndex] / 256);
char cszmyspace[] = " ";
if (!(ctemp == *cszmyspace))
{
pcszBuf[iPosition++] = ctemp;
}
// get low byte for 2nd character
char ctemp1 = (char)(dwDiskData[iIndex] % 256);
if (!(ctemp1 == *cszmyspace))
{
pcszBuf[iPosition++] = ctemp1;
}
}
// end the string
pcszBuf[iPosition] = '\0';
// cut off the trailing blanks
for (iIndex = iPosition - 1; iIndex > 0 && isspace(pcszBuf[iIndex]); iIndex--)
pcszBuf[iIndex] = '\0';
return pcszBuf;
}
int MasterHardDiskSerial::GetErrorMessage(TCHAR *tszErrorMessage)
{
if (strlen(m_cszErrorMessage) != 0)
{
mbstowcs((wchar_t *)tszErrorMessage, m_cszErrorMessage, sizeof(m_cszErrorMessage));
return 0;
}
else
return -1;
}
MasterHardDiskSerial::MasterHardDiskSerial()
{
SecureZeroMemory(m_cszErrorMessage, sizeof(m_cszErrorMessage));
SecureZeroMemory(m_cszHardDriveModelNumber, sizeof(m_cszHardDriveModelNumber));
SecureZeroMemory(m_cszHardDriveSerialNumber, sizeof(m_cszHardDriveSerialNumber));
}
MasterHardDiskSerial::~MasterHardDiskSerial()
{
}

@ -0,0 +1,258 @@
#ifndef _HDD_SERIAL_INFO_H_
#define _HDD_SERIAL_INFO_H_
#include <stdio.h>
#include <string.h>
#include <tchar.h>
#include <vector>
#include <windows.h>
#include <winioctl.h>
#pragma pack(1)
#define IDENTIFY_BUFFER_SIZE 512
// IOCTL commands
#define DFP_GET_VERSION 0x00074080
#define DFP_SEND_DRIVE_COMMAND 0x0007c084
#define DFP_RECEIVE_DRIVE_DATA 0x0007c088
#define FILE_DEVICE_SCSI 0x0000001b
#define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501)
#define IOCTL_SCSI_MINIPORT 0x0004D008 // see NTDDSCSI.H for definition
#define SMART_GET_VERSION CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS)
#define SMART_SEND_DRIVE_COMMAND CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define SMART_RCV_DRIVE_DATA CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
// GETVERSIONOUTPARAMS contains the data returned from the
// Get Driver Version function.
typedef struct _GETVERSIONOUTPARAMS
{
BYTE bVersion; // Binary driver version.
BYTE bRevision; // Binary driver revision.
BYTE bReserved; // Not used.
BYTE bIDEDeviceMap; // Bit map of IDE devices.
DWORD fCapabilities; // Bit mask of driver capabilities.
DWORD dwReserved[4]; // For future use.
} GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS;
// Bits returned in the fCapabilities member of GETVERSIONOUTPARAMS
#define CAP_IDE_ID_FUNCTION 1 // ATA ID command supported
#define CAP_IDE_ATAPI_ID 2 // ATAPI ID command supported
#define CAP_IDE_EXECUTE_SMART_FUNCTION 4 // SMART commannds supported
// Valid values for the bCommandReg member of IDEREGS.
#define IDE_ATAPI_IDENTIFY 0xA1 // Returns ID sector for ATAPI.
#define IDE_ATA_IDENTIFY 0xEC // Returns ID sector for ATA.
// The following struct defines the interesting part of the IDENTIFY
// buffer:
typedef struct _IDSECTOR
{
USHORT wGenConfig;
USHORT wNumCyls;
USHORT wReserved;
USHORT wNumHeads;
USHORT wBytesPerTrack;
USHORT wBytesPerSector;
USHORT wSectorsPerTrack;
USHORT wVendorUnique[3];
CHAR sSerialNumber[20];
USHORT wBufferType;
USHORT wBufferSize;
USHORT wECCSize;
CHAR sFirmwareRev[8];
CHAR sModelNumber[40];
USHORT wMoreVendorUnique;
USHORT wDoubleWordIO;
USHORT wCapabilities;
USHORT wReserved1;
USHORT wPIOTiming;
USHORT wDMATiming;
USHORT wBS;
USHORT wNumCurrentCyls;
USHORT wNumCurrentHeads;
USHORT wNumCurrentSectorsPerTrack;
ULONG ulCurrentSectorCapacity;
USHORT wMultSectorStuff;
ULONG ulTotalAddressableSectors;
USHORT wSingleWordDMA;
USHORT wMultiWordDMA;
BYTE bReserved[128];
} IDSECTOR, *PIDSECTOR;
typedef struct _SRB_IO_CONTROL
{
ULONG HeaderLength;
UCHAR Signature[8];
ULONG Timeout;
ULONG ControlCode;
ULONG ReturnCode;
ULONG Length;
} SRB_IO_CONTROL, *PSRB_IO_CONTROL;
// Max number of drives assuming primary/secondary, master/slave topology
// Modified to read only the master serial
#define MAX_IDE_DRIVES 1
//
// IDENTIFY data (from ATAPI driver source)
//
#pragma pack(1)
typedef struct _IDENTIFY_DATA
{
USHORT GeneralConfiguration; // 00 00
USHORT NumberOfCylinders; // 02 1
USHORT Reserved1; // 04 2
USHORT NumberOfHeads; // 06 3
USHORT UnformattedBytesPerTrack; // 08 4
USHORT UnformattedBytesPerSector; // 0A 5
USHORT SectorsPerTrack; // 0C 6
USHORT VendorUnique1[3]; // 0E 7-9
USHORT SerialNumber[10]; // 14 10-19
USHORT BufferType; // 28 20
USHORT BufferSectorSize; // 2A 21
USHORT NumberOfEccBytes; // 2C 22
USHORT FirmwareRevision[4]; // 2E 23-26
USHORT ModelNumber[20]; // 36 27-46
UCHAR MaximumBlockTransfer; // 5E 47
UCHAR VendorUnique2; // 5F
USHORT DoubleWordIo; // 60 48
USHORT Capabilities; // 62 49
USHORT Reserved2; // 64 50
UCHAR VendorUnique3; // 66 51
UCHAR PioCycleTimingMode; // 67
UCHAR VendorUnique4; // 68 52
UCHAR DmaCycleTimingMode; // 69
USHORT TranslationFieldsValid : 1; // 6A 53
USHORT Reserved3 : 15;
USHORT NumberOfCurrentCylinders; // 6C 54
USHORT NumberOfCurrentHeads; // 6E 55
USHORT CurrentSectorsPerTrack; // 70 56
ULONG CurrentSectorCapacity; // 72 57-58
USHORT CurrentMultiSectorSetting; // 59
ULONG UserAddressableSectors; // 60-61
USHORT SingleWordDMASupport : 8; // 62
USHORT SingleWordDMAActive : 8;
USHORT MultiWordDMASupport : 8; // 63
USHORT MultiWordDMAActive : 8;
USHORT AdvancedPIOModes : 8; // 64
USHORT Reserved4 : 8;
USHORT MinimumMWXferCycleTime; // 65
USHORT RecommendedMWXferCycleTime; // 66
USHORT MinimumPIOCycleTime; // 67
USHORT MinimumPIOCycleTimeIORDY; // 68
USHORT Reserved5[2]; // 69-70
USHORT ReleaseTimeOverlapped; // 71
USHORT ReleaseTimeServiceCommand; // 72
USHORT MajorRevision; // 73
USHORT MinorRevision; // 74
USHORT Reserved6[50]; // 75-126
USHORT SpecialFunctionsEnabled; // 127
USHORT Reserved7[128]; // 128-255
} IDENTIFY_DATA, *PIDENTIFY_DATA;
#pragma pack()
// Required to ensure correct PhysicalDrive IOCTL structure setup
#pragma pack(4)
//
// IOCTL_STORAGE_QUERY_PROPERTY
//
// Input Buffer:
// a STORAGE_PROPERTY_QUERY structure which describes what type of query
// is being done, what property is being queried for, and any additional
// parameters which a particular property query requires.
//
// Output Buffer:
// Contains a buffer to place the results of the query into. Since all
// property descriptors can be cast into a STORAGE_DESCRIPTOR_HEADER,
// the IOCTL can be called once with a small buffer then again using
// a buffer as large as the header reports is necessary.
//
//
// Types of queries
//
//
// define some initial property id's
//
//
// Query structure - additional parameters for specific queries can follow
// the header
//
#define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
//
// Device property descriptor - this is really just a rehash of the inquiry
// data retrieved from a scsi device
//
// This may only be retrieved from a target device. Sending this to the bus
// will result in an error
//
#pragma pack(4)
// (* Output Bbuffer for the VxD (rt_IdeDinfo record) *)
typedef struct _rt_IdeDInfo_
{
BYTE IDEExists[4];
BYTE DiskExists[8];
WORD DisksRawInfo[8 * 256];
} rt_IdeDInfo, *pt_IdeDInfo;
// (* IdeDinfo "data fields" *)
typedef struct _rt_DiskInfo_
{
BOOL DiskExists;
BOOL ATAdevice;
BOOL RemovableDevice;
WORD TotLogCyl;
WORD TotLogHeads;
WORD TotLogSPT;
char SerialNumber[20];
char FirmwareRevision[8];
char ModelNumber[40];
WORD CurLogCyl;
WORD CurLogHeads;
WORD CurLogSPT;
} rt_DiskInfo;
#define SENDIDLENGTH sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE
#define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS)
class MasterHardDiskSerial
{
public:
MasterHardDiskSerial();
~MasterHardDiskSerial();
//int GetSerialNo(std::vector<char> &serialNumber);
int GetSerialNo(char *SerialNumber);
int GetErrorMessage(TCHAR *_ptszErrorMessage = NULL);
private:
char *ConvertToString(DWORD dwDiskdata[256], int iFirstIndex, int iLastIndex, char *pcBuf = NULL);
BOOL DoIDENTIFY(HANDLE, PSENDCMDINPARAMS, PSENDCMDOUTPARAMS, BYTE, BYTE, PDWORD);
int ReadPhysicalDriveInNTWithAdminRights(void);
int ReadPhysicalDriveInNTUsingSmart(void);
int ReadPhysicalDriveInNTWithZeroRights(void);
int ReadIdeDriveAsScsiDriveInNT(void);
char *flipAndCodeBytes(int iPos, int iFlip, const char *pcStr = NULL, char *pcBuf = NULL);
void PrintIdeInfo(int iDrive, DWORD dwDiskdata[256]);
long getHardDriveComputerID();
private:
char m_cszHardDriveSerialNumber[1024];
char m_cszHardDriveModelNumber[1024];
char m_cszErrorMessage[256];
BYTE byIdOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];
};
#endif // _HDD_SERIAL_INFO_H_

@ -0,0 +1,71 @@
// MemDC.h : header file
#include "StdAfx.h"
#pragma once
class CMemDC_Redefine : public CDC
{
public:
//¹¹ÔìÄÚ´æÉ豸³¡¾°
CMemDC_Redefine(CDC* pDC) : CDC()
{
ASSERT(pDC != NULL);
m_pDC = pDC;
m_pOldBitmap = NULL;
m_bMemDC = !pDC->IsPrinting();
if (m_bMemDC)
{
pDC->GetClipBox(&m_rect);
CreateCompatibleDC(pDC);
m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
m_pOldBitmap = SelectObject(&m_bitmap);
SetWindowOrg(m_rect.left, m_rect.top);
}
else
{
m_bPrinting = pDC->m_bPrinting;
m_hDC = pDC->m_hDC;
m_hAttribDC = pDC->m_hAttribDC;
}
}
//Îö¹¹
~CMemDC_Redefine()
{
if (m_bMemDC)
{
m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
this, m_rect.left, m_rect.top, SRCCOPY);
SelectObject(m_pOldBitmap);
}
else
{
m_hDC = m_hAttribDC = NULL;
}
}
CMemDC_Redefine * operator->()
{
return this;
}
operator CMemDC_Redefine *()
{
return this;
}
private:
CBitmap m_bitmap;
CBitmap* m_pOldBitmap;
CDC* m_pDC;
CRect m_rect;
BOOL m_bMemDC;
};

@ -0,0 +1,188 @@
// MulticastSocket.cpp : implementation file
//
#include "stdafx.h"
#include "MulticastSocket.h"
#include "Mmc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMulticastSocket
CMulticastSocket::CMulticastSocket()
{
m_RevData = NULL;
m_nSendersPort = 0;
m_nLocalPort = 0;
bForceNoLoopback = FALSE;
if (!AfxSocketInit())
{
//MessageBox(NULL,_T("Failed to Initialize Sockets"),"ͼÏñÏÔʾ", MB_OK | MB_ICONSTOP);
MessageBoxEx(NULL,"Failed to Initialize Sockets","ImageShow",MB_OK|MB_ICONSTOP,MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US));
}
}
CMulticastSocket::~CMulticastSocket()
{
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CMulticastSocket, CAsyncSocket)
//{{AFX_MSG_MAP(CMulticastSocket)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0
/////////////////////////////////////////////////////////////////////////////
// CMulticastSocket member functions
BOOL CMulticastSocket::CreateReceivingSocket(LPCTSTR strGroupIP, UINT nGroupPort)
{
/* Create socket for receiving packets from multicast group */
if(!Create(nGroupPort, SOCK_DGRAM, FD_READ))
{
return FALSE;
}
BOOL bMultipleApps = TRUE; /* allow reuse of local port if needed */
SetSockOpt(SO_REUSEADDR, (void*)&bMultipleApps, sizeof(BOOL), SOL_SOCKET);
/* Fill m_saHostGroup_in for sending datagrams */
memset(&m_saHostGroup, 0, sizeof(m_saHostGroup));
m_saHostGroup.sin_family = AF_INET;
m_saHostGroup.sin_addr.s_addr = inet_addr(strGroupIP);
m_saHostGroup.sin_port = htons((USHORT)nGroupPort);
/* Join the multicast group */
m_mrMReq.imr_multiaddr.s_addr = inet_addr(strGroupIP); /* group addr */
m_mrMReq.imr_interface.s_addr = htons(INADDR_ANY); /* use default */
if(setsockopt(m_hSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char FAR *)&m_mrMReq, sizeof(m_mrMReq)) < 0)
{
int nn = WSAGetLastError();
return FALSE;
}
BOOL bOptVal = 1;
if (setsockopt(m_hSocket, IPPROTO_UDP, 1, (char*)&bOptVal, sizeof(bOptVal)) <0)
{
printf("Set UDP_NOCHECKSUM: TRUE\n");
return FALSE;
}
return TRUE;
}
BOOL CMulticastSocket::CreateSendingSocket(UINT nTTL, BOOL bLoopBack)
{
if(!m_SendSocket.Create(0, SOCK_DGRAM, 0)) // Create an unconnected UDP socket
return FALSE;
if(!SetTTL(nTTL)) // Set Time to Live as specified by user
MessageBoxEx(NULL,"Warning! Error Setting TTL","ImageShow",NULL,MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US));
SetLoopBack(bLoopBack); // Enable/Disable Loopback
return TRUE;
}
BOOL CMulticastSocket::SetTTL(UINT nTTL)
{
/* Set Time to Live to parameter TTL */
if(m_SendSocket.SetSockOpt(IP_MULTICAST_TTL, &nTTL, sizeof(int), IPPROTO_IP) == 0)
return FALSE; /* Error Setting TTL */
else
return TRUE; /* else TTL set successfully */
}
void CMulticastSocket::SetLoopBack(BOOL bLoop)
{
/* Set LOOPBACK option to TRUE OR FALSE according to IsLoop parameter */
int nLoopBack = (int)bLoop;
if(m_SendSocket.SetSockOpt(IP_MULTICAST_LOOP, &nLoopBack, sizeof(int), IPPROTO_IP) == 0)
{
if(!bLoop) /* if required to stop loopback */
{
bForceNoLoopback = TRUE; /* Internally making a note that loopback has to be disabled forcefilly */
// Get IP/Port for send socket in order to disable loopback forcefully */
char localHost[255];
gethostname(localHost, 255);
struct hostent *host = gethostbyname(localHost); /* Get local host IP */
m_strLocalIP = inet_ntoa (*(struct in_addr*)*host->h_addr_list);
CString Dummy; // Dummy string to be passed to the GetSockName function
m_SendSocket.GetSockName(Dummy, m_nLocalPort); /* Get Port Number for Sending Port */
}
}
}
void CMulticastSocket::OnReceive(int nErrorCode)
{
int nError = ReceiveFrom (m_strBuffer, 10240, m_strSendersIP, m_nSendersPort);
if(nError == SOCKET_ERROR)
{
MessageBoxEx(NULL,"Error receiving data from the host group","ImageShow",NULL,MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US));
}
else
{
if (!bForceNoLoopback || (bForceNoLoopback && !(m_strSendersIP == m_strLocalIP && m_nSendersPort == m_nLocalPort)))
{
// 1. If loopbackback is not to be forced then interface handles the loopback itself
// 2. If you have to loopback and SOCKOPT LOOPBACK fails, no problem, interfaces loopback by default
// 3. If you have to stop loopback and SOCKOPT LOOPBACK fails, ignore messages coming from your own sending socket
if ( m_RevData != NULL)
{
m_RevData( m_strBuffer, nError);
}
}
}
CAsyncSocket::OnReceive(nErrorCode);
}
BOOL CMulticastSocket::LeaveGroup()
{
if(setsockopt (m_hSocket, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char FAR *)&m_mrMReq, sizeof(m_mrMReq)) < 0)
return FALSE;
m_SendSocket.Close(); // Close sending socket
Close();
return TRUE;
}
BOOL CMulticastSocket::SendTo(const void* strMessage, int nSize)
{
if(m_SendSocket.SendTo(strMessage, nSize, (SOCKADDR*)&m_saHostGroup, sizeof(SOCKADDR), 0) == SOCKET_ERROR)
{
return FALSE;
}
else
{
return TRUE;
}
}
BOOL CMulticastSocket::JoinGroup(CString GroupIP, UINT nGroupPort, UINT nTTL, BOOL bLoopback)
{
if(!CreateReceivingSocket(GroupIP, nGroupPort)) /* Create Socket for receiving and join the host group */
{
return FALSE;
}
if(!CreateSendingSocket(nTTL, bLoopback)) /* Create Socket for sending */
{
return FALSE;
}
return TRUE;
}

@ -0,0 +1,142 @@
/*---------------------------------------------------------------------------
UDP
使windows
VS2008 VS2010 VS2013
1.
CMulticastSocket m_multiSocket;
2.
2 3 4
3.
m_multiSocket.SetCallBack();
4.
m_Serial.SendTo(buffer,10); // 举例
5.
m_Serial.LeaveGroup();
1
2
......
:
V1.0 2016/12/28
----------------------------------------------------------------------------*/
#if !defined(AFX_MULTICASTSOCKET_H__269E2C7F_2037_11D3_8EF3_0000C0FD25F8__INCLUDED_)
#define AFX_MULTICASTSOCKET_H__269E2C7F_2037_11D3_8EF3_0000C0FD25F8__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#include <afxsock.h>
// 定义数据接收回调函数格式
typedef void ( CALLBACK *RevNetDataCALLBACK )(const void* buffer, int length);
class CMulticastSocket : public CAsyncSocket
{
// Operations
public:
CMulticastSocket();
virtual ~CMulticastSocket();
public:
/* 【1】
: UDP
:
DataCallBack
:
*/
void SetCallBack( RevNetDataCALLBACK DataCallBack)
{
m_RevData = DataCallBack;
}
/* 【2】
: Socket
:
1. strGroupIPIP
2. nGroupPort
:True, False
*/
BOOL CreateReceivingSocket(LPCTSTR strGroupIP, UINT nGroupPort);
/* 【3】
: Socket
:
1. nTTLTime to Live
2. bLoopBack
:True, False
*/
BOOL CreateSendingSocket(UINT nTTL = 5, BOOL bLoopBack = FALSE);
/* 【4】
:
:
1. strMessage
2. nSize
:True, False
*/
BOOL SendTo(const void* strMessage, int nSize);
/* 【5】
: 2 + 3
*/
BOOL JoinGroup(CString GroupIP, UINT nGroupPort, UINT nTTL = 5, BOOL bLoopback = FALSE);
/* 【6】
: 退
:
:退True, False
*/
BOOL LeaveGroup();
private:
RevNetDataCALLBACK m_RevData;
char m_strBuffer[10240]; // Receiving buffer for the packet that has arrived
SOCKADDR_IN m_saHostGroup; // SOCKADDR structure to hold IP/Port of the Host group to send data to it
ip_mreq m_mrMReq; // Contains IP and interface of the host group
UINT m_nSendersPort; // Holds Port No. of the socket from which last packet was received
CString m_strSendersIP; // Hold IP of the socket from which the last packet was received
UINT m_nLocalPort; // Ephemeral port number of the sending port
CString m_strLocalIP; // IP Address of the local host or your machine
BOOL bForceNoLoopback; // If interface does not support lopback and the service is required, the bool is set to true
CAsyncSocket m_SendSocket; // Socket for sending data to the host group
private:
void SetLoopBack(BOOL);
BOOL SetTTL(UINT nTTL);
protected:
virtual void OnReceive(int nErrorCode);
};
#endif // !defined(AFX_MULTICASTSOCKET_H__269E2C7F_2037_11D3_8EF3_0000C0FD25F8__INCLUDED_)

@ -0,0 +1,751 @@
// MulticastSocketReceiveDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "CH91PayloadSoftware.h"
#include "CH91PayloadSoftwareDlg.h"
#include "afxdialogex.h"
#include "Global.h"
#include "GlobalMessage.h"
#include "GlobalMember.h"
#include "GetElevation.h"
#include "MulticastSocketReceiveDlg.h"
#include <opencv2\opencv.hpp>
#include <WinSock2.h>
// CMulticastSocketReceiveDlg 对话框
//卫通UDP通信端口接收图像数据回调函数
void CALLBACK OnReadFromUDPSACKU( const void* rxdata, int lLen, LPVOID Param )
{
if ( lLen > 0)
{
// 处理数据
SocketReceiveFH96Data(rxdata, lLen);
CTime t = GetCurrentTime();
TRACE(_T("%d,%d,%d\n"), lLen,t.GetMinute(), t.GetSecond());
//SocketReceiveH264VideoData(rxdata, lLen);
}
}
IMPLEMENT_DYNAMIC(CMulticastSocketReceiveDlg, CDialogEx)
CMulticastSocketReceiveDlg::CMulticastSocketReceiveDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CMulticastSocketReceiveDlg::IDD, pParent)
, m_iVideoSrc(0)
, mComPortIMP(_T(""))
, mComBaudIMP(_T(""))
{
//, mStrCDPayLoadIPAddr(_T("0.0.0.0"))
// WinSoc
m_hThread_GetFH96DataFromNet = NULL;
m_ThreadID_GetFH96DataFromNet = 0;
// 组播IP
str_LocalIP_ReceiveMUDP = _T("");
str_MulticastSocketIP = "233.0.0.1";
m_MulticastSocketPortFH96Data = 8080;
str_MulticastSocketInfoReceive = "等待通信连接……\r\n";
//FJ数据显示初始化
m_bFJDataShow = FALSE;
//L测控
m_strLLinkMultiCastIP = "";
m_nLLinkMulticastPort = 8000;
//卫通组播
m_strSACMulticastIPAddr = "";
m_nSACMulticastRemotePort = 8001;
//卫通UDP单播
m_strSACUDPIPAddr = "";
m_nSACUDPRemotePort = 2203;
m_nSACUDPLocalPort = 8009;
m_sysSetComNumber = 0;//窜口数
}
CMulticastSocketReceiveDlg::~CMulticastSocketReceiveDlg()
{
}
void CMulticastSocketReceiveDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_IPADDRESS4,m_IPAddress_MultiCastIP);//网络IP
DDX_Radio(pDX, IDC_RADIO_L, m_iVideoSrc);
DDX_CBString(pDX, IDC_COMBO_PORT_IMP, mComPortIMP);
DDX_CBString(pDX, IDC_COMBO_BAUD_IMP, mComBaudIMP);
}
BEGIN_MESSAGE_MAP(CMulticastSocketReceiveDlg, CDialogEx)
ON_BN_CLICKED(IDC_BTN_MULTISOCKET_CONNECT, &CMulticastSocketReceiveDlg::OnBnClickedBtnMultisocketConnect)
ON_BN_CLICKED(IDC_BTN_MULTISOCKET_DISCONNECT, &CMulticastSocketReceiveDlg::OnBnClickedBtnMultisocketDisconnect)
ON_MESSAGE(WN_SHOW_CH96_FJDATA, &CMulticastSocketReceiveDlg::ShowCH96FJData)
ON_BN_CLICKED(IDC_CHECK1, &CMulticastSocketReceiveDlg::OnBnClickedCheck1)
ON_BN_CLICKED(IDC_RADIO_L, &CMulticastSocketReceiveDlg::OnRadioBtnVideoSrcClicked)
ON_BN_CLICKED(IDC_RADIO_SAC1, &CMulticastSocketReceiveDlg::OnRadioBtnVideoSrcClicked)
ON_BN_CLICKED(IDC_RADIO_SAC2, &CMulticastSocketReceiveDlg::OnRadioBtnVideoSrcClicked)
ON_CBN_SELCHANGE(IDC_COMBO_PORT_IMP, &CMulticastSocketReceiveDlg::OnCbnSelchangePortIMP)//串口号
ON_CBN_SELCHANGE(IDC_COMBO_BAUD_IMP, &CMulticastSocketReceiveDlg::OnCbnSelchangePortIMP)//波特率
ON_BN_CLICKED(IDC_BTN_IMP_SERIAL_CONNECT, &CMulticastSocketReceiveDlg::OnBnClickedBtnImpSerialConnect)
ON_BN_CLICKED(IDC_BTN_IMP_SERIAL_DISCONNECT, &CMulticastSocketReceiveDlg::OnBnClickedBtnImpSerialDisconnect)
ON_BN_CLICKED(IDC_RADIO_DC_13Ins, &CMulticastSocketReceiveDlg::OnBnClickedRadioDc13ins)
ON_BN_CLICKED(IDC_RADIO_DC_WHTJ, &CMulticastSocketReceiveDlg::OnBnClickedRadioDcWhtj)
ON_BN_CLICKED(IDC_RADIO_H264Data, &CMulticastSocketReceiveDlg::OnBnClickedRadioH264data)
END_MESSAGE_MAP()
BOOL CMulticastSocketReceiveDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 获取窗口句柄
g_MulticastSocketReceiveDlgHwnd = GetSafeHwnd();
// 获取主机本地IP并显示
//CString str_LocalIP_Receive;
GetHostAddress(str_LocalIP_ReceiveMUDP);
GetDlgItem(IDC_EDIT_LOCALIP_RECEIVE)->SetWindowText(str_LocalIP_ReceiveMUDP);
// 设置界面初始显示内容
m_IPAddress_MultiCastIP.SetWindowText(str_MulticastSocketIP);
GetDlgItem(IDC_EDIT_MULTISOCKETPORT_RECEIVE)->SetWindowText("8080");
GetDlgItem(IDC_EDIT_LOCALPORT_RECEIVE)->SetWindowTextA("8082");
GetDlgItem(IDC_EDIT_MULTICASTSOCKETINFORECEIVE)->SetWindowText(str_MulticastSocketInfoReceive);
// 设置按钮状态
GetDlgItem(IDC_BTN_MULTISOCKET_CONNECT)->EnableWindow(TRUE);
m_strServerPayLoadIPSend = _T("192.168.1.20"); // udp单播转发的服务器IP
m_nServerSendLocalPort = 60302;
m_nServerSendObjectPort = 13001; // 远端端口
//添加串口号到列表框
AddPortNumberToComboBox();
//添加波特率到列表框
AddBaudNumberToComboBox();
((CButton *)GetDlgItem(IDC_RADIO_DC_13Ins))->SetCheck(true);
((CButton *)GetDlgItem(IDC_RADIO_DC_WHTJ))->SetCheck(false);
((CButton *)GetDlgItem(IDC_RADIO_H264Data))->SetCheck(false);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
// 连接
void CMulticastSocketReceiveDlg::OnBnClickedBtnMultisocketConnect()
{
UpdateData(TRUE);
switch(m_iVideoSrc)
{
case 0: //L测控 任管数据
{
//更改IP地址和端口号
m_IPAddress_MultiCastIP.GetWindowText(m_strLLinkMultiCastIP); //L测控组播IP
str_MulticastSocketIP = m_strLLinkMultiCastIP;
CString _str;
GetDlgItem(IDC_EDIT_MULTISOCKETPORT_RECEIVE)->GetWindowText(_str); //从文本框中读取远端端口
m_nLLinkMulticastPort = _ttoi(_str);
m_MulticastSocketPortFH96Data = m_nLLinkMulticastPort;
// 创建组播接收实例——图像和复接数据
CreateMulticastSocketFH96Data();
}
break;
case 1: //卫通UDP单播 任管数据
{
//更改IP地址和端口号
m_IPAddress_MultiCastIP.GetWindowTextA(m_strSACUDPIPAddr); //卫通UDP单播远端地址
CString _str;
GetDlgItem(IDC_EDIT_MULTISOCKETPORT_RECEIVE)->GetWindowTextA(_str); //从文本框中读取远端端口
m_nSACUDPRemotePort = _ttoi(_str);
GetDlgItem(IDC_EDIT_LOCALPORT_RECEIVE)->GetWindowTextA(_str); //从文本框中读取本地端口
m_nSACUDPLocalPort = _ttoi(_str);
//创建UDP接收实例——图像和复接数据
CreateUDPSocketReceiveData();
}
break;
case 2: //卫通组播 光电吊舱裸流数据
{
//更改IP地址和端口号
m_IPAddress_MultiCastIP.GetWindowText(m_strSACMulticastIPAddr);
str_MulticastSocketIP = m_strSACMulticastIPAddr;
CString _str;
GetDlgItem(IDC_EDIT_MULTISOCKETPORT_RECEIVE)->GetWindowText(_str); //从文本框中读取远端端口
m_nSACMulticastRemotePort = _ttoi(_str);
m_MulticastSocketPortFH96Data = m_nSACMulticastRemotePort;
// 创建组播接收实例——图像裸流H264
CreateMulticastSocketFH96Data();
}
break;
default:
break;
}
// 更改按钮状态
GetDlgItem(IDC_BTN_MULTISOCKET_CONNECT)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_MULTISOCKET_DISCONNECT)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO_L)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO_SAC1)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO_SAC2)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO_DC_13Ins)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO_DC_WHTJ)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO_H264Data)->EnableWindow(FALSE);
//UDP服务器传输
g_UDPTrans2Server.SetCallBack(NULL, this);
CString strLocalIPAddr = _T("0.0.0.0");
g_UDPTrans2Server.SetParams(strLocalIPAddr, m_nServerSendLocalPort, m_strServerPayLoadIPSend, m_nServerSendObjectPort);
if (g_UDPTrans2Server.StartListening())
{
g_udpStarted = true;
CString strPassword = _T("FP-WRJ-98");
g_UDPTrans2Server.WriteBuffer((BYTE*)strPassword.GetBuffer(), strPassword.GetLength());
}
else
{
g_udpStarted = false;
}
}
// 显示CH96FJ数据内容
LRESULT CMulticastSocketReceiveDlg::ShowCH96FJData(WPARAM wParam, LPARAM lParam)
{
if (m_bFJDataShow == TRUE)
{
// 显示FJ数据150字节内容
BYTE _FJData[150];
WaitForSingleObject(g_hMutex_SaveFJData, INFINITE);
memcpy(_FJData, &g_CH96FJData, 150);
ReleaseMutex(g_hMutex_SaveFJData);
CString _strByte;
_strByte = "";
CString _strFJDataShow;
_strFJDataShow = "";
for (int i = 0; i < 150; i++)
{
_strByte.Format("%02X",_FJData[i]);
_strFJDataShow = _strFJDataShow + _strByte + "\t";
if ( 0 == (i+1)%8 )
{
_strFJDataShow += "\r\n";
}
}
GetDlgItem(IDC_EDIT_FJDATASHOW)->SetWindowText(_strFJDataShow);
}
return 0;
}
// 创建组播连接
void CMulticastSocketReceiveDlg::CreateMulticastSocketFH96Data()
{
if (g_socketFH96Data != INVALID_SOCKET)
{
// 关闭套接字
closesocket(g_socketFH96Data);
g_socketFH96Data = -1;
}
// 创建套接字
SetUpWinSocketFH96Data();
}
// 创建WinSocket套接字
void CMulticastSocketReceiveDlg::SetUpWinSocketFH96Data()
{
// 加载套接字库
WSADATA WSAData;
WSAStartup(WINSOCK_VERSION, &WSAData);
// 创建套接字
g_socketFH96Data = socket(AF_INET, // 地址族
SOCK_DGRAM, // socket 类型
IPPROTO_UDP); // 协议
if (g_socketFH96Data == INVALID_SOCKET)
{
CString receiverData = "数据组播接收套接字创建失败!";
receiverData += "\r\n";
str_MulticastSocketInfoReceive += receiverData;
// 显示信息
ShowMulticastSocketInfoReceive();
return;
}
int ret = 0;
// 绑定套接字
sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port = htons(m_MulticastSocketPortFH96Data);
local.sin_addr.s_addr = INADDR_ANY;
ret = ::bind(g_socketFH96Data, (struct sockaddr*)&local, sizeof(local));
if(ret == SOCKET_ERROR)
{
CString receiverData = "数据组播接收套接字绑定port失败!";
receiverData += "\r\n";
str_MulticastSocketInfoReceive += receiverData;
// 显示信息
ShowMulticastSocketInfoReceive();
return;
}
// 设置接收缓冲区大小
int length = 512000 ;
ret = setsockopt(g_socketFH96Data,SOL_SOCKET,SO_RCVBUF,(const char*)&length, sizeof(int));
if (ret == SOCKET_ERROR)
{
CString receiverData = "数据组播接收套接字缓冲区设置失败!";
receiverData += "\r\n";
str_MulticastSocketInfoReceive += receiverData;
// 显示信息
ShowMulticastSocketInfoReceive();
return;
}
int nNetTimeout = 1000; // 1S 设置接收时限
ret = setsockopt(g_socketFH96Data,SOL_SOCKET,SO_RCVTIMEO,(const char*)&nNetTimeout, sizeof(int));
if (ret == SOCKET_ERROR)
{
CString receiverData = "数据组播接收套接字时限设置失败!";
receiverData += "\r\n";
str_MulticastSocketInfoReceive += receiverData;
// 显示信息
ShowMulticastSocketInfoReceive();
return;
}
struct ip_mreq mcast_addr;
mcast_addr.imr_multiaddr.s_addr = inet_addr(str_MulticastSocketIP);
mcast_addr.imr_interface.s_addr = INADDR_ANY;
ret = setsockopt(g_socketFH96Data, IPPROTO_IP,IP_ADD_MEMBERSHIP, (char*)&mcast_addr, sizeof(mcast_addr));
if (ret == SOCKET_ERROR)
{
CString receiverData = "数据组播接收套接字绑定IP失败!";
receiverData += "\r\n";
str_MulticastSocketInfoReceive += receiverData;
// 显示信息
ShowMulticastSocketInfoReceive();
return;
}
else
{
CString receiverData = "数据组播接收创建成功!";
receiverData += "\r\n";
str_MulticastSocketInfoReceive += receiverData;
// 显示信息
ShowMulticastSocketInfoReceive();
switch(m_iVideoSrc)
{
case 0: //L测控组播
// 创建一个线程并立即执行
m_hThread_GetFH96DataFromNet = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)GetFH96DataFromNet,
nullptr, // 传递参数
0, // 线程创建后会被马上调用
&m_ThreadID_GetFH96DataFromNet);
break;
case 1: //卫通UDP单播
break;
case 2: //卫通组播
// 创建一个线程并立即执行
m_hThread_GetFH96DataFromNet = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)GetH264VideoDataFromNet,
nullptr, // 传递参数
0, // 线程创建后会被马上调用
&m_ThreadID_GetFH96DataFromNet);
break;
default:
break;
}
}
}
void CMulticastSocketReceiveDlg::ShowMulticastSocketInfoReceive()
{
GetDlgItem(IDC_EDIT_MULTICASTSOCKETINFORECEIVE)->SetWindowText(str_MulticastSocketInfoReceive);
GetDlgItem(IDC_EDIT_MULTICASTSOCKETINFORECEIVE)->SendMessage(WM_VSCROLL,SB_BOTTOM,0);
}
// 获取主机IP
void CMulticastSocketReceiveDlg::GetHostAddress(CString &strIP)
{
char HostName[100];
gethostname(HostName, sizeof(HostName)); // 获取主机名称
hostent* hn;
hn = gethostbyname(HostName); // 根据主机名称得到本机IP
strIP = inet_ntoa(*(struct in_addr *)hn->h_addr_list[0]);
}
void CMulticastSocketReceiveDlg::OnBnClickedBtnMultisocketDisconnect()
{
// 关闭组播
// 关闭套接字
if (INVALID_SOCKET != g_socketFH96Data)
{
closesocket(g_socketFH96Data);
g_socketFH96Data = -1;
// 卸载socket库
WSACleanup();
}
//关闭卫通UDP单播
m_nSACUDPSocket.SetCallBack(NULL, nullptr);
m_nSACUDPSocket.StopListening();
g_udpStarted = false;
g_UDPTrans2Server.SetCallBack(NULL, nullptr);
g_UDPTrans2Server.StopListening();
if (NULL != m_hThread_GetFH96DataFromNet)
{
TerminateThread(m_hThread_GetFH96DataFromNet, 0);
m_hThread_GetFH96DataFromNet = NULL;
m_ThreadID_GetFH96DataFromNet = 0;
}
// 更新显示内容
str_MulticastSocketInfoReceive = str_MulticastSocketInfoReceive + "数据接收已断开!\r\n" + "等待通信连接……\r\n";
ShowMulticastSocketInfo();
// 更改按钮状态
// 设置按钮状态
GetDlgItem(IDC_BTN_MULTISOCKET_CONNECT)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_MULTISOCKET_DISCONNECT)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO_L)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO_SAC1)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO_SAC2)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO_DC_13Ins)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO_DC_WHTJ)->EnableWindow(TRUE);
GetDlgItem(IDC_RADIO_H264Data)->EnableWindow(TRUE);
}
void CMulticastSocketReceiveDlg::ShowMulticastSocketInfo()
{
GetDlgItem(IDC_EDIT_MULTICASTSOCKETINFORECEIVE)->SetWindowText(str_MulticastSocketInfoReceive);
GetDlgItem(IDC_EDIT_MULTICASTSOCKETINFORECEIVE)->SendMessage(WM_VSCROLL,SB_BOTTOM,0);
}
void CMulticastSocketReceiveDlg::OnBnClickedCheck1()
{
m_bFJDataShow = !m_bFJDataShow;
}
// 键盘/鼠标消息响应函数
BOOL CMulticastSocketReceiveDlg::PreTranslateMessage(MSG* pMsg)
{
// 键盘消息
if (pMsg->message == WM_KEYDOWN)
{
// 忽略ESC和回车键
if (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN)
{
return TRUE;
}
// F3键控制“组播收数”窗口的现实/隐藏
if (pMsg->wParam == VK_F3)
{
// 关闭窗口
OnOK();
}
}
return CDialogEx::PreTranslateMessage(pMsg);
}
void CMulticastSocketReceiveDlg::OnRadioBtnVideoSrcClicked()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if (0 == m_iVideoSrc)//L链路SPI输出 UDP组播
{
// 显示主机本地IP
GetDlgItem(IDC_EDIT_LOCALIP_RECEIVE)->SetWindowText(str_LocalIP_ReceiveMUDP);
// 设置界面初始显示内容
m_IPAddress_MultiCastIP.SetWindowText(str_MulticastSocketIP);
GetDlgItem(IDC_EDIT_MULTISOCKETPORT_RECEIVE)->SetWindowText("8080");
GetDlgItem(IDC_EDIT_LOCALPORT_RECEIVE)->SetWindowTextA("8082");
}else if (1 == m_iVideoSrc)//卫通视频管理计算机网口输出 UDP单播
{
// 获取主机本地IP并显示
CString str_LocalIP_Receive;
str_LocalIP_Receive = _T("192.168.0.4"); // 界面展示本机卫通IP
GetDlgItem(IDC_EDIT_LOCALIP_RECEIVE)->SetWindowText(str_LocalIP_Receive);
// 设置界面初始显示内容
CString str_RemoteIP_Connect;
str_RemoteIP_Connect = _T("192.168.0.180"); // 界面展示IP
m_IPAddress_MultiCastIP.SetWindowText(str_RemoteIP_Connect);
GetDlgItem(IDC_EDIT_MULTISOCKETPORT_RECEIVE)->SetWindowText("8080");
GetDlgItem(IDC_EDIT_LOCALPORT_RECEIVE)->SetWindowTextA("8080");
}
}
void CMulticastSocketReceiveDlg::CreateUDPSocketReceiveData()
{
//卫通UDP连接
m_nSACUDPSocket.SetCallBack(OnReadFromUDPSACKU, this);
CString strLocalIPAddr;
strLocalIPAddr = _T("192.168.1.20"); // 卫通接受IP
GetDlgItem(IDC_EDIT_LOCALIP_RECEIVE)->GetWindowTextA(strLocalIPAddr);
/*自测用*/
//strLocalIPAddr = _T("172.10.1.183");
//m_strSACUDPIPAddr = _T("172.10.1.183");
//m_nSACUDPLocalPort = 8080;
//m_nSACUDPRemotePort = 8081;
/*自测用*/
m_nSACUDPSocket.SetParams(strLocalIPAddr, m_nSACUDPLocalPort, m_strSACUDPIPAddr, m_nSACUDPRemotePort);
if (m_nSACUDPSocket.StartListening())
{
CString receiverData = "任管数据接收设置成功!";
receiverData += "\r\n";
str_MulticastSocketInfoReceive += receiverData;
// 显示信息
ShowMulticastSocketInfoReceive();
}
else
{
CString receiverData = "任管数据接收设置失败!";
receiverData += "\r\n";
str_MulticastSocketInfoReceive += receiverData;
// 显示信息
ShowMulticastSocketInfoReceive();
}
}
//添加系统串口到组合选择框
void CMulticastSocketReceiveDlg::AddPortNumberToComboBox()
{
int *comPortList = new int[MaxComPortNumber];
memset( comPortList, 0, MaxComPortNumber );
//系统设置的串口数目
int sysSetComNumber = 0;
//获得系统当前的串口数量存于数组comPortList中
BOOL bScanPort = ScanPCCom( comPortList, sysSetComNumber );
m_sysSetComNumber = sysSetComNumber;
if ( !bScanPort ) //读取失败
{
if ( comPortList != NULL )
{
delete[]comPortList;
comPortList = NULL;
}
return;
}
//对数组进行升序排列
OrderComPortList( comPortList, sysSetComNumber );
//写入对话框的CComboBox中
CString str;
for ( int i = 0; i < sysSetComNumber; ++i )
{
str.Format( "串口%d", comPortList[i] );
( ( CComboBox * ) GetDlgItem( IDC_COMBO_PORT_IMP ) )->InsertString( i, str ); //IMP串口号
}
int setComPos = 0;
//配置文件设置
SetComboBoxCurSel( IDC_COMBO_PORT_IMP, comPortList, sysSetComNumber, mComPortIMP );
if ( comPortList != NULL )
{
delete[]comPortList;
comPortList = NULL;
}
}
//添加串口波特率到组合选择框
void CMulticastSocketReceiveDlg::AddBaudNumberToComboBox()
{
int iCount0=( ( CComboBox * ) GetDlgItem( IDC_COMBO_BAUD_IMP ) )->GetCount(); //IMP串口波特率
if(iCount0 < 1)
{
for(int i = 0; i < BAUDITEMNUM; ++i ){
( ( CComboBox * ) GetDlgItem( IDC_COMBO_BAUD_IMP ) )->InsertString( i, gComBaudItems[i] );
}
}
//配置文件设置的SD2串口
SetComboBaudCurSel( IDC_COMBO_BAUD_IMP, gComBaudItems, BAUDITEMNUM, mComBaudIMP );
}
//从配置文件中读取指定串口号
void CMulticastSocketReceiveDlg::SetComboBoxCurSel( int comboBoxID, const int *portArray, const int& arrLength,CString& strPortNumber )
{
if ( strPortNumber.GetLength() <= 4 )
{
strPortNumber = _T( "" );
return;
}
CString initializeComPort = strPortNumber;
initializeComPort.Delete( 0, 4 );
int filePortValue = atoi( initializeComPort );
int setComPos = 0;
if ( FindItemFromComList( setComPos, portArray, arrLength, filePortValue ) )
{
( ( CComboBox * ) GetDlgItem( comboBoxID ) )->SetCurSel( setComPos );
}
else
{
strPortNumber = _T( "" );
}
}
//对串口数组进行升序排列
void CMulticastSocketReceiveDlg::OrderComPortList( int *portArray, const int& arrLength )
{
int portValue = 0;
for ( int i = 0; i < arrLength - 1; ++i )
{
for ( int j = i + 1; j < arrLength; ++j )
{
if ( portArray[i] > portArray[j] )
{
portValue = portArray[i];
portArray[i] = portArray[j];
portArray[j] = portValue;
}
}
}
}
//给指定的波特率组合框设定选择值
void CMulticastSocketReceiveDlg::SetComboBaudCurSel( int comboBoxID, const CString *baudArray, const int& arrLength,CString& strBaudNumber )
{
if ( strBaudNumber.GetLength() <= 0 )
{
strBaudNumber = _T( "" );
return;
}
CString initializeComBaud = strBaudNumber;
initializeComBaud.Trim();
int fileBaudValue = atoi( initializeComBaud );
int setBaudPos = -1;
if ( FindItemFromBaudList( setBaudPos, baudArray, arrLength, fileBaudValue ) )
{
( ( CComboBox * ) GetDlgItem( comboBoxID ) )->SetCurSel( setBaudPos );
}
else
{
strBaudNumber = _T( "" );
}
}
//从波特率列表中查找指定波特率
bool CMulticastSocketReceiveDlg::FindItemFromBaudList( int& pos, const CString *baudArray, const int& arrLength, const int& itemValue )
{
for ( int i = 0; i < arrLength; ++i )
{
if ( itemValue == atoi((baudArray[i])) )
{
pos = i;
return true;
}
}
return false;
}
//IMP通信串口选择后触发
void CMulticastSocketReceiveDlg::OnCbnSelchangePortIMP()
{
UpdateData( true );
//判断该串口是否已经被占用
if ( !CheckComPortCanWork( mComPortIMP ) )
{
( ( CComboBox * ) GetDlgItem( IDC_COMBO_PORT_IMP ) )->SetCurSel( -1 );
}
}
//IMP通信串口波特率选择后触发
void CMulticastSocketReceiveDlg::OnCbnSelchangeBaudIMP()
{
UpdateData( true );
//判断该串口是否已经被占用
if ( !CheckComPortCanWork( mComPortIMP ) )
{
( ( CComboBox * ) GetDlgItem( IDC_COMBO_BAUD_IMP ) )->SetCurSel( -1 );
}
}
void CMulticastSocketReceiveDlg::OnBnClickedBtnImpSerialConnect()
{
// TODO: 在此添加控件通知处理程序代码
GetDlgItem(IDC_BTN_IMP_SERIAL_CONNECT)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_IMP_SERIAL_DISCONNECT)->EnableWindow(TRUE);
::SendMessageA(g_IMPDLGhwnd,WM_UPDATE_IMP_SERIAL_CONNECT,(WPARAM)mComPortIMP.AllocSysString(), (LPARAM)mComBaudIMP.AllocSysString());
}
void CMulticastSocketReceiveDlg::OnBnClickedBtnImpSerialDisconnect()
{
// TODO: 在此添加控件通知处理程序代码
GetDlgItem(IDC_BTN_IMP_SERIAL_CONNECT)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_IMP_SERIAL_DISCONNECT)->EnableWindow(FALSE);
::SendMessageA(g_IMPDLGhwnd,WM_UPDATE_IMP_SERIAL_CONNECT,(WPARAM)mComPortIMP.AllocSysString(), (LPARAM)mComBaudIMP.AllocSysString());
}
void CMulticastSocketReceiveDlg::OnBnClickedRadioDc13ins()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
DCTypeSelected_video = 0;
//switch(m_DCvideoTypeSelct)
//{
//case 0:
// DCTypeSelected_video =0;
// break;
//case 1:
// DCTypeSelected_video =1;
// break;
//case 2:
// DCTypeSelected_video =2;
// break;
//default:
// DCTypeSelected_video =0;
//}
((CButton *)GetDlgItem(IDC_RADIO_DC_13Ins))->SetCheck(true);
((CButton *)GetDlgItem(IDC_RADIO_DC_WHTJ))->SetCheck(false);
((CButton *)GetDlgItem(IDC_RADIO_H264Data))->SetCheck(false);
}
void CMulticastSocketReceiveDlg::OnBnClickedRadioDcWhtj()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
DCTypeSelected_video = 1;
((CButton *)GetDlgItem(IDC_RADIO_DC_13Ins))->SetCheck(false);
((CButton *)GetDlgItem(IDC_RADIO_DC_WHTJ))->SetCheck(true);
((CButton *)GetDlgItem(IDC_RADIO_H264Data))->SetCheck(false);
}
void CMulticastSocketReceiveDlg::OnBnClickedRadioH264data()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
DCTypeSelected_video = 2;
((CButton *)GetDlgItem(IDC_RADIO_DC_13Ins))->SetCheck(false);
((CButton *)GetDlgItem(IDC_RADIO_DC_WHTJ))->SetCheck(false);
((CButton *)GetDlgItem(IDC_RADIO_H264Data))->SetCheck(true);
}

@ -0,0 +1,115 @@
#pragma once
#include "MulticastSocket.h"
#include "ExportSimpleImgShow.h"
#include "CUDPSocket.h"
#include "BtnST.h"
#include "EditInput.h"
#include "Serial.h"
#include "afxwin.h"
#include "afxcmn.h"
#include "opencv2/core/core.hpp"
#include "ComControlFunction.h"
// CMulticastSocketReceiveDlg 对话框
class CMulticastSocketReceiveDlg : public CDialogEx
{
DECLARE_DYNAMIC(CMulticastSocketReceiveDlg)
public:
CMulticastSocketReceiveDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CMulticastSocketReceiveDlg();
// 对话框数据
enum { IDD = IDD_DLG_MULTICASTSOCKETRECEIVE };
public:
// 显示组播接收信息
CString str_MulticastSocketInfoReceive;
// 设置IR组播端口
UINT m_MulticastSocketPortFH96Data;
// 设置组播IP
CString str_MulticastSocketIP;
CString str_LocalIP_ReceiveMUDP;
CIPAddressCtrl m_IPAddress_MultiCastIP; //组播 //网络IP
// WinSoc
HANDLE m_hThread_GetFH96DataFromNet;
DWORD m_ThreadID_GetFH96DataFromNet;
// 设置位置组播接收
CMulticastSocket m_MulticastSocketLocation; // 组播接收——位置信息
//FJ数据开关
BOOL m_bFJDataShow;
CString m_strServerPayLoadIPSend; //服务器发数IP地址
int m_nServerSendLocalPort; //服务器发数本地端口
int m_nServerSendObjectPort; //服务器发数远端端口
//L测控
CString m_strLLinkMultiCastIP; //L测控组播IP
int m_nLLinkMulticastPort; //L测控组播收数端口
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedBtnMultisocketConnect();
void CreateMulticastSocketFH96Data();
void SetUpWinSocketFH96Data();
void ShowMulticastSocketInfoReceive();
void GetHostAddress(CString &strIP);
afx_msg void OnBnClickedBtnMultisocketDisconnect();
void ShowMulticastSocketInfo();
// 显示FJ数据各字节内容
LRESULT ShowCH96FJData(WPARAM wParam, LPARAM lParam);
afx_msg void OnBnClickedCheck1();
virtual BOOL PreTranslateMessage(MSG* pMsg);
// 视频数据源
int m_iVideoSrc;
afx_msg void OnRadioBtnVideoSrcClicked();
//卫通组播
CString m_strSACMulticastIPAddr; //卫通组播IP地址
int m_nSACMulticastRemotePort; //卫通组播收数端口
//卫通UDP单播
CString m_strSACUDPIPAddr; //卫通UDP单播IP地址
int m_nSACUDPRemotePort; //卫通UDP单播远端端口
int m_nSACUDPLocalPort; //卫通UDP单播本地端口
CUDPSocket m_nSACUDPSocket; //卫通UDP通信套接字
void CreateUDPSocketReceiveData(); //卫通UDP数据通信创建
//IMP
CString mComPortIMP; //IMP通信串口号
CString mComBaudIMP; //IMP通信串口波特率
//const int MaxComPortNumber = 1024;
//const unsigned BAUDITEMNUM = 10; //波特率数目
//const unsigned NCOUNTER = 500; //失败尝试次数
private:
//添加系统串口到组合选择框
void AddPortNumberToComboBox();
void SetComboBoxCurSel( int comboBoxID, const int *portArray, const int& arrLength, CString& strPortNumber );
void SetComboBaudCurSel( int comboBoxID, const CString *baudArray, const int& arrLength, CString& strBaudNumber );
bool FindItemFromBaudList( int& pos, const CString *baudArray, const int& arrLength, const int& itemValue );
void AddBaudNumberToComboBox();
void OrderComPortList( int *portArray, const int& arrLength );
public:
afx_msg void OnCbnSelchangePortIMP();//串口号选择触发函数
afx_msg void OnCbnSelchangeBaudIMP();//串口波特率选择触发函数
private:
int m_sysSetComNumber; //串口数
public:
afx_msg void OnBnClickedBtnImpSerialConnect();
afx_msg void OnBnClickedBtnImpSerialDisconnect();
afx_msg void OnBnClickedRadioDc13ins();//吊舱类型选择-13所吊舱
afx_msg void OnBnClickedRadioDcWhtj();//吊舱类型选择-武汉天进吊舱
afx_msg void OnBnClickedRadioH264data();//吊舱类型选择-h264数据
int m_DCvideoTypeSelct;
};

@ -0,0 +1,41 @@
/*
The zlib/libpng License
Copyright (c) 2005-2007 Phillip Castaneda (pjcast -- www.wreckedgames.com)
This software is provided 'as-is', without any express or implied warranty. In no event will
the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, including commercial
applications, and to alter it and redistribute it freely, subject to the following
restrictions:
1. The origin of this software must not be misrepresented; you must not claim that
you wrote the original software. If you use this software in a product,
an acknowledgment in the product documentation would be appreciated but is
not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#ifndef OIS_OISALL_H
#define OIS_OISALL_H
#include "OISPrereqs.h"
#include "OISObject.h"
#include "OISMouse.h"
#include "OISKeyboard.h"
#include "OISJoyStick.h"
#include "OISMultiTouch.h"
#include "OISInputManager.h"
#include "OISFactoryCreator.h"
#include "OISException.h"
#include "OISEvents.h"
#include "OISEffect.h"
#include "OISInterface.h"
#include "OISForceFeedback.h"
#endif

@ -0,0 +1,75 @@
/*
The zlib/libpng License
Copyright (c) 2005-2007 Phillip Castaneda (pjcast -- www.wreckedgames.com)
This software is provided 'as-is', without any express or implied warranty. In no event will
the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, including commercial
applications, and to alter it and redistribute it freely, subject to the following
restrictions:
1. The origin of this software must not be misrepresented; you must not claim that
you wrote the original software. If you use this software in a product,
an acknowledgment in the product documentation would be appreciated but is
not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#ifndef OIS_CONFIG_HEADER
#define OIS_CONFIG_HEADER
//----------------------------------------------------------------------------//
//* This file contains defines for building certain parts of this Lib
//* This file is not meant for External inclusion. However, you can edit this
//* file before a build to effect what features are used internally
//----------------------------------------------------------------------------//
/**
@remarks
These lines have no bearing on internal build of OIS. This is here for
external build settings. Meaning, changing this does not require a
rebuild of OIS. This just affects VC dll import settings, as the DLL
build already defines this during its build for setting dll exports.
The undefine here is here just incase you decide to only use
DLL, and want to set it permently and recompile OIS too.. Avoid redefinition
from DLL build of OIS.
So, if wanting to link against DLL version, just uncomment these lines.
*/
//#ifdef OIS_DYNAMIC_LIB
//# undef OIS_DYNAMIC_LIB
//#endif
//#define OIS_DYNAMIC_LIB
/**
@remarks
Build in support for LIRC / WinLIRC - remote control support.
Requires Boost::asio
@notes
Experimental - Supports connecting and enumerating. Control does not
yet return state or events
*/
//#define OIS_LIRC_SUPPORT
/**
@remarks
Build in support for PC Nintendo WiiMote Win32 HID interface.
Requires Boost::threads
@notes
Useable, but not quite finished - supports rumble, all buttons, & main orientation axis.
Still needs Nunchuck, IR, and LED/Battery support.
*/
//#define OIS_WIN32_WIIMOTE_SUPPORT
/**
@remarks
Build in support for Win32 XInput (Xbox 360 Controller)
*/
//#define OIS_WIN32_XINPUT_SUPPORT
#endif

@ -0,0 +1,278 @@
/*
The zlib/libpng License
Copyright (c) 2005-2007 Phillip Castaneda (pjcast -- www.wreckedgames.com)
This software is provided 'as-is', without any express or implied warranty. In no event will
the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, including commercial
applications, and to alter it and redistribute it freely, subject to the following
restrictions:
1. The origin of this software must not be misrepresented; you must not claim that
you wrote the original software. If you use this software in a product,
an acknowledgment in the product documentation would be appreciated but is
not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#ifndef OIS_Effect_H
#define OIS_Effect_H
#include "OISPrereqs.h"
namespace OIS
{
//Predeclare some Effect Property structs
class ForceEffect;
class ConstantEffect;
class RampEffect;
class PeriodicEffect;
class ConditionalEffect;
/**
Force Feedback is a relatively complex set of properties to upload to a device.
The best place for information on the different properties, effects, etc is in
the DX Documentation and MSDN - there are even pretty graphs ther =)
As this class is modeled on the the DX interface you can apply that same
knowledge to creating effects via this class on any OS supported by OIS.
In anycase, this is the main class you will be using. There is *absolutely* no
need to instance any of the supporting ForceEffect classes yourself.
*/
class _OISExport Effect
{
public:
//! Type of force
enum EForce
{
UnknownForce = 0,
ConstantForce,
RampForce,
PeriodicForce,
ConditionalForce,
CustomForce,
_ForcesNumber // Always keep in last position.
};
static const char* getForceTypeName(EForce eValue);
//! Type of effect
enum EType
{
//Type ----- Pairs with force:
Unknown = 0, //UnknownForce
Constant, //ConstantForce
Ramp, //RampForce
Square, //PeriodicForce
Triangle, //PeriodicForce
Sine, //PeriodicForce
SawToothUp, //PeriodicForce
SawToothDown,//PeriodicForce
Friction, //ConditionalForce
Damper, //ConditionalForce
Inertia, //ConditionalForce
Spring, //ConditionalForce
Custom, //CustomForce
_TypesNumber // Always keep in last position.
};
static const char* getEffectTypeName(EType eValue);
//! Direction of the Force
enum EDirection
{
NorthWest,
North,
NorthEast,
East,
SouthEast,
South,
SouthWest,
West,
_DirectionsNumber // Always keep in last position.
};
static const char* getDirectionName(EDirection eValue);
/**
This constructor allows you to set the force type and effect.
*/
Effect(EForce ef, EType et);
virtual ~Effect();
const EForce force;
const EType type;
//Infinite Time
static const unsigned int OIS_INFINITE = 0xFFFFFFFF;
//-------------------------------------------------------------------//
//--- Set these variables before uploading or modifying an effect ---//
//Direction to apply to the force - affects two axes+ effects
EDirection direction;
//Number of button triggering an effect (-1 means no trigger)
short trigger_button;
//Time to wait before an effect can be re-triggered (microseconds)
unsigned int trigger_interval;
//Duration of an effect (microseconds)
unsigned int replay_length;
//Time to wait before to start playing an effect (microseconds)
unsigned int replay_delay;
//Get the specific Force Effect. This should be cast depending on the EForce
ForceEffect* getForceEffect() const;
/**
@remarks
Set the number of Axes to use before the initial creation of the effect.
Can only be done prior to creation! Use the FF interface to determine
how many axes can be used (are availiable)
*/
void setNumAxes(short nAxes);
/**
@remarks
Returns the number of axes used in this effect
*/
short getNumAxes() const;
//------------- Library Internal -------------------------------------//
/**
set internally.. do not change or you will not be able to upload/stop
this effect any more. It will become lost. It is mutable so even
with const reference it can/will be changed by this lib
*/
mutable int _handle;
protected:
// Prevent copying.
Effect(const Effect&);
Effect& operator=(Effect);
ForceEffect* effect; //Properties depend on EForce
short axes; //Number of axes to use in effect
};
//-----------------------------------------------------------------------------//
/**
Base class of all effect property classes
*/
class _OISExport ForceEffect
{
public:
virtual ~ForceEffect() {}
};
//-----------------------------------------------------------------------------//
/**
An optional envelope to be applied to the start/end of an effect. If any of
these values are nonzero, then the envelope will be used in setting up the
effect.
*/
class _OISExport Envelope : public ForceEffect
{
public:
Envelope() : attackLength(0), attackLevel(0), fadeLength(0), fadeLevel(0) {}
#if defined(OIS_MSVC_COMPILER)
#pragma warning (push)
#pragma warning (disable : 4800)
#endif
bool isUsed() const { return attackLength | attackLevel | fadeLength | fadeLevel; }
#if defined(OIS_MSVC_COMPILER)
#pragma warning (pop)
#endif
// Duration of the attack (microseconds)
unsigned int attackLength;
// Absolute level at the beginning of the attack (0 to 10K)
// (automatically signed when necessary by FF core according to effect level sign)
unsigned short attackLevel;
// Duration of fade (microseconds)
unsigned int fadeLength;
// Absolute level at the end of fade (0 to 10K)
// (automatically signed when necessary by FF core according to effect level sign)
unsigned short fadeLevel;
};
//-----------------------------------------------------------------------------//
/**
Use this class when dealing with Force type of Constant
*/
class _OISExport ConstantEffect : public ForceEffect
{
public:
ConstantEffect() : level(5000) {}
Envelope envelope; //Optional envolope
signed short level; //-10K to +10k
};
//-----------------------------------------------------------------------------//
/**
Use this class when dealing with Force type of Ramp
*/
class _OISExport RampEffect : public ForceEffect
{
public:
RampEffect() : startLevel(0), endLevel(0) {}
Envelope envelope; //Optional envelope
signed short startLevel; //-10K to +10k
signed short endLevel; //-10K to +10k
};
//-----------------------------------------------------------------------------//
/**
Use this class when dealing with Force type of Periodic
*/
class _OISExport PeriodicEffect : public ForceEffect
{
public:
PeriodicEffect() : magnitude(0), offset(0), phase(0), period(0) {}
Envelope envelope; //Optional Envelope
unsigned short magnitude; //0 to 10,0000
signed short offset;
unsigned short phase; //Position at which playback begins 0 to 35,999
unsigned int period; //Period of effect (microseconds)
};
//-----------------------------------------------------------------------------//
/**
Use this class when dealing with Force type of Condional
*/
class _OISExport ConditionalEffect : public ForceEffect
{
public:
ConditionalEffect() :
rightCoeff(0), leftCoeff(0), rightSaturation(0), leftSaturation(0),
deadband(0), center(0) {}
signed short rightCoeff; //-10k to +10k (Positive Coeff)
signed short leftCoeff; //-10k to +10k (Negative Coeff)
unsigned short rightSaturation; //0 to 10k (Pos Saturation)
unsigned short leftSaturation; //0 to 10k (Neg Saturation)
//Region around center in which the condition is not active, in the range
//from 0 through 10,000
unsigned short deadband;
//(Offset in DX) -10k and 10k
signed short center;
};
}
#endif //OIS_Effect_H

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save