wyq 1 yıl önce
ebeveyn
işleme
535bd9dd82

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


+ 26 - 0
Service/Leo1SatTaskServer54/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
Service/Leo1SatTaskServer54/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 X1LeoTaskServer54
+{
+    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 - 12
Service/Leo1SatTaskServer54/App.config

@@ -9,29 +9,23 @@
 
 		<!--定位平台Http地址-->
 		<add key="PosPlatformAddr" value="http://127.0.0.1:8091" />
-
-		<!--检测结果目录-->
-		<add key="DetectDir" value="D:\data\Detect"/>
-
+		
 		<!--采集数据目录-->
-		<add key="CapDir" value="D:\data\AD"/>
-
-		<!--DDC处理后的目录-->
-		<add key="DdcDir" value="D:\data\DDC"/>
+		<add key="CapDir" value="D:\data1\AD"/>
 
 		<!--定位结果输出目录-->
-		<add key="PosResDir" value="D:\data\PosRes"/>
+		<add key="PosResDir" value="D:\data1\PosRes"/>
 
 		<!--状态上报目录-->
-		<add key="StateRptDir" value="D:\data\StateRes"/>
+		<add key="StateRptDir" value="D:\data1\StateRes"/>
 
 		<!--卫星及星历-->
-		<add key ="Time1SatInfo" value="23467,-41275189.6404,5820330.8446,6331022.0431,1,2,3"/>
+		<add key ="Time1SatInfo" value="40892,-41275189.6404,5820330.8446,6331022.0431,1,2,3"/>
 		<add key ="Time2SatInfo" value="40892,4694560.4826,41891872.2374,47531.3795,1,2,3"/>
 		<add key ="Time3SatInfo" value="40892,4694560.4826,41891872.2374,47531.3795,1,2,3"/>
 
 		<!--定位时差系数-->
-		<add key="PosDtoFactor" value="-1"/>
+		<add key="PosDtoFactor" value="1"/>
 
 		<!--时差误差(单位:us)-->
 		<add key="DtoErrus" value="1"/>

+ 4 - 21
Service/Leo1SatTaskServer54/HistoryFile.cs

@@ -44,28 +44,9 @@ namespace X1LeoTaskServer54
         public DateTime AdTime { get; set; }
 
         /// <summary>
-        /// 通道
+        /// 分组
         /// </summary>
-        public int ChNo { get; set; }
-    }
-
-    public class DDCFile
-    {
-        /// <summary>
-        /// 文件(含路径)
-        /// </summary>
-        public string File { get; set; }
-
-        /// <summary>
-        /// 采集时刻
-        /// </summary>
-        public DateTime AdTime { get; set; }
-
-        /// <summary>
-        /// 通道号
-        /// </summary>
-        
-        public int ChNo { get; set; }
+        public int XDNo { get; set; }
 
         /// <summary>
         /// 下行频点MHz
@@ -79,4 +60,6 @@ namespace X1LeoTaskServer54
 
         public int Fs { get; set; }
     }
+
+  
 }

+ 236 - 161
Service/Leo1SatTaskServer54/Service/TaskService.cs

@@ -1,4 +1,5 @@
-using System;
+using DevExpress.XtraLayout;
+using System;
 using System.Collections.Generic;
 using System.Configuration;
 using System.Diagnostics;
@@ -17,9 +18,7 @@ namespace X1LeoTaskServer54.Service
         private readonly string baseUrl;
         CancellationTokenSource cts;
 
-        string DetectDir;
         string CapDir;
-        string DdcDir;
         string PosResDir;
         string StateDir;
         int MainSatCode;
@@ -38,9 +37,7 @@ namespace X1LeoTaskServer54.Service
             else
                 this.baseUrl = posPlatformAddr + "/api/";
 
-            DetectDir = ConfigurationManager.AppSettings["DetectDir"].Trim();
             CapDir = ConfigurationManager.AppSettings["CapDir"].Trim();
-            DdcDir = ConfigurationManager.AppSettings["DdcDir"].Trim();
             PosResDir = ConfigurationManager.AppSettings["PosResDir"].Trim();
             StateDir = ConfigurationManager.AppSettings["StateRptDir"].Trim();
             var PosDtoFactorstr = ConfigurationManager.AppSettings["PosDtoFactor"].Trim();
@@ -55,15 +52,18 @@ namespace X1LeoTaskServer54.Service
             if (useGpuStr != null && useGpuStr.Trim() == "1")
                 useGpuCg = true;
         }
