using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Threading.Tasks; using System.Web.Http; using XdCxRhDW.Dto; using XdCxRhDW.WebApi; using static System.Windows.Forms.VisualStyles.VisualStyleElement.Rebar; namespace CpuCgServer.Controllers { /// /// Cpu参估接口 /// public class CpuCgController : BaseController { /// /// CPU参估计算(需要先上传文件) /// /// CPU参估参数 /// [HttpPost] public async Task> Calc(CpuCgDto dto) { GC.Collect(); dto.file1 = GetLocalFile(dto.file1); dto.file2 = GetLocalFile(dto.file2); XcorrStruct xItem = new XcorrStruct { file1 = dto.file1, file2 = dto.file2, samplingRate = dto.samplingRate, bandHz=dto.BandHz, dtCenter = dto.dtCenter, dtRange = dto.dtRange, dfRange = dto.dfRange, TimeoutSeconds = dto.TimeoutSeconds, snrThreshold = dto.snrThreshold, }; FileInfo file1 = new FileInfo(dto.file1); FileInfo file2 = new FileInfo(dto.file2); long totalsamp = file1.Length < file2.Length ? file1.Length / 4 : file2.Length / 4; //样点数为0时计算所有样本 if (dto.smpCount == 0) { xItem.smpCount = (int)totalsamp - dto.smpStart; } else if (dto.smpCount > 0 && dto.smpCount < 1) { xItem.smpCount = (int)(totalsamp * dto.smpCount); } else { xItem.smpCount = dto.smpCount; } xItem.smpStart = dto.smpStart; CpuCgResDto resDto = new CpuCgResDto(); try { XcorrUtils xcorr = new XcorrUtils(); var result = await xcorr.Calc(xItem); //开始计算 if (result.flag == -2) { Serilog.Log.Error("参估计算内部错误!"); return Error("参估计算内部错误!"); } else if (result.flag == -1) { Serilog.Log.Error("参估计算所需数据超出文件范围!"); return Error("参估计算所需数据超出文件范围!"); } resDto.TimeMs = result.tm; resDto.Smpstart = result.smpstart; resDto.Smplen = result.smplen; if (result.flag == 1) { resDto.Dt = result.dt.Value; resDto.Df = result.df.Value; resDto.Snr = result.snr.Value; } } catch (Exception ex) { Serilog.Log.Error(ex, "执行CPU参估异常"); return Error($"执行CPU参估异常"); } return Success(resDto); } /// /// CPU参估多个时隙的参估计算(需要先上传文件) /// /// CPU多时隙参估参数模型 /// 返回结果个数始终和传入的时隙个数相同 [HttpPost] public async Task>> MultiCalc(CpuCgMultiDto dto) { GC.Collect(); dto.file1 = GetLocalFile(dto.file1); dto.file2 = GetLocalFile(dto.file2); MultiXcorrStruct xItem = new MultiXcorrStruct(); xItem.file1 = dto.file1; xItem.file2 = dto.file2; xItem.samplingRate = dto.samplingRate; xItem.bandHz = dto.BandHz; xItem.dtCenter = dto.dtCenter; xItem.dtRange = dto.dtRange; xItem.dfRange = dto.dfRange; xItem.snrThreshold = dto.snrThreshold; xItem.TimeoutSeconds = dto.TimeoutSeconds; xItem.xcorrSmps = dto.smpPositions.Select(m => new XcorrSmp(m.smpStart, m.smpCount)).ToList(); List resDtos = new List(); XcorrUtils xcorr = new XcorrUtils(); try { var result = await xcorr.MultiCalc(xItem); foreach (var item in result) { CpuCgResDto resDto = new CpuCgResDto { Smpstart = item.smpstart, Smplen = item.smplen, TimeMs = item.tm, Dt = item.dt.Value, Df = item.df.Value, Snr = item.snr.Value, }; resDtos.Add(resDto); } return Success(resDtos); } catch (Exception ex) { Serilog.Log.Error(ex, "CPU多时隙参估异常"); return Error>("CPU多时隙参估异常"); } } /// /// 参估画图 /// /// [HttpPost] public async Task>> DrawImage(CpuCgDto dto) { var cafp = new Process(); List list = new List(); dto.file1 = GetLocalFile(dto.file1); dto.file2 = GetLocalFile(dto.file2); await Task.Run(() => { FileInfo file1 = new FileInfo(dto.file1); FileInfo file2 = new FileInfo(dto.file2); long totalsamp = file1.Length < file2.Length ? file1.Length / 4 : file2.Length / 4; //样点数为0时计算所有样本 if (dto.smpCount == 0) { dto.smpCount = (int)totalsamp - dto.smpStart; } else if (dto.smpCount > 0 && dto.smpCount < 1) { dto.smpCount = (int)(totalsamp * dto.smpCount); } string outFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CgImag.txt"); int flag = 1; if (dto.smpStart == 0) { flag = 3;//文件画图,避免滑动时溢出 cafp.StartInfo.Arguments = $"{flag} \"{dto.file1}\" \"{dto.file2}\" {(long)dto.samplingRate} {dto.dtCenter} {dto.dtRange} {dto.dfRange} {dto.smpCount} {dto.snrThreshold} {outFile}"; } else { var minStart = dto.dtRange / 2 / 1e6 * dto.samplingRate; if (dto.smpStart < minStart)//滑动计算起时值必须要大于等于此数 { dto.smpStart = (long)minStart; } cafp.StartInfo.Arguments = $"{flag} \"{dto.file1}\" \"{dto.file2}\" {(long)(dto.samplingRate)} {dto.dtCenter} {dto.dtRange} {dto.dfRange} {dto.smpStart} {dto.smpCount} {dto.snrThreshold} {dto.BandHz} {outFile}"; } cafp.StartInfo.FileName = Path.Combine(cafp.StartInfo.WorkingDirectory, "AddIns\\XcorrCpu.exe"); //cafp.StartInfo.Arguments = $"1 \"{xs.file1}\" \"{xs.file2}\" {(long)(xs.samplingRate)} {xs.dtCenter} {xs.dtRange} {xs.dfRange} {xs.smpStart} {xs.smpCount} {xs.snrThreshold} {outFile}"; cafp.StartInfo.CreateNoWindow = true; cafp.StartInfo.RedirectStandardError = true; cafp.StartInfo.RedirectStandardOutput = true; cafp.StartInfo.UseShellExecute = false; cafp.Start(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); cafp.WaitForExit(); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; var str = cafp.StandardOutput.ReadToEnd(); if (str.StartsWith("1:") && File.Exists(outFile)) { var lines = File.ReadAllLines(outFile); if (lines.Length > 1) { var lineFirstArr = lines[0].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); int fsHz = Convert.ToInt32(lineFirstArr[0]); int xFlag = Convert.ToInt32(lineFirstArr[1]); int xMax = Convert.ToInt32(lineFirstArr[2]); float yMax = Convert.ToSingle(lineFirstArr[3]); for (int i = 1; i < lines.Length; i++) { var lineArr = lines[i].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); ImageResultDto ir = new ImageResultDto() { FsHz = fsHz, XFlag = xFlag, XMax = xMax, YMax = yMax, XValue = Convert.ToInt32(lineArr[0]), YValue = Convert.ToSingle(lineArr[1]), Snr = Convert.ToSingle(lineArr[2]), }; list.Add(ir); } } File.Delete(outFile); } }); return Success(list); } } }