123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- 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
- {
- /// <summary>
- /// Cpu参估接口
- /// </summary>
- public class CpuCgController : BaseController
- {
- /// <summary>
- /// CPU参估计算(需要先上传文件)
- /// </summary>
- /// <param name="dto">CPU参估参数</param>
- /// <returns></returns>
- [HttpPost]
- public async Task<AjaxResult<CpuCgResDto>> 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<CpuCgResDto>("参估计算内部错误!");
- }
- else if (result.flag == -1)
- {
- Serilog.Log.Error("参估计算所需数据超出文件范围!");
- return Error<CpuCgResDto>("参估计算所需数据超出文件范围!");
- }
- 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<CpuCgResDto>($"执行CPU参估异常");
- }
- return Success(resDto);
- }
- /// <summary>
- /// CPU参估多个时隙的参估计算(需要先上传文件)
- /// </summary>
- /// <param name="dto">CPU多时隙参估参数模型</param>
- /// <returns>返回结果个数始终和传入的时隙个数相同</returns>
- [HttpPost]
- public async Task<AjaxResult<List<CpuCgResDto>>> 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<CpuCgResDto> resDtos = new List<CpuCgResDto>();
- 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<List<CpuCgResDto>>("CPU多时隙参估异常");
- }
- }
- /// <summary>
- /// 参估画图
- /// </summary>
- /// <returns></returns>
- [HttpPost]
- public async Task<AjaxResult<List<ImageResultDto>>> DrawImage(CpuCgDto dto)
- {
- var cafp = new Process();
- List<ImageResultDto> list = new List<ImageResultDto>();
- 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);
- }
- }
- }
|