using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Web.Http;
using XdCxRhDW.Dto;
using XdCxRhDW.WebApi;
namespace CpuCgServer.Controllers
{
///
/// Cpu参估接口
///
public class GpuCgController : BaseController
{
///
/// CPU参估计算(需要先上传文件)
///
/// CPU参估参数
///
[HttpPost]
public async Task> Calc(CpuCgDto dto)
{
dto.file1 = GetLocalFile(dto.file1);
dto.file2 = GetLocalFile(dto.file2);
XcorrStruct xItem = new XcorrStruct();
xItem.file1 = dto.file1;
xItem.file2 = dto.file2;
xItem.samplingRate = dto.samplingRate;
xItem.dtCenter = dto.dtCenter;
xItem.dtRange = dto.dtRange;
xItem.dfRange = dto.dfRange;
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;
xItem.snrThreshold = dto.snrThreshold;
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)
{
dto.file1 = GetLocalFile(dto.file1);
dto.file2 = GetLocalFile(dto.file2);
XcorrStruct xItem = new XcorrStruct();
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;
List resDtos = new List();
foreach (var smpItem in dto.smpPositions)
{
XcorrUtils xcorr = new XcorrUtils();
xItem.smpStart = smpItem.smpStart;
xItem.smpCount = smpItem.smpCount;
CpuCgResDto resDto = new CpuCgResDto();
resDto.Smpstart = xItem.smpStart;
resDto.Smplen = (long)xItem.smpCount;
try
{
var result = await xcorr.Calc(xItem);
//开始计算
if (result.flag == -2)
{
resDto.Dt = 0;
resDto.Df = 0;
resDto.Snr = 0;
resDtos.Add(resDto);
Serilog.Log.Error("参估计算内部错误!");
}
else if (result.flag == -1)
{
resDto.Dt = 0;
resDto.Df = 0;
resDto.Snr = 0;
resDtos.Add(resDto);
Serilog.Log.Error("参估计算所需数据超出文件范围!");
}
else
{
resDto.TimeMs = result.tm;
if (result.flag == 1)
{
resDto.Dt = result.dt.Value;
resDto.Df = result.df.Value;
resDto.Snr = result.snr.Value;
resDtos.Add(resDto);
}
else
{
resDto.Dt = 0;
resDto.Df = 0;
resDto.Snr = 0;
resDtos.Add(resDto);
}
}
}
catch (Exception ex)
{
resDto.Dt = 0;
resDto.Df = 0;
resDto.Snr = 0;
resDtos.Add(resDto);
Serilog.Log.Error(ex, "执行CPU参估异常");
}
}
return Success(resDtos);
}
}
}