zoulei vor 1 Jahr
Ursprung
Commit
631039d612

+ 8 - 1
Service/GpuCgServer/AddIns/GpuCgHelper.cs

@@ -84,8 +84,15 @@ namespace GpuCgServer
             }
             List<GpuCgResponseDto> list = new List<GpuCgResponseDto>();
             //3:-0.000*-0.00054.553+72.917*0.000*37.756+-72.917*0.000*37.671+
-            if (res.Length<3)
+            if (res.Length < 3)
+            {
+                list.Add(new GpuCgResponseDto()
+                {
+                     Smplen=(long)smpCount,
+                     TimeMs=(int)sw.ElapsedMilliseconds,
+                });
                 return list;
+            }
             else
             {
                 var xgfArr = res.Substring(2).Split("+".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

+ 3 - 0
Service/X2D1TaskServer54/App.config

@@ -30,6 +30,9 @@
 		<!--定位时差系数-->
 		<add key="PosDtoFactor" value="-1"/>
 
+		<!--使用GPU执行参数估计=1 ,使用CPU执行参数估计=0-->
+		<add key="UseGpuCg" value="0"/>
+
 	</appSettings>
 	<startup>
 		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />

+ 1 - 1
Service/X2D1TaskServer54/Controllers/X2D1NoRefTaskProcessingController.cs

@@ -33,7 +33,7 @@ namespace X3TaskServer54.Controllers
         /// <param name="dto">离线任务信息</param>
         /// <returns></returns>
         [HttpPost]
-        public AjaxResult Run(X2D1NoRefTaskHandleDto dto)
+        public AjaxResult Run(X3NoRefTaskHandleDto dto)
         {
             try
             {

+ 349 - 145
Service/X2D1TaskServer54/Service/HistoryTaskService.cs

@@ -1,4 +1,5 @@
-using System;
+using DevExpress.Internal.WinApi.Windows.UI.Notifications;
+using System;
 using System.Collections.Generic;
 using System.Configuration;
 using System.Diagnostics;
@@ -7,6 +8,7 @@ using System.Linq;
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
+using System.Web.Http.Results;
 using XdCxRhDW.Dto;
 
 namespace X3TaskServer54.Service
@@ -24,8 +26,10 @@ namespace X3TaskServer54.Service
         int MainSatCode, Adja1SatCode, Adja2SatCode;
         double[] MainSatXYZ, Adja1SatXYZ, Adja2SatXYZ;
         int PosDtoFactor;
+        bool useGpuCg = false;
         public HistoryTaskService()
         {
+            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,8 +43,13 @@ namespace X3TaskServer54.Service
             var PosDtoFactorstr = ConfigurationManager.AppSettings["PosDtoFactor"].Trim();
             int.TryParse(PosDtoFactorstr, out PosDtoFactor);
             if (PosDtoFactor == 0) PosDtoFactor = 1;
+            string useGpuStr = ConfigurationManager.AppSettings["UseGpuCg"];
+            if (useGpuStr != null && useGpuStr.Trim() == "1")
+                useGpuCg = true;
+
+
         }
-        public void StartAsync(X2D1NoRefTaskHandleDto dto)
+        public void StartAsync(X3NoRefTaskHandleDto dto)
         {
             cts = new CancellationTokenSource();
             Task.Run(async () =>
@@ -108,7 +117,6 @@ namespace X3TaskServer54.Service
                                     File.Delete(item.File);//检测检测结果文件
                                 if (slotsInfo.Slots.Any())
                                     listSlotsInfo.Add(slotsInfo);
-                                LogHelper.Warning($"【任务{dto.ID}】{slotsInfo.AdTime:yyyyMMddHHmmss}时刻频点{slotsInfo.FreqDownMHz}共{slotsInfo.Slots.Count}个突发");
                             }
                             if (!listSlotsInfo.Any()) continue;
                             var adFiles = Directory.EnumerateFiles(CapDir, "*.dat", SearchOption.TopDirectoryOnly).Select(p => StringToAdFile(p))
@@ -121,7 +129,9 @@ namespace X3TaskServer54.Service
                             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处理开始...");
+                            LogHelper.Info($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理开始,共{sigs.Count()}个频点...");
+                            Stopwatch sw = new Stopwatch();
+                            sw.Start();
                             Parallel.ForEach(adFiles, adFile =>
                             {
 
@@ -131,7 +141,8 @@ namespace X3TaskServer54.Service
                                 if (!Debugger.IsAttached)
                                     File.Delete(adFile.File);//删除AD文件
                             });
-                            LogHelper.Info($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理完成");
+                            sw.Stop();
+                            LogHelper.Info($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理完成,耗时{sw.ElapsedMilliseconds}ms");
                             if (!chDDCFiles.Any())
                             {
                                 LogHelper.Error($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理无结果");
@@ -147,178 +158,371 @@ namespace X3TaskServer54.Service
                                 var ch2File = group.Where(p => p.ChNo == 2).FirstOrDefault();
                                 if (ch0File == null)
                                 {
-                                    LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻未找到主星信号ch0文件,跳过此组数据");
+                                    LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到主星信号ch0文件,跳过此组数据");
                                     continue;
                                 }
                                 if (ch1File == null)
                                 {
-                                    LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻未找到邻1星信号ch1文件,跳过此组数据");
+                                    LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到邻1星信号ch1文件,跳过此组数据");
                                     continue;
                                 }
                                 if (ch2File == null)
                                 {
-                                    LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻未找到邻2星信号ch2文件,跳过此组数据");
+                                    LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到邻2星信号ch2文件,跳过此组数据");
                                     continue;
                                 }
-
-                                string mainFile = await HttpHelper.UploadFileAsync(ch0File.File, baseUrl, token: cts.Token);//主星文件
-                                string adja1File = await HttpHelper.UploadFileAsync(ch1File.File, baseUrl, token: cts.Token);//邻1星文件
-                                string adja2File = await HttpHelper.UploadFileAsync(ch2File.File, baseUrl, 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() { TimeSeconds = p.TimeSeconds, smpStart = p.StartPoint, smpCount = p.Len }).ToList(),
-                                    snrThreshold = 15,
-                                };
-                                LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻主星邻1星CPU参估开始...");
-                                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() { TimeSeconds = p.TimeSeconds, smpStart = p.StartPoint, smpCount = p.Len }).ToList(),
-                                    snrThreshold = 15,
-                                };
-                                LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻主星邻2星CPU参估开始...");
-                                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;
-                                }
-                                //删除DDC文件
-                                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)
+                                if (useGpuCg)
                                 {
-                                    LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻参估结果个数和检测结果个数不匹配");
-                                    continue;
-                                }
-                                for (int i = 0; i < data1.Count; i++)
-                                {
-                                    try
+                                    LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-GPU参估开始,共{sig.Slots.Slots.Count}个突发...");
+                                    sw.Start();
+                                    List<GpuCgResponseDto> data1 = new List<GpuCgResponseDto>();
+                                    List<GpuCgResponseDto> data2 = new List<GpuCgResponseDto>();
+                                    foreach (var item in sig.Slots.Slots)
                                     {
-                                        if (cts.IsCancellationRequested) break;
-                                        X3TwoDtoNoParPosDto x3 = new X3TwoDtoNoParPosDto()
+                                        string f1 = $"tmp\\{Path.GetFileNameWithoutExtension(ch0File.File)}_{item.StartPoint}_{item.Len}.dat";
+                                        string f2 = $"tmp\\{Path.GetFileNameWithoutExtension(ch1File.File)}_{item.StartPoint}_{item.Len}.dat";
+                                        string f3 = $"tmp\\{Path.GetFileNameWithoutExtension(ch2File.File)}_{item.StartPoint}_{item.Len}.dat";
+                                        using (FileStream fs = new FileStream(ch0File.File, FileMode.Open))
                                         {
-                                            TaskID = dto.ID,
-                                            //SigTime = capTime.AddSeconds(data1[i].Smpstart / (double)ch0File.Fs),
-                                            SigTime = capTime.AddSeconds(data1[i].TimeSeconds),
-                                            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 = PosDtoFactor * data1[i].Dt,
-                                            Dfo1 = data1[i].Df,
-                                            Snr1 = data1[i].Snr,
-                                            Dto2 = PosDtoFactor * data2[i].Dt,
-                                            Dfo2 = data2[i].Df,
-                                            Snr2 = data2[i].Snr,
-                                            SatTxLon = dto.CapLon,
-                                            SatTxLat = dto.CapLat,
-                                            FreqDown = ch0File.FreqDownMHz * 1e6,
-                                            CheckRes = new CheckResDto()
-                                            {
-                                                FileName = Path.GetFileName(ch0File.File),
-                                                SmpStart = sig.Slots.Slots[i].StartPoint,
-                                                SmpCount = sig.Slots.Slots[i].Len,
-                                                PosCheckType = EnumPosCheckTypeDto.DAMA,
-                                            }
+                                            byte[] data = new byte[item.Len * 4];
+                                            fs.Position = item.StartPoint * 4;
+                                            fs.Read(data, 0, data.Length);
+                                            File.WriteAllBytes(f1, data);
+                                        }
+                                        using (FileStream fs = new FileStream(ch1File.File, FileMode.Open))
+                                        {
+                                            byte[] data = new byte[item.Len * 4];
+                                            fs.Position = item.StartPoint * 4;
+                                            fs.Read(data, 0, data.Length);
+                                            File.WriteAllBytes(f2, data);
+                                        }
+                                        using (FileStream fs = new FileStream(ch2File.File, FileMode.Open))
+                                        {
+                                            byte[] data = new byte[item.Len * 4];
+                                            fs.Position = item.StartPoint * 4;
+                                            fs.Read(data, 0, data.Length);
+                                            File.WriteAllBytes(f3, data);
+                                        }
+                                        string mainSlotFile = await HttpHelper.UploadFileAsync(f1, baseUrl, token: cts.Token);//主星文件
+                                        string adja1SlotFile = await HttpHelper.UploadFileAsync(f2, baseUrl, token: cts.Token);//邻1星文件
+                                        string adja2SlotFile = await HttpHelper.UploadFileAsync(f3, baseUrl, token: cts.Token);//邻2星文件
+                                        File.Delete(f1);
+                                        File.Delete(f2);
+                                        File.Delete(f3);
+                                        var gpudto = new GpuCgRequestDto()
+                                        {
+                                            dtCenter = 0,
+                                            dtRange = 40000,
+                                            file1 = mainSlotFile,
+                                            file2 = adja1SlotFile,
+                                            samplingRate = ch0File.Fs,
+                                            smpCount = 0,
+                                            snrThreshold = 15
+                                        };
+                                        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}");
+                                            continue;
+                                        }
+                                        var data1First = result1.data.First();
+                                        data1First.TimeSeconds = item.TimeSeconds;
+                                        data1.Add(data1First);
+                                        gpudto = new GpuCgRequestDto()
+                                        {
+                                            dtCenter = 0,
+                                            dtRange = 40000,
+                                            file1 = mainSlotFile,
+                                            file2 = adja2SlotFile,
+                                            samplingRate = ch0File.Fs,
+                                            smpCount = 0,
+                                            snrThreshold = 15
                                         };
-                                        var result = await HttpHelper.PostRequestAsync<PosResDto>(baseUrl + "Pos/PosX3TwoDtoNoParAsync", x3);
-                                        if (result.code != 200)
+                                        var result2 = await HttpHelper.PostRequestAsync<List<GpuCgResponseDto>>(baseUrl + "DetectCg/GpuCgCalc", gpudto, token: cts.Token);
+                                        if (result2.code != 200)
                                         {
-                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻时隙位置{data1[i].Smpstart}定位异常.{result.msg}");
+                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻2星GPU参估出错.{result2.msg}.突发位置{item.StartPoint}-{item.Len}");
+                                            continue;
                                         }
-                                        else
+                                        var data2First = result2.data.First();
+                                        data2First.TimeSeconds = item.TimeSeconds;
+                                        data2.Add(data2First);
+                                    }
+                                    sw.Stop();
+                                    LogHelper.Info($"【任务{dto.ID}】{capTime: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}时刻参估结果个数和检测结果个数不匹配");
+                                        continue;
+                                    }
+                                    for (int i = 0; i < data1.Count; i++)
+                                    {
+                                        try
                                         {
-                                            var posRes = result.data;
-                                            double posLon = posRes.PosLon;
-                                            double posLat = posRes.PosLat;
-                                            if (x3.Snr1 == 0 || x3.Snr2 == 0)
+                                            if (cts.IsCancellationRequested) break;
+                                            X3TwoDtoNoParPosDto x3 = new X3TwoDtoNoParPosDto()
                                             {
-                                                posLon = 0;
-                                                posLat = 0;
+                                                TaskID = dto.ID,
+                                                //SigTime = capTime.AddSeconds(data1[i].Smpstart / (double)ch0File.Fs),
+                                                SigTime = capTime.AddSeconds(data1[i].TimeSeconds),
+                                                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 = PosDtoFactor * data1[i].Dt,
+                                                Dfo1 = data1[i].Df,
+                                                Snr1 = data1[i].Snr,
+                                                Dto2 = PosDtoFactor * data2[i].Dt,
+                                                Dfo2 = data2[i].Df,
+                                                Snr2 = data2[i].Snr,
+                                                FreqUp = ch0File.FreqDownMHz * 1e6,
+                                                SatTxLon = dto.CapLon,
+                                                SatTxLat = dto.CapLat,
+                                                FreqDown = ch0File.FreqDownMHz * 1e6,
+                                                CheckRes = new CheckResDto()
+                                                {
+                                                    FileName = Path.GetFileName(ch0File.File),
+                                                    SmpStart = sig.Slots.Slots[i].StartPoint,
+                                                    SmpCount = sig.Slots.Slots[i].Len,
+                                                    PosCheckType = EnumPosCheckTypeDto.DAMA,
+                                                }
+                                            };
+                                            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}");
                                             }
-                                            StringBuilder sb = new StringBuilder();
-                                            sb.Append($"{x3.SigTime:yyyy}\t");
-                                            sb.Append($"{x3.SigTime:MM}\t");
-                                            sb.Append($"{x3.SigTime:dd}\t");
-                                            sb.Append($"{x3.SigTime:HH}\t");
-                                            sb.Append($"{x3.SigTime:mm}\t");
-                                            sb.Append($"{x3.SigTime:ss}\t");
-                                            sb.Append($"{x3.SigTime:fff}\t");
-                                            sb.Append($"{x3.CheckRes.SmpCount * 1000 / ch0File.Fs:D4}\t");//信号持续时间ms
-                                            sb.Append($"{Convert.ToInt64(group.First().FreqDownMHz * 1e6):D12}\t");//下行频点
-                                            sb.Append($"{Convert.ToInt64((group.First().FreqDownMHz + 44) * 1e6):D12}\t");//上行频点
-                                            sb.Append($"{4}\t");//信号样式(暂定有这些1:CPM,2:BPSK,4:QPSK),
-                                            sb.Append($"{0:D4}\t");//目标序号
-                                            sb.Append($"res\t");
-                                            sb.Append($"{Convert.ToInt64(posLon * 1e6):D10}\t");
-                                            sb.Append($"{Convert.ToInt64(posLat * 1e6):D10}\t");
-                                            sb.Append($"{Convert.ToInt64(0 * 1e3):D8}\t");//定位误差km
-                                            sb.Append($"{Convert.ToInt64(x3.Dto1 * 1e2):D10}\t");
-                                            sb.Append($"{Convert.ToInt64(x3.Dfo1 * 1e2):D10}\t");
-                                            sb.Append($"{Convert.ToInt64(x3.Snr1 * 1e2):D6}\t");
-                                            sb.Append($"{Convert.ToInt64(x3.Dto2 * 1e2):D10}\t");
-                                            sb.Append($"{Convert.ToInt64(x3.Dfo2 * 1e2):D10}\t");
-                                            sb.Append($"{Convert.ToInt64(x3.Snr2 * 1e2):D6}\t");
-                                            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($"{0:D8}\t");//长轴
-                                            sb.Append($"{0:D8}\t");//短轴
-                                            sb.Append($"{0:D7}\t");//倾角
-                                            sb.Append($"{data1.Count:D2}\t");//时隙属性
-                                            sb.Append($"{1}\t");//所属卫星
-                                            sb.Append($"{950:D3}\t");//置信度
-                                            sb.Append($"{3}\r\n");//定位体制(星地=3)
-                                            string resFile = Path.Combine(PosResDir, $"定位结果_{posRes.SigTime:yyyyMMdd}.txt");
-                                            File.AppendAllText(resFile, sb.ToString());
+                                            else
+                                            {
+                                                var posRes = result.data;
+                                                double posLon = posRes.PosLon;
+                                                double posLat = posRes.PosLat;
+                                                if (x3.Snr1 == 0 || x3.Snr2 == 0)
+                                                {
+                                                    posLon = 0;
+                                                    posLat = 0;
+                                                }
+                                                StringBuilder sb = new StringBuilder();
+                                                sb.Append($"{x3.SigTime:yyyy}\t");
+                                                sb.Append($"{x3.SigTime:MM}\t");
+                                                sb.Append($"{x3.SigTime:dd}\t");
+                                                sb.Append($"{x3.SigTime:HH}\t");
+                                                sb.Append($"{x3.SigTime:mm}\t");
+                                                sb.Append($"{x3.SigTime:ss}\t");
+                                                sb.Append($"{x3.SigTime:fff}\t");
+                                                sb.Append($"{x3.CheckRes.SmpCount * 1000 / ch0File.Fs:D4}\t");//信号持续时间ms
+                                                sb.Append($"{Convert.ToInt64(group.First().FreqDownMHz * 1e6):D12}\t");//下行频点
+                                                sb.Append($"{Convert.ToInt64((group.First().FreqDownMHz + 44) * 1e6):D12}\t");//上行频点
+                                                sb.Append($"{4}\t");//信号样式(暂定有这些1:CPM,2:BPSK,4:QPSK),
+                                                sb.Append($"{0:D4}\t");//目标序号
+                                                sb.Append($"res\t");
+                                                sb.Append($"{Convert.ToInt64(posLon * 1e6):D10}\t");
+                                                sb.Append($"{Convert.ToInt64(posLat * 1e6):D10}\t");
+                                                sb.Append($"{Convert.ToInt64(0 * 1e3):D8}\t");//定位误差km
+                                                sb.Append($"{Convert.ToInt64(x3.Dto1 * 1e2):D10}\t");
+                                                sb.Append($"{Convert.ToInt64(x3.Dfo1 * 1e2):D10}\t");
+                                                sb.Append($"{Convert.ToInt64(x3.Snr1 * 1e2):D6}\t");
+                                                sb.Append($"{Convert.ToInt64(x3.Dto2 * 1e2):D10}\t");
+                                                sb.Append($"{Convert.ToInt64(x3.Dfo2 * 1e2):D10}\t");
+                                                sb.Append($"{Convert.ToInt64(x3.Snr2 * 1e2):D6}\t");
+                                                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($"{0:D8}\t");//长轴
+                                                sb.Append($"{0:D8}\t");//短轴
+                                                sb.Append($"{0:D7}\t");//倾角
+                                                sb.Append($"{data1.Count:D2}\t");//时隙属性
+                                                sb.Append($"{1}\t");//所属卫星
+                                                sb.Append($"{950:D3}\t");//置信度
+                                                sb.Append($"{3}\r\n");//定位体制(星地=3)
+                                                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);
                                         }
                                     }
-                                    catch (Exception ex)
+                                }
+                                else
+                                {
+                                    LogHelper.Info($"【任务{dto.ID}】{capTime: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星文件
+                                    string adja2File = await HttpHelper.UploadFileAsync(ch2File.File, baseUrl, token: cts.Token);//邻2星文件
+                                    var cgDto = new CpuCgMultiDto()
+                                    {
+                                        dtCenter = 0,
+                                        dtRange = 40000,
+                                        file1 = mainFile,
+                                        file2 = adja1File,
+                                        samplingRate = ch0File.Fs,
+                                        smpPositions = sig.Slots.Slots.Select(p => new SmpPosition() { TimeSeconds = p.TimeSeconds, 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}时刻-信号{group.Key}MHz-主星邻1星CPU参估出错.{result1.msg}");
+                                        continue;
+                                    }
+                                    cgDto = new CpuCgMultiDto()
                                     {
-                                        LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻时隙位置{data1[i].Smpstart}定位异常", ex);
+                                        dtCenter = 0,
+                                        dtRange = 40000,
+                                        file1 = mainFile,
+                                        file2 = adja2File,
+                                        samplingRate = ch0File.Fs,
+                                        smpPositions = sig.Slots.Slots.Select(p => new SmpPosition() { TimeSeconds = p.TimeSeconds, smpStart = p.StartPoint, smpCount = p.Len }).ToList(),
+                                        snrThreshold = 15,
+                                    };
+                                    var result2 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
+                                    sw.Stop();
+                                    if (result2.code != 200)
+                                    {
+                                        LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻2星CPU参估出错.{result2.msg}");
+                                        continue;
+                                    }
+                                    LogHelper.Info($"【任务{dto.ID}】{capTime: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-参估结果个数和检测结果个数不匹配");
+                                        continue;
+                                    }
+                                    for (int i = 0; i < data1.Count; i++)
+                                    {
+                                        try
+                                        {
+                                            if (cts.IsCancellationRequested) break;
+                                            X3TwoDtoNoParPosDto x3 = new X3TwoDtoNoParPosDto()
+                                            {
+                                                TaskID = dto.ID,
+                                                //SigTime = capTime.AddSeconds(data1[i].Smpstart / (double)ch0File.Fs),
+                                                SigTime = capTime.AddSeconds(data1[i].TimeSeconds),
+                                                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 = PosDtoFactor * data1[i].Dt,
+                                                Dfo1 = data1[i].Df,
+                                                Snr1 = data1[i].Snr,
+                                                Dto2 = PosDtoFactor * data2[i].Dt,
+                                                Dfo2 = data2[i].Df,
+                                                Snr2 = data2[i].Snr,
+                                                SatTxLon = dto.CapLon,
+                                                SatTxLat = dto.CapLat,
+                                                FreqDown = ch0File.FreqDownMHz * 1e6,
+                                                FreqUp = ch0File.FreqDownMHz * 1e6,
+                                                CheckRes = new CheckResDto()
+                                                {
+                                                    FileName = Path.GetFileName(ch0File.File),
+                                                    SmpStart = sig.Slots.Slots[i].StartPoint,
+                                                    SmpCount = sig.Slots.Slots[i].Len,
+                                                    PosCheckType = EnumPosCheckTypeDto.DAMA,
+                                                }
+                                            };
+                                            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}");
+                                            }
+                                            else
+                                            {
+                                                var posRes = result.data;
+                                                double posLon = posRes.PosLon;
+                                                double posLat = posRes.PosLat;
+                                                if (x3.Snr1 == 0 || x3.Snr2 == 0)
+                                                {
+                                                    posLon = 0;
+                                                    posLat = 0;
+                                                }
+                                                StringBuilder sb = new StringBuilder();
+                                                sb.Append($"{x3.SigTime:yyyy}\t");
+                                                sb.Append($"{x3.SigTime:MM}\t");
+                                                sb.Append($"{x3.SigTime:dd}\t");
+                                                sb.Append($"{x3.SigTime:HH}\t");
+                                                sb.Append($"{x3.SigTime:mm}\t");
+                                                sb.Append($"{x3.SigTime:ss}\t");
+                                                sb.Append($"{x3.SigTime:fff}\t");
+                                                sb.Append($"{x3.CheckRes.SmpCount * 1000 / ch0File.Fs:D4}\t");//信号持续时间ms
+                                                sb.Append($"{Convert.ToInt64(group.First().FreqDownMHz * 1e6):D12}\t");//下行频点
+                                                sb.Append($"{Convert.ToInt64((group.First().FreqDownMHz + 44) * 1e6):D12}\t");//上行频点
+                                                sb.Append($"{4}\t");//信号样式(暂定有这些1:CPM,2:BPSK,4:QPSK),
+                                                sb.Append($"{0:D4}\t");//目标序号
+                                                sb.Append($"res\t");
+                                                sb.Append($"{Convert.ToInt64(posLon * 1e6):D10}\t");
+                                                sb.Append($"{Convert.ToInt64(posLat * 1e6):D10}\t");
+                                                sb.Append($"{Convert.ToInt64(0 * 1e3):D8}\t");//定位误差km
+                                                sb.Append($"{Convert.ToInt64(x3.Dto1 * 1e2):D10}\t");
+                                                sb.Append($"{Convert.ToInt64(x3.Dfo1 * 1e2):D10}\t");
+                                                sb.Append($"{Convert.ToInt64(x3.Snr1 * 1e2):D6}\t");
+                                                sb.Append($"{Convert.ToInt64(x3.Dto2 * 1e2):D10}\t");
+                                                sb.Append($"{Convert.ToInt64(x3.Dfo2 * 1e2):D10}\t");
+                                                sb.Append($"{Convert.ToInt64(x3.Snr2 * 1e2):D6}\t");
+                                                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($"{0:D8}\t");//长轴
+                                                sb.Append($"{0:D8}\t");//短轴
+                                                sb.Append($"{0:D7}\t");//倾角
+                                                sb.Append($"{data1.Count:D2}\t");//时隙属性
+                                                sb.Append($"{1}\t");//所属卫星
+                                                sb.Append($"{950:D3}\t");//置信度
+                                                sb.Append($"{3}");//定位体制(星地=3)
+                                                sb.Append($"QPSK");//调制类型
+                                                sb.Append($"1.33\r\n");//符号速率kbps
+                                                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-时隙位置{data1[i].Smpstart}定位异常", ex);
+                                        }
                                     }
                                 }
