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 System.Windows.Media; using DevExpress.XtraBars.Docking2010.Views.Widget; 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 async void btnCalc_Click(object sender, EventArgs e) { 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, "corc.exe"); string snr = ""; if (!string.IsNullOrWhiteSpace(txtSnr.Text)) snr = $"--snr {txtSnr.Text} "; string dfoCenter = ""; if (!string.IsNullOrWhiteSpace(txtDfoCenter.Text)) dfoCenter = $"--dfocenter {txtDfoCenter.Text} "; string dfoRange = ""; if (!string.IsNullOrWhiteSpace(txtDfoRange.Text)) dfoRange = $"--dforange {txtDfoRange.Text} "; string dtoXb = ""; if (!string.IsNullOrWhiteSpace(txtDtoXb.Text)) dtoXb = $"--dtocorr {txtDtoXb.Text} "; string dfoXb = ""; if (!string.IsNullOrWhiteSpace(txtDfoXb.Text)) dfoXb = $"--dfocorr {txtDfoXb.Text} "; string thread = ""; if (!string.IsNullOrWhiteSpace(txtThread.Text)) thread = $"--threadnum {txtThread.Text} "; else thread = $"--threadnum {Environment.ProcessorCount} "; long Samplestart = 0; long Samplelen = 0; if (!string.IsNullOrWhiteSpace(txtStart.Text) && !string.IsNullOrWhiteSpace(txtLen.Text)) { Samplestart = Convert.ToInt64(txtStart.Text); Samplelen = Convert.ToInt64(txtLen.Text); } 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); Samplestart = Convert.ToInt64(txtStart.Text); Samplelen = len; } string slot = ""; if (Samplestart != 0) { slot = $"-m {Samplestart},{Samplelen} "; } if (!string.IsNullOrWhiteSpace(txtAddZero.Text)) { long addzero = Convert.ToInt16(txtAddZero.Text); //起始样点=起始位置+补零样点 Samplestart = Samplestart + addzero; //样点长度=补零样点*2+补零长度 Samplelen = addzero * 2 + Samplelen; } long dtocenterus = Convert.ToInt64(txtDtoCenter.Text); double offset = dtocenterus * Convert.ToDouble(txtFs.Text); //当偏移大于样点长度就需要补零 if (offset > Samplelen) { long addzero = Convert.ToInt64(offset) - Samplelen; //起始样点=起始位置+补零样点 Samplestart = Samplestart + addzero; //样点长度=补零样点*2+补零长度 Samplelen = addzero * 2 + Samplelen; } if (Samplestart != 0) { if (dtocenterus > 200000) { slot += $"-n {Samplestart - offset},{Samplelen}"; } else { slot += $"-n {Samplestart},{Samplelen}"; } } //样点长度>时差范围*采样率 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}{slot}"; p.StartInfo.CreateNoWindow = true; p.StartInfo.RedirectStandardError = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.UseShellExecute = false; p.Start(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); p.WaitForExit(); stopwatch.Stop(); var str = p.StandardOutput.ReadToEnd(); sw.Stop(); var arr = str.Split(new string[] { "\t", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries); if (arr.Length == 3) { var costTimeMs = stopwatch.Elapsed.TotalMilliseconds; var dt = Math.Round(Convert.ToDouble(arr[0]), 3); var df = Math.Round(Convert.ToDouble(arr[1]), 1); var snrRes = Math.Round(Convert.ToDouble(arr[2].Replace(";", "")), 1); if (dtocenterus > 200000 && snrRes >= 14) { dt += offset; } list.Add(new CgRes() { File1 = txtF1.Text, File2 = txtF2.Text, CostTimeMs = costTimeMs, Dto = dt, Dfo = df, Snr = snrRes }); } else { this.Invoke(new Action(() => XtraMessageBox.Show("参估计算无结果"))); } } catch (Exception ex) { Serilog.Log.Error("参估计算出错", ex); this.Invoke(new Action(() => XtraMessageBox.Show("参估计算出错"))); } }); this.gridView1.RefreshData(); this.tablePanel1.Enabled = true; } } }