zoulei 1 year ago
parent
commit
66e0163163

BIN
XdCxRhDW.DataEmulation/AddIns/SignalEmulation.dll


+ 273 - 0
XdCxRhDW.DataEmulation/AddIns/SignalEmulation.h

@@ -0,0 +1,273 @@
+#pragma once
+
+#ifndef _WIN32			//linux
+#ifndef DECL_EXPORT
+#    define DECL_EXPORT     __attribute__((visibility("default")))
+#endif
+#ifndef DECL_IMPORT
+#    define DECL_IMPORT     __attribute__((visibility("default")))
+#endif
+#else					//Windows
+#ifndef DECL_EXPORT
+#    define DECL_EXPORT     __declspec(dllexport)
+#endif
+#ifndef DECL_IMPORT
+#    define DECL_IMPORT     __declspec(dllimport)
+#endif
+#endif
+
+#ifdef SignalEmulation_Lib
+#define SignalEmulation_EXPORT DECL_EXPORT
+#else
+#define SignalEmulation_EXPORT DECL_IMPORT
+#endif
+
+
+extern "C"
+{
+	// 根据卫星 接收站位置 目标位置 推算
+	// pos1 xyz	3
+	// pos2 xyz	3
+	// recv1 lla 3
+	// recv2 lla 3
+	// tar lla 3 * n
+	// tarCount  n
+	// deltaT n
+	void genDeltaT(double *pos1, double *pos2, double *recv1, double *recv2, double *tar, int tarCount, double *deltaT);
+
+	// 生成psk调整信号
+	// x 输入符号
+	// len 符号长度
+	// mode alphabet size 2^N (1,2,3,4)
+	// phase	initial phase   
+	// Amplify		幅度
+	// N	升采样系数  >= 0
+	void pskMod(int *x, int len, int mode, double phase, int Amplify, int N, double *y, int &olen);
+
+	// 添加高斯白噪声
+	// sig IQ信号
+	// len 信号个数 
+	// sigPower  signal power in dBW  < 0 表示需要进行测量
+	// reqSNR
+	void awgn(double *sig, int len, double sigPower, double reqSNR);
+
+	// 添加高斯白噪声
+	// sig IQ信号
+	// len 信号个数 
+	// sigPower  signal power in dBW  < 0 表示需要进行测量
+	// reqSNR
+	void awgnComplex(double *sig, int len, double sigPower, double reqSNR);
+
+	//生成升余弦滤波器
+	// mode =0  normal
+	// delay = span*sps/2;
+	// t = (-delay:delay) / sps;
+	//  denom = (1-(2*beta*t).^2);
+	//  sinc(t(idx1)).*(cos(pi*beta*t(idx1))./denom(idx1))/sps;
+	// mod = 1  sqrt  暂未实现
+	//
+	double *rcosdesign(double beta, int span, int sps, int mode, int &len);
+
+	// 根据参数生成一组目标信号
+	// major_sat 主星星历 xyz
+	// minor_sat 邻星星历 xyz
+	// majorRecv 主星接收站  lla
+	// minorRecv 邻星接收站	 lla
+	// tarPos	 目标位置	 lla	
+	// ------------------------
+	// fsample		生成信号采样率
+	// tlenms		生成信号时长 ms
+	// fmajor		生成信号主星文件名称
+	// fminor		生成信号邻星文件名称
+	//
+	SignalEmulation_EXPORT void genSatSignal(double majorSat[3], double minorSat[3], double majorRecv[3], double minorRecv[3], double tarPos[3]
+		, __int64 fsample, int tlenms, char *fmajor, char *fminor, double *res);
+
+	// 根据参数生成一组目标信号
+	// major_sat 主星星历 xyz
+	// minor_sat1 邻星星历 xyz
+	// minor_sat2 邻星星历 xyz
+	// majorRecv 主星接收站  lla
+	// minorRecv1 邻星接收站 lla
+	// minorRecv2 邻星接收站 lla
+	// tarPos	 目标位置	 lla	
+	// ------------------------
+	// fsample		生成信号采样率
+	// tlenms		生成信号时长  ms
+	// dtErrRange   误差范围, 根据该值 生成一个随机误差 单位us
+	// fmajor		生成信号主星文件名称
+	// fminor1		生成信号邻星文件名称
+	// fminor2		生成信号邻星文件名称
+	//
+	SignalEmulation_EXPORT void genSatSignals(double majorSat[3], double minorSat1[3], double minorSat2[3]
+		, double majorRecv[3], double minorRecv1[3], double minorRecv2[3]
+		, double tarPos[3], __int64 fsample, int tlenms, int dtErrRange, double df[2]
+		, char *fmajor, char *fminor1, char *fminor2, double *res);
+
+	// 根据参数生成一组目标信号
+	// major_sat 主星星历 xyz
+	// minor_sat1 邻星星历 xyz
+	// minor_sat2 邻星星历 xyz
+	// majorRecv 主星接收站  lla
+	// minorRecv1 邻星接收站 lla
+	// minorRecv2 邻星接收站 lla
+	// tarPos	 目标位置	 lla	
+	// refPos	 目标位置	 lla	
+	// ------------------------
+	// fsample		生成信号采样率
+	// tlenms			生成信号时长   ms
+	// dtErrRange   误差范围, 根据该值 生成一个随机误差 单位us
+	// fmajor		生成信号主星文件名称
+	// fminor1		生成信号邻星文件名称
+	// fminor2		生成信号邻星文件名称
+	// frmajor		生成参考信号主星文件名称
+	// frminor1		生成参考信号邻星文件名称
+	// frminor2		生成参考信号邻星文件名称
+	// res 长度4 目标参考对应的时差
+	//
+	SignalEmulation_EXPORT void genSatSignalsWithRef(double majorSat[3], double minorSat1[3], double minorSat2[3]
+		, double majorRecv[3], double minorRecv1[3], double minorRecv2[3]
+		, double tarPos[3], double refPos[3], __int64 fsample, __int64 fsampleref, int tlenms, int dtErrRange, double df[4]
+		, char *fmajor, char *fminor1, char *fminor2
+		, char *frmajor, char *frminor1, char *frminor2
+		, double *res);
+
+	///
+	/// 根据给定文件生成其对应的时差文件
+	/// fIn		输入文件	
+	/// fOut	输出文件
+	/// fsample 采样率
+	/// dt		时差
+	/// df		频差
+	///
+	SignalEmulation_EXPORT void genSignalWithDtDf(char *fIn, char *fOut, __int64 fsample, double dt, double df);
+
+	///
+	/// 根据给定时频差生成信号
+	/// f1		主星文件	
+	/// f2		邻星文件
+	/// fsample 采样率
+	// tlenms			生成信号时长   ms
+	/// dt		时差
+	/// df		频差
+	///
+	SignalEmulation_EXPORT void genSignalsWithDtDf(char *file1, char *file2, __int64 fsample, int tlenms, double dt, double df);
+
+	///
+	/// 该函数用于合并两个信号到一个新的文件
+	///	两个信号文件必须是相同的采样率, 如果两个文件不一样长,最后生成的数据以较短的文件时长为准
+	/// 
+	///	infsample:		输出文件的采样率
+	///					输入文件为复采样文件
+	///	sigfile1:		输入文件1
+	/// outffc1:		输入文件1 在输出文件的中频位置			
+	///					请确保  outffc1 - infsample/2 >= -outfsample/2 && outffc1 + infsample/2 <= outfsample/2 否则将会返回错误
+	///	sigfile2:		输入文件2
+	/// outffc2:		输入文件2 在输出文件的中频位置
+	///					请确保  outffc2 - infsample/2 >= -outfsample/2 && outffc2 + infsample/2 <= outfsample/2 否则将会返回错误
+	///					请确保 [outffc1 - infsample/2, outffc1 + infsample/2] 与 [outffc2 - infsample/2, outffc2 + infsample/2] 无交集 否则将返回错误
+	/// outfsample:		输出文件采样率
+	///					请确保  outfsample = infsample * 2^N (N为正整数)
+	/// outfile:		输出文件名称,如果输出文件存在将覆盖
+	///					输出文件为复采样文件 IQ
+	///	return:			返回值:0 成功
+	///							1 输入/输出文件不合法或者无法打开
+	///							2 输入文件太小 必须大于0.1秒对应的数据
+	///							3 outffc1,2 不合法
+	///							4 outffc1,outffc2 存在交集
+	///							5 输入输出采样率不满足规则
+	///
+	SignalEmulation_EXPORT int mergeSignals(__int64 infsample, char *sigfile1, __int64 outffc1, char *sigfile2, __int64 outffc2, __int64 outfsample, char *outfile);
+
+	///
+	/// 该函数用于合并两个信号到一个新的文件
+	///	两个信号文件必须是相同的采样率, 如果两个文件不一样长,最后生成的数据以较短的文件时长为准
+	/// 
+	///	infsample:		输出文件的采样率
+	///					输入文件为复采样文件
+	///	sigfile1:		输入文件1
+	/// outffc1:		输入文件1 在输出文件的中频位置			
+	///					请确保  outffc1 - infsample/2 >= -outfsample/2 && outffc1 + infsample/2 <= outfsample/2 否则将会返回错误
+	///	sigfile2:		输入文件2
+	/// outffc2:		输入文件2 在输出文件的中频位置
+	///					请确保  outffc2 - infsample/2 >= -outfsample/2 && outffc2 + infsample/2 <= outfsample/2 否则将会返回错误
+	///	sigfile3:		输入文件3
+	/// outffc3:		输入文件3 在输出文件的中频位置
+	///					请确保  outffc3 - infsample/2 >= -outfsample/2 && outffc3 + infsample/2 <= outfsample/2 否则将会返回错误
+	///					请确保 [outffc1 - infsample/2, outffc1 + infsample/2] , [outffc2 - infsample/2, outffc2 + infsample/2] , [outffc2 - infsample/2, outffc2 + infsample/2]无交集 否则将返回错误
+	/// outfsample:		输出文件采样率
+	///					请确保  outfsample = infsample * 2^N (N为正整数)
+	/// outfile:		输出文件名称,如果输出文件存在将覆盖
+	///					输出文件为复采样文件 IQ
+	///	return:			返回值:0 成功
+	///							1 输入/输出文件不合法或者无法打开
+	///							2 输入文件太小 必须大于0.1秒对应的数据
+	///							3 outffc1,2,3 不合法
+	///							4 outffc1,outffc2,outffc3 存在交集
+	///							5 输入输出采样率不满足规则
+	///
+	SignalEmulation_EXPORT int mergeSignalsEx(__int64 infsample, char *sigfile1, __int64 outffc1, char *sigfile2, __int64 outffc2, char *sigfile3, __int64 outffc3, __int64 outfsample, char *outfile);
+
+
+	///
+	/// 该函数用于合并两个信号到一个新的文件
+	///	三个信号文件必须是相同的采样率, 如果三个文件不一样长,最后生成的数据以较短的文件时长为准
+	/// 
+	///	infsample:		输出文件的采样率
+	///					输入文件为复采样文件
+	///	sigfile1:		输入文件1
+	/// outffc1:		输入文件1 在输出文件的中频位置			
+	///					请确保  outffc1 - infsample/2 >= -outfsample/2 && outffc1 + infsample/2 <= outfsample/2 否则将会返回错误
+	///	sigfile2:		输入文件2
+	/// outffc2:		输入文件2 在输出文件的中频位置
+	///					请确保  outffc2 - infsample/2 >= -outfsample/2 && outffc2 + infsample/2 <= outfsample/2 否则将会返回错误
+	///	sigfile3:		输入文件3
+	/// outffc3:		输入文件3 在输出文件的中频位置
+	///					请确保  outffc3 - infsample/2 >= -outfsample/2 && outffc3 + infsample/2 <= outfsample/2 否则将会返回错误
+	///					请确保 [outffc1 - infsample/2, outffc1 + infsample/2] , [outffc2 - infsample/2, outffc2 + infsample/2] , [outffc2 - infsample/2, outffc2 + infsample/2]无交集 否则将返回错误
+	/// outfsample:		输出文件采样率
+	///					请确保  outfsample = infsample * N  (N为正整数 and N > 3)
+	/// outfile:		输出文件名称,如果输出文件存在将覆盖
+	///					输出文件为复采样文件 IQ
+	///	return:			返回值:0 成功
+	///							1 输入/输出文件不合法或者无法打开
+	///							2 输入文件太小 必须大于0.1秒对应的数据
+	///							3 outffc1,2,3 不合法
+	///							4 outffc1,outffc2,outffc3 存在交集
+	///							5 输入输出采样率不满足规则
+	///
+	SignalEmulation_EXPORT int mergeSignalsEx_MN(__int64 infsample, char *sigfile1, __int64 outffc1, char *sigfile2, __int64 outffc2, char *sigfile3, __int64 outffc3, __int64 outfsample, char *outfile);
+
+
+	///
+	/// 该函数用于合并两个信号到一个新的文件
+	///	三个信号文件必须是相同的采样率, 如果三个文件不一样长,最后生成的数据以较短的文件时长为准
+	/// 
+	///	infsample:		输出文件的采样率 
+	///					确保infsample %(outfsample /  3062500)==0
+	///					输入文件为复采样文件
+	///	sigfile1:		输入文件1
+	/// outffc1:		输入文件1 在输出文件的中频位置			
+	///					请确保  outffc1 - infsample/2 >= -outfsample/2 && outffc1 + infsample/2 <= outfsample/2 否则将会返回错误
+	///	sigfile2:		输入文件2
+	/// outffc2:		输入文件2 在输出文件的中频位置
+	///					请确保  outffc2 - infsample/2 >= -outfsample/2 && outffc2 + infsample/2 <= outfsample/2 否则将会返回错误
+	///	sigfile3:		输入文件3
+	/// outffc3:		输入文件3 在输出文件的中频位置
+	///					请确保  outffc3 - infsample/2 >= -outfsample/2 && outffc3 + infsample/2 <= outfsample/2 否则将会返回错误
+	///					请确保 [outffc1 - infsample/2, outffc1 + infsample/2] , [outffc2 - infsample/2, outffc2 + infsample/2] , [outffc2 - infsample/2, outffc2 + infsample/2]无交集 否则将返回错误
+	/// outfsample:		输出文件采样率  3062500 的倍数
+	/// outfile:		输出文件名称,如果输出文件存在将覆盖
+	///					输出文件为复采样文件 IQ
+	///	return:			返回值:0 成功
+	///							1 输入/输出文件不合法或者无法打开
+	///							2 输入文件太小 必须大于0.1秒对应的数据
+	///							3 outffc1,2,3 不合法
+	///							4 outffc1,outffc2,outffc3 存在交集
+	///							5 输入输出采样率不满足规则
+	///								1.outfsample %  3062500 == 0
+	///								2.infsample %(outfsample /  3062500)==0
+	///								3.outfsample / infsample > 3
+	///
+	SignalEmulation_EXPORT int mergeSignalsEx_M(__int64 infsample, char *sigfile1, __int64 outffc1, char *sigfile2, __int64 outffc2, char *sigfile3, __int64 outffc3, __int64 outfsample, char *outfile);
+};

