zoulei 1 éve
szülő
commit
4dbd07539f
29 módosított fájl, 800 hozzáadás és 135 törlés
  1. 1 1
      Service/X2D1NoRefTaskServer/HistoryFile.cs
  2. 2 2
      Service/X2D1NoRefTaskServer/Service/HistoryTaskService.cs
  3. 86 0
      Service/X2D1TaskServer54/AddIns/DDC/DDCHelper.cs
  4. BIN
      Service/X2D1TaskServer54/AddIns/DDC/DigitaDownConverter.exe
  5. BIN
      Service/X2D1TaskServer54/AddIns/DDC/ippcore-9.0.dll
  6. BIN
      Service/X2D1TaskServer54/AddIns/DDC/ipps-9.0.dll
  7. BIN
      Service/X2D1TaskServer54/AddIns/DDC/ippsy8-9.0.dll
  8. 14 0
      Service/X2D1TaskServer54/AddIns/DDC/readme.txt
  9. BIN
      Service/X2D1TaskServer54/AddIns/时隙获取/SlotChecker.dll
  10. 26 0
      Service/X2D1TaskServer54/AddIns/时隙获取/SlotChecker.h
  11. 109 0
      Service/X2D1TaskServer54/AddIns/时隙获取/SlotHelper.cs
  12. 89 72
      Service/X2D1TaskServer54/App.config
  13. 2 2
      Service/X2D1TaskServer54/Controllers/HistoryTaskProcessingController.cs
  14. 82 0
      Service/X2D1TaskServer54/HistoryFile.cs
  15. 1 1
      Service/X2D1TaskServer54/LogHelper.cs
  16. 1 1
      Service/X2D1TaskServer54/LogInfo.cs
  17. 2 2
      Service/X2D1TaskServer54/MainForm.Designer.cs
  18. 5 5
      Service/X2D1TaskServer54/MainForm.cs
  19. 1 1
      Service/X2D1TaskServer54/Program.cs
  20. 2 2
      Service/X2D1TaskServer54/Properties/AssemblyInfo.cs
  21. 2 2
      Service/X2D1TaskServer54/Properties/Resources.Designer.cs
  22. 1 1
      Service/X2D1TaskServer54/Properties/Settings.Designer.cs
  23. 279 29
      Service/X2D1TaskServer54/Service/HistoryTaskService.cs
  24. 32 3
      Service/X2D1TaskServer54/X3TaskServer54.csproj
  25. 0 1
      XdCxRhDW.App/EditForms/TargetEditor.cs
  26. 62 6
      XdCxRhDW.App/UserControl/CtrlHome.cs
  27. 0 2
      XdCxRhDW.Repostory/EFContext/RHDWContext.cs
  28. 0 1
      XdCxRhDW.Sender/ColorRGB.cs
  29. 1 1
      XdCxRhDW.sln

+ 1 - 1
Service/X2D1NoRefTaskServer/HistoryFile.cs

