Преглед изворни кода

添加取参考流程处理并做两星一地有参结果

wyq пре 10 месеци
родитељ
комит
0f53d8bf28

+ 10 - 8
Service/X2D1TaskServer/Service/TaskService.cs

@@ -554,7 +554,6 @@ namespace X2D1TaskServer
                         }
                         List<DetectResDto> refDetects = await DoRefAsync(dto, paramInfo, deteRes, data1, data2, cts);
                         bool beFindRef = false;
-
                         if (refDetects != null && refDetects.Count > 0)//有参考信号
                         {
                             beFindRef = true;
@@ -562,7 +561,10 @@ namespace X2D1TaskServer
                             data1 = data1.Where(c => !refDetects.Any(r => r.Start == c.Smpstart && r.Length == c.Smplen)).ToList();
                             data2 = data2.Where(c => !refDetects.Any(r => r.Start == c.Smpstart && r.Length == c.Smplen)).ToList();
                         }
-                        await DoX2D1NoParPosAsync(dto, paramInfo, deteRes, data1, data2, cts, true, beFindRef);
+                        string msg = $"【任务{dto.ID}】目标信号[{paramInfo.TaskSig.FreqUp / 1e6:f3}MHz]";
+                        //目标信号找参考时才赋值固定站编号,为找参考信号做准备
+                        //目标信号无参时不存储固定站编号
+                        await DoX2D1NoParPosAsync(dto, paramInfo, deteRes, data1, data2, cts, msg, beFindRef ? dto.FixedStationDto.FixedStationId : 0, beFindRef);
 
                     }
                     catch (TaskCanceledException)
@@ -582,9 +584,8 @@ namespace X2D1TaskServer
             return task;
         }
 
-        private async Task DoX2D1NoParPosAsync(X2D1TaskHandleDto dto, BaseParamInfo paramInfo, List<DetectResDto> deteRes, List<CpuCgResDto> data1, List<CpuCgResDto> data2, CancellationTokenSource cts, bool beTar = false, bool beFindRef = false)
+        private async Task DoX2D1NoParPosAsync(X2D1TaskHandleDto dto, BaseParamInfo paramInfo, List<DetectResDto> deteRes, List<CpuCgResDto> data1, List<CpuCgResDto> data2, CancellationTokenSource cts, string msg, int fixedStationId, bool beFindRef = false)
         {
-            string msg = $"【任务{dto.ID}】{(!beTar ? "参考" : "目标")}信号[{paramInfo.TaskSig.FreqUp / 1e6:f3}MHz]";
             for (int i = 0; i < data1.Count; i++)
             {
                 try
@@ -619,9 +620,9 @@ namespace X2D1TaskServer
                             PosCheckType = detect.DmcType.GetEnumByDisplayName<EnumPosCheckTypeDto>(),
                         }
                     };
-                    if (dto.FixedStationDto != null)
+                    if (fixedStationId > 0)
                     {
-                        x2D1.FixedStationId = dto.FixedStationDto.FixedStationId;
+                        x2D1.FixedStationId = fixedStationId;
                     }
                     if (data1[i].Snr > 0 && data2[i].Snr > 0)
                     {
@@ -720,8 +721,9 @@ namespace X2D1TaskServer
                 await LogHelper.Error($"【任务{dto.ID}】参考信号[{dto.FixedStationDto.FreqUp / 1e6:f3}MHz],{capTime:yyyyMMddHHmmss}时刻参估结果个数和检测结果个数不匹配");
                 return null;
             }
-
-            await DoX2D1NoParPosAsync(dto, paramInfo, refDetects, data1, data2, cts);
+            string msg = $"【任务{dto.ID}】参考信号[{paramInfo.TaskSig.FreqUp / 1e6:f3}MHz]";
+            //参考信号要存储固定站编号,标记是参考信号
+            await DoX2D1NoParPosAsync(dto, paramInfo, refDetects, data1, data2, cts, msg, dto.FixedStationDto.FixedStationId);
             return refDetects;
         }
     }

+ 6 - 0
XdCxRhDW.App/Controllers/PosController.cs