BIN
XdCxRhDW.DataEmulation/AddIns/ippcore-9.0.dll


BIN
XdCxRhDW.DataEmulation/AddIns/ipps-9.0.dll


BIN
XdCxRhDW.DataEmulation/AddIns/ippsy8-9.0.dll


+ 21 - 0
XdCxRhDW.DataEmulation/App.config

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <configSections>
+    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System">
+      <section name="DevExpress.LookAndFeel.Design.AppSettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+    </sectionGroup>
+  </configSections>
+  <applicationSettings>
+    <DevExpress.LookAndFeel.Design.AppSettings>
+      <setting name="DPIAwarenessMode" serializeAs="String">
+        <value>System</value>
+      </setting>
+      <setting name="RegisterBonusSkins" serializeAs="String">
+        <value>True</value>
+      </setting>
+    </DevExpress.LookAndFeel.Design.AppSettings>
+  </applicationSettings>
+  <startup>
+    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
+  </startup>
+</configuration>

+ 33 - 0
XdCxRhDW.DataEmulation/DataEmulationHelper.cs

@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace XdCxRhDW.DataEmulation
+{
+    public static class DataEmulationHelper
+    {
+        private const string dll = @"AddIns\SignalEmulation.dll";
+
+        #region cpp dll Interop 
+        [DllImport(dll, EntryPoint = "genSignalsWithDtDf", CallingConvention = CallingConvention.Cdecl)]
+        private extern static void GenSignalsWithDtDfCore(string file1, string file2, long fsHz, int sigLenMs, double dt, double df);
+        #endregion
+
+        /// <summary>
+        /// 时频差信号文件仿真
+        /// </summary>
+        /// <param name="file1">输出文件1</param>
+        /// <param name="file2">输出文件2</param>
+        /// <param name="fsHz">采样率Hz</param>
+        /// <param name="sigLenMs">信号时长秒</param>
+        /// <param name="dt">时差秒</param>
+        /// <param name="df">频差Hz</param>
+        public static void GenSignalsWithDtDf(string file1,string file2,long fsHz,int sigLenMs,double dt,double df)
+        {
+            GenSignalsWithDtDfCore(file1, file2, fsHz, sigLenMs, dt, df);
+        }
+    }
+}