-                                LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻定位完成");
+                                //删除DDC文件
+                                File.Delete(ch0File.File);
+                                File.Delete(ch1File.File);
+                                File.Delete(ch2File.File);
+                                LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-定位完成");
                             }
 
                         }
                         #endregion
                     }
+                    catch (TaskCanceledException ex)
+                    {
+                        LogHelper.Warning($"【任务{dto.ID}】处理结束,用户手动终止", ex.InnerException);
+                    }
                     catch (Exception ex)
                     {
-                        LogHelper.Error("任务执行出错", ex);
+                        if (ex.InnerException != null && ex.InnerException.GetType() == typeof(TaskCanceledException))
+                            LogHelper.Warning($"【任务{dto.ID}】处理结束,用户手动终止", ex.InnerException);
+                        else
+                            LogHelper.Error($"【任务{dto.ID}】任务执行出错", ex);
+                        continue;
                     }
                 }
             }, cts.Token);

+ 1 - 1
XdCxRhDW.Api/AddIns/GDOP误差椭圆/GDOPAPi.cs

@@ -313,7 +313,7 @@ namespace XdCxRhDW.Api
         [DllImport(GDOPDll, EntryPoint = "SCX_XD_NoRef_new", CallingConvention = CallingConvention.Cdecl)]
         public static extern int SCX_XD_NoRef_new(double[] mainxyz, double[] mbrecPos, double[] cdbPos,
             double target_dto, ref int linecount, out IntPtr reslen, out IntPtr res);
