| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 | 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;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)        {            dto.file1 = GetLocalFile(dto.file1);            dto.file2 = GetLocalFile(dto.file2);            XcorrStruct xItem = new XcorrStruct            {                file1 = dto.file1,                file2 = dto.file2,                samplingRate = dto.samplingRate,                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)        {            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.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) { TimeSeconds = m.TimeSeconds }).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,                        TimeSeconds = xItem.xcorrSmps[0].TimeSeconds,                    };                    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} {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);        }    }}
 |