+ 403 - 0
XdCxRhDW.DataEmulation/Form1.Designer.cs

@@ -0,0 +1,403 @@
+namespace XdCxRhDW.DataEmulation
+{
+    partial class Form1
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            DevExpress.XtraEditors.Controls.EditorButtonImageOptions editorButtonImageOptions4 = new DevExpress.XtraEditors.Controls.EditorButtonImageOptions();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject13 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject14 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject15 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject16 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.XtraEditors.Controls.EditorButtonImageOptions editorButtonImageOptions5 = new DevExpress.XtraEditors.Controls.EditorButtonImageOptions();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject17 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject18 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject19 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject20 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.XtraEditors.Controls.EditorButtonImageOptions editorButtonImageOptions1 = new DevExpress.XtraEditors.Controls.EditorButtonImageOptions();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject1 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject2 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject3 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject4 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.XtraEditors.Controls.EditorButtonImageOptions editorButtonImageOptions2 = new DevExpress.XtraEditors.Controls.EditorButtonImageOptions();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject5 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject6 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject7 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject8 = new DevExpress.Utils.SerializableAppearanceObject();
+            this.layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
+            this.Root = new DevExpress.XtraLayout.LayoutControlGroup();
+            this.txtFile1 = new DevExpress.XtraEditors.TextEdit();
+            this.layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.txtFile2 = new DevExpress.XtraEditors.TextEdit();
+            this.layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.txtFsHz = new DevExpress.XtraEditors.ButtonEdit();
+            this.layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.txtSigLen = new DevExpress.XtraEditors.ButtonEdit();
+            this.layoutControlItem4 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.txtDto = new DevExpress.XtraEditors.ButtonEdit();
+            this.layoutControlItem5 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.txtDfo = new DevExpress.XtraEditors.ButtonEdit();
+            this.layoutControlItem6 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.btnBuilder = new DevExpress.XtraEditors.SimpleButton();
+            this.layoutControlItem7 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.layoutControlGroup1 = new DevExpress.XtraLayout.LayoutControlGroup();
+            this.btnOpenDir = new DevExpress.XtraEditors.SimpleButton();
+            this.layoutControlItem8 = new DevExpress.XtraLayout.LayoutControlItem();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControl1)).BeginInit();
+            this.layoutControl1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.Root)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtFile1.Properties)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtFile2.Properties)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtFsHz.Properties)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem3)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtSigLen.Properties)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem4)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtDto.Properties)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem5)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtDfo.Properties)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem6)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem7)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem8)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // layoutControl1
+            // 
+            this.layoutControl1.Controls.Add(this.btnOpenDir);
+            this.layoutControl1.Controls.Add(this.btnBuilder);
+            this.layoutControl1.Controls.Add(this.txtFsHz);
+            this.layoutControl1.Controls.Add(this.txtFile2);
+            this.layoutControl1.Controls.Add(this.txtFile1);
+            this.layoutControl1.Controls.Add(this.txtSigLen);
+            this.layoutControl1.Controls.Add(this.txtDto);
+            this.layoutControl1.Controls.Add(this.txtDfo);
+            this.layoutControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.layoutControl1.Location = new System.Drawing.Point(0, 0);
+            this.layoutControl1.Name = "layoutControl1";
+            this.layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new System.Drawing.Rectangle(1113, 199, 650, 400);
+            this.layoutControl1.Root = this.Root;
+            this.layoutControl1.Size = new System.Drawing.Size(289, 388);
+            this.layoutControl1.TabIndex = 0;
+            this.layoutControl1.Text = "layoutControl1";
+            // 
+            // Root
+            // 
+            this.Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
+            this.Root.GroupBordersVisible = false;
+            this.Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
+            this.layoutControlItem1,
+            this.layoutControlGroup1,
+            this.layoutControlItem2,
+            this.layoutControlItem4,
+            this.layoutControlItem5,
+            this.layoutControlItem6,
+            this.layoutControlItem8,
+            this.layoutControlItem7});
+            this.Root.Name = "Root";
+            this.Root.Size = new System.Drawing.Size(289, 388);
+            this.Root.TextVisible = false;
+            // 
+            // txtFile1
+            // 
+            this.txtFile1.EditValue = "ch1.dat";
+            this.txtFile1.Location = new System.Drawing.Point(12, 31);
+            this.txtFile1.Name = "txtFile1";
+            this.txtFile1.Properties.AutoHeight = false;
+            this.txtFile1.Size = new System.Drawing.Size(265, 23);
+            this.txtFile1.StyleController = this.layoutControl1;
+            this.txtFile1.TabIndex = 4;
+            // 
+            // layoutControlItem1
+            // 
+            this.layoutControlItem1.Control = this.txtFile1;
+            this.layoutControlItem1.Location = new System.Drawing.Point(0, 0);
+            this.layoutControlItem1.MaxSize = new System.Drawing.Size(0, 46);
+            this.layoutControlItem1.MinSize = new System.Drawing.Size(114, 46);
+            this.layoutControlItem1.Name = "layoutControlItem1";
+            this.layoutControlItem1.Size = new System.Drawing.Size(269, 46);
+            this.layoutControlItem1.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
+            this.layoutControlItem1.Text = "输出文件1";
+            this.layoutControlItem1.TextAlignMode = DevExpress.XtraLayout.TextAlignModeItem.AutoSize;
+            this.layoutControlItem1.TextLocation = DevExpress.Utils.Locations.Top;
+            this.layoutControlItem1.TextSize = new System.Drawing.Size(55, 14);
+            this.layoutControlItem1.TextToControlDistance = 5;
+            // 
+            // txtFile2
+            // 
+            this.txtFile2.EditValue = "ch2.dat";
+            this.txtFile2.Location = new System.Drawing.Point(12, 87);
+            this.txtFile2.Name = "txtFile2";
+            this.txtFile2.Properties.AutoHeight = false;
+            this.txtFile2.Size = new System.Drawing.Size(265, 23);
+            this.txtFile2.StyleController = this.layoutControl1;
+            this.txtFile2.TabIndex = 5;
+            // 
+            // layoutControlItem2
+            // 
+            this.layoutControlItem2.Control = this.txtFile2;
+            this.layoutControlItem2.Location = new System.Drawing.Point(0, 46);
+            this.layoutControlItem2.MaxSize = new System.Drawing.Size(0, 56);
+            this.layoutControlItem2.MinSize = new System.Drawing.Size(114, 56);
+            this.layoutControlItem2.Name = "layoutControlItem2";
+            this.layoutControlItem2.Padding = new DevExpress.XtraLayout.Utils.Padding(2, 2, 12, 2);
+            this.layoutControlItem2.Size = new System.Drawing.Size(269, 56);
+            this.layoutControlItem2.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
+            this.layoutControlItem2.Text = "输出文件2";
+            this.layoutControlItem2.TextAlignMode = DevExpress.XtraLayout.TextAlignModeItem.AutoSize;
+            this.layoutControlItem2.TextLocation = DevExpress.Utils.Locations.Top;
+            this.layoutControlItem2.TextSize = new System.Drawing.Size(55, 14);
+            this.layoutControlItem2.TextToControlDistance = 5;
+            // 
+            // txtFsHz
+            // 
+            this.txtFsHz.EditValue = "96000";
+            this.txtFsHz.Location = new System.Drawing.Point(12, 143);
+            this.txtFsHz.Name = "txtFsHz";
+            this.txtFsHz.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
+            new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Glyph, "Hz", -1, false, true, false, editorButtonImageOptions4, new DevExpress.Utils.KeyShortcut(System.Windows.Forms.Keys.None), serializableAppearanceObject13, serializableAppearanceObject14, serializableAppearanceObject15, serializableAppearanceObject16, "", null, null, DevExpress.Utils.ToolTipAnchor.Default)});
+            this.txtFsHz.Size = new System.Drawing.Size(265, 23);
+            this.txtFsHz.StyleController = this.layoutControl1;
+            this.txtFsHz.TabIndex = 6;
+            // 
+            // layoutControlItem3
+            // 
+            this.layoutControlItem3.Control = this.txtFsHz;
+            this.layoutControlItem3.Location = new System.Drawing.Point(0, 0);
+            this.layoutControlItem3.MaxSize = new System.Drawing.Size(0, 56);
+            this.layoutControlItem3.MinSize = new System.Drawing.Size(96, 56);
+            this.layoutControlItem3.Name = "layoutControlItem3";
+            this.layoutControlItem3.Padding = new DevExpress.XtraLayout.Utils.Padding(2, 2, 12, 2);
+            this.layoutControlItem3.Size = new System.Drawing.Size(269, 56);
+            this.layoutControlItem3.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
+            this.layoutControlItem3.Text = "采样率";
+            this.layoutControlItem3.TextAlignMode = DevExpress.XtraLayout.TextAlignModeItem.AutoSize;
+            this.layoutControlItem3.TextLocation = DevExpress.Utils.Locations.Top;
+            this.layoutControlItem3.TextSize = new System.Drawing.Size(36, 14);
+            this.layoutControlItem3.TextToControlDistance = 5;
+            // 
+            // txtSigLen
+            // 
+            this.txtSigLen.EditValue = "15";
+            this.txtSigLen.Location = new System.Drawing.Point(12, 199);
+            this.txtSigLen.Name = "txtSigLen";
+            this.txtSigLen.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
+            new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Glyph, "秒", -1, false, true, false, editorButtonImageOptions5, new DevExpress.Utils.KeyShortcut(System.Windows.Forms.Keys.None), serializableAppearanceObject17, serializableAppearanceObject18, serializableAppearanceObject19, serializableAppearanceObject20, "", null, null, DevExpress.Utils.ToolTipAnchor.Default)});
+            this.txtSigLen.Size = new System.Drawing.Size(265, 23);
+            this.txtSigLen.StyleController = this.layoutControl1;
+            this.txtSigLen.TabIndex = 6;
+            // 
+            // layoutControlItem4
+            // 
+            this.layoutControlItem4.Control = this.txtSigLen;
+            this.layoutControlItem4.ControlAlignment = System.Drawing.ContentAlignment.TopLeft;
+            this.layoutControlItem4.CustomizationFormText = "采样率";
+            this.layoutControlItem4.Location = new System.Drawing.Point(0, 158);
+            this.layoutControlItem4.MaxSize = new System.Drawing.Size(0, 56);
+            this.layoutControlItem4.MinSize = new System.Drawing.Size(107, 56);
+            this.layoutControlItem4.Name = "layoutControlItem4";
+            this.layoutControlItem4.Padding = new DevExpress.XtraLayout.Utils.Padding(2, 2, 12, 2);
+            this.layoutControlItem4.Size = new System.Drawing.Size(269, 56);
+            this.layoutControlItem4.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
+            this.layoutControlItem4.Text = "信号时长";
+            this.layoutControlItem4.TextAlignMode = DevExpress.XtraLayout.TextAlignModeItem.AutoSize;
+            this.layoutControlItem4.TextLocation = DevExpress.Utils.Locations.Top;
+            this.layoutControlItem4.TextSize = new System.Drawing.Size(48, 14);
+            this.layoutControlItem4.TextToControlDistance = 5;
+            // 
+            // txtDto
+            // 
+            this.txtDto.EditValue = "1000";
+            this.txtDto.Location = new System.Drawing.Point(12, 255);
+            this.txtDto.Name = "txtDto";
+            this.txtDto.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
+            new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Glyph, "us", -1, false, true, false, editorButtonImageOptions1, new DevExpress.Utils.KeyShortcut(System.Windows.Forms.Keys.None), serializableAppearanceObject1, serializableAppearanceObject2, serializableAppearanceObject3, serializableAppearanceObject4, "", null, null, DevExpress.Utils.ToolTipAnchor.Default)});
+            this.txtDto.Size = new System.Drawing.Size(265, 23);
+            this.txtDto.StyleController = this.layoutControl1;
+            this.txtDto.TabIndex = 6;
+            // 
+            // layoutControlItem5
+            // 
+            this.layoutControlItem5.Control = this.txtDto;
+            this.layoutControlItem5.ControlAlignment = System.Drawing.ContentAlignment.TopLeft;
+            this.layoutControlItem5.CustomizationFormText = "采样率";
+            this.layoutControlItem5.Location = new System.Drawing.Point(0, 214);
+            this.layoutControlItem5.MaxSize = new System.Drawing.Size(0, 56);
+            this.layoutControlItem5.MinSize = new System.Drawing.Size(83, 56);
+            this.layoutControlItem5.Name = "layoutControlItem5";
+            this.layoutControlItem5.Padding = new DevExpress.XtraLayout.Utils.Padding(2, 2, 12, 2);
+            this.layoutControlItem5.Size = new System.Drawing.Size(269, 56);
+            this.layoutControlItem5.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
+            this.layoutControlItem5.Text = "时差";
+            this.layoutControlItem5.TextAlignMode = DevExpress.XtraLayout.TextAlignModeItem.AutoSize;
+            this.layoutControlItem5.TextLocation = DevExpress.Utils.Locations.Top;
+            this.layoutControlItem5.TextSize = new System.Drawing.Size(24, 14);
+            this.layoutControlItem5.TextToControlDistance = 5;
+            // 
+            // txtDfo
+            // 
+            this.txtDfo.EditValue = "200";
+            this.txtDfo.Location = new System.Drawing.Point(12, 311);
+            this.txtDfo.Name = "txtDfo";
+            this.txtDfo.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
+            new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Glyph, "Hz", -1, false, true, false, editorButtonImageOptions2, new DevExpress.Utils.KeyShortcut(System.Windows.Forms.Keys.None), serializableAppearanceObject5, serializableAppearanceObject6, serializableAppearanceObject7, serializableAppearanceObject8, "", null, null, DevExpress.Utils.ToolTipAnchor.Default)});
+            this.txtDfo.Size = new System.Drawing.Size(265, 23);
+            this.txtDfo.StyleController = this.layoutControl1;
+            this.txtDfo.TabIndex = 6;
+            // 
+            // layoutControlItem6
+            // 
+            this.layoutControlItem6.Control = this.txtDfo;
+            this.layoutControlItem6.ControlAlignment = System.Drawing.ContentAlignment.TopLeft;
+            this.layoutControlItem6.CustomizationFormText = "采样率";
+            this.layoutControlItem6.Location = new System.Drawing.Point(0, 270);
+            this.layoutControlItem6.MaxSize = new System.Drawing.Size(0, 56);
+            this.layoutControlItem6.MinSize = new System.Drawing.Size(84, 56);
+            this.layoutControlItem6.Name = "layoutControlItem6";
+            this.layoutControlItem6.Padding = new DevExpress.XtraLayout.Utils.Padding(2, 2, 12, 2);
+            this.layoutControlItem6.Size = new System.Drawing.Size(269, 56);
+            this.layoutControlItem6.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
+            this.layoutControlItem6.Text = "频差";
+            this.layoutControlItem6.TextAlignMode = DevExpress.XtraLayout.TextAlignModeItem.AutoSize;
+            this.layoutControlItem6.TextLocation = DevExpress.Utils.Locations.Top;
+            this.layoutControlItem6.TextSize = new System.Drawing.Size(24, 14);
+            this.layoutControlItem6.TextToControlDistance = 5;
+            // 
+            // btnBuilder
+            // 
+            this.btnBuilder.Location = new System.Drawing.Point(12, 348);
+            this.btnBuilder.Name = "btnBuilder";
+            this.btnBuilder.Size = new System.Drawing.Size(120, 28);
+            this.btnBuilder.StyleController = this.layoutControl1;
+            this.btnBuilder.TabIndex = 7;
+            this.btnBuilder.Text = "生成";
+            this.btnBuilder.Click += new System.EventHandler(this.btnBuilder_ClickAsync);
+            // 
+            // layoutControlItem7
+            // 
+            this.layoutControlItem7.Control = this.btnBuilder;
+            this.layoutControlItem7.Location = new System.Drawing.Point(0, 326);
+            this.layoutControlItem7.MaxSize = new System.Drawing.Size(0, 42);
+            this.layoutControlItem7.MinSize = new System.Drawing.Size(89, 42);
+            this.layoutControlItem7.Name = "layoutControlItem7";
+            this.layoutControlItem7.Padding = new DevExpress.XtraLayout.Utils.Padding(2, 12, 12, 2);
+            this.layoutControlItem7.Size = new System.Drawing.Size(134, 42);
+            this.layoutControlItem7.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
+            this.layoutControlItem7.TextSize = new System.Drawing.Size(0, 0);
+            this.layoutControlItem7.TextVisible = false;
+            // 
+            // layoutControlGroup1
+            // 
+            this.layoutControlGroup1.GroupBordersVisible = false;
+            this.layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
+            this.layoutControlItem3});
+            this.layoutControlGroup1.Location = new System.Drawing.Point(0, 102);
+            this.layoutControlGroup1.Name = "layoutControlGroup1";
+            this.layoutControlGroup1.Size = new System.Drawing.Size(269, 56);
+            // 
+            // btnOpenDir
+            // 
+            this.btnOpenDir.Location = new System.Drawing.Point(156, 348);
+            this.btnOpenDir.Name = "btnOpenDir";
+            this.btnOpenDir.Size = new System.Drawing.Size(121, 28);
+            this.btnOpenDir.StyleController = this.layoutControl1;
+            this.btnOpenDir.TabIndex = 8;
+            this.btnOpenDir.Text = "打开输出目录";
+            this.btnOpenDir.Click += new System.EventHandler(this.btnOpenDir_Click);
+            // 
+            // layoutControlItem8
+            // 
+            this.layoutControlItem8.Control = this.btnOpenDir;
+            this.layoutControlItem8.Location = new System.Drawing.Point(134, 326);
+            this.layoutControlItem8.MaxSize = new System.Drawing.Size(0, 42);
+            this.layoutControlItem8.MinSize = new System.Drawing.Size(89, 42);
+            this.layoutControlItem8.Name = "layoutControlItem8";
+            this.layoutControlItem8.Padding = new DevExpress.XtraLayout.Utils.Padding(12, 2, 12, 2);
+            this.layoutControlItem8.Size = new System.Drawing.Size(135, 42);
+            this.layoutControlItem8.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
+            this.layoutControlItem8.TextSize = new System.Drawing.Size(0, 0);
+            this.layoutControlItem8.TextVisible = false;
+            // 
+            // Form1
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(289, 388);
+            this.Controls.Add(this.layoutControl1);
+            this.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
+            this.MaximizeBox = false;
+            this.MinimizeBox = false;
+            this.Name = "Form1";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Text = "时频差数据仿真";
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControl1)).EndInit();
+            this.layoutControl1.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.Root)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtFile1.Properties)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtFile2.Properties)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtFsHz.Properties)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem3)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtSigLen.Properties)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem4)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtDto.Properties)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem5)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.txtDfo.Properties)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem6)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem7)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup1)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem8)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private DevExpress.XtraLayout.LayoutControl layoutControl1;
+        private DevExpress.XtraLayout.LayoutControlGroup Root;
+        private DevExpress.XtraEditors.ButtonEdit txtFsHz;
+        private DevExpress.XtraEditors.TextEdit txtFile2;
+        private DevExpress.XtraEditors.TextEdit txtFile1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
+        private DevExpress.XtraEditors.ButtonEdit txtSigLen;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem4;
+        private DevExpress.XtraEditors.ButtonEdit txtDto;
+        private DevExpress.XtraEditors.ButtonEdit txtDfo;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem5;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem6;
+        private DevExpress.XtraEditors.SimpleButton btnBuilder;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem7;
+        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup1;
+        private DevExpress.XtraEditors.SimpleButton btnOpenDir;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem8;
+    }
+}
+