+
+        /// <summary>
+        /// 扫描 检测 参估 定位
+        /// </summary>
+        /// <param name="dto"></param>
         public void StartAsync(LeoSat1TaskHandleDto dto)
         {
             cts = new CancellationTokenSource();
             Task.Run(async () =>
             {
                 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)
@@ -71,17 +71,12 @@ namespace X1LeoTaskServer54.Service
                     try
                     {
                         #region 第1步,读取需要的配置信息
-                        if (!Directory.Exists(DetectDir))
-                        {
-                            await StopTask(dto.ID, EnumTaskStopType.Error, $"检测结果目录[{DetectDir}]不存在");
-                            return;
-                        }
+                     
                         if (!Directory.Exists(CapDir))
                         {
                             await StopTask(dto.ID, EnumTaskStopType.Error, $"AD采集目录[{CapDir}]不存在");
                             return;
                         }
-                        Directory.CreateDirectory(DdcDir);
                         Directory.CreateDirectory(PosResDir);
                         try
                         {
@@ -92,9 +87,9 @@ namespace X1LeoTaskServer54.Service
                             var arr2 = adja1Info.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                             var arr3 = adja2Info.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                             MainSatCode = Convert.ToInt32(arr1[0]);
-                            Time1XYZ = GetEph(arr1); 
+                            Time1XYZ = GetEph(arr1);
                             Time2XYZ = GetEph(arr2);
-                            Time3XYZ = GetEph(arr3); 
+                            Time3XYZ = GetEph(arr3);
                         }
                         catch
                         {
@@ -104,120 +99,241 @@ namespace X1LeoTaskServer54.Service
                         #endregion
 
                         #region 第2步,扫描检测结果目录
-                        var groupFiles = Directory.EnumerateFiles(DetectDir, "*.dat", SearchOption.TopDirectoryOnly).Select(p => StringToCheckResFile(p))
-                             .GroupBy(m => Convert.ToInt64(m.DayTime.ToString("yyyyMMdd") + m.FlagNo)).OrderBy(m => m.Key);
+                        //同一个AD文件得到的不同频点的检测文件FlagNo相同
+                        var groupFiles = Directory.EnumerateFiles(CapDir, "*.dat", SearchOption.TopDirectoryOnly).Select(p => StringToAdFile(p))
+                        .GroupBy(m => m.XDNo).OrderBy(m => m.Key);
+
                         if (!groupFiles.Any())
                         {
                             LogHelper.Info($"【任务{dto.ID}】等待扫描文件...");
                             await Task.Delay(10000);
                         }
-                        try
+                        var listTask = new List<Task>();
+                        foreach (var groupFile in groupFiles)//每一组文件代表同一组可定位的三个不同时刻的采集文件
                         {
+                            if (cts.IsCancellationRequested) break;
+                         
+                            var first = groupFile.First();
+                            LogHelper.Info($"【任务{dto.ID}】正在执行第{first.XDNo}组的采集文件");
 
-                            LeoX1ParPosDto leoX1 = new LeoX1ParPosDto()
-                            {
-                                TaskID = dto.ID,
-                                //SigTime = capTime.AddSeconds(data1[i].TimeSeconds),
-                                MainCode = MainSatCode,
-                                Adja1Code = MainSatCode,
-                                Adja2Code = MainSatCode,
-                                MainX = Time1XYZ[0],
-                                MainY = Time1XYZ[1],
-                                MainZ = Time1XYZ[2],
-                                MainVX = Time1XYZ[3],
-                                MainVY = Time1XYZ[4],
-                                MainVZ = Time1XYZ[5],
-                                Adja1X = Time2XYZ[0],
-                                Adja1Y = Time2XYZ[1],
-                                Adja1Z = Time2XYZ[2],
-                                Adja1VX = Time2XYZ[3],
-                                Adja1VY = Time2XYZ[4],
-                                Adja1VZ = Time2XYZ[5],
-                                Adja2X = Time3XYZ[0],
-                                Adja2Y = Time3XYZ[1],
-                                Adja2Z = Time3XYZ[2],
-                                Adja2VX = Time3XYZ[3],
-                                Adja2VY = Time3XYZ[4],
-                                Adja2VZ = Time3XYZ[5],
-                               //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 + 44) * 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/PosLeX1ParAsync", leoX1);
-                            if (result.code != 200)
+                            var group = groupFile.OrderBy(g => g.AdTime).ToArray();
+                            if (group.Count() != 3)
                             {
-                               // LogHelper.Error($"【任务{dto.ID}】-信号{group.Key}MHz-{capTime:yyyyMMddHHmmss}时刻第{i + 1}个突发定位异常.{result.msg}");
+                                LogHelper.Warning($"【任务{dto.ID}】第{first.XDNo}组{first.AdTime:yyyyMMddHHmmss}时刻-信号{first.FreqDownMHz}MHz-未找到三个时刻的信号文件,跳过此组数据");
+                                return;
                             }
-                            else
+                            //group:同一组不同时刻的文件
+                            var task = Task.Run(async () =>
                             {
-                                var posRes = result.data;
-                                double posLon = posRes.PosLon;
-                                double posLat = posRes.PosLat;
-                                if (leoX1.Snr1 == 0 || leoX1.Snr2 == 0)
+                                DateTime adTime = groupFile.First().AdTime;
+                                double freq = groupFile.First().FreqDownMHz;
+                                int No = groupFile.First().XDNo; 
+                                var ch0File = group[0];
+                                var ch1File = group[1];
+                                var ch2File = group[2];
+                                if (ch0File == null)
                                 {
-                                    posLon = 0;
-                                    posLat = 0;
+                                    LogHelper.Warning($"【任务{dto.ID}】第{No}组{ch0File.AdTime:yyyyMMddHHmmss}时刻-信号{freq}MHz-未找到第一时刻的信号文件,跳过此组数据");
+                                    return;
                                 }
-                                /*
-                                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,9:其它),
-                                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($"{1335:D12}");//符号速率bps  12个
-                                sb.Append("\r\n");
-                                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);
-                        }
+                                if (ch1File == null)
+                                {
+                                    LogHelper.Warning($"【任务{dto.ID}】第{No}组{ch1File.AdTime:yyyyMMddHHmmss}时刻-信号{freq}MHz-未找到第二时刻的信号文件,跳过此组数据");
+                                    return;
+                                }
+                                if (ch2File == null)
+                                {
+                                    LogHelper.Warning($"【任务{dto.ID}】第{No}组{ch2File.AdTime:yyyyMMddHHmmss}时刻-信号{freq}MHz-未找到第三时刻的信号文件,跳过此组数据");
+                                    return;
+                                }
+                                if (cts.IsCancellationRequested) return;
+
+
+                                Stopwatch sw = new Stopwatch();
+                                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星文件
+
+                                DetectDto detectDto = new DetectDto()
+                                {
+                                    file1 = mainFile,
+                                    dmcType = EnumSigCheckTypeDto.Ky5758,
+                                    fsHz = ch0File.Fs,
+                                    mergeRes = true,
+                                    SigProc = true,
+                                };
+
+                                var deteResp = await HttpHelper.PostRequestAsync<List<DetectResDto>>(baseUrl + "DetectCg/DetectCalc", detectDto, token: cts.Token);
+                                if (deteResp.code != 200)
+                                {
+                                    LogHelper.Error($"【任务{dto.ID}】第{No}组{adTime:yyyyMMddHHmmss}时刻-信号{freq}MHz信号检测出错.{deteResp.msg}");
+                                    return;
+                                }
+                                var smps = deteResp.data.Select(m => new SmpPosition(m.Start, m.Length)).ToList();//怎么补0?
 
+                                LogHelper.Info($"【任务{dto.ID}】第{No}组{adTime:yyyyMMddHHmmss}时刻-信号{freq}MHz-CPU参估开始,共{smps.Count}个突发...");
+                                var cgDto = new CpuCgMultiDto()
+                                {
+                                    dtCenter = 0,
+                                    dtRange = 40000,
+                                    file1 = mainFile,
+                                    file2 = adja1File,
+                                    samplingRate = ch0File.Fs,
+                                    smpPositions = smps,
+                                    snrThreshold = 15,
+                                };
+                                var result1 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
+                                if (result1.code != 200)
+                                {
+                                    LogHelper.Error($"【任务{dto.ID}】第{No}组{adTime:yyyyMMddHHmmss}时刻-信号{freq}MHz-主星邻1星CPU参估出错.{result1.msg}");
+                                    return;
+                                }
+                                cgDto = new CpuCgMultiDto()
+                                {
+                                    dtCenter = 0,
+                                    dtRange = 40000,
+                                    file1 = mainFile,
+                                    file2 = adja2File,
+                                    samplingRate = ch0File.Fs,
+                                    smpPositions = smps,
+                                    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}】第{No}组{adTime:yyyyMMddHHmmss}时刻-信号{freq}MHz-主星邻2星CPU参估出错.{result2.msg}");
+                                    return;
+                                }
+                                LogHelper.Info($"【任务{dto.ID}】第{No}组{adTime:yyyyMMddHHmmss}时刻-信号{freq}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}】第{No}组{adTime:yyyyMMddHHmmss}时刻-信号{freq}MHz-参估结果个数和检测结果个数不匹配");
+                                    return;
+                                }
+                                sw.Start();
+                                for (int i = 0; i < data1.Count; i++)
+                                {
+                                    try
+                                    {
+                                        if (cts.IsCancellationRequested) break;
+                                        LeoX1ParPosDto leoX1 = new LeoX1ParPosDto()
+                                        {
+                                            TaskID = dto.ID,
+                                            SigTime = adTime.AddSeconds(data1[i].TimeSeconds),
+                                            MainCode = MainSatCode,
+                                            Adja1Code = MainSatCode,
+                                            Adja2Code = MainSatCode,
+                                            MainX = Time1XYZ[0],
+                                            MainY = Time1XYZ[1],
+                                            MainZ = Time1XYZ[2],
+                                            MainVX = Time1XYZ[3],
+                                            MainVY = Time1XYZ[4],
+                                            MainVZ = Time1XYZ[5],
+                                            Adja1X = Time2XYZ[0],
+                                            Adja1Y = Time2XYZ[1],
+                                            Adja1Z = Time2XYZ[2],
+                                            Adja1VX = Time2XYZ[3],
+                                            Adja1VY = Time2XYZ[4],
+                                            Adja1VZ = Time2XYZ[5],
+                                            Adja2X = Time3XYZ[0],
+                                            Adja2Y = Time3XYZ[1],
+                                            Adja2Z = Time3XYZ[2],
+                                            Adja2VX = Time3XYZ[3],
+                                            Adja2VY = Time3XYZ[4],
+                                            Adja2VZ = Time3XYZ[5],
+                                            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 + 44) * 1e6,
+                                            SatTxLon = dto.CapLon,
+                                            SatTxLat = dto.CapLat,
+                                            FreqDown = ch0File.FreqDownMHz * 1e6,
+                                            CheckRes = new CheckResDto()
+                                            {
+                                                FileName = Path.GetFileName(ch0File.File),
+                                                SmpStart = cgDto.smpPositions[i].smpStart,
+                                                SmpCount = cgDto.smpPositions[i].smpCount,
+                                                PosCheckType = EnumPosCheckTypeDto.Ky5758,
+                                            }
+                                        };
+                                        var result = await HttpHelper.PostRequestAsync<PosResDto>(baseUrl + "Pos/PosLeX1ParAsync", leoX1);
+                                        if (result.code != 200)
+                                        {
+                                             LogHelper.Error($"【任务{dto.ID}】第{No}组-{adTime:yyyyMMddHHmmss}时刻-信号{freq}MHz 第{i + 1}个突发定位异常.{result.msg}");
+                                        }
+                                        else
+                                        {
+                                            var posRes = result.data;
+                                            double posLon = posRes.PosLon;
+                                            double posLat = posRes.PosLat;
+                                            if (leoX1.Snr1 == 0 || leoX1.Snr2 == 0)
+                                            {
+                                                posLon = 0;
+                                                posLat = 0;
+                                            }
+                                            StringBuilder sb = new StringBuilder();
+                                            sb.Append($"{leoX1.SigTime:yyyy}\t");
+                                            sb.Append($"{leoX1.SigTime:MM}\t");
+                                            sb.Append($"{leoX1.SigTime:dd}\t");
+                                            sb.Append($"{leoX1.SigTime:HH}\t");
+                                            sb.Append($"{leoX1.SigTime:mm}\t");
+                                            sb.Append($"{leoX1.SigTime:ss}\t");
+                                            sb.Append($"{leoX1.SigTime:fff}\t");
+                                            sb.Append($"{leoX1.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,9:其它),
+                                            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(leoX1.Dto1 * 1e2):D10}\t");
+                                            sb.Append($"{Convert.ToInt64(leoX1.Dfo1 * 1e2):D10}\t");
+                                            sb.Append($"{Convert.ToInt64(leoX1.Snr1 * 1e2):D6}\t");
+                                            sb.Append($"{Convert.ToInt64(leoX1.Dto2 * 1e2):D10}\t");
+                                            sb.Append($"{Convert.ToInt64(leoX1.Dfo2 * 1e2):D10}\t");
+                                            sb.Append($"{Convert.ToInt64(leoX1.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}\t");//定位体制(星地=3)
+                                            sb.Append($"{1335:D12}");//符号速率bps  12个
+                                            sb.Append("\r\n");
+                                            string resFile = Path.Combine(PosResDir, $"定位结果_{posRes.SigTime:yyyyMMdd}.txt");
+                                            File.AppendAllText(resFile, sb.ToString());
+                                        }
+                                    }
+                                    catch (Exception ex)
+                                    {
+                                        LogHelper.Error($"【任务{dto.ID}】第{No}组{adTime:yyyyMMddHHmmss}时刻-信号{freq}MHz-时隙位置{data1[i].Smpstart}定位异常", ex);
+                                    }
+                                }
+                                sw.Stop();
+                                LogHelper.Info($"【任务{dto.ID}】第{No}组{adTime:yyyyMMddHHmmss}时刻-信号{freq}MHz-定位完成,耗时{sw.ElapsedMilliseconds}ms");
+
+                                //删除DDC文件
+                                File.Delete(ch0File.File);
+                                File.Delete(ch1File.File);
+                                File.Delete(ch2File.File);
+                            }, cts.Token);
+                            listTask.Add(task);
+
+                            await Task.WhenAll(listTask);
+                        }
                         #endregion
                     }
                     catch (TaskCanceledException ex)
@@ -238,11 +354,10 @@ namespace X1LeoTaskServer54.Service
 
         }
 
-
         private double[] GetEph(string[] strs)
         {
 
-           var TimeXYZ = new double[6] { Convert.ToDouble(strs[1]),
+            var TimeXYZ = new double[6] { Convert.ToDouble(strs[1]),
                Convert.ToDouble(strs[2]),
                Convert.ToDouble(strs[3]),
                Convert.ToDouble(strs[4]),
@@ -291,21 +406,7 @@ namespace X1LeoTaskServer54.Service
             }
         }
 
-        private CheckResFile StringToCheckResFile(string file)
-        {
-            //YUFO_252.050MHz_20240409_1398.dat
-            string fileName = Path.GetFileNameWithoutExtension(file).ToUpper();
-            var arr = fileName.Split(new string[] { "_", "MHZ" }, StringSplitOptions.RemoveEmptyEntries);
-            var dayTime = DateTime.ParseExact(arr[2], "yyyyMMdd", null);
-            CheckResFile res = new CheckResFile()
-            {
-                DayTime = dayTime,
-                File = file,
-                FreqDownMHz = Convert.ToDouble(arr[1]),
-                FlagNo = Convert.ToInt64(arr[3]),
-            };
-            return res;
-        }
+
         private AdFile StringToAdFile(string file)
         {
             //20240409094240_ADC_ch02.dat
@@ -316,36 +417,10 @@ namespace X1LeoTaskServer54.Service
             {
                 File = file,
                 AdTime = time,
-                ChNo = Convert.ToInt32(arr[2]),
+                XDNo = Convert.ToInt32(arr[2]),
             };
             return adFile;
         }
-        public DDCFile StringToDDCFile(string file)
-        {
-            //20240409094240_252.025_C109375_ch0.dat
-            var name = Path.GetFileNameWithoutExtension(file).ToUpper();
-            var arr = name.Split(new string[] { "_", "MHz", "C", "H" }, StringSplitOptions.RemoveEmptyEntries);
-            var time = DateTime.ParseExact(arr[0], "yyyyMMddHHmmss", null);
-            double freqDown = Convert.ToDouble(arr[1]);
-            int fs = Convert.ToInt32(arr[2]);
-            int chNo = Convert.ToInt32(arr[3]);
-            return new DDCFile()
-            {
-                AdTime = time,
-                ChNo = chNo,
-                File = file,
-                FreqDownMHz = freqDown,
-                Fs = fs
-            };
-        }
-        public List<DDCFile> StringToDDCFile(List<string> files)
-        {
-            List<DDCFile> list = new List<DDCFile>();
-            foreach (var item in files)
-            {
-                list.Add(StringToDDCFile(item));
-            }
-            return list;
-        }
+
     }
 }

+ 9 - 0
Service/Leo1SatTaskServer54/X1LeoTaskServer54.csproj

@@ -118,6 +118,7 @@
     <Compile Include="..\..\XdCxRhDW.App\Localizer\ChsLocalizer.cs">
       <Link>DxHelper\ChsLocalizer.cs</Link>
     </Compile>
+    <Compile Include="AddIns\时隙获取\SlotHelper.cs" />
     <Compile Include="Controllers\LeoSatTaskProcessingController.cs" />
     <Compile Include="HistoryFile.cs" />
     <Compile Include="LogHelper.cs" />
@@ -172,6 +173,14 @@
       <Name>05.XdCxRhDW.WebApi</Name>
     </ProjectReference>
   </ItemGroup>
+  <ItemGroup>
+    <Content Include="AddIns\时隙获取\SlotChecker.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="AddIns\时隙获取\SlotChecker.h">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <PropertyGroup>
     <PostBuildEvent>del DevExpress*.xml,EntityFramework*.xml,Serilog*.xml,Newtonsoft*.xml

+ 127 - 46
XdCxRhDW.Api/AddIns/低轨/ErrorEllipseHelper.cs → XdCxRhDW.Api/AddIns/低轨/LeoErrorEllipseHelper.cs

@@ -4,11 +4,56 @@ using System.Linq;
 using System.Runtime.InteropServices;
 using System.Text;
 using System.Threading.Tasks;
+using XdCxRhDW.Dto;
 
 namespace XdCxRhDW.Api
 {
 
-    public class ErrorEllipseDTFOTSOption
+    public class ErrorEllipseX1Option
+    {
+        /// <summary>
+        /// 第一时刻星历
+        /// </summary>
+        public double[] MsEph { get; set; }
+
+        /// <summary>
+        ///第二时刻星历
+        /// </summary>
+        public double[] NsEph1 { get; set; }
+
+        /// <summary>
+        /// 第三时刻星历
+        /// </summary>
+        public double[] NsEph2 { get; set; }
+
+        /// <summary>
+        /// 定位点
+        /// </summary>
+        public double[] SelectPoint { get; set; }
+
+        /// <summary>
+        /// 频差误差(Hz)
+        /// </summary>
+        public double DfoErr { get; set; }
+        /// <summary>
+        /// 星历位置误差
+        /// </summary>
+        public double EphPosErr { get; set; }
+        /// <summary>
+        ///星历速度误差
+        /// </summary>
+        public double EphVelErr { get; set; }
+        /// <summary>
+        /// 上行频点(Hz)
+        /// </summary>
+        public double fu { get; set; }
+        /// <summary>
+        /// 概率 默认0.5
+        /// </summary>
+        public double Pe { get; set; } = 0.5;
+
+    }
+    public class ErrorEllipseX2Option
     {
         /// <summary>
         /// 主星星历
@@ -62,7 +107,7 @@ namespace XdCxRhDW.Api
 
     }
 
-    public class ErrorEllipseDTO2X1DOption
+    public class ErrorEllipseX3Option
     {
         /// <summary>
         /// 主星星历
@@ -72,12 +117,12 @@ namespace XdCxRhDW.Api
         /// <summary>
         /// 邻星星历
         /// </summary>
-        public double[] NsEph { get; set; }
+        public double[] NsEph1 { get; set; }
 
         /// <summary>
-        /// 超短波位置
+        /// 邻星星历
         /// </summary>
-        public double[] CDBAnt { get; set; }
+        public double[] NsEph2 { get; set; }
 
         /// <summary>
         /// 参考站位置
@@ -93,11 +138,27 @@ namespace XdCxRhDW.Api
         /// 时差误差(s)
         /// </summary>
         public double DtoErr { get; set; }
+        /// <summary>
+        /// 频差误差(Hz)
+        /// </summary>
+        public double DfoErr { get; set; }
+        /// <summary>
+        /// 星历位置误差
+        /// </summary>
+        public double EphPosErr { get; set; }
+        /// <summary>
+        ///星历速度误差
+        /// </summary>
+        public double EphVelErr { get; set; }
 
         /// <summary>
-        /// 星历误差
+        /// 上行频点1(Hz)
         /// </summary>
-        public double EphErr { get; set; }
+        public double fu1 { get; set; }
+        /// <summary>
+        /// 上行频点2(Hz)
+        /// </summary>
+        public double fu2 { get; set; }
         /// <summary>
         /// 概率 默认0.5
         /// </summary>
@@ -105,53 +166,52 @@ namespace XdCxRhDW.Api
 
     }
 
-    public class ErrorEllipseDTO1XOption
+    public class ErrorEllipse2X1DOption
     {
         /// <summary>
-        /// 第一时刻星历
+        /// 主星星历
         /// </summary>
         public double[] MsEph { get; set; }
 
         /// <summary>
-        ///第二时刻星历
+        /// 邻星星历
         /// </summary>
-        public double[] NsEph1 { get; set; }
+        public double[] NsEph { get; set; }
 
         /// <summary>
-        /// 第三时刻星历
+        /// 超短波位置
         /// </summary>
-        public double[] NsEph2 { get; set; }
+        public double[] CDBAnt { get; set; }
 
         /// <summary>
-        /// 定位点
+        /// 参考站位置
         /// </summary>
-        public double[] SelectPoint { get; set; }
+        public double[] RefGeod { get; set; }
 
         /// <summary>
-        /// 频差误差(Hz)
-        /// </summary>
-        public double DfoErr { get; set; }
-        /// <summary>
-        /// 星历位置误差
+        /// 定位点
         /// </summary>
-        public double EphPosErr { get; set; }
+        public double[] SelectPoint { get; set; }
+
         /// <summary>
-        ///星历速度误差
+        /// 时差误差(s)
         /// </summary>
-        public double EphVelErr { get; set; }
+        public double DtoErr { get; set; }
+
         /// <summary>
-        /// 上行频点(Hz)
+        /// 星历误差
         /// </summary>
-        public double fu { get; set; }
+        public double EphErr { get; set; }
         /// <summary>
         /// 概率 默认0.5
         /// </summary>
         public double Pe { get; set; } = 0.5;
 
     }
-    public static class ErrorEllipseHelper
+
+    public static class LeoErrorEllipseHelper
     {
-        private const string errorEllipseDll = @"Api\低轨\GDOP\DLL_GD64.dll";
+        private const string errorEllipseDll = @"AddIns\低轨\DLL_GD64.dll";
         /// <summary>
         /// 低轨双星误差椭圆
         /// </summary>
@@ -214,10 +274,9 @@ namespace XdCxRhDW.Api
         [DllImport(errorEllipseDll, CallingConvention = CallingConvention.Cdecl)]
         public static extern void freeBuff(IntPtr buf);
 
-        public static IEnumerable<(double lon, double lat)> ErrorEllipseLeoX2(ErrorEllipseDTFOTSOption opt)
+        public static ErrEllipseResDto ErrorEllipseLeoX2(ErrorEllipseX2Option opt, bool outputErrPoint)
         {
 
-            List<DtoLinePoint> list = new List<DtoLinePoint>();
 
             int LOP_Len = 0;
             IntPtr LOP_ValuePtr = Error_Ellipse_DTFO(
@@ -230,11 +289,30 @@ namespace XdCxRhDW.Api
                opt.EphPosErr,
                opt.EphVelErr,
                opt.fu1, opt.fu2, opt.Pe, ref LOP_Len);
-            return ParseResult(LOP_ValuePtr, LOP_Len);
+            return ParseResult(LOP_ValuePtr, LOP_Len, outputErrPoint);
+        }
+
+
+        public static ErrEllipseResDto ErrorEllipseLeoX3(ErrorEllipseX3Option opt, bool outputErrPoint)
+        {
+
+#warning 未提供低轨三星误差椭圆算法 
+            int LOP_Len = 0;
+            IntPtr LOP_ValuePtr = Error_Ellipse_DTFO(
+                opt.MsEph,
+                 opt.NsEph1,
+                opt.RefGeod,
+                 opt.SelectPoint,
+                opt.DtoErr,
+                opt.DfoErr,
+               opt.EphPosErr,
+               opt.EphVelErr,
+               opt.fu1, opt.fu2, opt.Pe, ref LOP_Len);
+            return ParseResult(LOP_ValuePtr, LOP_Len, outputErrPoint);
         }
 
 
-        public static IEnumerable<(double lon, double lat)> ErrorEllipse2X1D(ErrorEllipseDTO2X1DOption opt)
+        public static ErrEllipseResDto ErrorEllipse2X1D(ErrorEllipse2X1DOption opt, bool outputErrPoint)
         {
             int LOP_Len = 0;
             IntPtr LOP_ValuePtr = Error_Ellipse_2X1D(
@@ -246,11 +324,11 @@ namespace XdCxRhDW.Api
                 opt.DtoErr,
                 opt.EphErr,
                 opt.Pe, ref LOP_Len);
-            return ParseResult(LOP_ValuePtr, LOP_Len);
+            return ParseResult(LOP_ValuePtr, LOP_Len, outputErrPoint);
         }
 
 
-        public static IEnumerable<(double lon, double lat)> ErrorEllipseLeoX1(ErrorEllipseDTO1XOption opt)
+        public static ErrEllipseResDto ErrorEllipseLeoX1(ErrorEllipseX1Option opt, bool outputErrPoint)
         {
             int LOP_Len = 0;
             IntPtr LOP_ValuePtr = Error_Ellipse_2DFO(
@@ -262,30 +340,33 @@ namespace XdCxRhDW.Api
                opt.EphPosErr,
                opt.EphVelErr,
                opt.fu, opt.Pe, ref LOP_Len);
-            return ParseResult(LOP_ValuePtr, LOP_Len);
+            return ParseResult(LOP_ValuePtr, LOP_Len,outputErrPoint);
         }
-
-        private static IEnumerable<(double lon, double lat)> ParseResult(IntPtr LOP_ValuePtr, int LOP_Len)
+        private static ErrEllipseResDto ParseResult(IntPtr LOP_ValuePtr, int LOP_Len, bool outputErrPoint)
         {
-            List<DtoLinePoint> list = new List<DtoLinePoint>();
             double[] LOP_Value = new double[LOP_Len];
             if (LOP_Len > 0)
             {
                 Marshal.Copy(LOP_ValuePtr, LOP_Value, 0, LOP_Value.Length);
-
-                int len = LOP_Len / 2;
-                for (int i = 0; i < len; i++)
+            }
+#warning 低轨多星误差椭圆是否包含长轴、短轴、倾角
+            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;
+                for (int i = 0; i < count; i += 2)//13 ---01 23 45 67 89
                 {
-                    int temp = i * 2;
-                    list.Add(new DtoLinePoint()
+                    res.GeoPoints.Add(new GeoPoint()
                     {
-                        Lon = LOP_Value[temp],
-                        Lat = LOP_Value[temp + 1]
+                        Lon = LOP_Value[i],
+                        Lat = LOP_Value[i + 1],
                     });
                 }
             }
-            var Lines = list.Select(p => (p.Lon, p.Lat));
-            return Lines;
+            return res;
         }
 
 

+ 7 - 3
XdCxRhDW.Api/XdCxRhDW.Api.csproj

@@ -54,7 +54,7 @@
     <Compile Include="AddIns\GDOP误差椭圆\MapItem.cs" />
     <Compile Include="AddIns\GDOP误差椭圆\TheoryDtoDfoApi.cs" />
     <Compile Include="AddIns\GPU参估\GpuCafResult.cs" />
-    <Compile Include="AddIns\低轨\ErrorEllipseHelper.cs" />
+    <Compile Include="AddIns\低轨\LeoErrorEllipseHelper.cs" />
     <Compile Include="AddIns\低轨\LeoPosApi.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="AddIns\定位\PosApi.cs" />
@@ -174,14 +174,18 @@
     <Content Include="AddIns\GDOP误差椭圆\DLL_SCXPlot.dll">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
-    <Content Include="AddIns\低轨\DLL_GD64.dll" />
+    <Content Include="AddIns\低轨\DLL_GD64.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="AddIns\低轨\DLL_LHDW.h">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     <Content Include="AddIns\低轨\DLL_XDXZ.dll">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
-    <Content Include="AddIns\低轨\GDOP_Draw.dll" />
+    <Content Include="AddIns\低轨\GDOP_Draw.dll">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="AddIns\频差线\Positioning.h" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

+ 78 - 0
XdCxRhDW.App/Controllers/DetectCgController.cs

@@ -174,5 +174,83 @@ namespace XdCxRhDW.App.Controllers
                 return Success(res);
             });
         }
+
+        /// <summary>
+        /// 低轨单星带参误差椭圆
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<AjaxResult<ErrEllipseResDto>> ErrorEllipseX1Leo(ErrorEllipseLeoX1Dto dto)
+        {
+            return await Task.Run(() =>
+            {
+                ErrorEllipseX1Option option = new ErrorEllipseX1Option();
+                option.MsEph = dto.MsEph;
+                option.NsEph1 = dto.NsEph1;
+                option.NsEph2 = dto.NsEph2;
+                option.SelectPoint = dto.SelectPoint;
+                option.DfoErr = dto.DfoErr;
+                option.EphPosErr = dto.EphPosErr;
+                option.EphVelErr = dto.EphVelErr;
+                option.fu = dto.fu;
+                option.Pe = dto.Pe;
+                var res = LeoErrorEllipseHelper.ErrorEllipseLeoX1(option,dto.OutputErrPoint);
+                return Success(res);
+            });
+        }
+
+        /// <summary>
+        /// 低轨双星带参误差椭圆
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<AjaxResult<ErrEllipseResDto>> ErrorEllipseX2Leo(ErrorEllipseLeoX2Dto dto)
+        {
+            return await Task.Run(() =>
+            {
+                ErrorEllipseX2Option option = new ErrorEllipseX2Option();
+                option.MsEph = dto.MsEph;
+                option.NsEph = dto.NsEph;
+                option.RefGeod = dto.RefGeod;
+                option.SelectPoint = dto.SelectPoint;
+                option.DtoErr = dto.DtoErr;
+                option.DfoErr = dto.DfoErr;
+                option.EphPosErr = dto.EphPosErr;
+                option.EphVelErr = dto.EphVelErr;
+                option.fu1 = dto.fu1;
+                option.fu2 = dto.fu2;
+                option.Pe = dto.Pe;
+                var res = LeoErrorEllipseHelper.ErrorEllipseLeoX2(option, dto.OutputErrPoint);
+                return Success(res);
+            });
+        }
+
+
+        /// <summary>
+        /// 低轨三星带参误差椭圆
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<AjaxResult<ErrEllipseResDto>> ErrorEllipseX3Leo(ErrorEllipseLeoX3Dto dto)
+        {
+            return await Task.Run(() =>
+            {
+                ErrorEllipseX3Option option = new ErrorEllipseX3Option();
+                option.MsEph = dto.MsEph;
+                option.NsEph1 = dto.NsEph1;
+                option.NsEph2 = dto.NsEph2;
+                option.RefGeod = dto.RefGeod;
+                option.SelectPoint = dto.SelectPoint;
+                option.DtoErr = dto.DtoErr;
+                option.DfoErr = dto.DfoErr;
+                option.EphPosErr = dto.EphPosErr;
+                option.EphVelErr = dto.EphVelErr;
+                option.fu1 = dto.fu1;
+                option.fu2 = dto.fu2;
+                option.Pe = dto.Pe;
+                var res = LeoErrorEllipseHelper.ErrorEllipseLeoX3(option, dto.OutputErrPoint);
+                return Success(res);
+            });
+        }
     }
 }

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

@@ -57,6 +57,7 @@
     <Compile Include="CafResultDto.cs" />
     <Compile Include="CgResDto.cs" />
     <Compile Include="CpuCgMultiDto.cs" />
+    <Compile Include="ErrEllipseLeoDto.cs" />
     <Compile Include="ErrEllipseResDto.cs" />
     <Compile Include="ErrEllipseX2D1Dto.cs" />
     <Compile Include="ImageResultDto.cs" />

+ 239 - 0
XdCxRhDw.Dto/ErrEllipseLeoDto.cs

@@ -0,0 +1,239 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace XdCxRhDW.Dto
+{
+    /// <summary>
+    /// 低轨单星
+    /// </summary>
+    public class ErrorEllipseLeoX1Dto
+    {
+        /// <summary>
+        /// 第一时刻星历
+        /// </summary>
+        public double[] MsEph { get; set; }
+
+        /// <summary>
+        ///第二时刻星历
+        /// </summary>
+        public double[] NsEph1 { get; set; }
+
+        /// <summary>
+        /// 第三时刻星历
+        /// </summary>
+        public double[] NsEph2 { get; set; }
+
+        /// <summary>
+        /// 定位点
+        /// </summary>
+        public double[] SelectPoint { get; set; }
+
+        /// <summary>
+        /// 频差误差(Hz)
+        /// </summary>
+        public double DfoErr { get; set; }
+        /// <summary>
+        /// 星历位置误差
+        /// </summary>
+        public double EphPosErr { get; set; }
+        /// <summary>
+        ///星历速度误差
+        /// </summary>
+        public double EphVelErr { get; set; }
+        /// <summary>
+        /// 上行频点(Hz)
+        /// </summary>
+        public double fu { get; set; }
+        /// <summary>
+        /// 概率 默认0.5
+        /// </summary>
+        public double Pe { get; set; } = 0.5;
+
+        /// <summary>
+        /// 是否输出椭圆位置信息
+        /// </summary>
+        public bool OutputErrPoint { get; set; }
+
+    }
+
+    /// <summary>
+    /// 低轨双星
+    /// </summary>
+    public class ErrorEllipseLeoX2Dto
+    {
+        /// <summary>
+        /// 主星星历
+        /// </summary>
+        public double[] MsEph { get; set; }
+
+        /// <summary>
+        /// 邻星星历
+        /// </summary>
+        public double[] NsEph { get; set; }
+
+        /// <summary>
+        /// 参考站位置
+        /// </summary>
+        public double[] RefGeod { get; set; }
+
+        /// <summary>
+        /// 定位点
+        /// </summary>
+        public double[] SelectPoint { get; set; }
+
+        /// <summary>
+        /// 时差误差(s)
+        /// </summary>
+        public double DtoErr { get; set; }
+        /// <summary>
+        /// 频差误差(Hz)
+        /// </summary>
+        public double DfoErr { get; set; }
+        /// <summary>
+        /// 星历位置误差
+        /// </summary>
+        public double EphPosErr { get; set; }
+        /// <summary>
+        ///星历速度误差
+        /// </summary>
+        public double EphVelErr { get; set; }
+
+        /// <summary>
+        /// 上行频点1(Hz)
+        /// </summary>
+        public double fu1 { get; set; }
+        /// <summary>
+        /// 上行频点2(Hz)
+        /// </summary>
+        public double fu2 { get; set; }
+        /// <summary>
+        /// 概率 默认0.5
+        /// </summary>
+        public double Pe { get; set; } = 0.5;
+
+        /// <summary>
+        /// 是否输出椭圆位置信息
+        /// </summary>
+        public bool OutputErrPoint { get; set; }
+    }
+
+    /// <summary>
+    /// 低轨三星
+    /// </summary>
+    public class ErrorEllipseLeoX3Dto
+    {
+        /// <summary>
+        /// 主星星历
+        /// </summary>
+        public double[] MsEph { get; set; }
+
+        /// <summary>
+        /// 邻星1星历
+        /// </summary>
+        public double[] NsEph1 { get; set; }
+
+        /// <summary>
+        /// 邻星2星历
+        /// </summary>
+        public double[] NsEph2 { get; set; }
+
+        /// <summary>
+        /// 参考站位置
+        /// </summary>
+        public double[] RefGeod { get; set; }
+
+        /// <summary>
+        /// 定位点
+        /// </summary>
+        public double[] SelectPoint { get; set; }
+
+        /// <summary>
+        /// 时差误差(s)
+        /// </summary>
+        public double DtoErr { get; set; }
+        /// <summary>
+        /// 频差误差(Hz)
+        /// </summary>
+        public double DfoErr { get; set; }
+        /// <summary>
+        /// 星历位置误差
+        /// </summary>
+        public double EphPosErr { get; set; }
+        /// <summary>
+        ///星历速度误差
+        /// </summary>
+        public double EphVelErr { get; set; }
+
+        /// <summary>
+        /// 上行频点1(Hz)
+        /// </summary>
+        public double fu1 { get; set; }
+        /// <summary>
+        /// 上行频点2(Hz)
+        /// </summary>
+        public double fu2 { get; set; }
+        /// <summary>
+        /// 概率 默认0.5
+        /// </summary>
+        public double Pe { get; set; } = 0.5;
+
+        /// <summary>
+        /// 是否输出椭圆位置信息
+        /// </summary>
+        public bool OutputErrPoint { get; set; }
+    }
+
+
+    public class ErrorEllipseX2D1Dto
+    {
+        /// <summary>
+        /// 主星星历
+        /// </summary>
+        public double[] MsEph { get; set; }
+
+        /// <summary>
+        /// 邻星星历
+        /// </summary>
+        public double[] NsEph { get; set; }
+
+        /// <summary>
+        /// 超短波位置
+        /// </summary>
+        public double[] CDBAnt { get; set; }
+
+        /// <summary>
+        /// 参考站位置
+        /// </summary>
+        public double[] RefGeod { get; set; }
+
+        /// <summary>
+        /// 定位点
+        /// </summary>
+        public double[] SelectPoint { get; set; }
+
+        /// <summary>
+        /// 时差误差(s)
+        /// </summary>
+        public double DtoErr { get; set; }
+
+        /// <summary>
+        /// 星历误差
+        /// </summary>
+        public double EphErr { get; set; }
+        /// <summary>
+        /// 概率 默认0.5
+        /// </summary>
+        public double Pe { get; set; } = 0.5;
+
+        /// <summary>
+        /// 是否输出椭圆位置信息
+        /// </summary>
+        public bool OutputErrPoint { get; set; }
+
+    }
+
+ 
+}