-
+        //单星、星地、低轨、
 
         //GDOP_EXPORT int SCX_XD_NoRef_new(double* main_sat_pos, double* mbwx_rec_pos, double* cdb_rec_pos,
         //double target_dto, int* linecount, int** reslen, double** res);

+ 1 - 1
XdCxRhDW.App/App.config

@@ -5,7 +5,7 @@
 	</connectionStrings>
 	<appSettings>
 		<!--54专用-->
-		<!--<add key="UseFor54" value="0"/>-->
+		<add key="UseFor54" value="1"/>
 		
 		<!--程序标题-->
 		<add key="SystemName" value="多模式融合定位平台" />

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

@@ -103,7 +103,8 @@
     <Compile Include="PosDto\X1D1PosDto.cs" />
     <Compile Include="PosDto\X2D1NoXlPosDto.cs" />
     <Compile Include="SvrStateDto.cs" />
-    <Compile Include="TaskHandleDto\X2D1HistoryTaskHandleDto.cs" />
+    <Compile Include="TaskHandleDto\X3NoRefTaskHandleDto.cs" />
+    <Compile Include="TaskHandleDto\X2D1NoRefTaskHandleDto.cs" />
     <Compile Include="TaskQueryResDto.cs" />
     <Compile Include="TaskSigDto.cs" />
     <Compile Include="XlCalcDto\XlImportDto.cs" />