+ 75 - 0
XdCxRhDW.DataEmulation/Form1.cs

@@ -0,0 +1,75 @@
+using DevExpress.XtraEditors;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace XdCxRhDW.DataEmulation
+{
+    public partial class Form1 : DevExpress.XtraEditors.XtraForm
+    {
+        public Form1()
+        {
+            InitializeComponent();
+        }
+
+        private void btnOpenDir_Click(object sender, EventArgs e)
+        {
+            System.Diagnostics.Process.Start("explorer.exe", ".\\");
+        }
+
+        private async void btnBuilder_ClickAsync(object sender, EventArgs e)
+        {
+            string file1 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, txtFile1.Text);
+            string file2 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, txtFile2.Text);
+            if (!long.TryParse(txtFsHz.Text, out long fsHz))
+            {
+                XtraMessageBox.Show("采样率非数字!");
+                return;
+            }
+            if (!double.TryParse(txtSigLen.Text, out double sigTimeLen))
+            {
+                XtraMessageBox.Show("信号时长非数字!");
+                return;
+            }
+            if (!double.TryParse(txtDto.Text, out double dt))
+            {
+                XtraMessageBox.Show("时差非数字!");
+                return;
+            }
+            if (!double.TryParse(txtDfo.Text, out double df))
+            {
+                XtraMessageBox.Show("频差非数字!");
+                return;
+            }
+            if (fsHz <= 0 || fsHz > 100000000)
+            {
+                XtraMessageBox.Show("采样率范围(0,100000000]!");
+                return;
+            }
+            if (sigTimeLen <= 0 || sigTimeLen > 120)
+            {
+                XtraMessageBox.Show("信号时长范围(0,120]!");
+                return;
+            }
+            btnBuilder.Enabled = false;
+            await Task.Run(() =>
+            {
+                try
+                {
+                    DataEmulationHelper.GenSignalsWithDtDf(file1, file2, fsHz, (int)(sigTimeLen * 1000), dt / 1e6, df);
+                }
+                catch (Exception ex)
+                {
+                }
+            });
+            btnBuilder.Enabled = true;
+        }
+    }
+}

