using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; using System.Net; using System.Text; using System.Threading.Tasks; using System.Web.Http; using XdCxRhDw.Dto; using XdCxRhDW.Core.Api; using XdCxRhDW.WebApi; using XdCxRhDW.WebApi.Service; namespace XdCxRhDW.WebApi.Controllers { /// /// 检测参估功能相关接口 /// public class DetectCgController : BaseController { private readonly string uploadFolder; private readonly TestService service; /// /// /// /// public DetectCgController(TestService service) { this.uploadFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot"); this.service = service; } private static readonly object thisLock = new object(); Dictionary keyValues = new Dictionary(); private (bool, string) ValidateCalcParam(CalcDto dto) { if (dto == null) { return (false, "参估计算参数格式错误!"); } if (string.IsNullOrEmpty(dto.file1)) { return (false, "参估计算参数数据文件[file1]不能为空!"); } if (string.IsNullOrEmpty(dto.file2)) { return (false, "参估计算参数数据文件[file2]不能为空!"); } if (!File.Exists(dto.file1)) { return (false, $"参估计算参数数据文件[{dto.file1}]不存在!"); } if (!File.Exists(dto.file2)) { return (false, $"参估计算参数数据文件[{dto.file2}]不存在!"); } if (dto.dtRange <= 0) { return (false, "参估计算参数时差范围[dtRange]不能小于等于0!"); } if (dto.smpStart < 0) { return (false, "参估计算参数开始样点[smpStart]不能小于0!"); } if (dto.smpCount < 0) { return (false, "参估计算参数样点数[smpCount]不能小于0!"); } return (true, string.Empty); } /// /// CPU参估计算 /// /// /// [HttpPost] public async Task> EstimationCalc(CalcDto dto) { var token = Request.GetCorrelationId().ToString(); dto.file1 = Path.Combine(uploadFolder, dto.file1); dto.file2 = Path.Combine(uploadFolder, dto.file2); var vpres = ValidateCalcParam(dto); if (!vpres.Item1) { Serilog.Log.Warning(vpres.Item2); return Error(vpres.Item2); } 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; //样点数为0时计算所有样本 if (dto.smpCount == 0) { FileInfo file = new FileInfo(dto.file1); long totalsamp = file.Length / 4; xItem.smpCount = (int)totalsamp - dto.smpStart; } else { xItem.smpCount = dto.smpCount; } xItem.smpStart = dto.smpStart; xItem.snrThreshold = dto.snrThreshold; EstimationResDto resDto = new EstimationResDto(); try { XcorrUtils xcorr = new XcorrUtils(); lock (thisLock) { keyValues.Add(token, xcorr); } var result = await xcorr.Calc(xItem); //开始计算 if (result.flag == -2) { Serilog.Log.Warning("参估计算内部错误!"); return Error("参估计算内部错误!"); } else if (result.flag == -1) { Serilog.Log.Warning("参估计算所需数据超出文件范围!"); return Error("参估计算所需数据超出文件范围!"); } resDto.Token = token; resDto.TimeMs = result.tm; resDto.Smpstart = result.smpstart; resDto.Smplen = result.smplen; resDto.File1 = result.file1; resDto.File2 = result.file2; if (result.flag == 1) { resDto.Dt = result.dt.Value; resDto.Df = result.df.Value; resDto.Snr = result.snr.Value; } } catch (Exception ex) { return Error($"执行参估计算异常,{ex.Message}"); } finally { lock (thisLock) { keyValues.Remove(token); } try { //删除计算得文件 File.Delete(dto.file1); File.Delete(dto.file2); } catch { } } return Success(resDto); } /// /// 参估计算停止 /// /// /// //[HttpPost] //public async Task> StopEstimationCalc(string token) //{ // return await Task.Run(() => // { // lock (thisLock) // { // if (keyValues.ContainsKey(token)) // { // keyValues[token].StopCalc(); // return Success(true); // } // else // { // return Success(false); // } // } // }); //} private (bool, string) ValidateDetectParam(DetectDto dto) { if (dto == null) { return (false, "检测计算参数格式错误!"); } if (string.IsNullOrEmpty(dto.file1)) { return (false, "检测计算参数数据文件[file1]不能为空!"); } if (!File.Exists(dto.file1)) { return (false, $"检测计算参数数据文件[{dto.file1}]不存在!"); } bool containsValue = Enum.IsDefined(typeof(DmcType), dto.dmcType); if (!containsValue) { return (false, $"检测计算参数[dmcType]检测类型值{dto.dmcType}不存在!"); } return (true, string.Empty); } /// /// 信号检测(支持DAMA、IBS、能量检测) /// /// /// [HttpPost] public async Task>> DetectCalc(DetectDto dto) { var token = Request.GetCorrelationId().ToString(); dto.file1 = Path.Combine(uploadFolder, dto.file1); var vpres = ValidateDetectParam(dto); if (!vpres.Item1) { Serilog.Log.Warning(vpres.Item2); return Error>(vpres.Item2); } List list = new List(); try { XcorrUtils xcorr = new XcorrUtils(); lock (thisLock) { keyValues.Add(token, xcorr); } var dmcResult = await xcorr.DmcCheckAsync(dto.file1, dto.fsHz, dto.dmcType); foreach (var dmcItem in dmcResult) { DetectResDto detectRes = new DetectResDto(dmcItem.Start, dmcItem.Length, dmcItem.UserName); detectRes.File1 = dto.file1; detectRes.TimeMs = dmcItem.Times; detectRes.Token = token; list.Add(detectRes); } } catch (Exception ex) { return Error>($"执行检测计算异常,{ex.Message}"); } finally { lock (thisLock) { //keyValues.Remove(token); } try { //删除检测的文件 File.Delete(dto.file1); } catch { } } return Success>(list); } /// /// 信号检测停止 /// /// /// //[HttpPost] //public async Task> StopDetectCalc(string token) //{ // return await Task.Run(() => // { // lock (thisLock) // { // if (keyValues.ContainsKey(token)) // { // keyValues[token].StopDm(); // return Success(true); // } // else // { // return Success(false); // } // } // }); //} } }