using DevExpress.Utils.About; using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Policy; using System.Text; using System.Threading.Tasks; using XdCxRhDw; using XdCxRhDW.Dto; using ZstdSharp.Unsafe; namespace XdCxRhDW.TaskServer.Task { public class X2D1Task : HistoryTaskI { public override void Start(HistoryTaskProcessingDto dto) { IsRuning = true; System.Threading.Tasks.Task.Run(async () => { DateTime preTime = dto.StartTime; while (IsRuning || dto.EndTime.HasValue && dto.EndTime <= DateTime.Now) { string capfile = Path.Combine(dto.CapDir, $"{preTime.ToString(dto.DateDirFormat)}"); var files = Directory.EnumerateFiles(capfile, "*.dat"); /* ch1 = 超短波信号 ch2 = 主星 ch3 = 邻1 ch4 = 采集卡4通道采集没接信号的那一路,不用管这路文件*/ var groups = files.Select(f => FileToHistoryFile(f)).GroupBy(m => m.CapTime).OrderBy(m => m.Key); foreach (var item in groups) { var finfos = item.ToList(); if (finfos.Count < 3) { LogHelper.Info($"历史任务:{dto.ID}采集时刻:{finfos.First().CapTime:yyyy-MM-dd HH:mm:ss}文件数量只有{finfos.Count}个,不满足"); continue; } //超短波信号 var dinfo = finfos.First(m => m.Ch == 1); //主星 var minfo = finfos.First(m => m.Ch == 2); //邻1 var ninfo = finfos.First(m => m.Ch == 3); try { //根据信号类型执行检测或参数估计 if (dto.SigType == EnumSigTypeDto.Normal) { var xd = await GPUCalcAsync(minfo.FilePath, dinfo.FilePath, minfo.FsHz); var sx = await GPUCalcAsync(minfo.FilePath, ninfo.FilePath, minfo.FsHz); X2D1NoXlPosDto x2D1 = new X2D1NoXlPosDto() { SigTime = minfo.CapTime, MainCode = minfo.SatId, AdjaCode = ninfo.SatId, SxDto = sx.Dt * 1e6, XdDto = xd.Dt * 1e6, /* MainYbDto = Convert.ToDouble(items[2]) * 1e6, /AdjaYbDto = Convert.ToDouble(items[3]) * 1e6, SatTxLon = IniFiles.ReadValue("Station_Data2023.ini", "卫星接收天线", "Lon"), SatTxLat = IniFiles.ReadValue("Station_Data2023.ini", "卫星接收天线", "Lat"), CdbTxLon = IniFiles.ReadValue("Station_Data2023.ini", "超短波接收天线", "Lon"), CdbTxLat = IniFiles.ReadValue("Station_Data2023.ini", "超短波接收天线", "Lat"), RefLon = IniFiles.ReadValue("Station_Data2023.ini", "参考站", "Lon"), RefLat = IniFiles.ReadValue("Station_Data2023.ini", "参考站", "Lat"), FreqDown = 295.425e6,//For Api Test FreqUp = 260.425e6,//For Api Test*/ XdDfo = xd.Df, XdSnr = xd.Snr, SxDfo = sx.Df, SxSnr = sx.Snr, }; await X2D1NoXlAsync(x2D1); } else { var mDetect = await DAMAAsync(DmcTypeDto.DAMA, minfo.FsHz, minfo.FilePath); var dfile = await ToResampleAsync((int)dinfo.FsHz, dinfo.FilePath); var nfile = await ToResampleAsync((int)ninfo.FsHz, ninfo.FilePath); foreach (var deitem in mDetect) { var xd = await CPUCalcAsync(deitem.File1, dfile.File, dfile.OutFsHz, deitem); var sx = await CPUCalcAsync(deitem.File1, nfile.File, nfile.OutFsHz, deitem); X2D1NoXlPosDto x2D1 = new X2D1NoXlPosDto() { SigTime = minfo.CapTime.AddSeconds(deitem.Start / nfile.OutFsHz), MainCode = minfo.SatId, AdjaCode = ninfo.SatId, SxDto = sx.Dt * 1e6, XdDto = xd.Dt * 1e6, /* MainYbDto = Convert.ToDouble(items[2]) * 1e6, /AdjaYbDto = Convert.ToDouble(items[3]) * 1e6, SatTxLon = IniFiles.ReadValue("Station_Data2023.ini", "卫星接收天线", "Lon"), SatTxLat = IniFiles.ReadValue("Station_Data2023.ini", "卫星接收天线", "Lat"), CdbTxLon = IniFiles.ReadValue("Station_Data2023.ini", "超短波接收天线", "Lon"), CdbTxLat = IniFiles.ReadValue("Station_Data2023.ini", "超短波接收天线", "Lat"), RefLon = IniFiles.ReadValue("Station_Data2023.ini", "参考站", "Lon"), RefLat = IniFiles.ReadValue("Station_Data2023.ini", "参考站", "Lat"), FreqDown = 295.425e6,//For Api Test FreqUp = 260.425e6,//For Api Test*/ XdDfo = xd.Df, XdSnr = xd.Snr, SxDfo = sx.Df, SxSnr = sx.Snr, }; await X2D1NoXlAsync(x2D1); } } } catch (Exception ex) { LogHelper.Info($"执行历史任务:{dto.ID}异常:{ex.Message}"); continue; } } preTime = preTime.AddHours(1); } }); } private async Task X2D1NoXlAsync(X2D1NoXlPosDto x2D1) { var result = await HttpHelper.PostRequestAsync(baseUrl + "Pos/PosX2D1NoXlAsync", x2D1); if (result.code != 200) { return false; } return true; } /// /// 获取采集文件信息 /// /// /// private HistoryFile FileToHistoryFile(string filePath) { //读取采集文件 //2024_01_31_10_01_51_000000000_ch11_-1__Nxx.xxxxxx_Exx.xxxxxx_xxxxx.xxxHz_xxx.xxxMHz_ch1_xd1.dat HistoryFile historyFile = new HistoryFile(); historyFile.FilePath = filePath; var fileName = Path.GetFileNameWithoutExtension(filePath); var strs = fileName.Split(new string[] { "_", "MHz", "Hz", "ch" }, StringSplitOptions.RemoveEmptyEntries); //采集时间 var datestr = string.Join("_", strs.Take(6)); historyFile.CapTime = DateTime.ParseExact(datestr, "yyyy_MM_dd_HH_mm_ss", null); //采集通道 var chstr = strs.Skip(strs.Length - 2).Take(1).First(); int ch; int.TryParse(chstr, out ch); //采集频点 var freqstr = strs.Skip(strs.Length - 3).Take(1).First(); double freqMHz; double.TryParse(freqstr, out freqMHz); //采样率 var fsstr = strs.Skip(strs.Length - 4).Take(1).First(); double fsHz; double.TryParse(fsstr, out fsHz); historyFile.FreqHz = freqMHz * 1e6; historyFile.Ch = ch; historyFile.FsHz = fsHz; if (ch > 1) { historyFile.SatId = GetSatId(historyFile.FreqHz); } return historyFile; } } }