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 CheckServer.Controllers
{
///
/// 信号检测、识别、变采样接口
///
public class CheckController : BaseController
{
///
/// 信号检测(支持DAMA、IBS、能量检测)(需要先上传文件)
///
/// 信号检测参数
///
[HttpPost]
public async Task>> Calc(DetectDto dto)
{
try
{
dto.file1 = GetLocalFile(dto.file1);
List list = new List();
List dmcResults = new List();
if (dto.dmcType.HasFlag(EnumSigCheckTypeDto.DAMA))
{
var dmcResult = await CheckHelper.DmcCheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.DAMA, dto.band);
dmcResults.AddRange(dmcResult);
}
if (dto.dmcType.HasFlag(EnumSigCheckTypeDto.IBS))
{
var dmcResult = await CheckHelper.DmcCheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.IBS, dto.band);
dmcResults.AddRange(dmcResult);
}
if (dto.dmcType.HasFlag(EnumSigCheckTypeDto.Ky5758))
{
var dmcResult = await CheckHelper.DmcCheckAsync(dto.file1, dto.fsHz, EnumSigCheckTypeDto.Ky5758, dto.band);
dmcResults.AddRange(dmcResult);
}
foreach (var dmcItem in dmcResults)
{
DetectResDto detectRes = new DetectResDto(dmcItem.Start, dmcItem.Length, dmcItem.UserName);
detectRes.ModType = dmcItem.ModType;
detectRes.DmcType = dmcItem.DmcType;
detectRes.File1 = dto.file1;
detectRes.TimeMs = dmcItem.Times;
list.Add(detectRes);
}
return Success(list);
}
catch (Exception ex)
{
Serilog.Log.Error(ex, $"{dto.dmcType}检测异常");
return Error>($"{dto.dmcType}检测异常");
}
}
///
/// 文件变采样(需要先上传文件)
///
///
///
public async Task> Resample(ResampleRequestDto dto)
{
var res = await Task.Run(() =>
{
try
{
string fileIn = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", dto.File);
string fileOut = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot", Guid.NewGuid() + ".dat");
var val = Gcd(dto.FsHz, dto.OutFsHz);//最大公约数
var insertFactor = dto.OutFsHz / val;
var extFactor = dto.FsHz / val;
var outFile = ReSampleHelper.Resample(fileIn, fileOut, insertFactor, extFactor, dto.TimeoutSeconds);
if (!string.IsNullOrWhiteSpace(outFile))
{
if (!File.Exists(outFile))
return Error("变采样后的文件未能生成");
else
return Success(new ResampleResponseDto() { File = Path.GetFileName(outFile), OutFsHz = dto.OutFsHz });
}
else
{
return Error("变采样算法返回失败");
}
}
catch (Exception ex)
{
Serilog.Log.Error(ex, "变采样算法执行异常");
return Error("变采样算法执行异常");
}
});
return res;
}
///
/// 信号识别(调制类型、调制速率、频偏)
///
/// 信号检测参数
///
[HttpPost]
public async Task>> SignalProc(SignalProcDto dto)
{
return await Task.Run(() =>
{
try
{
dto.File = GetLocalFile(dto.File);
List list = new List();
var res = SignalProcHelper.SigalEst(dto.File, dto.Fs
, dto.Smps.Select(p => (int)p.smpStart).ToArray()
, dto.Smps.Select(p => (int)p.smpCount).ToArray());
foreach (var item in res)
{
SignalProcResDto resItem = new SignalProcResDto()
{
Ffc = item.Ffc,
Rate = item.Rate,
ModType = (EnumSignalTypeDto)(int)item.SignalType
};
list.Add(resItem);
}
return Success(list);
}
catch (Exception ex)
{
Serilog.Log.Error(ex, "信号识别算法执行异常");
return Error>($"信号识别算法执行异常");
}
});
}
//求最大公约数
private int Gcd(int M, int N)
{
int Rem;
while (N > 0)
{
Rem = M % N;
M = N;
N = Rem;
}
return M;
}
}
}