@@ -9,7 +9,7 @@ namespace X2D1NoRefTaskServer
     public class HistoryFile
     {
         /// <summary>
-        /// 文件名称(含路径)
+        /// 文件名称(含路径)
         /// </summary>
         public string FilePath { get; set; }
 

+ 2 - 2
Service/X2D1NoRefTaskServer/Service/HistoryTaskService.cs

@@ -200,7 +200,7 @@ namespace X2D1NoRefTaskServer.Service
                                 var result1 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
                                 if (result1.code != 200)
                                 {
-                                    LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻主星超短CPU参估出错.{deteResp.msg}");
+                                    LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻主星超短CPU参估出错.{result1.msg}");
                                     continue;
                                 }
                                 LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻主星超短CPU参估完成.");
@@ -217,7 +217,7 @@ namespace X2D1NoRefTaskServer.Service
                                 var result2 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
                                 if (result2.code != 200)
                                 {
-                                    LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻邻星超短CPU参估出错.{deteResp.msg}");
+                                    LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻邻星超短CPU参估出错.{result2.msg}");
                                     continue;
                                 }
                                 LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻邻星超短CPU参估完成");

+ 86 - 0
Service/X2D1TaskServer54/AddIns/DDC/DDCHelper.cs

@@ -0,0 +1,86 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace X3TaskServer54
+{
+    static class DDCHelper
+    {
+        private static string exePath = "AddIns\\DDC";
+        private const string exeName = "DigitaDownConverter.exe";
+        /// <summary>
+        /// 设置【DigitaDownConverter.exe】文件所在路径,支持相对路径
+        /// </summary>
+        public static void SetExePath(string path)
+        {
+            if (string.IsNullOrWhiteSpace(path)) return;
+            if (path.StartsWith("\\"))//相对路径要么开头不带\,要么是 .\
+                path = path.Remove(0, 1);
+            exePath = path;
+        }
+        /// <summary>
+        /// 对多个频点信号的AD文件做DDC
+        /// </summary>
+        /// <param name="file">输入文件</param>
+        /// <param name="adTime">采集时刻</param>
+        /// <param name="chNo">通道号0-3</param>
+        /// <param name="fsHz">输入文件采样率Hz</param>
+        /// <param name="freqCenterHz">中心频率Hz</param>
+        /// <param name="outDir">输出目录</param>
+        /// <param name="sigs">DDC信号参数</param>
+        /// <param name="timeoutSeconds">超时时间(秒)</param>
+        /// <returns>成功后返回DDC输出的文件</returns>
+        public static List<string> DDC(string file, DateTime adTime, int chNo, long fsHz, long freqCenterHz,
+            string outDir, IEnumerable<DDCSig> sigs, int timeoutSeconds = 60)
+        {
+            if (string.IsNullOrWhiteSpace(exePath))
+                throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
+            if (!Directory.Exists(exePath))
+                throw new Exception($"路径[{exePath}]不存在");
+            var exeFile = Path.Combine(exePath, exeName);
+            if (!File.Exists(exeFile))
+                throw new Exception($"文件[{exeFile}]不存在");
+            Process p = new Process();
+            p.StartInfo.WorkingDirectory = exePath;
+            p.StartInfo.FileName = exeFile;
+            StringBuilder sb = new StringBuilder();
+            sb.Append($"\"{file}\" \"{outDir}\" {adTime:yyyyMMddHHmmss} {chNo} {fsHz} {freqCenterHz} {sigs.Count()}");
+            List<string> list = new List<string>();
+            foreach (var sig in sigs)
+            {
+                sb.Append(" ").Append(sig.FreqDownHz).Append(" ").Append(sig.Mult);
+                list.Add(Path.Combine(outDir, $"{adTime:yyyyMMddHHmmss}_{sig.FreqDownHz / 1e6:f3}_C{fsHz / sig.Mult}_CH{chNo}.dat"));
+            }
+            p.StartInfo.Arguments = sb.ToString();
+            p.StartInfo.CreateNoWindow = true;
+            p.StartInfo.RedirectStandardError = true;
+            p.StartInfo.RedirectStandardOutput = true;
+            p.StartInfo.UseShellExecute = false;
+            p.Start();
+            var succeed = p.WaitForExit(timeoutSeconds * 1000);
+            if (!succeed)
+            {
+                throw new Exception($"进程[{exeName}]超时未完成!");
+            }
+            return list.Where(x => File.Exists(x)).ToList();
+        }
+    }
+    class DDCSig
+    {
+        /// <summary>
+        /// 信号下行频点Hz
+        /// </summary>
+        public int FreqDownHz { get; set; }
+
+        /// <summary>
+        /// 抽取倍数
+        /// </summary>
+        public int Mult { get; set; }
+
+        public SlotsInfo Slots { get; set; }
+    }
+}

BIN
Service/X2D1TaskServer54/AddIns/DDC/DigitaDownConverter.exe


BIN
Service/X2D1TaskServer54/AddIns/DDC/ippcore-9.0.dll


BIN
Service/X2D1TaskServer54/AddIns/DDC/ipps-9.0.dll


BIN
Service/X2D1TaskServer54/AddIns/DDC/ippsy8-9.0.dll


+ 14 - 0
Service/X2D1TaskServer54/AddIns/DDC/readme.txt

@@ -0,0 +1,14 @@
+D:\ztming\data\20240409094240_ADC_ch00.dat D:\ztming\data 20240409094240 0 112000000 227000000 1 252050000 1024
+D:\ztming\data\20240409094240_ADC_ch01.dat D:\ztming\data 20240409094240 1 112000000 227000000 1 252050000 1024
+D:\ztming\data\20240409094240_ADC_ch02.dat D:\ztming\data 20240409094240 2 112000000 227000000 1 252050000 1024
+
+
+std::string fileName = std::string(argv[++idx]);//输入文件
+	std::string opa = std::string(argv[++idx]);//输出路径
+	std::string basetime = std::string(argv[++idx]);//输入文件开始时间
+	int flag = atoi(argv[++idx]);//	通道号
+	__int64 samplingRate = atoll(argv[++idx]);//输入文件采样率 Hz
+	__int64 freqencemid = atoll(argv[++idx]);//输入文件中心频率
+	int sigcount = atoi(argv[++idx]);//信号个数
+	int *multis = new int[sigcount];
+	int *ffcs = new int[sigcount];

BIN
Service/X2D1TaskServer54/AddIns/时隙获取/SlotChecker.dll


+ 26 - 0
Service/X2D1TaskServer54/AddIns/时隙获取/SlotChecker.h

@@ -0,0 +1,26 @@
+#pragma once
+
+#ifdef SLOTCHECKER
+#define SlotExport __declspec(dllexport)
+#else
+#define SlotExport __declspec(dllimport)
+#endif
+
+extern "C"
+{
+	// 释放内存
+	SlotExport void freeslots(float *slotst, float *slotle);
+
+	// 获取时间
+	// ifile 输入文件
+	// fbasetime y M d H m s
+	// frequenceM 文件对应频点
+	// fsampleM 原始文件采样率
+	// multi  抽取倍数
+	// slotscount 突发个数
+	// slotst 开始时间  s
+	// slotle 持续时间  ms
+	SlotExport int getslots(char *ifile, unsigned char fbasetime[6]
+		, float *frequenceM, float *fsampleM, int *multi
+		, int *slotscount, float **slotst, float **slotle);
+};

+ 109 - 0
Service/X2D1TaskServer54/AddIns/时隙获取/SlotHelper.cs

@@ -0,0 +1,109 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace X3TaskServer54
+{
+    static class SlotHelper
+    {
+        #region cpp dll Interop 
+        private const string slotDll = @"AddIns\时隙获取\SlotChecker.dll";
+
+        [DllImport(slotDll, EntryPoint = "getslots", CallingConvention = CallingConvention.Cdecl)]
+        private extern static int GetFileSlots(string file, byte[] fileTime, ref float frequenceM, ref float fsampleM,
+            ref int multi, ref int slotscount, out IntPtr slotst, out IntPtr slotle);
+
+        [DllImport(slotDll, EntryPoint = "freeslots", CallingConvention = CallingConvention.Cdecl)]
+        private extern static void Free(IntPtr slotst, IntPtr slotle);
+        #endregion
+
+        public static SlotsInfo GetFileSlots(string file)
+        {
+            SlotsInfo res = new SlotsInfo();
+            string name = Path.GetFileName(file);
+            res.FreqDownMHz = Convert.ToDouble(name.Split(new string[] { "_", "MHz" }, StringSplitOptions.RemoveEmptyEntries)[1]);
+            byte[] timeData = new byte[6];
+            float frequenceM = 0, fsampleM = 0;
+            int multi = 0, slotscount = 0;
+            IntPtr slotst, slotle;
+            var ret = GetFileSlots(file, timeData, ref frequenceM, ref fsampleM, ref multi, ref slotscount, out slotst, out slotle);
+            if (ret == 0)
+            {
+                res.FrequenceM = (float)((long)((decimal)frequenceM * 1000000) / 1e6);
+                res.FsampleM = fsampleM;
+                res.Multi = multi;
+                res.AdTime = new DateTime(2000 + timeData[0], timeData[1], timeData[2], timeData[3], timeData[4], timeData[5]);
+                float[] startsF = new float[slotscount];
+                float[] lenF = new float[slotscount];
+                Marshal.Copy(slotst, startsF, 0, slotscount);
+                Marshal.Copy(slotle, lenF, 0, slotscount);
+                for (int i = 0; i < slotscount; i++)
+                {
+                    Slot s = new Slot()
+                    {
+                        StartPoint = (int)(fsampleM * 1e6 / multi * startsF[i]),
+                        Len = (int)(fsampleM * 1e6 / multi * lenF[i] * 1e-3)
+                    };
+                    res.Slots.Add(s);
+                }
+            }
+            Free(slotst, slotle);
+            return res;
+        }
+    }
+    /// <summary>
+    /// 突发信息
+    /// </summary>
+    class SlotsInfo
+    {
+        /// <summary>
+        /// 采集时刻
+        /// </summary>
+        public DateTime AdTime { get; set; }
+
+        /// <summary>
+        /// 信号下行频点MHz
+        /// </summary>
+        public double FreqDownMHz { get; set; }
+
+        /// <summary>
+        /// AD采样率
+        /// </summary>
+        public float FsampleM { get; set; }
+
+        /// <summary>
+        /// 信号下行频点
+        /// </summary>
+        public float FrequenceM { get; set; }
+
+        /// <summary>
+        /// 抽取倍数
+        /// </summary>
+        public float Multi { get; set; }
+
+        /// <summary>
+        /// 时隙位置集合
+        /// </summary>
+        public List<Slot> Slots { get; set; } = new List<Slot>();
+    }
+
+    /// <summary>
+    /// 时隙信息
+    /// </summary>
+    class Slot
+    {
+        /// <summary>
+        /// 起始样点
+        /// </summary>
+        public int StartPoint { get; set; }
+
+        /// <summary>
+        /// 结束样点
+        /// </summary>
+        public int Len { get; set; }
+    }
+}

+ 89 - 72
Service/X2D1TaskServer54/App.config

@@ -10,80 +10,97 @@
 		<!--定位平台Http地址-->
 		<add key="PosPlatformAddr" value="http://127.0.0.1:8091" />
 
+		<!--检测结果目录-->
+		<add key="DetectDir" value="D:\data\Detect"/>
+
+		<!--采集数据目录-->
+		<add key="CapDir" value="D:\data\AD"/>
+
+		<!--DDC处理后的目录-->
+		<add key="DdcDir" value="D:\data\DDC"/>
+
+		<!--定位结果输出目录-->
+		<add key="PosResDir" value="D:\data\PosRes"/>
+
+		<!--卫星及星历-->
+		<add key ="MainSatInfo" value="23467,-41275189.6404,5820330.8446,6331022.0431"/>
+		<add key ="Adja1SatInfo" value="40892,4694560.4826,41891872.2374,47531.3795"/>
+		<add key ="Adja2SatInfo" value="44637,-38166658.7333,17900616.4901,13836.5451"/>
+
 	</appSettings>
 	<startup>
 		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
 	</startup>
-  <runtime>
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <dependentAssembly>
-        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-4.2.2.0" newVersion="4.2.2.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Autofac" publicKeyToken="17863af14b0044da" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-5.3.0.0" newVersion="5.3.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Web.Http.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-5.3.0.0" newVersion="5.3.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Web.Cors" publicKeyToken="31bf3856ad364e35" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-5.3.0.0" newVersion="5.3.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.Web.Infrastructure" publicKeyToken="31bf3856ad364e35" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Google.Protobuf" publicKeyToken="a7d26565bac4d604" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-3.26.0.0" newVersion="3.26.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="ZstdSharp" publicKeyToken="8d151af33a4ad5cf" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-0.7.6.0" newVersion="0.7.6.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="K4os.Compression.LZ4.Streams" publicKeyToken="2186fa9121ef231d" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-1.3.8.0" newVersion="1.3.8.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.IO.Pipelines" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
-      </dependentAssembly>
-    </assemblyBinding>
-  </runtime>
+	<runtime>
+		<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+			<dependentAssembly>
+				<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-4.2.2.0" newVersion="4.2.2.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="Autofac" publicKeyToken="17863af14b0044da" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-5.3.0.0" newVersion="5.3.0.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Web.Http.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-5.3.0.0" newVersion="5.3.0.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Web.Cors" publicKeyToken="31bf3856ad364e35" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-5.3.0.0" newVersion="5.3.0.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="Microsoft.Web.Infrastructure" publicKeyToken="31bf3856ad364e35" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="Google.Protobuf" publicKeyToken="a7d26565bac4d604" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-3.26.0.0" newVersion="3.26.0.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="ZstdSharp" publicKeyToken="8d151af33a4ad5cf" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-0.7.6.0" newVersion="0.7.6.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="K4os.Compression.LZ4.Streams" publicKeyToken="2186fa9121ef231d" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-1.3.8.0" newVersion="1.3.8.0" />
+			</dependentAssembly>
+			<dependentAssembly>
+				<assemblyIdentity name="System.IO.Pipelines" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+				<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
+			</dependentAssembly>
+		</assemblyBinding>
+	</runtime>
 </configuration>

+ 2 - 2
Service/X2D1TaskServer54/Controllers/HistoryTaskProcessingController.cs

@@ -7,9 +7,9 @@ using System.Linq;
 using System.Web.Http;
 using XdCxRhDW.Dto;
 using XdCxRhDW.WebApi;
-using X2D1TaskServer54.Service;
+using X3TaskServer54.Service;
 
-namespace X2D1TaskServer54.Controllers
+namespace X3TaskServer54.Controllers
 {
     /// <summary>
     ///离线任务处理接口

+ 82 - 0
Service/X2D1TaskServer54/HistoryFile.cs

@@ -0,0 +1,82 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace X3TaskServer54
+{
+    public class CheckResFile
+    {
+        /// <summary>
+        /// 文件(含路径)
+        /// </summary>
+        public string File { get; set; }
+
+        /// <summary>
+        /// 下行频点MHz
+        /// </summary>
+        public double FreqDownMHz { get; set; }
+
+        /// <summary>
+        /// 日期(精度到天)
+        /// </summary>
+        public DateTime DayTime { get; set; }
+
+        /// <summary>
+        /// 序号
+        /// </summary>
+        public long FlagNo { get; set; }
+
+    }
+
+    public class AdFile
+    {
+        /// <summary>
+        /// 文件(含路径)
+        /// </summary>
+        public string File { get; set; }
+
+        /// <summary>
+        /// 采集时刻
+        /// </summary>
+        public DateTime AdTime { get; set; }
+
+        /// <summary>
+        /// 通道号
+        /// </summary>
+        public int ChNo { get; set; }
+    }
+
+    public class DDCFile
+    {
+        /// <summary>
+        /// 文件(含路径)
+        /// </summary>
+        public string File { get; set; }
+
+        /// <summary>
+        /// 采集时刻
+        /// </summary>
+        public DateTime AdTime { get; set; }
+
+        /// <summary>
+        /// 通道号
+        /// </summary>
+        
+        public int ChNo { get; set; }
+
+        /// <summary>
+        /// 下行频点MHz
+        /// </summary>
+
+        public double FreqDownMHz { get; set; }
+
+        /// <summary>
+        /// 采样率Hz
+        /// </summary>
+
+        public int Fs { get; set; }
+    }
+}

+ 1 - 1
Service/X2D1TaskServer54/LogHelper.cs

@@ -4,7 +4,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace X2D1TaskServer54
+namespace X3TaskServer54
 {
     public static class LogHelper
     {

+ 1 - 1
Service/X2D1TaskServer54/LogInfo.cs

@@ -6,7 +6,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace X2D1TaskServer54
+namespace X3TaskServer54
 {
     public class LogInfo
     {

+ 2 - 2
Service/X2D1TaskServer54/MainForm.Designer.cs

@@ -1,4 +1,4 @@
-namespace X2D1TaskServer54
+namespace X3TaskServer54
 {
     partial class MainForm
     {
@@ -59,7 +59,7 @@
             this.Controls.Add(this.gridLog);
             this.IconOptions.SvgImage = ((DevExpress.Utils.Svg.SvgImage)(resources.GetObject("MainForm.IconOptions.SvgImage")));
             this.Name = "MainForm";
-            this.Text = "两星一地无参离线数据处理服务";
+            this.Text = "三星离线数据处理服务";
             this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MainForm_FormClosed);
             this.Load += new System.EventHandler(this.MainForm_LoadAsync);
             ((System.ComponentModel.ISupportInitialize)(this.gridLog)).EndInit();

+ 5 - 5
Service/X2D1TaskServer54/MainForm.cs

@@ -6,7 +6,7 @@ using System.Windows.Forms;
 using XdCxRhDW.Dto;
 using XdCxRhDW.WebApi;
 
-namespace X2D1TaskServer54
+namespace X3TaskServer54
 {
     public partial class MainForm : DevExpress.XtraEditors.XtraForm
     {
@@ -30,7 +30,7 @@ namespace X2D1TaskServer54
             var port = Convert.ToInt32(ConfigurationManager.AppSettings["LocalHttpPort"].Trim());
             var svrID = ConfigurationManager.AppSettings["SvrID"].Trim();
             var posPlatformAddr = ConfigurationManager.AppSettings["PosPlatformAddr"].Trim();
-            this.Text = EnumSvrType.X2D1NoRefHistoryTask.GetEnumDisplayName() + "-" + svrID;
+            this.Text = EnumSvrType.X3NoRefHistoryTask.GetEnumDisplayName() + "-" + svrID;
             var localIp = IpHelper.GetLocalIp();
             Startup.Start(port, $"{System.Reflection.Assembly.GetExecutingAssembly().GetName().Name}.xml", "XdCxRhDW.Dto.xml");
             LogHelper.Info($"服务启动成功.接口地址http://{localIp}:{port}/swagger");
@@ -47,7 +47,7 @@ namespace X2D1TaskServer54
                 {
                     var res = await HttpHelper.PostRequestAsync<object>(url, new SvrStateReportDto()
                     {
-                        SvrType = EnumSvrType.X2D1NoRefHistoryTask,
+                        SvrType = EnumSvrType.X3NoRefHistoryTask,
                         SvrID = svrID,
                         ReportType = 0,
                         BaseHttpAddr = $"http://{localIp}:{port}",
@@ -70,7 +70,7 @@ namespace X2D1TaskServer54
                     LogHelper.Error($"状态上报异常[url={url}]", ex);
                     preSucceed = false;
                 }
-                await System.Threading.Tasks.Task.Delay(10000);
+                await System.Threading.Tasks.Task.Delay(6000);
             }
         }
 
@@ -92,7 +92,7 @@ namespace X2D1TaskServer54
                 _ = HttpHelper.PostRequestAsync<object>(url, new SvrStateReportDto()
                 {
                     SvrID = svrID,
-                    SvrType = EnumSvrType.X2D1NoRefHistoryTask,
+                    SvrType = EnumSvrType.X3NoRefHistoryTask,
                     ReportType = 1,
                     BaseHttpAddr = $"http://{localIp}:{port}",
                 });

+ 1 - 1
Service/X2D1TaskServer54/Program.cs

@@ -12,7 +12,7 @@ using System.Security.Principal;
 using System.Threading.Tasks;
 using System.Windows.Forms;
 
-namespace X2D1TaskServer54
+namespace X3TaskServer54
 {
     internal static class Program
     {

+ 2 - 2
Service/X2D1TaskServer54/Properties/AssemblyInfo.cs

@@ -5,11 +5,11 @@ using System.Runtime.InteropServices;
 // 有关程序集的一般信息由以下
 // 控制。更改这些特性值可修改
 // 与程序集关联的信息。
-[assembly: AssemblyTitle("X2D1TaskServer54")]
+[assembly: AssemblyTitle("X3TaskServer54")]
 [assembly: AssemblyDescription("")]
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("X2D1TaskServer54")]
+[assembly: AssemblyProduct("X3TaskServer54")]
 [assembly: AssemblyCopyright("Copyright ©  2024")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]

+ 2 - 2
Service/X2D1TaskServer54/Properties/Resources.Designer.cs

@@ -8,7 +8,7 @@
 // </auto-generated>
 //------------------------------------------------------------------------------
 
-namespace X2D1TaskServer54.Properties {
+namespace X3TaskServer54.Properties {
     using System;
     
     
@@ -39,7 +39,7 @@ namespace X2D1TaskServer54.Properties {
         internal static global::System.Resources.ResourceManager ResourceManager {
             get {
                 if (object.ReferenceEquals(resourceMan, null)) {
-                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("X2D1TaskServer54.Properties.Resources", typeof(Resources).Assembly);
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("X3TaskServer54.Properties.Resources", typeof(Resources).Assembly);
                     resourceMan = temp;
                 }
                 return resourceMan;

+ 1 - 1
Service/X2D1TaskServer54/Properties/Settings.Designer.cs

@@ -8,7 +8,7 @@
 // </auto-generated>
 //------------------------------------------------------------------------------
 
-namespace X2D1TaskServer54.Properties {
+namespace X3TaskServer54.Properties {
     
     
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

+ 279 - 29
Service/X2D1TaskServer54/Service/HistoryTaskService.cs

@@ -3,19 +3,27 @@ using Google.Protobuf.WellKnownTypes;
 using System;
 using System.Collections.Generic;
 using System.Configuration;
+using System.IO;
 using System.Linq;
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
 using XdCxRhDW.Dto;
 
-namespace X2D1TaskServer54.Service
+namespace X3TaskServer54.Service
 {
     //业务逻辑处理类
     public class HistoryTaskService
     {
         private readonly string baseUrl;
         CancellationTokenSource cts;
+
+        string DetectDir;
+        string CapDir;
+        string DdcDir;
+        string PosResDir;
+        int MainSatCode, Adja1SatCode, Adja2SatCode;
+        double[] MainSatXYZ, Adja1SatXYZ, Adja2SatXYZ;
         public HistoryTaskService()
         {
             var posPlatformAddr = ConfigurationManager.AppSettings["PosPlatformAddr"].Trim();//like http://127.0.0.1:8091 or http://127.0.0.1:8091/
@@ -23,8 +31,13 @@ namespace X2D1TaskServer54.Service
                 this.baseUrl = posPlatformAddr + "api/";
             else
                 this.baseUrl = posPlatformAddr + "/api/";
+
+            DetectDir = ConfigurationManager.AppSettings["DetectDir"].Trim();
+            CapDir = ConfigurationManager.AppSettings["CapDir"].Trim();
+            DdcDir = ConfigurationManager.AppSettings["DdcDir"].Trim();
+            PosResDir = ConfigurationManager.AppSettings["PosResDir"].Trim();
         }
-        public void StartAsync(X2D1HistoryTaskHandleDto taskInfo)
+        public void StartAsync(X2D1HistoryTaskHandleDto dto)
         {
             cts = new CancellationTokenSource();
             Task.Run(async () =>
@@ -34,43 +47,208 @@ namespace X2D1TaskServer54.Service
                 {
                     try
                     {
-                        #region 第1步,上传检测参估需要的数据文件执行检测
-                        string mainFile = await HttpHelper.UploadFileAsync("E:\\1.dat", baseUrl + "File/UploadFileAsync", token: cts.Token);//主星文件
-                        string adjaFile = await HttpHelper.UploadFileAsync("E:\\2.dat", baseUrl + "File/UploadFileAsync", token: cts.Token);//邻星文件
-                        string cdbFile = await HttpHelper.UploadFileAsync("E:\\2.dat", baseUrl + "File/UploadFileAsync", token: cts.Token);//超短文件
-                        string url = baseUrl + "POST/Api/DetectCg/DetectCalc";//信号检测
-                        var httpResp1 = await HttpHelper.PostRequestAsync<List<DetectResDto>>(url, new DetectDto()
+                        #region 第1步,读取需要的配置信息
+                        if (!Directory.Exists(DetectDir))
                         {
-                            file1 = mainFile,//用到文件的地方必须使用先上传后返回的文件
-                            fsHz = 96000,
-                            dmcType = DmcType.DAMA
-                        });
-                        if (httpResp1.code == 0)
+                            StopTask(dto.ID, $"检测结果目录[{DetectDir}]不存在");
+                            return;
+                        }
+                        if (!Directory.Exists(CapDir))
                         {
-                            LogHelper.Error(httpResp1.msg);
+                            StopTask(dto.ID, $"AD采集目录[{CapDir}]不存在");
+                            return;
                         }
-                        var slots = httpResp1.data;
-                        #endregion
-
-                        #region 第2步,多时隙参估
-                        url = baseUrl + "POST/Api/DetectCg/CpuCgMultiCalc";//CPU参估(多个时隙)
-                        var httpResp2 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(url, new CpuCgMultiDto(), token: cts.Token);
-                        if (httpResp2.code == 0)
+                        Directory.CreateDirectory(DdcDir);
+                        try
                         {
-                            LogHelper.Error(httpResp2.msg);
+                            var mainInfo = ConfigurationManager.AppSettings["MainSatInfo"].Replace(",", ",").Trim();
+                            var adja1Info = ConfigurationManager.AppSettings["Adja1SatInfo"].Replace(",", ",").Trim();
+                            var adja2Info = ConfigurationManager.AppSettings["Adja2SatInfo"].Replace(",", ",").Trim();
+                            var arr1 = mainInfo.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
+                            var arr2 = adja1Info.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
+                            var arr3 = adja2Info.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
+                            MainSatCode = Convert.ToInt32(arr1[0]);
+                            Adja1SatCode = Convert.ToInt32(arr2[0]);
+                            Adja2SatCode = Convert.ToInt32(arr3[0]);
+                            MainSatXYZ = new double[3] { Convert.ToDouble(arr1[1]), Convert.ToDouble(arr1[2]), Convert.ToDouble(arr1[3]) };
+                            Adja1SatXYZ = new double[3] { Convert.ToDouble(arr2[1]), Convert.ToDouble(arr2[2]), Convert.ToDouble(arr2[3]) };
+                            Adja2SatXYZ = new double[3] { Convert.ToDouble(arr3[1]), Convert.ToDouble(arr3[2]), Convert.ToDouble(arr3[3]) };
+                        }
+                        catch
+                        {
+                            StopTask(dto.ID, $"任务处理服务配置文件卫星信息解析出错");
+                            return;
                         }
                         #endregion
 
-                        #region 第3步,每个时隙调用定位算法
-                        url = baseUrl + "Pos/PosX2D1NoXlNoParAsync";//两星一地无参无星历定位
-                        foreach (var slot in slots)
+                        #region 第2步,扫描检测结果目录
+                        var groupFiles = Directory.EnumerateFiles(DetectDir, "*.dat", SearchOption.TopDirectoryOnly).Select(p => StringToCheckResFile(p))
+                             .GroupBy(m => Convert.ToInt64(m.DayTime.ToString("yyyyMMdd") + m.FlagNo)).OrderBy(m => m.Key);
+                        if (!groupFiles.Any())
+                        {
+                            LogHelper.Info($"【任务{dto.ID}】等待扫描文件...");
+                            await Task.Delay(10000);
+                        }
+                        foreach (var groupFile in groupFiles)//每一组文件代表同一个时刻的
                         {
                             if (cts.IsCancellationRequested) break;
-                            var httpResp3 = await HttpHelper.PostRequestAsync<PosResDto>(url, new X2D1NoXlNoParlPosDto(), token: cts.Token);
-                            if (httpResp3.code == 0)
+                            List<SlotsInfo> listSlotsInfo = new List<SlotsInfo>();//多个频点的时隙结果
+                            foreach (var item in groupFile)
                             {
-                                LogHelper.Error(httpResp3.msg);
+                                var slotsInfo = SlotHelper.GetFileSlots(item.File);//某个频点的所有时隙
+                                if (slotsInfo.Slots.Any())
+                                    listSlotsInfo.Add(slotsInfo);
+                                else
+                                {
+                                    LogHelper.Warning($"【任务{dto.ID}】{slotsInfo.AdTime:yyyyMMddHHmmss}时刻频点{slotsInfo.FreqDownMHz}MHz无检测结果,跳过此组文件");
+                                }
                             }
+                            if (!listSlotsInfo.Any()) continue;
+                            var adFiles = Directory.EnumerateFiles(CapDir, "*.dat", SearchOption.TopDirectoryOnly).Select(p => StringToAdFile(p))
+                                .Where(p => p.AdTime == listSlotsInfo.First().AdTime);
+                            var first = listSlotsInfo.First();
+                            var sigs = listSlotsInfo.Select(p => new DDCSig() { FreqDownHz = (int)(p.FreqDownMHz * 1e6), Mult = (int)first.Multi, Slots = p });
+                            List<DDCFile> chDDCFiles = new List<DDCFile>();//同一个时刻多个频点多个通道的DDC数据
+                            LogHelper.Info($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理开始...");
+                            Parallel.ForEach(adFiles, adFile =>
+                            {
+
+                                //227=变频器频点255-(140-112))
+                                var ddcRes = DDCHelper.DDC(adFile.File, adFile.AdTime, adFile.ChNo, (long)(first.FsampleM * 1e6), (long)(227 * 1e6), DdcDir, sigs);
+                                chDDCFiles.AddRange(StringToDDCFile(ddcRes));
+                            });
+                            LogHelper.Info($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理完成");
+                            if (!chDDCFiles.Any())
+                            {
+                                LogHelper.Error($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理无结果");
+                                continue;
+                            }
+                            var groupDDCFiles = chDDCFiles.GroupBy(p => p.FreqDownMHz);
+                            foreach (var group in groupDDCFiles)
+                            {
+                                //group:同一个时刻同一个频点的多个通道数据
+                                var capTime = group.First().AdTime;
+                                var ch0File = group.Where(p => p.ChNo == 0).FirstOrDefault();
+                                var ch1File = group.Where(p => p.ChNo == 1).FirstOrDefault();
+                                var ch2File = group.Where(p => p.ChNo == 2).FirstOrDefault();
+                                if (ch0File == null)
+                                {
+                                    LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻未找到主星信号ch0文件,跳过此组数据");
+                                    continue;
+                                }
+                                if (ch1File == null)
+                                {
+                                    LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻未找到邻1星信号ch1文件,跳过此组数据");
+                                    continue;
+                                }
+                                if (ch2File == null)
+                                {
+                                    LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻未找到邻2星信号ch2文件,跳过此组数据");
+                                    continue;
+                                }
+
+                                string mainFile = await HttpHelper.UploadFileAsync(ch0File.File, baseUrl + "File/UploadFileAsync", token: cts.Token);//主星文件
+                                string adja1File = await HttpHelper.UploadFileAsync(ch1File.File, baseUrl + "File/UploadFileAsync", token: cts.Token);//邻1星文件
+                                string adja2File = await HttpHelper.UploadFileAsync(ch2File.File, baseUrl + "File/UploadFileAsync", token: cts.Token);//邻2星文件
+
+
+                                var sig = sigs.FirstOrDefault(p => p.FreqDownHz == (int)(group.Key * 1e6));
+                                var cgDto = new CpuCgMultiDto()
+                                {
+                                    dtCenter = 0,
+                                    dtRange = 40000,
+                                    file1 = mainFile,
+                                    file2 = adja1File,
+                                    samplingRate = ch0File.Fs,
+                                    smpPositions = sig.Slots.Slots.Select(p => new SmpPosition() { smpStart = p.StartPoint, smpCount = p.Len }).ToList(),
+                                    snrThreshold = 15,
+                                };
+                                var result1 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
+                                if (result1.code != 200)
+                                {
+                                    LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻主星邻1星CPU参估出错.{result1.msg}");
+                                    continue;
+                                }
+                                LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻主星邻1星CPU参估完成.");
+                                cgDto = new CpuCgMultiDto()
+                                {
+                                    dtCenter = 0,
+                                    dtRange = 40000,
+                                    file1 = mainFile,
+                                    file2 = adja2File,
+                                    samplingRate = ch0File.Fs,
+                                    smpPositions = sig.Slots.Slots.Select(p => new SmpPosition() { smpStart = p.StartPoint, smpCount = p.Len }).ToList(),
+                                    snrThreshold = 15,
+                                };
+                                var result2 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
+                                if (result2.code != 200)
+                                {
+                                    LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻主星邻2星CPU参估出错.{result2.msg}");
+                                    continue;
+                                }
+                                File.Delete(ch0File.File);
+                                File.Delete(ch1File.File);
+                                File.Delete(ch2File.File);
+                                LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻主星邻2星CPU参估完成");
+                                var data1 = result1.data;
+                                var data2 = result2.data;
+                                if (data1.Count != data2.Count || data1.Count != cgDto.smpPositions.Count)
+                                {
+                                    LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻参估结果个数和检测结果个数不匹配");
+                                    continue;
+                                }
+                                for (int i = 0; i < data1.Count; i++)
+                                {
+                                    try
+                                    {
+                                        if (cts.IsCancellationRequested) break;
+                                        X3TwoDtoNoParPosDto x2D1 = new X3TwoDtoNoParPosDto()
+                                        {
+                                            TaskID = dto.ID,
+                                            SigTime = capTime.AddSeconds(data1[i].Smpstart / ch0File.Fs),
+                                            MainCode = MainSatCode,
+                                            Adja1Code = Adja1SatCode,
+                                            Adja2Code = Adja2SatCode,
+                                            MainX = MainSatXYZ[0],
+                                            MainY = MainSatXYZ[1],
+                                            MainZ = MainSatXYZ[2],
+                                            Adja1X = Adja1SatXYZ[0],
+                                            Adja1Y = Adja1SatXYZ[1],
+                                            Adja1Z = Adja1SatXYZ[2],
+                                            Adja2X = Adja2SatXYZ[0],
+                                            Adja2Y = Adja2SatXYZ[1],
+                                            Adja2Z = Adja2SatXYZ[2],
+                                            Dto1 = -data1[i].Dt,
+                                            Dfo1 = data1[i].Df,
+                                            Snr1 = data1[i].Snr,
+                                            Dto2 = -data2[i].Dt,
+                                            Dfo2 = data2[i].Df,
+                                            Snr2 = data2[i].Df,
+                                            SatTxLon = dto.CapLon,
+                                            SatTxLat = dto.CapLat,
+                                            FreqDown = ch0File.FreqDownMHz * 1e6,
+                                            CheckRes = new CheckResDto()
+                                            {
+                                                FileName = Path.GetFileName(ch0File.File),
+                                                SmpCount = sig.Slots.Slots[i].StartPoint,
+                                                SmpStart = sig.Slots.Slots[i].Len,
+                                                PosCheckType = EnumPosCheckTypeDto.DAMA,
+                                            }
+                                        };
+                                        var result = await HttpHelper.PostRequestAsync<PosResDto>(baseUrl + "Pos/PosX3TwoDtoNoParAsync", x2D1);
+                                        if (result.code != 200)
+                                        {
+                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻时隙位置{data1[i].Smpstart}定位异常.{result.msg}");
+                                        }
+                                    }
+                                    catch (Exception ex)
+                                    {
+                                        LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻时隙位置{data1[i].Smpstart}定位异常", ex);
+                                    }
+                                }
+                                LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻定位完成");
+                            }
+
                         }
                         #endregion
                     }
@@ -79,11 +257,83 @@ namespace X2D1TaskServer54.Service
                         LogHelper.Error("任务执行出错", ex);
                     }
                 }
-            },cts.Token);
+            }, cts.Token);
         }
         public void Stop()
         {
             cts?.Cancel();
         }
+        void StopTask(int taskID, string stopReason)
+        {
+            TaskStopHandleDto stopDto = new TaskStopHandleDto() { ID = taskID, StopReason = stopReason };
+            if (string.IsNullOrWhiteSpace(stopReason))
+                LogHelper.Info($"【任务{taskID}】正常结束");
+            else
+                LogHelper.Error($"【任务{taskID}】{stopReason}");
+
+            var stopResp = HttpHelper.PostRequestAsync(baseUrl + "Task/StopTask", stopDto).Result;
+            if (stopResp.code != 200)
+            {
+                LogHelper.Error($"【任务{taskID}】停止异常.{stopResp.msg}");
+                return;
+            }
+        }
+
+        private CheckResFile StringToCheckResFile(string file)
+        {
+            //YUFO_252.050MHz_20240409_1398.dat
+            string fileName = Path.GetFileNameWithoutExtension(file).ToUpper();
+            var arr = fileName.Split(new string[] { "_", "MHZ" }, StringSplitOptions.RemoveEmptyEntries);
+            var dayTime = DateTime.ParseExact(arr[2], "yyyyMMdd", null);
+            CheckResFile res = new CheckResFile()
+            {
+                DayTime = dayTime,
+                File = file,
+                FreqDownMHz = Convert.ToDouble(arr[1]),
+                FlagNo = Convert.ToInt64(arr[3]),
+            };
+            return res;
+        }
+        private AdFile StringToAdFile(string file)
+        {
+            //20240409094240_ADC_ch02.dat
+            var name = Path.GetFileNameWithoutExtension(file).ToUpper();
+            var arr = name.Split(new string[] { "_", "CH" }, StringSplitOptions.RemoveEmptyEntries);
+            var time = DateTime.ParseExact(arr[0], "yyyyMMddHHmmss", null);
+            AdFile adFile = new AdFile()
+            {
+                File = file,
+                AdTime = time,
+                ChNo = Convert.ToInt32(arr[2]),
+            };
+            return adFile;
+        }
+        public DDCFile StringToDDCFile(string file)
+        {
+            //20240409094240_252.025_C109375_ch0.dat
+            var name = Path.GetFileNameWithoutExtension(file).ToUpper();
+            var arr = name.Split(new string[] { "_", "MHz", "C", "H" }, StringSplitOptions.RemoveEmptyEntries);
+            var time = DateTime.ParseExact(arr[0], "yyyyMMddHHmmss", null);
+            double freqDown = Convert.ToDouble(arr[1]);
+            int fs = Convert.ToInt32(arr[2]);
+            int chNo = Convert.ToInt32(arr[3]);
+            return new DDCFile()
+            {
+                AdTime = time,
+                ChNo = chNo,
+                File = file,
+                FreqDownMHz = freqDown,
+                Fs = fs
+            };
+        }
+        public List<DDCFile> StringToDDCFile(List<string> files)
+        {
+            List<DDCFile> list = new List<DDCFile>();
+            foreach (var item in files)
+            {
+                list.Add(StringToDDCFile(item));
+            }
+            return list;
+        }
     }
 }

+ 32 - 3
Service/X2D1TaskServer54/X2D1TaskServer54.csproj → Service/X2D1TaskServer54/X3TaskServer54.csproj

@@ -6,8 +6,8 @@
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
     <ProjectGuid>{31871C1B-8855-4FE4-A549-DB5506C7BE0B}</ProjectGuid>
     <OutputType>WinExe</OutputType>
-    <RootNamespace>XdCxRhDW.X2D1TaskServer</RootNamespace>
-    <AssemblyName>两星一地离线数据处理服务</AssemblyName>
+    <RootNamespace>X3TaskServer54</RootNamespace>
+    <AssemblyName>三星离线数据处理服务</AssemblyName>
     <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
@@ -22,7 +22,8 @@
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
-    <DocumentationFile>bin\Debug\两星一地离线数据处理服务.xml</DocumentationFile>
+    <DocumentationFile>bin\Debug\三星离线数据处理服务.xml</DocumentationFile>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <PlatformTarget>AnyCPU</PlatformTarget>
@@ -146,7 +147,9 @@
     <Compile Include="..\..\XdCxRhDW.App\Localizer\ChsLocalizer.cs">
       <Link>DxHelper\ChsLocalizer.cs</Link>
     </Compile>
+    <Compile Include="AddIns\DDC\DDCHelper.cs" />
     <Compile Include="Controllers\HistoryTaskProcessingController.cs" />
+    <Compile Include="HistoryFile.cs" />
     <Compile Include="LogHelper.cs" />
     <Compile Include="LogInfo.cs" />
     <Compile Include="Program.cs" />
@@ -158,6 +161,7 @@
       <DependentUpon>MainForm.cs</DependentUpon>
     </Compile>
     <Compile Include="Service\HistoryTaskService.cs" />
+    <Compile Include="AddIns\时隙获取\SlotHelper.cs" />
     <None Include="packages.config" />
     <None Include="Properties\licenses.licx" />
     <EmbeddedResource Include="Properties\Resources.resx">
@@ -200,6 +204,31 @@
       <Name>05.XdCxRhDW.WebApi</Name>
     </ProjectReference>
   </ItemGroup>
+  <ItemGroup>
+    <None Include="AddIns\时隙获取\SlotChecker.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="AddIns\时隙获取\SlotChecker.h">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="AddIns\DDC\DigitaDownConverter.exe">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="AddIns\DDC\ippcore-9.0.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="AddIns\DDC\ipps-9.0.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="AddIns\DDC\ippsy8-9.0.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="AddIns\DDC\readme.txt">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
     <PostBuildEvent>del DevExpress*.xml,EntityFramework*.xml,Serilog*.xml,Newtonsoft*.xml

+ 0 - 1
XdCxRhDW.App/EditForms/TargetEditor.cs

@@ -14,7 +14,6 @@ using System.Windows.Documents;
 using System.Windows.Forms;
 using XdCxRhDW.Entity;
 using XdCxRhDW.Repostory;
-using static DevExpress.Utils.Drawing.Helpers.NativeMethods;
 
 namespace XdCxRhDW.App.EditForms
 {

+ 62 - 6
XdCxRhDW.App/UserControl/CtrlHome.cs

@@ -36,13 +36,13 @@ using DevExpress.Utils.Drawing.Helpers;
 using DevExpress.Office.Crypto;
 using XdCxRhDW.App.Model;
 using DPP_YH_Core.Extensions;
-using static DevExpress.Utils.Drawing.Helpers.NativeMethods;
 using DevExpress.Utils.Filtering;
 using DevExpress.Data.Svg;
 using DevExpress.Utils.About;
 using XdCxRhDW.App.App.Properties;
 using System.Windows.Documents;
 using System.Configuration;
+using DevExpress.XtraExport.Helpers;
 
 namespace XdCxRhDW.App.UserControl
 {
@@ -55,6 +55,9 @@ namespace XdCxRhDW.App.UserControl
         {
             InitializeComponent();
             layoutControl1.UseDefault();
+            if (this.splitterItem1.Location.X < 200)
+                this.splitterItem1.Location = new Point(200, 0);
+
         }
 
 
@@ -80,8 +83,8 @@ namespace XdCxRhDW.App.UserControl
                 }
                 this.gridView1.RefreshData();
             });
-
-            gridHomeTask.UseDefault(list).UseEmptyText("点击+创建任务");
+            gridHomeTask.UseDefault(list, showScrollH: true).UseEmptyText("点击+创建任务");
+            gridView1.BestFitColumns();
             gridHomePosRes.UseDefault(new List<ModelPosRes>()).UseMultiSelect().UseRowNumber().UseNullValueText()
                 .AddRowMenu<ModelPosRes>("绘制时差线", SvgHelper.CreateDtoLine(), DrawDtoLine, item => item.PosResType != EnumPosResType.RH)
                 .AddRowMenuAsync<ModelPosRes>("绘制频差线", SvgHelper.CreateDfoLine(), DrawDfoLine, item => item.PosResType == EnumPosResType.X2Dfo || item.PosResType == EnumPosResType.X3TwoDfo)
@@ -284,7 +287,7 @@ namespace XdCxRhDW.App.UserControl
                 if (tsk.HistoryFrequpMHz != null)
                 {
                     var freqArr = tsk.HistoryFrequpMHz.Split(',');
-                    var listFreqHz = freqArr.Select(p => Convert.ToDouble(p) * 1e6).OrderBy(p => p).ToList();
+                    var listFreqHz = freqArr.Where(p => !string.IsNullOrWhiteSpace(p)).Select(p => Convert.ToDouble(p) * 1e6).OrderBy(p => p).ToList();
                     foreach (var freqHz in listFreqHz)
                     {
                         this.txtFrequpMHz.Properties.Items.Add(new ImageComboBoxItem((freqHz / 1e6).ToString("f3"), freqHz));
@@ -520,6 +523,16 @@ namespace XdCxRhDW.App.UserControl
                 {
                     if (tsk.TaskType == EnumTaskType.History)
                     {
+                        TxInfo tx;
+                        using (RHDWContext db = new RHDWContext())
+                        {
+                            tx = db.TxInfos.FirstOrDefault();
+                            if (tx == null)
+                            {
+                                DxHelper.MsgBoxHelper.ShowWarning($"未配置天线信息");
+                                return;
+                            }
+                        }
                         if (tsk.PosType == EnumPosType.X2D1)
                         {
                             //下发任务
@@ -545,6 +558,8 @@ namespace XdCxRhDW.App.UserControl
                                 TaskName = tsk.TaskName,
                                 TaskCheckType = tsk.DetectionWay.HasValue ? (EnumTaskCheckTypeDto)(int)tsk.DetectionWay.Value : EnumTaskCheckTypeDto.DAMA,
                                 CapDir = tsk.CapDir,
+                                CapLon = tx.Lon,
+                                CapLat = tx.Lat,
                                 DateDirFormat = tsk.CapDirFormat,
                                 FreqsHz = freqs.ToList()
                             };
@@ -556,6 +571,44 @@ namespace XdCxRhDW.App.UserControl
                                 return;
                             }
                         }
+                        else if (tsk.PosType == EnumPosType.X3TwoDto)
+                        {
+                            //下发任务
+                            var svtItem = ServerContext.Instance.GetRandomOne(EnumSvrType.X3NoRefHistoryTask);
+                            if (svtItem == null)
+                            {
+                                DxHelper.MsgBoxHelper.ShowWarning($"未找到注册的处理服务");
+                                return;
+                            }
+                            TaskHistoryTimeEditor frm = new TaskHistoryTimeEditor(tsk);
+                            if (frm.ShowDialog() != DialogResult.OK) return;
+                            var startTime = frm.start;
+                            var endTime = frm.end;
+                            var strs = tsk.HistoryFrequpMHz.Split(',');
+                            var freqs = strs.Select(f => ((long)(Convert.ToDouble(f) * 1e6)));
+                            X2D1HistoryTaskHandleDto dto = new X2D1HistoryTaskHandleDto()
+                            {
+                                MainSatCode = tsk.MainSat,
+                                AdjaSatCode = tsk.Adja1Sat.Value,
+                                ID = tsk.ID,
+                                StartTime = startTime,
+                                EndTime = endTime,
+                                TaskName = tsk.TaskName,
+                                TaskCheckType = tsk.DetectionWay.HasValue ? (EnumTaskCheckTypeDto)(int)tsk.DetectionWay.Value : EnumTaskCheckTypeDto.DAMA,
+                                CapDir = tsk.CapDir,
+                                DateDirFormat = tsk.CapDirFormat,
+                                CapLon = tx.Lon,
+                                CapLat = tx.Lat,
+                                FreqsHz = freqs.ToList()
+                            };
+                            var res = await HttpHelper.PostRequestAsync<AjaxResult>(svtItem.BaseHttpAddr + "/api/HistoryTaskProcessing/Run", dto);
+                            if (res.code != 200)
+                            {
+                                Serilog.Log.Error(res.msg);
+                                DxHelper.MsgBoxHelper.ShowError($"{res.msg}");
+                                return;
+                            }
+                        }
                         else
                         {
                             DxHelper.MsgBoxHelper.ShowError($"暂不支持{tsk.PosType.GetEnumDisplayName()}类型的历史任务");
@@ -588,8 +641,11 @@ namespace XdCxRhDW.App.UserControl
                 {
                     if (tsk.TaskType == EnumTaskType.History)
                     {
-                        //下发任务
-                        var svtItem = ServerContext.Instance.GetRandomOne(EnumSvrType.X2D1NoRefHistoryTask);
+                        ModelSvr svtItem = null;
+                        if (tsk.PosType == EnumPosType.X2D1)
+                            svtItem = ServerContext.Instance.GetRandomOne(EnumSvrType.X2D1NoRefHistoryTask);
+                        else if (tsk.PosType == EnumPosType.X3TwoDto)
+                            svtItem = ServerContext.Instance.GetRandomOne(EnumSvrType.X3NoRefHistoryTask);
                         if (svtItem == null)
                         {
                             DxHelper.MsgBoxHelper.ShowWarning($"未找到注册的处理服务");

+ 0 - 2
XdCxRhDW.Repostory/EFContext/RHDWContext.cs

@@ -14,8 +14,6 @@ using System.Reflection;
 using System.Data.SQLite.EF6;
 using System.Data.SQLite;
 using System.Data.Entity.Core.Common;
-using System.Data.Entity.Core.EntityClient;
-using static System.Net.WebRequestMethods;
 using XdCxRhDW.Entity;
 
 namespace XdCxRhDW.Repostory

+ 0 - 1
XdCxRhDW.Sender/ColorRGB.cs

@@ -4,7 +4,6 @@ using System.Drawing;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
-using static DevExpress.Utils.Drawing.Helpers.NativeMethods;
 
 namespace XdCxRhDW.Sender
 {

+ 1 - 1
XdCxRhDW.sln

@@ -25,7 +25,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CpuCgServer", "Service\CpuC
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "X2D1NoRefTaskServer", "Service\X2D1NoRefTaskServer\X2D1NoRefTaskServer.csproj", "{C1BECB5B-A11E-4A10-988F-1056FE60E689}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "X2D1TaskServer54", "Service\X2D1TaskServer54\X2D1TaskServer54.csproj", "{31871C1B-8855-4FE4-A549-DB5506C7BE0B}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "X3TaskServer54", "Service\X2D1TaskServer54\X3TaskServer54.csproj", "{31871C1B-8855-4FE4-A549-DB5506C7BE0B}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution