123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- 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
- {
- /// <summary>
- /// 参估处理服务
- /// </summary>
- public class CgService
- {
- private bool isBusy = false;
- private string exeName = "cog";
- /// <summary>
- /// 开始
- /// </summary>
- /// <param name="dto"></param>
- /// <returns></returns>
- public async Task<CorResult[]> 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;
- }
- });
- }
- /// <summary>
- /// 停止
- /// </summary>
- 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;
- }
- }
- }
|