+ 120 - 0
XdCxRhDW.DataEmulation/Form1.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 24 - 0
XdCxRhDW.DataEmulation/Program.cs

@@ -0,0 +1,24 @@
+using DevExpress.LookAndFeel;
+using DevExpress.Skins;
+using DevExpress.UserSkins;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace XdCxRhDW.DataEmulation
+{
+    internal static class Program
+    {
+        /// <summary>
+        /// The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new Form1());
+        }
+    }
+}

+ 32 - 0
XdCxRhDW.DataEmulation/Properties/AssemblyInfo.cs

@@ -0,0 +1,32 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("XdCxRhDW.DataEmulation")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("XdCxRhDW.DataEmulation")]
+[assembly: AssemblyCopyright("Copyright ©  2024")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("9006f149-aa49-4b8e-ba69-386d945fa738")]
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

+ 63 - 0
XdCxRhDW.DataEmulation/Properties/Resources.Designer.cs

@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     此代码由工具生成。
+//     运行时版本:4.0.30319.42000
+//
+//     对此文件的更改可能会导致不正确的行为,并且如果
+//     重新生成代码,这些更改将会丢失。
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace XdCxRhDW.DataEmulation.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   一个强类型的资源类,用于查找本地化的字符串等。
+    /// </summary>
+    // 此类是由 StronglyTypedResourceBuilder
+    // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+    // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+    // (以 /str 作为命令选项),或重新生成 VS 项目。
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   返回此类使用的缓存的 ResourceManager 实例。
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("XdCxRhDW.DataEmulation.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   重写当前线程的 CurrentUICulture 属性,对
+        ///   使用此强类型资源类的所有资源查找执行重写。
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+    }
+}

