Browse Source

Merge branch 'master' of http://139.155.15.221:3000/zoulei/XdCxRhDW54

wyq 1 year ago
parent
commit
33af4596a1

+ 4 - 0
Service/X2D1NoRefTaskServer54/AddIns/DDC/DDCHelper.cs

@@ -37,6 +37,10 @@ namespace X2D1NoRefTaskServer54
         public static List<string> DDC(string file, DateTime adTime, int chNo, long fsHz, long freqCenterHz,
             string outDir, IEnumerable<DDCSig> sigs, int timeoutSeconds = 60)
         {
+            if (!outDir.Contains(":"))
+            {
+                outDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, outDir);
+            }
             if (string.IsNullOrWhiteSpace(exePath))
                 throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
             if (!Directory.Exists(exePath))

BIN
Service/X2D1NoRefTaskServer54/AddIns/误差椭圆/DLL_GDOP_Analysis0415.dll


+ 0 - 27
Service/X2D1NoRefTaskServer54/AddIns/误差椭圆/DLL_GDOP_Analysis0415.h

@@ -1,27 +0,0 @@
-#ifndef _DLL_LHDWFUNCTION_H
-#define _DLL_LHDWFUNCTION_H
-#include "math.h"
-
-extern "C"  double * GDOP_Matrix_3X_2DTO(double *main_eph,double *neigh_eph1,double *neigh_eph2,double *Ref_Station_LLH,double *Zone,double step_len,
-	double dto_err,double eph_pos_err, int * Matrix_Size);
-
-extern "C"  double * Error_Ellipse_3X_2DTO(double *main_eph,double *neigh_eph1,double *neigh_eph2,double *Ref_Station_LLH,double *Select_Point,
-	double dto_err,double eph_pos_err,double Pe, int *len);
-
-extern "C"  double * GDOP_Matrix_2X1D(double *main_eph,double *neigh_eph, double *CDB_Station_LLH,double *Ref_Station_LLH,double *Zone,double step_len,
-	                               double dto_err,double eph_err, int * Matrix_Size);
-extern "C"  double * Error_Ellipse_2X1D(double *station1,double *station2, double *station3,double *Ref_Station_LLH,double *Select_Point,
-	                                    double dto_err,double eph_err,double Pe, int *len);
-
-extern "C"  double * GDOP_Matrix_DTFO(double *main_eph,double *neigh_eph,double *Ref_Station_LLH,double *Zone,double step_len,double dto_err,double dfo_err,
-	double eph_pos_err,double eph_vel_err,double fu1,double fu2, int * Matrix_Size);
-extern "C"  double * Error_Ellipse_DTFO(double *main_eph,double *neigh_eph,double *Ref_Station_LLH,double *Select_Point,double dto_err,double dfo_err,
-	                   double eph_pos_err,double eph_vel_err,double fu1,double fu2,double Pe, int *len);
-
-extern "C"  double * GDOP_Matrix_2DFO(double *main_eph,double *neigh_eph1,double *neigh_eph2,double *Zone,double step_len, double dfo_err,
-	                     double eph_pos_err,double eph_vel_err,double fu, int * Matrix_Size);
-extern "C"  double * Error_Ellipse_2DFO(double *main_eph,double *neigh_eph1,double *neigh_eph2,double *Select_Point,double dfo_err,double eph_pos_err,double eph_vel_err,double fu,double Pe, int *len);
-
-extern "C" void freeBuff(void *buf);
-
-#endif 

+ 0 - 3
Service/X2D1NoRefTaskServer54/App.config

@@ -16,9 +16,6 @@
 		<!--采集数据目录-->
 		<add key="CapDir" value="D:\data\AD"/>
 
-		<!--DDC处理后的目录-->
-		<add key="DdcDir" value="D:\data\DDC"/>
-
 		<!--定位结果输出目录-->
 		<add key="PosResDir" value="D:\data\PosRes"/>
 

+ 8 - 0
Service/X2D1NoRefTaskServer54/MainForm.cs

@@ -3,6 +3,7 @@ using DxHelper;
 using System;
 using System.Collections.Generic;
 using System.Configuration;
+using System.IO;
 using System.Threading.Tasks;
 using System.Windows.Forms;
 using XdCxRhDW.Dto;
@@ -35,6 +36,13 @@ namespace X2D1NoRefTaskServer54
 
         private async void MainForm_LoadAsync(object sender, EventArgs e)
         {
+            try
+            {
+                if (Directory.Exists("tmp"))
+                    Directory.Delete("tmp");
+            }
+            catch
+            { }
             var port = Convert.ToInt32(ConfigurationManager.AppSettings["LocalHttpPort"].Trim());
             var svrID = ConfigurationManager.AppSettings["SvrID"].Trim();
             var posPlatformAddr = ConfigurationManager.AppSettings["PosPlatformAddr"].Trim();

+ 1 - 0
Service/X2D1NoRefTaskServer54/Program.cs

@@ -112,6 +112,7 @@ namespace X2D1NoRefTaskServer54
         [STAThread]
         static void Main()
         {
+            
             string outputTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}  {Exception}";
             Serilog.Log.Logger = new Serilog.LoggerConfiguration()
                 .WriteTo.Console(outputTemplate: outputTemplate)

+ 110 - 72
Service/X2D1NoRefTaskServer54/Service/TaskService.cs

@@ -16,10 +16,8 @@ namespace X2D1NoRefTaskServer54.Service
     {
         private readonly string baseUrl;
         CancellationTokenSource cts;
-
         string DetectDir;
         string CapDir;
-        string DdcDir;
         string PosResDir;
         string StateDir;
         int MainSatCode, Adja1SatCode;
@@ -40,7 +38,6 @@ namespace X2D1NoRefTaskServer54.Service
 
             DetectDir = ConfigurationManager.AppSettings["DetectDir"].Trim();
             CapDir = ConfigurationManager.AppSettings["CapDir"].Trim();
-            DdcDir = ConfigurationManager.AppSettings["DdcDir"].Trim();
             PosResDir = ConfigurationManager.AppSettings["PosResDir"].Trim();
             StateDir = ConfigurationManager.AppSettings["StateRptDir"].Trim();
             var PosDtoFactorstr = ConfigurationManager.AppSettings["PosDtoFactor"].Trim();
@@ -50,7 +47,6 @@ namespace X2D1NoRefTaskServer54.Service
             double.TryParse(DtoErrusstr, out DtoErrus);
             var EphErrmstr = ConfigurationManager.AppSettings["EphErrm"].Trim();
             double.TryParse(EphErrmstr, out EphErrm);
-
             string useGpuStr = ConfigurationManager.AppSettings["UseGpuCg"];
             if (useGpuStr != null && useGpuStr.Trim() == "1")
                 useGpuCg = true;
@@ -63,7 +59,6 @@ namespace X2D1NoRefTaskServer54.Service
                 LogHelper.Info($"【任务{dto.ID}】开始执行...");
                 LogHelper.Info($"【任务{dto.ID}】检测结果目录[{DetectDir}]");
                 LogHelper.Info($"【任务{dto.ID}】AD采集目录[{CapDir}]");
-                LogHelper.Info($"【任务{dto.ID}】DDC输出目录[{DdcDir}]");
                 LogHelper.Info($"【任务{dto.ID}】状态上报输出目录[{StateDir}]");
                 //点击定位平台右上角查看接口可以在浏览器中查看平台提供的所有接口详细信息
                 while (!cts.IsCancellationRequested)
@@ -81,7 +76,7 @@ namespace X2D1NoRefTaskServer54.Service
                             await StopTask(dto.ID, EnumTaskStopType.Error, $"AD采集目录[{CapDir}]不存在");
                             return;
                         }
-                        Directory.CreateDirectory(DdcDir);
+                        Directory.CreateDirectory("DdcDir");
                         Directory.CreateDirectory(PosResDir);
 
                         try
@@ -103,6 +98,7 @@ namespace X2D1NoRefTaskServer54.Service
                         #endregion
 
                         #region 第2步,扫描检测结果目录
+                        //同一个AD文件得到的不同频点的检测文件FlagNo相同
                         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())
