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);
}
}
}