@@ -688,6 +688,12 @@ namespace XdCxRhDW.App.Controllers
                 Serilog.Log.Error($"推算卫星{dto.AdjaCode}的ECEF星历出错.{ephAdja.msg}");
                 return Error<PosResDto>($"推算卫星{dto.AdjaCode}的ECEF星历出错");
             }
+            if (dto.BeFindRef)
+            {
+                X2D1PosRefService.Instance.AddPosDto(dto);
+                PosRes posRes = new PosRes();
+                return Success(MapDto(posRes));
+            }
             using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
             {
                 var StationRes = db.StationRes.Add(new StationRes()

+ 1 - 0
XdCxRhDW.App/UserControl/CtrlHome.cs

@@ -628,6 +628,7 @@ namespace XdCxRhDW.App.UserControl
                                 DateDirFormat = tsk.CapDirFormat,
                                 Sigs = tskSigsDto,
                             };
+              #warning 多个固定站时,默认找到的第一个固定站
                             var fixedStation = fixedStations.FirstOrDefault(p => dto.Sigs.Any(t => t.FreqUp == p.FreqUpHz));
                             if (fixedStation != null)
                             {

+ 23 - 0
XdCxRhDW.App/X2D1PosRef/LinearInterpolation.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace XdCxRhDW.App
+{
+    public class LinearInterpolation
+    {
+        public static double CalSigTimeDto(DateTime x, DateTime x0, DateTime x1, double y0, double y1)
+        {
+            // 线性插值公式: y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0))
+            double y= y0 + (x - x0).TotalSeconds * ((y1 - y0) / (x1 - x0).TotalSeconds);
+            if (y == double.NaN)
+            {
+                y = 0;
+            }
+            return y;
+        }
+
+    }
+}

+ 161 - 0
XdCxRhDW.App/X2D1PosRef/X2D1PosHandle.cs

@@ -0,0 +1,161 @@
+using DevExpress.Utils.About;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Data.Entity;
+using System.Linq;
+using System.Security.Policy;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Documents;
+using XdCxRhDW.Dto;
+using XdCxRhDW.Entity;
+using XdCxRhDW.Repostory;
+
+namespace XdCxRhDW.App
+{
+    /// <summary>
+    /// 两星一地定位取参考
+    /// </summary>
+    public class X2D1PosHandle
+    {
+        
+        public int TaskId;
+        //十分钟时间内的数据
+        private int TimeSeconds = 10 * 60;//十分钟
+        private bool isRuning = true;
+
+        BlockingCollection<X2D1NoXlNoParlPosDto> posDtos = new BlockingCollection<X2D1NoXlNoParlPosDto>();
+        public X2D1PosHandle(int taskId)
+        {
+            TaskId = taskId;
+            StartMonitor();
+        }
+
+        public void StartMonitor()
+        {
+            Task.Run(async () =>
+            {
+
+                while (isRuning)
+                {
+                    try
+                    {
+                        var dto = posDtos.Take();
+
+                        FixedStation fixedStation;
+                        using (RHDWContext db = new RHDWContext())
+                        {
+                            fixedStation = await db.FixedStation.FirstAsync(f => f.ID == dto.FixedStationId.Value);
+                        }
+                        
+                        DateTime min = dto.SigTime.AddSeconds(-TimeSeconds);
+                        DateTime max = dto.SigTime.AddSeconds(TimeSeconds);
+                        using (RHDWPartContext db = RHDWPartContext.GetContext(dto.SigTime, true))
+                        {
+                            //获取十分钟之内的固定站数据
+                            var cgRess = await db.CgRes.Where(m => m.FixedStationResID == dto.FixedStationId && dto.SigTime >= min && dto.SigTime <= max).OrderBy(d => d.SigTime).ToListAsync();
+
+                            List<CgRes> matchCgList = new List<CgRes>();
+                            cgRess.ForEach(c =>
+                            {
+                                if ((dto.SigTime - c.SigTime).TotalSeconds <= TimeSeconds)
+                                {
+                                    matchCgList.Add(c);
+                                }
+                            });
+#warning 获取最近时间的时差值,若没找到参考信号就做无参 是否要等待?
+                            var point1 = matchCgList.Where(c => c.SigTime <= dto.SigTime).FirstOrDefault();
+                            var point2 = matchCgList.Where(c => c.SigTime >= dto.SigTime).FirstOrDefault();
+                            bool isSucces = false;
+                            if (point1 != null && point2 != null)
+                            {
+                                //通过双星时差及超短波时差怎么计算参考信息的时差
+                                double refDto = LinearInterpolation.CalSigTimeDto(dto.SigTime, point1.SigTime, point2.SigTime, point1.Dto1.Value, point2.Dto1.Value);
+                                double refDtoCdb = LinearInterpolation.CalSigTimeDto(dto.SigTime, point1.SigTime, point2.SigTime, point1.DtoCdb.Value, point2.DtoCdb.Value);
+
+                                //执行两星一地有参定位
+                                X2D1NoXlPosDto X2D1NoXlPosDto = new X2D1NoXlPosDto()
+                                {
+                                    SigTime = dto.SigTime,
+                                    MainCode = dto.MainCode,
+                                    AdjaCode = dto.AdjaCode,
+                                    SxDto = dto.SxDto,
+                                    XdDto = dto.XdDto,
+                                    MainYbDto = refDto,
+                                    AdjaYbDto = refDtoCdb,
+                                    SatTxLon = dto.SatTxLon,
+                                    SatTxLat = dto.SatTxLat,
+                                    CdbTxLon = dto.CdbTxLon,
+                                    CdbTxLat = dto.CdbTxLat,
+                                    RefLon = fixedStation.Lon,
+                                    RefLat = fixedStation.Lat,
+                                    FreqDown = dto.FreqDown,
+                                    FreqUp = dto.FreqUp,
+                                    XdDfo = dto.XdDfo,
+                                    XdSnr = dto.XdSnr,
+                                    SxDfo = dto.SxDfo,
+                                    SxSnr = dto.SxSnr,
+                                    CalcConfidence = true,
+                                    TheoryDfoCalc = true,
+                                };
+                                var result = await HttpHelper.PostRequestAsync<PosResDto>(SysConfig.GetUrl("Pos/PosX2D1NoXlAsync"), X2D1NoXlPosDto);
+                                if (result.code != 200)
+                                {
+                                    isSucces = false;
+                                    Serilog.Log.Error($"{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地有参定位失败{result.msg}");
+                                }
+                                else
+                                {
+                                    isSucces = true;
+                                    Serilog.Log.Error($"{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地有参定位完成{result.msg}");
+                                }
+                                if (isSucces && result.data.PosLon == 999)
+                                {
+                                    isSucces = false;
+                                }
+
+                            }
+                            if (!isSucces)
+                            {
+                                dto.BeFindRef = false;
+                                dto.FixedStationId = null;
+                                var result = await HttpHelper.PostRequestAsync<PosResDto>(SysConfig.GetUrl("Pos/PosX2D1NoXlNoParAsync"), dto);
+                                if (result.code != 200)
+                                {
+                                    Serilog.Log.Error($"{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位失败{result.msg}");
+
+                                }
+                                else
+                                {
+                                    Serilog.Log.Error($"{dto.SigTime:yyyy-MM-dd HH:mm:ss}两星一地无参定位完成{result.msg}");
+                                }
+
+                            }
+
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+                        Serilog.Log.Error(ex, $"【取参考信号流程异常{ex.Message}");
+                    }
+
+                }
+            });
+        }
+        public void Append(X2D1NoXlNoParlPosDto dto)
+        {
+            bool ret = posDtos.TryAdd(dto);
+            if (!ret)
+            {
+                Serilog.Log.Error($"【任务{dto.TaskID}】添加取参考Dto");
+            }
+        }
+
+        public void Stop()
+        {
+            //当前任务停止处理
+            isRuning = false;
+        }
+    }
+}

+ 112 - 0
XdCxRhDW.App/X2D1PosRef/X2D1PosRefService.cs

@@ -0,0 +1,112 @@
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Data.Entity;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using XdCxRhDW.Dto;
+using XdCxRhDW.Entity;
+using XdCxRhDW.Repostory;
+namespace XdCxRhDW.App
+{
+    /// <summary>
+    /// 两星一地定位取参考服务 
+    /// </summary>
+    public class X2D1PosRefService
+    {
+        public static X2D1PosRefService Instance { get; private set; } = new X2D1PosRefService();
+
+        readonly List<X2D1PosHandle> handles = new List<X2D1PosHandle>();
+
+        public X2D1PosRefService()
+        {
+            StartMonitor();
+        }
+        public void StartMonitor()
+        {
+            Task.Run(() =>
+            {
+                while (true)
+                {
+                    if (handles.Count == 0)
+                    {
+                        Thread.Sleep(5000);
+                    }
+                    try
+                    {
+                        lock (this)
+                        {
+                            List<X2D1PosHandle> deletes = new List<X2D1PosHandle>();
+                            using (RHDWContext db = new RHDWContext())
+                            {
+                                for (int i = 0; i < handles.Count; i++)
+                                {
+                                    var handle = handles[i];
+                                    var runTask = db.TaskInfos.FirstOrDefault(p => p.ID == handle.TaskId && p.TaskState == EnumTaskState.Running);
+                                    if (runTask == null)
+                                    {
+                                        handle.Stop();
+                                        deletes.Add(handle);
+                                    }
+                                }
+
+                            }
+                            //删除未运行的任务
+                            handles.RemoveAll(r => deletes.Any(d => d.TaskId == r.TaskId));
+                        }
+                        Thread.Sleep(5000);
+                    }
+                    catch (Exception ex)
+                    {
+                        Serilog.Log.Error(ex, $"【监视取参考任务运行状态异常,{ex.Message}");
+
+                    }
+
+                }
+            });
+        }
+        public void AddPosDto(X2D1NoXlNoParlPosDto dto)
+        {
+            try
+            {
+                lock (this)
+                {
+                    var firstDto = handles.FirstOrDefault(m => m.TaskId == dto.TaskID);
+                    if (firstDto == null)
+                    {
+                        firstDto = new X2D1PosHandle(dto.TaskID.Value);
+                        handles.Add(firstDto);
+                    }
+                    firstDto.Append(dto);
+                }
+            }
+            catch (Exception ex)
+            {
+                Serilog.Log.Error(ex, $"【任务{dto.TaskID}】添加取参考信号流程异常,{ex.Message}");
+
+            }
+        }
+        public void Stop(int taskID)
+        {
+            try
+            {
+                lock (this)
+                {
+                    var firstDto = handles.FirstOrDefault(m => m.TaskId == taskID);
+                    if (firstDto != null)
+                    {
+                        firstDto.Stop();
+                        handles.Remove(firstDto);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Serilog.Log.Error(ex, $"停止【任务{taskID}】取参考信号流程异常,{ex.Message}");
+
+            }
+        }
+
+    }
+}

+ 3 - 1
XdCxRhDW.App/XdCxRhDW.App.csproj

@@ -334,6 +334,8 @@
     <Compile Include="Model\ModelCgXgf.cs" />
     <Compile Include="Model\RePosRes.cs" />
     <Compile Include="CpuMonitor.cs" />
+    <Compile Include="X2D1PosRef\LinearInterpolation.cs" />
+    <Compile Include="X2D1PosRef\X2D1PosRefService.cs" />
     <Compile Include="PopupControl\ShowCgCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -469,6 +471,7 @@
     <Compile Include="UserControl\X2D1GDOPParam.Designer.cs">
       <DependentUpon>X2D1GDOPParam.cs</DependentUpon>
     </Compile>
+    <Compile Include="X2D1PosRef\X2D1PosHandle.cs" />
     <EmbeddedResource Include="CorTools\GpuCalcForm.resx">
       <DependentUpon>GpuCalcForm.cs</DependentUpon>
     </EmbeddedResource>
@@ -555,7 +558,6 @@
     <EmbeddedResource Include="PopupControl\ShowCxCtrl.resx">
       <DependentUpon>ShowCxCtrl.cs</DependentUpon>
     </EmbeddedResource>
-    <None Include="Properties\licenses.licx" />
     <EmbeddedResource Include="Properties\Resources.resx">
       <Generator>ResXFileCodeGenerator</Generator>
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>