using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using DevExpress.Utils.DPI; using DevExpress.XtraEditors; using ExtensionsDev; using static System.Windows.Forms.VisualStyles.VisualStyleElement.TaskbarClock; namespace XdCxRhDw.CpuCgTools { public partial class FormCpuCg : DevExpress.XtraEditors.XtraForm { public class CgParam { public string F1 { get; set; } public string F2 { get; set; } public string snr { get; set; } public string dfoCenter { get; set; } public string dfoRange { get; set; } public string dtoXb { get; set; } public string dfoXb { get; set; } public string thread { get; set; } public string addZero { get; set; } public string start { get; set; } public string len { get; set; } public string dtoCenter { get; set; } public string dtoRange { get; set; } public string fs { get; set; } } public class CgRes { [Display(Name = "文件1")] public string File1 { get; set; } [Display(Name = "文件2")] public string File2 { get; set; } [Display(Name = "时差(us)")] public double Dto { get; set; } [Display(Name = "频差(us)")] public double Dfo { get; set; } [Display(Name = "信噪比(dB)")] public double Snr { get; set; } [Display(Name = "耗时(ms)")] public double CostTimeMs { get; set; } } List list = new List(); public FormCpuCg() { InitializeComponent(); } private void XtraForm1_Load(object sender, EventArgs e) { gridControl1.Init().UseExportCsv().UseExportXlsx(); gridControl1.DataSource = list; txtF1.UseChooseFile(); txtF2.UseChooseFile(); if (File.Exists("tmp.txt")) { var obj = Newtonsoft.Json.JsonConvert.DeserializeObject(File.ReadAllText("tmp.txt")); txtAddZero.Text = obj.addZero; txtDfoCenter.Text = obj.dfoCenter; txtDfoRange.Text = obj.dfoRange; txtDfoXb.Text = obj.dfoXb; txtDtoCenter.Text = obj.dtoCenter; txtDtoRange.Text = obj.dtoRange; txtDtoXb.Text = obj.dtoXb; txtF1.Text = obj.F1; txtF2.Text = obj.F2; txtFs.Text = obj.fs; txtLen.Text = obj.len; txtSnr.Text = obj.snr; txtStart.Text = obj.start; txtThread.Text = obj.thread; } } private (bool, string) checkParam() { //{txtF1.Text}\" \"{txtF2.Text}\" {dtocenterus} {txtDtoRange.Text} if (string.IsNullOrWhiteSpace(txtF1.Text)) { return (false, "文件1不能为空!"); } if (string.IsNullOrWhiteSpace(txtF2.Text)) { return (false, "文件2不能为空!"); } if (string.IsNullOrWhiteSpace(txtFs.Text)) { return (false, "采样率不能为空!"); } if (string.IsNullOrWhiteSpace(txtDtoCenter.Text)) { return (false, "时差中心不能为空!"); } if (string.IsNullOrWhiteSpace(txtDtoRange.Text)) { return (false, "时差范围不能为空!"); } if (string.IsNullOrWhiteSpace(txtSnr.Text)) { return (false, "信噪比不能为空!"); } return (true, string.Empty); } private async void btnCalc_Click(object sender, EventArgs e) { var ckres = checkParam(); if (!ckres.Item1) { DxHelper.MsgBoxHelper.ShowError($"{ckres.Item2}"); return; } this.tablePanel1.Enabled = false; await Task.Run(() => { try { Stopwatch sw = new Stopwatch(); sw.Start(); Process p = new Process(); p.StartInfo.WorkingDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Core"); p.StartInfo.FileName = Path.Combine(p.StartInfo.WorkingDirectory, "coc.exe"); string snr = ""; if (!string.IsNullOrWhiteSpace(txtSnr.Text)) snr = $"{txtSnr.Text} "; string dfoCenter = ""; if (!string.IsNullOrWhiteSpace(txtDfoCenter.Text)) dfoCenter = $"{txtDfoCenter.Text} "; string dfoRange = ""; if (!string.IsNullOrWhiteSpace(txtDfoRange.Text)) dfoRange = $"{txtDfoRange.Text} "; string dtoXb = ""; if (!string.IsNullOrWhiteSpace(txtDtoXb.Text)) dtoXb = $"{txtDtoXb.Text} "; string dfoXb = ""; if (!string.IsNullOrWhiteSpace(txtDfoXb.Text)) dfoXb = $"{txtDfoXb.Text} "; string fs = $"{Convert.ToDouble(txtFs.Text) * 1000000} "; string bandWidth = "25000 "; string thread = ""; if (!string.IsNullOrWhiteSpace(txtThread.Text)) thread = $"-t {txtThread.Text} "; else thread = $"-t {Environment.ProcessorCount} "; string defalut = "-l 0 -f 0";//-l样点数 -f信号偏移类型 string addZero = $"-z 0 "; if (!string.IsNullOrWhiteSpace(txtAddZero.Text)) addZero = $"-z {txtAddZero.Text} "; string slot = ""; if (!string.IsNullOrWhiteSpace(txtStart.Text) && !string.IsNullOrWhiteSpace(txtLen.Text)) slot = $" -m 0 -d {txtStart.Text} {txtLen.Text} ";// -m时隙合并方式 if (!string.IsNullOrWhiteSpace(txtStart.Text) && (string.IsNullOrWhiteSpace(txtLen.Text) || Convert.ToInt32(txtLen.Text) <= 0)) { FileInfo f1 = new FileInfo(txtF1.Text); FileInfo f2 = new FileInfo(txtF2.Text); long size = f1.Length; if (f1.Length > f2.Length) size = f2.Length; size /= 4;//IQ文件一个样点4个字节 var len = size - Convert.ToInt32(txtStart.Text); slot = $" -m 0 -d {txtStart.Text} {len} ";// -m时隙合并方式 } long dtocenterus = Convert.ToInt64(txtDtoCenter.Text); string timeoffset = "-o 0 "; if (dtocenterus > 200000) { timeoffset = $"-o {dtocenterus * 1e-6} "; dtocenterus = 0; } CgParam cp = new CgParam() { addZero = txtAddZero.Text, dfoCenter = txtDfoCenter.Text, dfoRange = txtDfoRange.Text, dfoXb = txtDfoXb.Text, dtoCenter = txtDtoCenter.Text, dtoRange = txtDtoRange.Text, dtoXb = txtDtoXb.Text, F1 = txtF1.Text, F2 = txtF2.Text, fs = txtFs.Text, len = txtLen.Text, snr = txtSnr.Text, start = txtStart.Text, thread = txtThread.Text, }; var jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(cp); File.WriteAllText("tmp.txt", jsonStr); //p.StartInfo.Arguments = $"\"{txtF1.Text}\" \"{txtF2.Text}\" {txtFs.Text} {txtDtoCenter.Text} {txtDtoRange.Text} {snr}{dfoCenter}{dfoRange}{dtoXb}{dfoXb}{thread}{addZero}{slot}"; p.StartInfo.Arguments = $"\"{txtF1.Text}\" \"{txtF2.Text}\" {dtocenterus} {txtDtoRange.Text} {snr}{dfoCenter}{dfoRange}{dtoXb}{dfoXb}{fs}{bandWidth}{thread}{addZero}{timeoffset}{slot}{defalut}"; p.StartInfo.CreateNoWindow = true; p.StartInfo.RedirectStandardError = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.UseShellExecute = false; p.Start(); p.WaitForExit(); var str = p.StandardOutput.ReadToEnd(); sw.Stop(); var res = CorResult.FromLines(str, Convert.ToDouble(txtSnr.Text)); if (res.Length > 0) { var costTimeMs = res[0].UseTime; var dt = Math.Round(Convert.ToDouble(res[0].Dto), 3); var df = Math.Round(Convert.ToDouble(res[0].Dfo), 1); var snrRes = Math.Round(Convert.ToDouble(res[0].Snr), 1); list.Add(new CgRes() { File1 = txtF1.Text, File2 = txtF2.Text, CostTimeMs = costTimeMs, Dto = dt, Dfo = df, Snr = snrRes }); } else { this.Invoke(new Action(() => DxHelper.MsgBoxHelper.ShowInfo("无参估计算结果"))); } } catch (Exception ex) { Serilog.Log.Error(ex,"参估计算出错"); this.Invoke(new Action(() => DxHelper.MsgBoxHelper.ShowError("参估计算出错"))); } }); this.gridView1.RefreshData(); this.tablePanel1.Enabled = true; } } }