using DevExpress.Pdf;
using Ips.Library.Basic;
using Ips.Library.Entity;
using Ips.Library.Signals;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ips.Service.GpuServer
{
///
/// 参估处理服务
///
public class CgService
{
private bool isBusy = false;
private string exeName = "cog";
///
/// 开始
///
///
///
public async Task StartAsync(CorParams dto)
{
if (isBusy)
{
throw new Exception("上次GPU调用未结束");
}
//直接从采集上下载文件到本地
string[] files = new string[] { dto.File1, dto.File2 };
for (int i = 0; i < 2; i++)
{
string localFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Download", files[i]);
if (!File.Exists(localFile))
{
var res = await HttpHelper.DownloadFileAsync(dto.AdFileDownloadUrl, files[i], localFile);
if (!res)
{
throw new Exception($"文件下载失败,url=[{dto.AdFileDownloadUrl}?filename={files[i]}]");
}
}
if (i == 0)
dto.File1 = localFile;
else
dto.File2 = localFile;
}
return await Task.Run(() =>
{
try
{
isBusy = true;
Process p = new Process();
p.StartInfo.FileName = $"参数估计\\{exeName}.exe";
StringBuilder sb = new StringBuilder();
sb.Append($"{dto.File1} ");
sb.Append($"{dto.File2} ");
sb.Append($"{dto.DtoCenter} ");
sb.Append($"{dto.DtoRange} ");
sb.Append($"{dto.Snr} ");
sb.Append($"{dto.DfoRange} ");
sb.Append($"{dto.DtoCorr} ");
sb.Append($"{dto.DfoCorr} ");
sb.Append($"{dto.Fs} ");
sb.Append($"-l {dto.DataLen} ");
sb.Append($"-z {dto.AddZero} ");
sb.Append($"-o {dto.TimeOffset} ");
sb.Append($"-f {(int)dto.OffsetType} ");
if (dto.Timeslots != null)
{
sb.Append($"-d {string.Join(" ", dto.Timeslots)} ");
sb.Append($"-m {dto.MergeType.ToString("d")}");
}
p.StartInfo.Arguments = sb.ToString();
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
IpsLogger.Info($"开始参估计算.可打开Logs目录查看{exeName}.exe命令行参数详细");
IpsLogger.Info($"开始参估计算.{exeName}.exe参数={p.StartInfo.Arguments}",false);
p.Start();
var succeed = p.WaitForExit(30 * 1000);
if (!succeed)
{
Stop();
throw new Exception($"计算超时");
}
var err = p.StandardError.ReadToEnd();
if (!string.IsNullOrWhiteSpace(err))
{
throw new Exception(err);
}
var str = p.StandardOutput.ReadToEnd();
var result = CorResult.FromLines(str, dto.Snr);
return result;
}
finally
{
isBusy = false;
}
});
}
///
/// 停止
///
public void Stop()
{
var pros = Process.GetProcessesByName(exeName);
foreach (var item in pros)
{
try
{
item.Kill();
}
catch
{ }
}
}
private CorResult[] FromLines(string result, double snr)
{
if (string.IsNullOrWhiteSpace(result))
return new CorResult[0];
var lines = result.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries);
CorResult[] results = new CorResult[lines.Length];
for (int i = 0; i < lines.Length; i++)
{
results[i] = FromLine(lines[i], snr);
}
return results;
}
private CorResult FromLine(string line, double snr)
{
if (string.IsNullOrWhiteSpace(line)) throw new ArgumentNullException(nameof(line));
CorResult corResult = new CorResult();
var cafItems = line.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
corResult.Message = line;
if (cafItems.Length == 0) return corResult;
int i = 0;
var cafitem = cafItems[i];
var resitems = cafitem.Split(',');
if (resitems.Length != 6) return corResult;
corResult.Start = int.Parse(resitems[0]);
corResult.Length = int.Parse(resitems[1]);
corResult.Dto = double.Parse(resitems[2]);
corResult.Dfo = double.Parse(resitems[3]);
corResult.Snr = double.Parse(resitems[4]);
corResult.UseTime = double.Parse(resitems[5]);
corResult.IsValid = corResult.Snr > snr;
if (cafItems.Length > 1)
{
for (i = 1; i < cafItems.Length; i++)
{
resitems = cafItems[i].Split(',');
XgfItem xgfItem = new XgfItem()
{
Dto = double.Parse(resitems[0]),
Dfo = double.Parse(resitems[1]),
Snr = double.Parse(resitems[2])
};
corResult.XgfList.Add(xgfItem);
}
}
return corResult;
}
}
}