+ 6 - 0
XdCxRhDw.Dto/GpuCgDto.cs

@@ -100,5 +100,11 @@ namespace XdCxRhDW.Dto
         /// 耗时(ms)
         /// </summary>
         public int TimeMs { get; set; }
+
+        /// <summary>
+        /// 54专用,避免样点转时间出现毫秒级误差
+        /// </summary>
+        [Obsolete]
+        public float TimeSeconds { get; set; }
     }
 }

+ 85 - 0
XdCxRhDw.Dto/TaskHandleDto/X2D1NoRefTaskHandleDto.cs

@@ -0,0 +1,85 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace XdCxRhDW.Dto
+{
+    /// <summary>
+    /// 两星一地无参处理模型
+    /// </summary>
+    public class X2D1NoRefTaskHandleDto
+    {
+        /// <summary>
+        /// 任务类型
+        /// </summary>
+        public EnumTaskTypeDto TaskType { get; set; }
+
+        /// <summary>
+        /// 任务ID
+        /// </summary>
+        public int ID { get; set; }
+
+        /// <summary>
+        /// 任务名称
+        /// </summary>
+        public string TaskName { get; set; }
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public DateTime StartTime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        public DateTime EndTime { get; set; }
+
+        /// <summary>
+        /// 主星编号(在MySql中找不到卫星时使用此编号)
+        /// </summary>
+        public int MainSatCode { get; set; }
+
+        /// <summary>
+        /// 邻星编号(在MySql中找不到卫星时使用此编号)
+        /// </summary>
+        public int AdjaSatCode { get; set; }
+
+        /// <summary>
+        /// 日期目录格式(yyyy_MM_dd_HH等格式)
+        /// </summary>
+        public string DateDirFormat { get; set; }
+
+        /// <summary>
+        /// 采集文件的目录
+        /// </summary>
+        public string CapDir { get; set; }
+
+        /// <summary>
+        /// 要处理的信号
+        /// </summary>
+        public List<TaskSigDto> Sigs { get; set; }
+
+        /// <summary>
+        /// 采集站经度
+        /// </summary>
+        public double CapLon { get; set; }
+
+        /// <summary>
+        /// 采集站纬度
+        /// </summary>
+        public double CapLat { get; set; }
+
+        /// <summary>
+        /// 超短站经度
+        /// </summary>
+        public double CdbLon { get; set; }
+
+        /// <summary>
+        /// 超短站纬度
+        /// </summary>
+        public double CdbLat { get; set; }
+    }
+}

+ 3 - 2
XdCxRhDw.Dto/TaskHandleDto/X2D1HistoryTaskHandleDto.cs → XdCxRhDw.Dto/TaskHandleDto/X3NoRefTaskHandleDto.cs

@@ -8,9 +8,9 @@ using System.Threading.Tasks;
 namespace XdCxRhDW.Dto
 {
     /// <summary>
-    /// 两星一地无参处理模型
+    /// 三星无参处理模型
     /// </summary>
-    public class X2D1NoRefTaskHandleDto
+    public class X3NoRefTaskHandleDto
     {
         /// <summary>
         /// 任务类型
@@ -71,5 +71,6 @@ namespace XdCxRhDW.Dto
         /// 采集站纬度
         /// </summary>
         public double CapLat { get; set; }
+
     }
 }