@@ -113,21 +109,43 @@ namespace X2D1NoRefTaskServer54.Service
                         foreach (var groupFile in groupFiles)//每一组文件代表同一个时刻的
                         {
                             if (cts.IsCancellationRequested) break;
+                            LogHelper.Info($"【任务{dto.ID}】正在解析序号为{groupFile.First().FlagNo}的检测引导文件");
                             List<SlotsInfo> listSlotsInfo = new List<SlotsInfo>();//多个频点的时隙结果
+                            int idx = 0;
+                            DateTime adTime = DateTime.MinValue;
                             foreach (var item in groupFile)
                             {
+                                if (cts.IsCancellationRequested) break;
                                 var slotsInfo = SlotHelper.GetFileSlots(item.File);//某个频点的所有时隙
-                                if (!Debugger.IsAttached)
-                                    File.Delete(item.File);//检测检测结果文件
+                                adTime = slotsInfo.AdTime;
+                                if (idx == 0)
+                                    LogHelper.Info($"【任务{dto.ID}】序号为{groupFile.First().FlagNo}的检测引导文件对应采集时刻{slotsInfo.AdTime:yyyyMMddHHmmss}");
+                                idx++;
                                 if (slotsInfo.Slots.Any())
                                     listSlotsInfo.Add(slotsInfo);
+                                else
+                                    File.Delete(item.File);//删除没有信号的检测引导文件
                             }
-                            if (!listSlotsInfo.Any()) continue;
                             var adFiles = Directory.EnumerateFiles(CapDir, "*.dat", SearchOption.TopDirectoryOnly).Select(p => StringToAdFile(p))
                                 .Where(p => p.AdTime == listSlotsInfo.First().AdTime);
-                            if (!adFiles.Any())
+                            if (!listSlotsInfo.Any())
                             {
-                                LogHelper.Warning($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻找不到原始AD文件,跳过此组文件");
+                                //没有突发信号,删除所有对应时刻的采集文件
+                                foreach (var item in adFiles)
+                                {
+                                    File.Delete(item.File);
+                                }
+                                continue;
+                            }
+
+                            if (adFiles.Count() != 3)
+                            {
+                                LogHelper.Warning($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻原始AD文件个数不为3,跳过此组文件");
+                                //AD数据不全,删除所有对应时刻的采集文件
+                                foreach (var item in adFiles)
+                                {
+                                    File.Delete(item.File);
+                                }
                                 continue;
                             }
                             var first = listSlotsInfo.First();
@@ -141,7 +159,7 @@ namespace X2D1NoRefTaskServer54.Service
                             {
                                 var task = Task.Run(() =>
                                 {
-                                    var ddcRes = DDCHelper.DDC(adFile.File, adFile.AdTime, adFile.ChNo, (long)(first.FsampleM * 1e6), (long)(227 * 1e6), DdcDir, sigs);
+                                    var ddcRes = DDCHelper.DDC(adFile.File, adFile.AdTime, adFile.ChNo, (long)(first.FsampleM * 1e6), (long)(227 * 1e6), "DdcDir", sigs);
                                     chDDCFiles.AddRange(StringToDDCFile(ddcRes));
                                     if (!Debugger.IsAttached)
                                         File.Delete(adFile.File);//删除AD文件
@@ -149,11 +167,12 @@ namespace X2D1NoRefTaskServer54.Service
                                 listTask.Add(task);
                             }
                             await Task.WhenAll(listTask);
+                            if (cts.IsCancellationRequested) break;
                             sw.Stop();
-                            LogHelper.Info($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理完成,耗时{sw.ElapsedMilliseconds}ms");
+                            LogHelper.Info($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻3路AD文件DDC处理完成,耗时{sw.ElapsedMilliseconds}ms");
                             if (!chDDCFiles.Any())
                             {
-                                LogHelper.Error($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理无结果");
+                                LogHelper.Error($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻3路AD文件DDC处理无结果");
                                 continue;
                             }
                             var groupDDCFiles = chDDCFiles.GroupBy(p => p.FreqDownMHz);
@@ -163,23 +182,22 @@ namespace X2D1NoRefTaskServer54.Service
                                 //group:同一个时刻同一个频点的多个通道数据
                                 var task = Task.Run(async () =>
                                 {
-                                    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}时刻-信号{group.Key}MHz-未找到主星信号ch0文件,跳过此组数据");
+                                        LogHelper.Warning($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到主星信号ch0文件,跳过此组数据");
                                         return;
                                     }
                                     if (ch1File == null)
                                     {
-                                        LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到邻星信号ch1文件,跳过此组数据");
+                                        LogHelper.Warning($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到邻星信号ch1文件,跳过此组数据");
                                         return;
                                     }
                                     if (ch2File == null)
                                     {
-                                        LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到超短信号ch2文件,跳过此组数据");
+                                        LogHelper.Warning($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到超短信号ch2文件,跳过此组数据");
                                         return;
                                     }
                                     var sig = sigs.FirstOrDefault(p => p.FreqDownHz == (int)(group.Key * 1e6));
@@ -187,7 +205,7 @@ namespace X2D1NoRefTaskServer54.Service
                                     if (cts.IsCancellationRequested) return;
                                     if (useGpuCg)
                                     {
-                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-GPU参估开始,共{sig.Slots.Slots.Count}个突发...");
+                                        LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-GPU参估开始,共{sig.Slots.Slots.Count}个突发...");
                                         sw.Start();
                                         List<GpuCgResponseDto> data1 = new List<GpuCgResponseDto>();
                                         List<GpuCgResponseDto> data2 = new List<GpuCgResponseDto>();
@@ -236,7 +254,7 @@ namespace X2D1NoRefTaskServer54.Service
                                             var result1 = await HttpHelper.PostRequestAsync<List<GpuCgResponseDto>>(baseUrl + "DetectCg/GpuCgCalc", gpudto, token: cts.Token);
                                             if (result1.code != 200)
                                             {
-                                                LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻1星GPU参估出错.{result1.msg}.突发位置{item.StartPoint}-{item.Len}");
+                                                LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻1星GPU参估出错.{result1.msg}.突发位置{item.StartPoint}-{item.Len}");
                                                 continue;
                                             }
                                             var data1First = result1.data.First();
@@ -255,7 +273,7 @@ namespace X2D1NoRefTaskServer54.Service
                                             var result2 = await HttpHelper.PostRequestAsync<List<GpuCgResponseDto>>(baseUrl + "DetectCg/GpuCgCalc", gpudto, token: cts.Token);
                                             if (result2.code != 200)
                                             {
-                                                LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻2星GPU参估出错.{result2.msg}.突发位置{item.StartPoint}-{item.Len}");
+                                                LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻2星GPU参估出错.{result2.msg}.突发位置{item.StartPoint}-{item.Len}");
                                                 continue;
                                             }
                                             var data2First = result2.data.First();
@@ -263,7 +281,7 @@ namespace X2D1NoRefTaskServer54.Service
                                             data2.Add(data2First);
                                         }
                                         sw.Stop();
-                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-GPU参估完成,耗时{sw.ElapsedMilliseconds}ms");
+                                        LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-GPU参估完成,耗时{sw.ElapsedMilliseconds}ms");
 
                                         string mainFile = await HttpHelper.UploadFileAsync(ch0File.File, baseUrl, token: cts.Token);//主星文件
                                         var smpPositions = sig.Slots.Slots.Select(p => new SmpPosition() { TimeSeconds = p.TimeSeconds, smpStart = p.StartPoint, smpCount = p.Len }).ToList();
@@ -276,20 +294,20 @@ namespace X2D1NoRefTaskServer54.Service
                                         var signalResult = await HttpHelper.PostRequestAsync<List<SignalProcResDto>>(baseUrl + "DetectCg/SignalProc", signaldto);
                                         if (signalResult.code != 200)
                                         {
-                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星信号识别出错.{signalResult.msg}");
+                                            LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星信号识别出错.{signalResult.msg}");
                                             return;
 
                                         }
-                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-GPU参估完成,耗时{sw.ElapsedMilliseconds}ms");
+                                        LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-GPU参估完成,耗时{sw.ElapsedMilliseconds}ms");
                                         if (data1.Count != data2.Count || data1.Count != sig.Slots.Slots.Count)
                                         {
-                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-参估结果个数和检测结果个数不匹配");
+                                            LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-参估结果个数和检测结果个数不匹配");
                                             return;
                                         }
 
                                         if (data1.Count != data2.Count || data1.Count != signalResult.data.Count)
                                         {
-                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-信号识别结果个数和检测结果个数不匹配");
+                                            LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-信号识别结果个数和检测结果个数不匹配");
                                             return;
                                         }
                                         sw.Start();
@@ -301,8 +319,8 @@ namespace X2D1NoRefTaskServer54.Service
                                                 X2D1NoParPosDto x21d = new X2D1NoParPosDto()
                                                 {
                                                     TaskID = dto.ID,
-                                                    //SigTime = capTime.AddSeconds(data1[i].Smpstart / (double)ch0File.Fs),
-                                                    SigTime = capTime.AddSeconds(data1[i].TimeSeconds),
+                                                    //SigTime = adTime.AddSeconds(data1[i].Smpstart / (double)ch0File.Fs),
+                                                    SigTime = adTime.AddSeconds(data1[i].TimeSeconds),
                                                     MainCode = MainSatCode,
                                                     AdjaCode = Adja1SatCode,
                                                     MainX = MainSatXYZ[0],
@@ -322,7 +340,7 @@ namespace X2D1NoRefTaskServer54.Service
                                                     CdbTxLon = dto.CdbLon,
                                                     CdbTxLat = dto.CdbLat,
                                                     FreqDown = ch0File.FreqDownMHz * 1e6,
-                                                    FreqUp = (ch0File.FreqDownMHz+44) * 1e6,
+                                                    FreqUp = (ch0File.FreqDownMHz + 44) * 1e6,
                                                     CheckRes = new CheckResDto()
                                                     {
                                                         FileName = Path.GetFileName(ch0File.File),
@@ -334,7 +352,7 @@ namespace X2D1NoRefTaskServer54.Service
                                                 var result = await HttpHelper.PostRequestAsync<PosResDto>(baseUrl + "Pos/PosX2D1NoParAsync", x21d);
                                                 if (result.code != 200)
                                                 {
-                                                    LogHelper.Error($"【任务{dto.ID}】-信号{group.Key}MHz-{capTime:yyyyMMddHHmmss}时刻第{i + 1}个突发定位异常.{result.msg}");
+                                                    LogHelper.Error($"【任务{dto.ID}】-信号{group.Key}MHz-{adTime:yyyyMMddHHmmss}时刻第{i + 1}个突发定位异常.{result.msg}");
                                                 }
                                                 else
                                                 {
@@ -346,22 +364,31 @@ namespace X2D1NoRefTaskServer54.Service
                                                         posLon = 0;
                                                         posLat = 0;
                                                     }
-                                                    double longAxis = 0, shortAxis = 0, dipAngle = 0;
+                                                    ErrEllipseResDto errRes = new ErrEllipseResDto();
                                                     if (posLon != 0 && posLat != 0 && posLon != 999 && posLat != 999)
                                                     {
-                                                        double[] cdbPos = new double[] { dto.CdbLon, dto.CdbLat, 0 };
-                                                        double[] refGeod = new double[] { 0, 0, 0 };
 #warning 误差椭圆没有提供无参算法 暂时使用有参
-                                                        double[] errorEllipse = ErrEllipseHepler.ErrorEllipse2X1D(posLon, posLat, MainSatXYZ, Adja1SatXYZ, cdbPos, refGeod, DtoErrus, EphErrm);
-                                                        if (errorEllipse.Length == 3)
+                                                        var errDto = new ErrEllipseX2D1Dto()
                                                         {
-                                                            longAxis = errorEllipse[0];
-                                                            shortAxis = errorEllipse[1];
-                                                            dipAngle = errorEllipse[2];
-                                                        }
+                                                            MainX = MainSatXYZ[0],
+                                                            MainY = MainSatXYZ[1],
+                                                            MainZ = MainSatXYZ[2],
+                                                            AdjaX = Adja1SatXYZ[0],
+                                                            AdjaY = Adja1SatXYZ[1],
+                                                            AdjaZ = Adja1SatXYZ[2],
+                                                            CdbLon = dto.CdbLon,
+                                                            CdbLat = dto.CdbLat,
+                                                            RefLon = 0,
+                                                            RefLat = 0,
+                                                            PosLon = posLon,
+                                                            PosLat = posLat,
+                                                            OutputErrPoint = false,
+                                                            DtoErrus = DtoErrus,
+                                                            EphErr = EphErrm,
+                                                        };
+                                                       var errResRsp = await HttpHelper.PostRequestAsync<ErrEllipseResDto>(baseUrl + "DetectCg/ErrorEllipse2X1D", errDto);
+                                                        errRes = errResRsp.data;
                                                     }
-
-
                                                     StringBuilder sb = new StringBuilder();
                                                     sb.Append($"{x21d.SigTime:yyyy}\t");
                                                     sb.Append($"{x21d.SigTime:MM}\t");
@@ -388,9 +415,9 @@ namespace X2D1NoRefTaskServer54.Service
                                                     sb.Append($"{Convert.ToInt64(0 * 1e2):D10}\t");
                                                     sb.Append($"{Convert.ToInt64(0 * 1e2):D10}\t");
                                                     sb.Append($"{Convert.ToInt64(0 * 1e2):D6}\t");
-                                                    sb.Append($"{(long)longAxis:D8}\t");//长轴
-                                                    sb.Append($"{(long)shortAxis:D8}\t");//短轴
-                                                    sb.Append($"{(long)dipAngle:D7}\t");//倾角
+                                                    sb.Append($"{(long)errRes.LongRadius:D8}\t");//长轴m
+                                                    sb.Append($"{(long)errRes.ShortRadius:D8}\t");//短轴m
+                                                    sb.Append($"{(long)errRes.DipAngle:D7}\t");//倾角°
                                                     sb.Append($"{data1.Count:D2}\t");//时隙属性
                                                     sb.Append($"{1}\t");//所属卫星
                                                     sb.Append($"{950:D3}\t");//置信度
@@ -403,16 +430,16 @@ namespace X2D1NoRefTaskServer54.Service
                                             }
                                             catch (Exception ex)
                                             {
-                                                LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-第{i + 1}个突发定位异常", ex);
+                                                LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-第{i + 1}个突发定位异常", ex);
                                             }
                                         }
                                         sw.Stop();
-                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-定位完成,耗时{sw.ElapsedMilliseconds}ms");
+                                        LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-定位完成,耗时{sw.ElapsedMilliseconds}ms");
                                     }
                                     else
                                     {
 
-                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-CPU参估开始,共{sig.Slots.Slots.Count}个突发...");
+                                        LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-CPU参估开始,共{sig.Slots.Slots.Count}个突发...");
                                         sw.Start();
                                         string mainFile = await HttpHelper.UploadFileAsync(ch0File.File, baseUrl, token: cts.Token);//主星文件
                                         string adja1File = await HttpHelper.UploadFileAsync(ch1File.File, baseUrl, token: cts.Token);//邻1星文件
@@ -432,7 +459,7 @@ namespace X2D1NoRefTaskServer54.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参估出错.{result1.msg}");
+                                            LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻主星邻星CPU参估出错.{result1.msg}");
                                             return;
                                         }
                                         cgDto = new CpuCgMultiDto()
@@ -448,11 +475,11 @@ namespace X2D1NoRefTaskServer54.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}时刻-信号{group.Key}MHz-主星超短CPU参估出错.{result2.msg}");
+                                            LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星超短CPU参估出错.{result2.msg}");
                                             return;
                                         }
                                         sw.Stop();
-                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-CPU参估完成,耗时{sw.ElapsedMilliseconds}ms");
+                                        LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-CPU参估完成,耗时{sw.ElapsedMilliseconds}ms");
                                         var signaldto = new SignalProcDto()
                                         {
                                             File = mainFile,
@@ -462,22 +489,22 @@ namespace X2D1NoRefTaskServer54.Service
                                         var signalResult = await HttpHelper.PostRequestAsync<List<SignalProcResDto>>(baseUrl + "DetectCg/SignalProc", signaldto);
                                         if (signalResult.code != 200)
                                         {
-                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星信号识别出错.{signalResult.msg}");
+                                            LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星信号识别出错.{signalResult.msg}");
                                             return;
 
                                         }
 
-                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星超短CPU参估完成");
+                                        LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星超短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}时刻-信号{group.Key}MHz-参估结果个数和检测结果个数不匹配");
+                                            LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-参估结果个数和检测结果个数不匹配");
                                             return;
                                         }
                                         if (data1.Count != signalResult.data.Count)
                                         {
-                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-信号识别结果个数和检测结果个数不匹配");
+                                            LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-信号识别结果个数和检测结果个数不匹配");
                                             return;
                                         }
                                         sw.Start();
@@ -489,8 +516,8 @@ namespace X2D1NoRefTaskServer54.Service
                                                 X2D1NoParPosDto x21d = new X2D1NoParPosDto()
                                                 {
                                                     TaskID = dto.ID,
-                                                    //SigTime = capTime.AddSeconds(data1[i].Smpstart / (double)ch0File.Fs),
-                                                    SigTime = capTime.AddSeconds(data1[i].TimeSeconds),
+                                                    //SigTime = adTime.AddSeconds(data1[i].Smpstart / (double)ch0File.Fs),
+                                                    SigTime = adTime.AddSeconds(data1[i].TimeSeconds),
                                                     MainCode = MainSatCode,
                                                     AdjaCode = Adja1SatCode,
                                                     MainX = MainSatXYZ[0],
@@ -510,7 +537,7 @@ namespace X2D1NoRefTaskServer54.Service
                                                     CdbTxLon = dto.CdbLon,
                                                     CdbTxLat = dto.CdbLat,
                                                     FreqDown = ch0File.FreqDownMHz * 1e6,
-                                                    FreqUp = (ch0File.FreqDownMHz+44) * 1e6,
+                                                    FreqUp = (ch0File.FreqDownMHz + 44) * 1e6,
                                                     CheckRes = new CheckResDto()
                                                     {
                                                         FileName = Path.GetFileName(ch0File.File),
@@ -522,7 +549,7 @@ namespace X2D1NoRefTaskServer54.Service
                                                 var result = await HttpHelper.PostRequestAsync<PosResDto>(baseUrl + "Pos/PosX2D1NoParAsync", x21d);
                                                 if (result.code != 200)
                                                 {
-                                                    LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-时隙位置{data1[i].Smpstart}定位异常.{result.msg}");
+                                                    LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-时隙位置{data1[i].Smpstart}定位异常.{result.msg}");
                                                 }
                                                 else
                                                 {
@@ -534,19 +561,30 @@ namespace X2D1NoRefTaskServer54.Service
                                                         posLon = 0;
                                                         posLat = 0;
                                                     }
-                                                    double longAxis = 0, shortAxis = 0, dipAngle = 0;
+                                                    ErrEllipseResDto errRes = new ErrEllipseResDto();
                                                     if (posLon != 0 && posLat != 0 && posLon != 999 && posLat != 999)
                                                     {
-                                                        double[] cdbPos = new double[] { dto.CdbLon, dto.CdbLat, 0 };
-                                                        double[] refGeod = new double[] { 0, 0, 0 };
 #warning 误差椭圆没有提供无参算法 暂时使用有参
-                                                        double[] errorEllipse = ErrEllipseHepler.ErrorEllipse2X1D(posLon, posLat, MainSatXYZ, Adja1SatXYZ, cdbPos, refGeod, DtoErrus, EphErrm);
-                                                        if (errorEllipse.Length == 3)
+                                                        var errDto = new ErrEllipseX2D1Dto()
                                                         {
-                                                            longAxis = errorEllipse[0];
-                                                            shortAxis = errorEllipse[1];
-                                                            dipAngle = errorEllipse[2];
-                                                        }
+                                                            MainX = MainSatXYZ[0],
+                                                            MainY = MainSatXYZ[1],
+                                                            MainZ = MainSatXYZ[2],
+                                                            AdjaX = Adja1SatXYZ[0],
+                                                            AdjaY = Adja1SatXYZ[1],
+                                                            AdjaZ = Adja1SatXYZ[2],
+                                                            CdbLon = dto.CdbLon,
+                                                            CdbLat = dto.CdbLat,
+                                                            RefLon = 0,
+                                                            RefLat = 0,
+                                                            PosLon = posLon,
+                                                            PosLat = posLat,
+                                                            OutputErrPoint = false,
+                                                            DtoErrus = DtoErrus,
+                                                            EphErr = EphErrm,
+                                                        };
+                                                        var errResRsp = await HttpHelper.PostRequestAsync<ErrEllipseResDto>(baseUrl + "DetectCg/ErrorEllipse2X1D", errDto);
+                                                        errRes = errResRsp.data;
                                                     }
                                                     StringBuilder sb = new StringBuilder();
                                                     sb.Append($"{x21d.SigTime:yyyy}\t");
@@ -574,9 +612,9 @@ namespace X2D1NoRefTaskServer54.Service
                                                     sb.Append($"{Convert.ToInt64(0 * 1e2):D10}\t");
                                                     sb.Append($"{Convert.ToInt64(0 * 1e2):D10}\t");
                                                     sb.Append($"{Convert.ToInt64(0 * 1e2):D6}\t");
-                                                    sb.Append($"{(long)longAxis:D8}\t");//长轴
-                                                    sb.Append($"{(long)shortAxis:D8}\t");//短轴
-                                                    sb.Append($"{(long)dipAngle:D7}\t");//倾角
+                                                    sb.Append($"{(long)errRes.LongRadius:D8}\t");//长轴m
+                                                    sb.Append($"{(long)errRes.ShortRadius:D8}\t");//短轴m
+                                                    sb.Append($"{(long)errRes.DipAngle:D7}\t");//倾角°
                                                     sb.Append($"{data1.Count:D2}\t");//时隙属性
                                                     sb.Append($"{1}\t");//所属卫星
                                                     sb.Append($"{950:D3}\t");//置信度
@@ -589,11 +627,11 @@ namespace X2D1NoRefTaskServer54.Service
                                             }
                                             catch (Exception ex)
                                             {
-                                                LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-时隙位置{data1[i].Smpstart}定位异常", ex);
+                                                LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-时隙位置{data1[i].Smpstart}定位异常", ex);
                                             }
                                         }
                                         sw.Stop();
-                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-定位完成,耗时{sw.ElapsedMilliseconds}ms");
+                                        LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-定位完成,耗时{sw.ElapsedMilliseconds}ms");
                                     }
                                     //删除DDC文件
                                     File.Delete(ch0File.File);

+ 0 - 9
Service/X2D1NoRefTaskServer54/X2D1NoRefTaskServer54.csproj

@@ -119,7 +119,6 @@
       <Link>DxHelper\ChsLocalizer.cs</Link>
     </Compile>
     <Compile Include="AddIns\DDC\DDCHelper.cs" />
-    <Compile Include="AddIns\误差椭圆\ErrEllipseHepler.cs" />
     <Compile Include="Controllers\X2D1NoRefTaskProcessingController.cs" />
     <Compile Include="HistoryFile.cs" />
     <Compile Include="LogHelper.cs" />
@@ -200,14 +199,6 @@
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
   </ItemGroup>
-  <ItemGroup>
-    <Content Include="AddIns\误差椭圆\DLL_GDOP_Analysis0415.dll">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <Content Include="AddIns\误差椭圆\DLL_GDOP_Analysis0415.h">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
     <PostBuildEvent>del DevExpress*.xml,EntityFramework*.xml,Serilog*.xml,Newtonsoft*.xml

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

@@ -37,6 +37,10 @@ namespace X3TaskServer54
         public static List<string> DDC(string file, DateTime adTime, int chNo, long fsHz, long freqCenterHz,
             string outDir, IEnumerable<DDCSig> sigs, int timeoutSeconds = 60)
         {
+            if (!outDir.Contains(":"))
+            {
+                outDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, outDir);
+            }
             if (string.IsNullOrWhiteSpace(exePath))
                 throw new Exception($"请先调用SetExePath指定{exeName}进程所在路径,支持相对路径");
             if (!Directory.Exists(exePath))

+ 8 - 8
Service/X2D1TaskServer54/App.config

@@ -11,24 +11,24 @@
 		<add key="PosPlatformAddr" value="http://127.0.0.1:8091" />
 
 		<!--检测结果目录-->
-		<add key="DetectDir" value="D:\data\Detect"/>
+		<add key="DetectDir" value="E:\data10\三星仿真数据\Detected"/>
 
 		<!--采集数据目录-->
-		<add key="CapDir" value="D:\data\AD"/>
+		<add key="CapDir" value="E:\data10\三星仿真数据\AD"/>
 
 		<!--DDC处理后的目录-->
-		<add key="DdcDir" value="D:\data\DDC"/>
+		<add key="DdcDir" value="E:\data10\三星仿真数据\DDC"/>
 
 		<!--定位结果输出目录-->
-		<add key="PosResDir" value="D:\data\PosRes"/>
+		<add key="PosResDir" value="E:\PosRes"/>
 
 		<!--状态上报目录-->
 		<add key="StateRptDir" value="D:\data\StateRes"/>
-		
+
 		<!--卫星及星历-->
-		<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"/>
+		<add key ="MainSatInfo" value="23467,-41382191.9136000,5386554.56810000,5909229.48100000"/>
+		<add key ="Adja1SatInfo" value="40892,-38200978.7507000,17823454.4590000,17223.4116000000"/>
+		<add key ="Adja2SatInfo" value="44637,4750288.28780000,41880282.2295000,19391.6018000000"/>
 
 		<!--定位时差系数-->
 		<add key="PosDtoFactor" value="-1"/>

+ 8 - 0
Service/X2D1TaskServer54/MainForm.cs

@@ -3,6 +3,7 @@ using DxHelper;
 using System;
 using System.Collections.Generic;
 using System.Configuration;
+using System.IO;
 using System.Threading.Tasks;
 using System.Windows.Forms;
 using XdCxRhDW.Dto;
@@ -35,6 +36,13 @@ namespace X3TaskServer54
 
         private async void MainForm_LoadAsync(object sender, EventArgs e)
         {
+            try
+            {
+                if (Directory.Exists("tmp"))
+                    Directory.Delete("tmp");
+            }
+            catch
+            { }
             var port = Convert.ToInt32(ConfigurationManager.AppSettings["LocalHttpPort"].Trim());
             var svrID = ConfigurationManager.AppSettings["SvrID"].Trim();
             var posPlatformAddr = ConfigurationManager.AppSettings["PosPlatformAddr"].Trim();

+ 61 - 44
Service/X2D1TaskServer54/Service/TaskService.cs

@@ -18,10 +18,8 @@ namespace X3TaskServer54.Service
     {
         private readonly string baseUrl;
         CancellationTokenSource cts;
-
         string DetectDir;
         string CapDir;
-        string DdcDir;
         string PosResDir;
         string StateDir;
         int MainSatCode, Adja1SatCode, Adja2SatCode;
@@ -30,7 +28,6 @@ namespace X3TaskServer54.Service
         bool useGpuCg = false;
         public TaskService()
         {
-            Directory.CreateDirectory("tmp");
             var posPlatformAddr = ConfigurationManager.AppSettings["PosPlatformAddr"].Trim();//like http://127.0.0.1:8091 or http://127.0.0.1:8091/
             if (posPlatformAddr.EndsWith("/"))
                 this.baseUrl = posPlatformAddr + "api/";
@@ -39,7 +36,6 @@ namespace X3TaskServer54.Service
 
             DetectDir = ConfigurationManager.AppSettings["DetectDir"].Trim();
             CapDir = ConfigurationManager.AppSettings["CapDir"].Trim();
-            DdcDir = ConfigurationManager.AppSettings["DdcDir"].Trim();
             PosResDir = ConfigurationManager.AppSettings["PosResDir"].Trim();
             StateDir = ConfigurationManager.AppSettings["StateRptDir"].Trim();
             var PosDtoFactorstr = ConfigurationManager.AppSettings["PosDtoFactor"].Trim();
@@ -59,7 +55,6 @@ namespace X3TaskServer54.Service
                 LogHelper.Info($"【任务{dto.ID}】开始执行...");
                 LogHelper.Info($"【任务{dto.ID}】检测结果目录[{DetectDir}]");
                 LogHelper.Info($"【任务{dto.ID}】AD采集目录[{CapDir}]");
-                LogHelper.Info($"【任务{dto.ID}】DDC输出目录[{DdcDir}]");
                 LogHelper.Info($"【任务{dto.ID}】状态上报输出目录[{StateDir}]");
                 //点击定位平台右上角查看接口可以在浏览器中查看平台提供的所有接口详细信息
                 while (!cts.IsCancellationRequested)
@@ -77,7 +72,7 @@ namespace X3TaskServer54.Service
                             await StopTask(dto.ID, EnumTaskStopType.Error, $"AD采集目录[{CapDir}]不存在");
                             return;
                         }
-                        Directory.CreateDirectory(DdcDir);
+                        Directory.CreateDirectory("DdcDir");
                         Directory.CreateDirectory(PosResDir);
                         try
                         {
@@ -102,6 +97,7 @@ namespace X3TaskServer54.Service
                         #endregion
 
                         #region 第2步,扫描检测结果目录
+                        //同一个AD文件得到的不同频点的检测文件FlagNo相同
                         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())
@@ -109,30 +105,53 @@ namespace X3TaskServer54.Service
                             LogHelper.Info($"【任务{dto.ID}】等待扫描文件...");
                             await Task.Delay(10000);
                         }
-                        foreach (var groupFile in groupFiles)//每一组文件代表同一个时刻的
+
+                        foreach (var groupFile in groupFiles)//每一组文件代表同一个时刻的,gourpFile时相同时刻的不同频点的文件
                         {
                             if (cts.IsCancellationRequested) break;
+                            LogHelper.Info($"【任务{dto.ID}】正在解析序号为{groupFile.First().FlagNo}的检测引导文件");
                             List<SlotsInfo> listSlotsInfo = new List<SlotsInfo>();//多个频点的时隙结果
+                            int idx = 0;
+                            DateTime adTime = DateTime.MinValue;
                             foreach (var item in groupFile)
                             {
+                                if (cts.IsCancellationRequested) break;
                                 var slotsInfo = SlotHelper.GetFileSlots(item.File);//某个频点的所有时隙
-                                if (!Debugger.IsAttached)
-                                    File.Delete(item.File);//检测检测结果文件
+                                adTime = slotsInfo.AdTime;
+                                if (idx == 0)
+                                    LogHelper.Info($"【任务{dto.ID}】序号为{groupFile.First().FlagNo}的检测引导文件对应采集时刻{slotsInfo.AdTime:yyyyMMddHHmmss}");
+                                idx++;
                                 if (slotsInfo.Slots.Any())
                                     listSlotsInfo.Add(slotsInfo);
+                                else
+                                    File.Delete(item.File);//删除没有信号的检测引导文件
                             }
-                            if (!listSlotsInfo.Any()) continue;
                             var adFiles = Directory.EnumerateFiles(CapDir, "*.dat", SearchOption.TopDirectoryOnly).Select(p => StringToAdFile(p))
-                                .Where(p => p.AdTime == listSlotsInfo.First().AdTime);
-                            if (!adFiles.Any())
+                                .Where(p => p.AdTime == adTime);
+                            if (!listSlotsInfo.Any())
+                            {
+                                //没有突发信号,删除所有对应时刻的采集文件
+                                foreach (var item in adFiles)
+                                {
+                                    File.Delete(item.File);
+                                }
+                                continue;
+                            }
+
+                            if (adFiles.Count() != 3)
                             {
-                                LogHelper.Warning($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻找不到原始AD文件,跳过此组文件");
+                                LogHelper.Warning($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻原始AD文件个数不为3,跳过此组文件");
+                                //AD数据不全,删除所有对应时刻的采集文件
+                                foreach (var item in adFiles)
+                                {
+                                    File.Delete(item.File);
+                                }
                                 continue;
                             }
                             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处理开始,共{sigs.Count()}个频点...");
+                            LogHelper.Info($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻3路AD文件开始DDC处理开始,共{sigs.Count()}个频点...");
                             Stopwatch sw = new Stopwatch();
                             sw.Start();
                             var listTask = new List<Task>();
@@ -140,19 +159,18 @@ namespace X3TaskServer54.Service
                             {
                                 var task = Task.Run(() =>
                                 {
-                                    var ddcRes = DDCHelper.DDC(adFile.File, adFile.AdTime, adFile.ChNo, (long)(first.FsampleM * 1e6), (long)(227 * 1e6), DdcDir, sigs);
+                                    var ddcRes = DDCHelper.DDC(adFile.File, adFile.AdTime, adFile.ChNo, (long)(first.FsampleM * 1e6), (long)(227 * 1e6), "DdcDir", sigs);
                                     chDDCFiles.AddRange(StringToDDCFile(ddcRes));
-                                    if (!Debugger.IsAttached)
-                                        File.Delete(adFile.File);//删除AD文件
                                 }, cts.Token);
                                 listTask.Add(task);
                             }
                             await Task.WhenAll(listTask);
+                            if (cts.IsCancellationRequested) break;
                             sw.Stop();
-                            LogHelper.Info($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理完成,耗时{sw.ElapsedMilliseconds}ms");
+                            LogHelper.Info($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻3路AD文件DDC处理完成,耗时{sw.ElapsedMilliseconds}ms");
                             if (!chDDCFiles.Any())
                             {
-                                LogHelper.Error($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理无结果");
+                                LogHelper.Error($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻3路AD文件DDC处理无结果");
                                 continue;
                             }
                             var groupDDCFiles = chDDCFiles.GroupBy(p => p.FreqDownMHz);
@@ -162,30 +180,29 @@ namespace X3TaskServer54.Service
                                 //group:同一个时刻同一个频点的多个通道数据
                                 var task = Task.Run(async () =>
                                 {
-                                    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}时刻-信号{group.Key}MHz-未找到主星信号ch0文件,跳过此组数据");
+                                        LogHelper.Warning($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到主星信号ch0文件,跳过此组数据");
                                         return;
                                     }
                                     if (ch1File == null)
                                     {
-                                        LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到邻1星信号ch1文件,跳过此组数据");
+                                        LogHelper.Warning($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到邻1星信号ch1文件,跳过此组数据");
                                         return;
                                     }
                                     if (ch2File == null)
                                     {
-                                        LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到邻2星信号ch2文件,跳过此组数据");
+                                        LogHelper.Warning($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到邻2星信号ch2文件,跳过此组数据");
                                         return;
                                     }
                                     var sig = sigs.FirstOrDefault(p => p.FreqDownHz == (int)(group.Key * 1e6));
                                     if (cts.IsCancellationRequested) return;
                                     if (useGpuCg)
                                     {
-                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-GPU参估开始,共{sig.Slots.Slots.Count}个突发...");
+                                        LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-GPU参估开始,共{sig.Slots.Slots.Count}个突发...");
                                         sw.Start();
                                         List<GpuCgResponseDto> data1 = new List<GpuCgResponseDto>();
                                         List<GpuCgResponseDto> data2 = new List<GpuCgResponseDto>();
@@ -234,7 +251,7 @@ namespace X3TaskServer54.Service
                                             var result1 = await HttpHelper.PostRequestAsync<List<GpuCgResponseDto>>(baseUrl + "DetectCg/GpuCgCalc", gpudto, token: cts.Token);
                                             if (result1.code != 200)
                                             {
-                                                LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻1星GPU参估出错.{result1.msg}.突发位置{item.StartPoint}-{item.Len}");
+                                                LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻1星GPU参估出错.{result1.msg}.突发位置{item.StartPoint}-{item.Len}");
                                                 continue;
                                             }
                                             var data1First = result1.data.First();
@@ -253,7 +270,7 @@ namespace X3TaskServer54.Service
                                             var result2 = await HttpHelper.PostRequestAsync<List<GpuCgResponseDto>>(baseUrl + "DetectCg/GpuCgCalc", gpudto, token: cts.Token);
                                             if (result2.code != 200)
                                             {
-                                                LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻2星GPU参估出错.{result2.msg}.突发位置{item.StartPoint}-{item.Len}");
+                                                LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻2星GPU参估出错.{result2.msg}.突发位置{item.StartPoint}-{item.Len}");
                                                 continue;
                                             }
                                             var data2First = result2.data.First();
@@ -261,10 +278,10 @@ namespace X3TaskServer54.Service
                                             data2.Add(data2First);
                                         }
                                         sw.Stop();
-                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-GPU参估完成,耗时{sw.ElapsedMilliseconds}ms");
+                                        LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-GPU参估完成,耗时{sw.ElapsedMilliseconds}ms");
                                         if (data1.Count != data2.Count || data1.Count != sig.Slots.Slots.Count)
                                         {
-                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-参估结果个数和检测结果个数不匹配");
+                                            LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-参估结果个数和检测结果个数不匹配");
                                             return;
                                         }
                                         sw.Start();
@@ -276,8 +293,8 @@ namespace X3TaskServer54.Service
                                                 X3TwoDtoNoParPosDto x3 = new X3TwoDtoNoParPosDto()
                                                 {
                                                     TaskID = dto.ID,
-                                                    //SigTime = capTime.AddSeconds(data1[i].Smpstart / (double)ch0File.Fs),
-                                                    SigTime = capTime.AddSeconds(data1[i].TimeSeconds),
+                                                    //SigTime = adTime.AddSeconds(data1[i].Smpstart / (double)ch0File.Fs),
+                                                    SigTime = adTime.AddSeconds(data1[i].TimeSeconds),
                                                     MainCode = MainSatCode,
                                                     Adja1Code = Adja1SatCode,
                                                     Adja2Code = Adja2SatCode,
@@ -311,7 +328,7 @@ namespace X3TaskServer54.Service
                                                 var result = await HttpHelper.PostRequestAsync<PosResDto>(baseUrl + "Pos/PosX3TwoDtoNoParAsync", x3);
                                                 if (result.code != 200)
                                                 {
-                                                    LogHelper.Error($"【任务{dto.ID}】-信号{group.Key}MHz-{capTime:yyyyMMddHHmmss}时刻第{i + 1}个突发定位异常.{result.msg}");
+                                                    LogHelper.Error($"【任务{dto.ID}】-信号{group.Key}MHz-{adTime:yyyyMMddHHmmss}时刻第{i + 1}个突发定位异常.{result.msg}");
                                                 }
                                                 else
                                                 {
@@ -358,21 +375,21 @@ namespace X3TaskServer54.Service
                                                     sb.Append($"{3}");//定位体制(星地=3)
                                                     sb.Append($"{1335:D12}");//符号速率bps  12个
                                                     sb.Append("\r\n");
-                                                    string resFile = Path.Combine(PosResDir, $"定位结果_{posRes.SigTime:yyyyMMdd}.txt");
+                                                    string resFile = Path.Combine(PosResDir, $"三星定位结果_{posRes.SigTime:yyyyMMdd}.txt");
                                                     File.AppendAllText(resFile, sb.ToString());
                                                 }
                                             }
                                             catch (Exception ex)
                                             {
-                                                LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-第{i + 1}个突发定位异常", ex);
+                                                LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-第{i + 1}个突发定位异常", ex);
                                             }
                                         }
                                         sw.Stop();
-                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-定位完成,耗时{sw.ElapsedMilliseconds}ms");
+                                        LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-定位完成,耗时{sw.ElapsedMilliseconds}ms");
                                     }
                                     else
                                     {
-                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-CPU参估开始,共{sig.Slots.Slots.Count}个突发...");
+                                        LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-CPU参估开始,共{sig.Slots.Slots.Count}个突发...");
                                         sw.Start();
                                         string mainFile = await HttpHelper.UploadFileAsync(ch0File.File, baseUrl, token: cts.Token);//主星文件
                                         string adja1File = await HttpHelper.UploadFileAsync(ch1File.File, baseUrl, token: cts.Token);//邻1星文件
@@ -390,7 +407,7 @@ namespace X3TaskServer54.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}时刻-信号{group.Key}MHz-主星邻1星CPU参估出错.{result1.msg}");
+                                            LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻1星CPU参估出错.{result1.msg}");
                                             return;
                                         }
                                         cgDto = new CpuCgMultiDto()
@@ -407,15 +424,15 @@ namespace X3TaskServer54.Service
                                         sw.Stop();
                                         if (result2.code != 200)
                                         {
-                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻2星CPU参估出错.{result2.msg}");
+                                            LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻2星CPU参估出错.{result2.msg}");
                                             return;
                                         }
-                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-CPU参估完成,耗时{sw.ElapsedMilliseconds}ms");
+                                        LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-CPU参估完成,耗时{sw.ElapsedMilliseconds}ms");
                                         var data1 = result1.data;
                                         var data2 = result2.data;
                                         if (data1.Count != data2.Count || data1.Count != cgDto.smpPositions.Count)
                                         {
-                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-参估结果个数和检测结果个数不匹配");
+                                            LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-参估结果个数和检测结果个数不匹配");
                                             return;
                                         }
                                         sw.Start();
@@ -427,8 +444,8 @@ namespace X3TaskServer54.Service
                                                 X3TwoDtoNoParPosDto x3 = new X3TwoDtoNoParPosDto()
                                                 {
                                                     TaskID = dto.ID,
-                                                    //SigTime = capTime.AddSeconds(data1[i].Smpstart / (double)ch0File.Fs),
-                                                    SigTime = capTime.AddSeconds(data1[i].TimeSeconds),
+                                                    //SigTime = adTime.AddSeconds(data1[i].Smpstart / (double)ch0File.Fs),
+                                                    SigTime = adTime.AddSeconds(data1[i].TimeSeconds),
                                                     MainCode = MainSatCode,
                                                     Adja1Code = Adja1SatCode,
                                                     Adja2Code = Adja2SatCode,
@@ -462,7 +479,7 @@ namespace X3TaskServer54.Service
                                                 var result = await HttpHelper.PostRequestAsync<PosResDto>(baseUrl + "Pos/PosX3TwoDtoNoParAsync", x3);
                                                 if (result.code != 200)
                                                 {
-                                                    LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-时隙位置{data1[i].Smpstart}定位异常.{result.msg}");
+                                                    LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-时隙位置{data1[i].Smpstart}定位异常.{result.msg}");
                                                 }
                                                 else
                                                 {
@@ -515,11 +532,11 @@ namespace X3TaskServer54.Service
                                             }
                                             catch (Exception ex)
                                             {
-                                                LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-时隙位置{data1[i].Smpstart}定位异常", ex);
+                                                LogHelper.Error($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-时隙位置{data1[i].Smpstart}定位异常", ex);
                                             }
                                         }
                                         sw.Stop();
-                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-定位完成,耗时{sw.ElapsedMilliseconds}ms");
+                                        LogHelper.Info($"【任务{dto.ID}】{adTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-定位完成,耗时{sw.ElapsedMilliseconds}ms");
                                     }
                                     //删除DDC文件
                                     File.Delete(ch0File.File);

+ 3 - 1
Service/X2D1TaskServer54/X3TaskServer54.csproj

@@ -212,6 +212,8 @@ move /Y *.pdb AddIns
 move AddIns\$(TargetName).pdb .
 copy $(SolutionDir)Service.svg Service.svg
 rmdir logs /S/Q
-rmdir wwwroot /S/Q</PostBuildEvent>
+rmdir wwwroot /S/Q
+rmdir tmp /S/Q
+rmdir DdcDir /S/Q</PostBuildEvent>
   </PropertyGroup>
 </Project>

BIN
Test/AddIns/时隙获取/SlotChecker.dll


+ 26 - 0
Test/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);
+};

+ 115 - 0
Test/AddIns/时隙获取/SlotHelper.cs

@@ -0,0 +1,115 @@
+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]),
+                        TimeSeconds = 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; }
+
+        /// <summary>
+        /// 时间的秒数,避免误差
+        /// </summary>
+        public float TimeSeconds { get; set; }
+    }
+}

+ 6 - 0
Test/App.config

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <startup> 
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
+    </startup>
+</configuration>

+ 42 - 0
Test/Program.cs

@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using X3TaskServer54;
+
+namespace Test
+{
+    internal class Program
+    {
+        static void Main(string[] args)
+        {
+            var dirs = Directory.GetFiles("D:\\Data21\\XDHJC");
+            Directory.CreateDirectory("tmp1");
+            Directory.CreateDirectory("tmp2");
+            foreach (var dir in dirs)
+            {
+                if (!dir.Contains("256.95")) continue;
+                var res = SlotHelper.GetFileSlots(dir);
+                if (res.Slots.Any())
+                {
+                    string adFileName1 = $"{res.AdTime:yyyyMMddHHmmss}_ADC_ch00.dat";
+                    string adFileName2 = $"{res.AdTime:yyyyMMddHHmmss}_ADC_ch01.dat";
+                    string adFileName3 = $"{res.AdTime:yyyyMMddHHmmss}_ADC_ch02.dat";
+                    string adFile1 = $"F:\\{adFileName1}";
+                    string adFile2 = $"F:\\{adFileName2}";
+                    string adFile3 = $"F:\\{adFileName3}";
+                    if (File.Exists(adFile1))
+                    {
+                        File.Copy(dir, $"tmp1\\{Path.GetFileName(dir)}");
+                        File.Copy(adFile1, $"tmp2\\{Path.GetFileName(adFile1)}");
+                        File.Copy(adFile2, $"tmp2\\{Path.GetFileName(adFile2)}");
+                        File.Copy(adFile3, $"tmp2\\{Path.GetFileName(adFile3)}");
+                    }
+                }
+            }
+
+        }
+    }
+}

+ 36 - 0
Test/Properties/AssemblyInfo.cs

@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的一般信息由以下
+// 控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("Test")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Test")]
+[assembly: AssemblyCopyright("Copyright ©  2024")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 会使此程序集中的类型
+//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
+//请将此类型的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("b56753e9-af1b-4b5a-a3d1-fefdd80d77a8")]
+
+// 程序集的版本信息由下列四个值组成: 
+//
+//      主版本
+//      次版本
+//      生成号
+//      修订号
+//
+//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
+//通过使用 "*",如下所示:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

+ 65 - 0
Test/Test.csproj

@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{B56753E9-AF1B-4B5A-A3D1-FEFDD80D77A8}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>Test</RootNamespace>
+    <AssemblyName>Test</AssemblyName>
+    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+  </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="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AddIns\时隙获取\SlotHelper.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="AddIns\时隙获取\SlotChecker.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="AddIns\时隙获取\SlotChecker.h">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>

+ 30 - 13
Service/X2D1NoRefTaskServer54/AddIns/误差椭圆/ErrEllipseHepler.cs → XdCxRhDW.Api/AddIns/GDOP误差椭圆/ErrEllipseHepler.cs

@@ -1,16 +1,21 @@
-using System;
+using DPP_YH_Core.Extensions;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Runtime.InteropServices;
 using System.Text;
 using System.Threading.Tasks;
+using XdCxRhDW.Dto;
 
-namespace X2D1NoRefTaskServer54
+namespace XdCxRhDW.Api
 {
+    /// <summary>
+    /// 误差椭圆帮助类
+    /// </summary>
     public static class ErrEllipseHepler
     {
 
-        private const string ErrellipDll = @"AddIns\误差椭圆\DLL_GDOP_Analysis0415";
+        private const string ErrellipDll = @"AddIns\GDOP误差椭圆\DLL_GDOP_Analysis0415";
 
         /// <summary>
         /// 两星一地误差椭圆
@@ -26,7 +31,7 @@ namespace X2D1NoRefTaskServer54
         /// <param name="LOP_Len"></param>
         /// <returns></returns>
         [DllImport(ErrellipDll, EntryPoint = "Error_Ellipse_2X1D", CallingConvention = CallingConvention.Cdecl)]
-        public extern static IntPtr Error_Ellipse_2X1D(double[] main_eph, double[] neigh_eph, double[] cdbAnt, double[] refStation, double[] Select_Point, double dto_err,
+        private extern static IntPtr Error_Ellipse_2X1D(double[] main_eph, double[] neigh_eph, double[] cdbAnt, double[] refStation, double[] Select_Point, double dto_err,
         double eph_err, double Pe, ref int LOP_Len);
 
         /// <summary>
@@ -40,16 +45,14 @@ namespace X2D1NoRefTaskServer54
         /// <param name="RefGeod"></param>
         /// <param name="DtoErrus"></param>
         /// <param name="EphErrm"></param>
+        /// <param name="outputErrPoint"></param>
         /// <returns></returns>
-        public static double[] ErrorEllipse2X1D(double posLon, double posLat, double[] mainEph, double[] adajEph, double[] cdbPos, double[] RefGeod, double DtoErrus, double EphErrm)
+        public static ErrEllipseResDto ErrorEllipse2X1D(double posLon, double posLat, double[] mainEph, double[] adajEph, double[] cdbPos, double[] RefGeod, double DtoErrus, double EphErrm, bool outputErrPoint)
         {
-            IEnumerable<double> res = new List<double>();
+            //IEnumerable<double> res = new List<double>();
             int LOP_Len = 0;
-            /// <summary>
-            /// 概率 默认0.5
-            /// </summary>
             double Pe = 0.5;
-            IntPtr LOP_ValuePtr =Error_Ellipse_2X1D(
+            IntPtr LOP_ValuePtr = Error_Ellipse_2X1D(
                    mainEph,
                    adajEph,
                    cdbPos,
@@ -62,11 +65,25 @@ namespace X2D1NoRefTaskServer54
             if (LOP_Len > 0)
             {
                 Marshal.Copy(LOP_ValuePtr, LOP_Value, 0, LOP_Value.Length);
+            }
+            ErrEllipseResDto res = new ErrEllipseResDto();
+            res.LongRadius = LOP_Value[LOP_Value.Length - 3];
+            res.ShortRadius = LOP_Value[LOP_Value.Length - 2];
+            res.DipAngle = LOP_Value[LOP_Value.Length - 1];
+            if (outputErrPoint)
+            {
+                int count = LOP_Value.Length - 3;
 
-                int lastcount = LOP_Len - 3;
-                res = LOP_Value.Skip(lastcount).Take(3);
+                for (int i = 0; i < count; i += 2)//13 ---01 23 45 67 89
+                {
+                    res.GeoPoints.Add(new GeoPoint()
+                    {
+                        Lon = LOP_Value[i],
+                        Lat = LOP_Value[i + 1],
+                    });
+                }
             }
-            return res.ToArray();
+            return res;
         }
     }
 }

+ 1 - 0
XdCxRhDW.Api/XdCxRhDW.Api.csproj

@@ -47,6 +47,7 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="AddIns\GDOP误差椭圆\ErrEllipseHepler.cs" />
     <Compile Include="AddIns\GDOP误差椭圆\GDOPAPi.cs" />
     <Compile Include="AddIns\GDOP误差椭圆\GdopConfig.cs" />
     <Compile Include="AddIns\GDOP误差椭圆\GdopHelper.cs" />

+ 35 - 1
XdCxRhDW.App/Controllers/DetectCgController.cs

@@ -8,6 +8,7 @@ using System.Web.Http;
 using DevExpress.Data.Svg;
 using XdCxRhDW.Api;
 using XdCxRhDW.Dto;
+using XdCxRhDW.Entity;
 using XdCxRhDW.Repostory;
 using XdCxRhDW.WebApi;
 
@@ -105,7 +106,7 @@ namespace XdCxRhDW.App.Controllers
                     res.data[i].ModRate = procRes.data[i].Rate;
                     res.data[i].ModType = procRes.data[i].ModType.GetEnumDisplayName();
                     res.data[i].FfcHz = procRes.data[i].Ffc;
-                    res.data[i].Snr= procRes.data[i].Snr;
+                    res.data[i].Snr = procRes.data[i].Snr;
                 }
             }
             return res;
@@ -138,5 +139,38 @@ namespace XdCxRhDW.App.Controllers
             await HttpHelper.DownloadFileAsync(svr.BaseHttpAddr, res.data.File, GetLocalFile(res.data.File), dto.TimeoutSeconds);
             return res;
         }
+
+
+        /// <summary>
+        /// 两星一地误差椭圆(带参)
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<AjaxResult<ErrEllipseResDto>> ErrorEllipse2X1D(ErrEllipseX2D1Dto dto)
+        {
+            return await Task.Run(() =>
+            {
+                double[] mainEcef = new double[3] { dto.MainX, dto.MainY, dto.MainZ };
+                double[] adjaEcef = new double[3] { dto.AdjaX, dto.AdjaY, dto.AdjaZ };
+                double[] cdbLoc = new double[3] { dto.CdbLon, dto.CdbLat, 0 };
+                double[] refLoc = new double[3] { dto.RefLon, dto.RefLat, 0 };
+                var res = ErrEllipseHepler.ErrorEllipse2X1D(dto.PosLon, dto.PosLat, mainEcef, adjaEcef, cdbLoc, refLoc, dto.DtoErrus, dto.EphErr, dto.OutputErrPoint);
+                return Success(res);
+            });
+        }
+
+        /// <summary>
+        /// 两星一地误差椭圆(无参)
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<AjaxResult<ResampleResponseDto>> ErrorEllipse2X1DNoRef(ResampleRequestDto dto)
+        {
+            var svr = ServerContext.Instance.GetRandomOne(EnumSvrType.CheckSvr);
+            dto.File = await HttpHelper.UploadFileAsync(GetLocalFile(dto.File), svr.BaseHttpAddr, timeoutSeconds: dto.TimeoutSeconds);
+            var res = await HttpHelper.PostRequestAsync<ResampleResponseDto>(svr.BaseHttpAddr + "Check/Resample", dto, dto.TimeoutSeconds);
+            await HttpHelper.DownloadFileAsync(svr.BaseHttpAddr, res.data.File, GetLocalFile(res.data.File), dto.TimeoutSeconds);
+            return res;
+        }
     }
 }

+ 7 - 0
XdCxRhDW54.sln

@@ -39,6 +39,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Leo3SatTaskServer54", "Serv
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Leo1SatTaskServer54", "Service\Leo1SatTaskServer54\Leo1SatTaskServer54.csproj", "{3EE88F99-F3EB-441C-B5E0-DB875EC3EC90}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test", "Test\Test.csproj", "{B56753E9-AF1B-4B5A-A3D1-FEFDD80D77A8}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -113,6 +115,10 @@ Global
 		{3EE88F99-F3EB-441C-B5E0-DB875EC3EC90}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{3EE88F99-F3EB-441C-B5E0-DB875EC3EC90}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{3EE88F99-F3EB-441C-B5E0-DB875EC3EC90}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B56753E9-AF1B-4B5A-A3D1-FEFDD80D77A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B56753E9-AF1B-4B5A-A3D1-FEFDD80D77A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B56753E9-AF1B-4B5A-A3D1-FEFDD80D77A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B56753E9-AF1B-4B5A-A3D1-FEFDD80D77A8}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -127,6 +133,7 @@ Global
 		{4A0ABED1-4193-4103-91C7-E88B0002B338} = {3EB6F47A-A57D-4468-B4BE-3A63E13B692D}
 		{1EA56810-0B15-4311-9F6B-69D3D660CBA7} = {3EB6F47A-A57D-4468-B4BE-3A63E13B692D}
 		{3EE88F99-F3EB-441C-B5E0-DB875EC3EC90} = {3EB6F47A-A57D-4468-B4BE-3A63E13B692D}
+		{B56753E9-AF1B-4B5A-A3D1-FEFDD80D77A8} = {3EB6F47A-A57D-4468-B4BE-3A63E13B692D}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {657E89B6-AB65-4E75-965C-06D70796CB71}

+ 2 - 0
XdCxRhDw.Dto/02.XdCxRhDW.Dto.csproj

@@ -57,6 +57,8 @@
     <Compile Include="CafResultDto.cs" />
     <Compile Include="CgResDto.cs" />
     <Compile Include="CpuCgMultiDto.cs" />
+    <Compile Include="ErrEllipseResDto.cs" />
+    <Compile Include="ErrEllipseX2D1Dto.cs" />
     <Compile Include="ImageResultDto.cs" />
     <Compile Include="CgResQueryDto.cs" />
     <Compile Include="PosDto\LeoX1ParPosDto.cs" />

+ 52 - 0
XdCxRhDw.Dto/ErrEllipseResDto.cs

@@ -0,0 +1,52 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace XdCxRhDW.Dto
+{
+    /// <summary>
+    /// 误差椭圆输出信息
+    /// </summary>
+    public class ErrEllipseResDto
+    {
+        /// <summary>
+        /// 长轴半径(m)
+        /// </summary>
+        public double LongRadius { get; set; }
+
+        /// <summary>
+        /// 短轴半径(m)
+        /// </summary>
+        public double ShortRadius { get; set; }
+
+        /// <summary>
+        /// 倾角(正北为0度)
+        /// </summary>
+        public double DipAngle { get; set; }
+
+        /// <summary>
+        /// 误差椭圆地图点位集合
+        /// </summary>
+        public List<GeoPoint> GeoPoints { get; set; } = new List<GeoPoint>();
+
+    }
+
+    /// <summary>
+    /// 地图点位信息
+    /// </summary>
+    public class GeoPoint
+    {
+
+        /// <summary>
+        /// 经度
+        /// </summary>
+        public double Lon { get; set; }
+
+        /// <summary>
+        /// 纬度
+        /// </summary>
+        public double Lat { get; set; }
+    }
+}

+ 91 - 0
XdCxRhDw.Dto/ErrEllipseX2D1Dto.cs

@@ -0,0 +1,91 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace XdCxRhDW.Dto
+{
+    /// <summary>
+    /// 两星一地误差椭圆参数模型
+    /// </summary>
+    public class ErrEllipseX2D1Dto
+    {
+        /// <summary>
+        /// 定位经度
+        /// </summary>
+        public double PosLon { get; set; }
+
+        /// <summary>
+        /// 定位纬度
+        /// </summary>
+        public double PosLat { get; set; }
+
+        /// <summary>
+        /// 主星ECEF坐标X
+        /// </summary>
+        public double MainX { get; set; }
+
+        /// <summary>
+        /// 主星ECEF坐标Y
+        /// </summary>
+        public double MainY { get; set; }
+
+        /// <summary>
+        /// 主星ECEF坐标Z
+        /// </summary>
+        public double MainZ { get; set; }
+
+        /// <summary>
+        /// 邻星ECEF坐标X
+        /// </summary>
+        public double AdjaX { get; set; }
+
+        /// <summary>
+        /// 邻星ECEF坐标Y
+        /// </summary>
+        public double AdjaY { get; set; }
+
+        /// <summary>
+        /// 邻星ECEF坐标Z
+        /// </summary>
+        public double AdjaZ { get; set; }
+
+        /// <summary>
+        /// 超短波接收站点经度
+        /// </summary>
+        public double CdbLon { get; set; }
+
+        /// <summary>
+        /// 超短波接收站点纬度
+        /// </summary>
+        public double CdbLat { get; set; }
+
+        /// <summary>
+        /// 参考站经度
+        /// </summary>
+        public double RefLon { get; set; }
+
+        /// <summary>
+        /// 参考站纬度
+        /// </summary>
+        public double RefLat { get; set; }
+
+
+        /// <summary>
+        /// 时差误差(us)
+        /// </summary>
+        public double DtoErrus { get; set; }
+
+        /// <summary>
+        /// 星历误差(米)
+        /// </summary>
+        public double EphErr { get; set; }
+
+        /// <summary>
+        /// 是否输出椭圆位置信息
+        /// </summary>
+        public bool OutputErrPoint { get; set; }
+
+    }
+}