+ 117 - 0
XdCxRhDW.DataEmulation/Properties/Resources.resx

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0"></xsd:element>
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string"></xsd:attribute>
+              <xsd:attribute name="type" type="xsd:string"></xsd:attribute>
+              <xsd:attribute name="mimetype" type="xsd:string"></xsd:attribute>
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string"></xsd:attribute>
+              <xsd:attribute name="name" type="xsd:string"></xsd:attribute>
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"></xsd:element>
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"></xsd:element>
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1"></xsd:attribute>
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"></xsd:attribute>
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"></xsd:attribute>
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"></xsd:element>
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required"></xsd:attribute>
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 26 - 0
XdCxRhDW.DataEmulation/Properties/Settings.Designer.cs

@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     此代码由工具生成。
+//     运行时版本:4.0.30319.42000
+//
+//     对此文件的更改可能会导致不正确的行为,并且如果
+//     重新生成代码,这些更改将会丢失。
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace XdCxRhDW.DataEmulation.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.9.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+    }
+}

+ 7 - 0
XdCxRhDW.DataEmulation/Properties/Settings.settings

@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>

+ 131 - 0
XdCxRhDW.DataEmulation/XdCxRhDW.DataEmulation.csproj

@@ -0,0 +1,131 @@
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E0E5334A-9DC1-4A45-8E1E-1049A9FD15F2}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>XdCxRhDW.DataEmulation</RootNamespace>
+    <AssemblyName>时频差数据仿真</AssemblyName>
+    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Accessibility" />
+    <Reference Include="DevExpress.BonusSkins.v23.2" />
+    <Reference Include="DevExpress.Data.Desktop.v23.2" />
+    <Reference Include="DevExpress.Data.v23.2" />
+    <Reference Include="DevExpress.Utils.v23.2" />
+    <Reference Include="DevExpress.Sparkline.v23.2.Core" />
+    <Reference Include="DevExpress.XtraEditors.v23.2" />
+    <Reference Include="DevExpress.Printing.v23.2.Core" />
+    <Reference Include="DevExpress.Drawing.v23.2" />
+    <Reference Include="DevExpress.XtraLayout.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
+    <Reference Include="System" />
+    <Reference Include="System.ComponentModel.DataAnnotations" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Data.Linq" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Runtime.Serialization.Formatters.Soap" />
+    <Reference Include="System.Security" />
+    <Reference Include="System.Transactions" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DataEmulationHelper.cs" />
+    <Compile Include="Form1.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Form1.Designer.cs">
+      <DependentUpon>Form1.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <EmbeddedResource Include="Form1.resx">
+      <DependentUpon>Form1.cs</DependentUpon>
+    </EmbeddedResource>
+    <None Include="Properties\licenses.licx" />
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+      <DesignTime>True</DesignTime>
+    </Compile>
+    <None Include="App.config" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="AddIns\ippcore-9.0.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="AddIns\ipps-9.0.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="AddIns\SignalEmulation.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="AddIns\SignalEmulation.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="AddIns\ippsy8-9.0.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PostBuildEvent>del DevExpress*.xml,EntityFramework*.xml,Serilog*.xml,Newtonsoft*.xml
+if not exist "AddIns" md AddIns
+move /Y *.dll AddIns</PostBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 6 - 0
XdCxRhDW.sln

@@ -33,6 +33,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CpuCgServer", "Service\CpuC
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CapMoni", "Service\CapMoni\CapMoni.csproj", "{205094BA-1381-43F3-8F42-0E1175587754}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XdCxRhDW.DataEmulation", "XdCxRhDW.DataEmulation\XdCxRhDW.DataEmulation.csproj", "{E0E5334A-9DC1-4A45-8E1E-1049A9FD15F2}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -95,6 +97,10 @@ Global
 		{205094BA-1381-43F3-8F42-0E1175587754}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{205094BA-1381-43F3-8F42-0E1175587754}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{205094BA-1381-43F3-8F42-0E1175587754}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E0E5334A-9DC1-4A45-8E1E-1049A9FD15F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E0E5334A-9DC1-4A45-8E1E-1049A9FD15F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E0E5334A-9DC1-4A45-8E1E-1049A9FD15F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E0E5334A-9DC1-4A45-8E1E-1049A9FD15F2}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE