using DevExpress.Utils.Extensions; using System; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; using System.Threading.Tasks; using XdCxRhDw; using XdCxRhDW.Dto; namespace XdCxRhDW.TaskServer.Task { public class HistoryTaskI { protected internal virtual string baseUrl => $"{ConfigurationManager.AppSettings["PosPlatformAddr"].Trim()}/api/"; protected internal virtual bool IsRuning { get; set; } = false; //变采样 protected internal virtual int OutFsHz { get; set; } = 96000; protected internal virtual HistoryTaskProcessingDto TaskDto { get; set; } public virtual void Start(HistoryTaskProcessingDto dto) { } /// /// 根据下行频点获取卫星Id /// /// /// public int GetSatId(double freqdown) { int satId = 0; try { // (洋区固定大写字母aì,不是数字1,查不到结果给出日志方便排查 string sql = $"select 卫星ID from freguencysatid where 下行 = '{freqdown}'and 洋区 = 'I' LIMIT 1"; var res = MySqlTools.ExecuteScalar(System.Data.CommandType.Text, sql); bool isInt = int.TryParse($"{res}", out satId); if (!isInt) { LogHelper.Error($"下行频点{freqdown * 1e-6}未找到卫星编号"); } } catch (Exception ex) { LogHelper.Error($"下行频点{freqdown}找卫星编号异常:{ex.Message}"); } return satId; } public virtual void Stop() { IsRuning = false; } //检测 public async Task> DAMAAsync(EnumTaskCheckTypeDto dmc, double fsHz, string mFile) { try { //主星变采样 var resampleRes = await ToResampleAsync((int)fsHz, mFile); DetectDto dto = new DetectDto(); dto.dmcType = (DmcType)dmc; dto.fsHz = resampleRes.OutFsHz; dto.file1 = await UploadFileAsync("DAMA检测", resampleRes.File); var dmcResult = await HttpHelper.PostRequestAsync>(baseUrl + "DetectCg/DetectCalc", dto); if (dmcResult.code != 200) { throw new Exception($"执行DAMA检测异常:{dmcResult.msg}"); } else { dmcResult.data.ForEach(m => m.File1 = resampleRes.File); return dmcResult.data; } } catch (Exception ex) { throw new Exception($"信号检测出错:{ex.Message}"); } } public async Task ToResampleAsync(int fsHz, string file) { ResampleResponseDto dtores = new ResampleResponseDto(); dtores.File = file; dtores.OutFsHz = fsHz; string step = "变采样"; //不需要变采样 if (fsHz == OutFsHz) { return dtores; } string file1 = await UploadFileAsync(step, file); ResampleRequestDto dto = new ResampleRequestDto() { File = file1, FsHz = fsHz, }; var response = await HttpHelper.PostRequestAsync(baseUrl + "/DetectCg/Resample", dto, dto.TimeoutSeconds); if (response.code == 200) { string downloadFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "download"); string outFile = Path.Combine(downloadFolder, Path.GetFileNameWithoutExtension(file1) + $"_Resample{response.data.OutFsHz}K.dat"); await DownloadFileAsync(step, response.data.File, outFile); dtores.OutFsHz = response.data.OutFsHz; dtores.File = outFile; return dtores; } else { throw new Exception($"采样率:{fsHz}变采样{file}异常:{response.msg}"); } } public async Task UploadFileAsync(string step, string file) { try { string file1 = await HttpHelper.UploadFileAsync(file, baseUrl + "File/UploadFileAsync"); return file1; } catch (Exception ex) { throw new Exception($"执行{step}上传文件异常:{ex.Message}"); } } public async Task DownloadFileAsync(string step, string Infile, string outFile) { try { return await HttpHelper.DownloadFileAsync(baseUrl, Infile, outFile); } catch (Exception ex) { throw new Exception($"执行{step}下载文件{Infile}异常:{ex.Message}"); } } //CPU计算 public async Task CPUCalcAsync(string file1, string file2, double fsHz, DetectResDto detect, double dtCenter, double dtRange) { string step = "CPU计算"; CpuCgDto dto = new CpuCgDto(); dto.file1 = await UploadFileAsync(step, file1); dto.file2 = await UploadFileAsync(step, file2); dto.smpCount = detect.Length; dto.samplingRate = fsHz; dto.dtCenter = dtCenter; dto.dtRange = dtRange; dto.smpStart = detect.Start; dto.snrThreshold = 14; try { var result = await HttpHelper.PostRequestAsync(baseUrl + "DetectCg/CpuCgCalc", dto); if (result.code != 200) { throw new Exception($"CPU文件参估出错,{result.msg}"); } return result.data; } catch (Exception ex) { throw new Exception($"CPU文件参估出错,{ex.Message}"); } } //CPU多检测计算 public async Task> CPUCalcAsync(string file1, string file2, double fsHz, List smps, double dtCenter, double dtRange) { string step = "CPU计算"; CpuCgMultiDto dto = new CpuCgMultiDto(); dto.file1 = await UploadFileAsync(step, file1); dto.file2 = await UploadFileAsync(step, file2); dto.smpPositions = smps; dto.samplingRate = fsHz; dto.dtCenter = dtCenter; dto.dtRange = dtRange; dto.snrThreshold = 14; try { var result = await HttpHelper.PostRequestAsync>(baseUrl + "DetectCg/CpuCgMultiCalc", dto); if (result.code != 200) { throw new Exception($"CPU文件参估出错,{result.msg}"); } return result.data; } catch (Exception ex) { throw new Exception($"CPU文件参估出错,{ex.Message}"); } } //GPU计算 public async Task GPUCalcAsync(string file1, string file2, double fsHz, double dtCenter, double dtRange) { string step = "GPU计算"; GpuCgRequestDto dto = new GpuCgRequestDto(); dto.file1 = await UploadFileAsync(step, file1); dto.file2 = await UploadFileAsync(step, file2); dto.samplingRate = fsHz; dto.dtCenter = dtCenter; dto.dtRange = dtRange; dto.snrThreshold = 14; try { var result = await HttpHelper.PostRequestAsync>(baseUrl + "DetectCg/GpuCgCalc", dto, dto.TimeoutSeconds); if (result.code != 200) { throw new Exception($"GPU文件参估出错,{result.msg}"); } return result.data.Count > 0 ? result.data.First() : new GpuCgResponseDto(); } catch (TaskCanceledException) { throw new Exception("GPU文件参估Http接口调用超时"); } catch (Exception ex) { throw new Exception($"GPU文件参估出错{ex.Message}"); } } /// /// 提取检测时隙数据 /// /// /// /// /// /// /// /// public async Task ExtractMergeAsync(string file, double fsHz, List smps, double dtCenter, double dtRange, int Ch) { long offset = 0; long zero = 0; if (Ch == 2)//主星 { zero = 0; } else if (Ch != 2 && dtCenter == 0)//三星信号文件 { zero = Convert.ToInt64(dtRange * 1e-6 * fsHz) / 2; } else//地信号文件 { zero = Convert.ToInt64(dtRange * 1e-6 * fsHz) / 2; offset = Convert.ToInt64(0.26 * fsHz); } string detectFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "MultiDetect"); Directory.CreateDirectory(detectFolder); string outfile = Path.Combine(detectFolder, Path.GetFileNameWithoutExtension(file) + "_de" + Path.GetExtension(file)); ExtractRes res = new ExtractRes(); res.file = outfile; List smpp = new List(); // 从指定位置开始读取数据 using (FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read)) { byte[] bytes = new byte[fileStream.Length]; foreach (var smp in smps) { long start = (smp.smpStart - zero - offset) * 4; int length = Convert.ToInt32(smp.smpCount + zero * 2 - offset) * 4; if (start < 0 || length < 0 || length > fileStream.Length) { continue; } // 移动到文件的指定位置 fileStream.Seek(start, SeekOrigin.Begin); byte[] buffer = new byte[length]; // 读取指定长度的数据 int bytesRead = await fileStream.ReadAsync(buffer, 0, buffer.Length); Array.ConstrainedCopy(buffer, 0, bytes, (int)start, bytesRead); smpp.Add(smp); } using (FileStream wrStream = new FileStream(outfile, FileMode.Create, FileAccess.ReadWrite)) { await wrStream.WriteAsync(bytes, 0, bytes.Length); } } res.positions = smpp; return res; } } }