FormCpuCg - 副本.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.ComponentModel.DataAnnotations;
  5. using System.Data;
  6. using System.Diagnostics;
  7. using System.Drawing;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows.Forms;
  13. using System.Windows.Media;
  14. using DevExpress.XtraBars.Docking2010.Views.Widget;
  15. using DevExpress.XtraEditors;
  16. using ExtensionsDev;
  17. using static System.Windows.Forms.VisualStyles.VisualStyleElement.TaskbarClock;
  18. namespace XdCxRhDw.CpuCgTools
  19. {
  20. public partial class FormCpuCg : DevExpress.XtraEditors.XtraForm
  21. {
  22. public class CgParam
  23. {
  24. public string F1 { get; set; }
  25. public string F2 { get; set; }
  26. public string snr { get; set; }
  27. public string dfoCenter { get; set; }
  28. public string dfoRange { get; set; }
  29. public string dtoXb { get; set; }
  30. public string dfoXb { get; set; }
  31. public string thread { get; set; }
  32. public string addZero { get; set; }
  33. public string start { get; set; }
  34. public string len { get; set; }
  35. public string dtoCenter { get; set; }
  36. public string dtoRange { get; set; }
  37. public string fs { get; set; }
  38. }
  39. public class CgRes
  40. {
  41. [Display(Name = "文件1")]
  42. public string File1 { get; set; }
  43. [Display(Name = "文件2")]
  44. public string File2 { get; set; }
  45. [Display(Name = "时差(us)")]
  46. public double Dto { get; set; }
  47. [Display(Name = "频差(us)")]
  48. public double Dfo { get; set; }
  49. [Display(Name = "信噪比(dB)")]
  50. public double Snr { get; set; }
  51. [Display(Name = "耗时(ms)")]
  52. public double CostTimeMs { get; set; }
  53. }
  54. List<CgRes> list = new List<CgRes>();
  55. public FormCpuCg()
  56. {
  57. InitializeComponent();
  58. }
  59. private void XtraForm1_Load(object sender, EventArgs e)
  60. {
  61. gridControl1.Init().UseExportCsv().UseExportXlsx();
  62. gridControl1.DataSource = list;
  63. txtF1.UseChooseFile();
  64. txtF2.UseChooseFile();
  65. if (File.Exists("tmp.txt"))
  66. {
  67. var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<CgParam>(File.ReadAllText("tmp.txt"));
  68. txtAddZero.Text = obj.addZero;
  69. txtDfoCenter.Text = obj.dfoCenter;
  70. txtDfoRange.Text = obj.dfoRange;
  71. txtDfoXb.Text = obj.dfoXb;
  72. txtDtoCenter.Text = obj.dtoCenter;
  73. txtDtoRange.Text = obj.dtoRange;
  74. txtDtoXb.Text = obj.dtoXb;
  75. txtF1.Text = obj.F1;
  76. txtF2.Text = obj.F2;
  77. txtFs.Text = obj.fs;
  78. txtLen.Text = obj.len;
  79. txtSnr.Text = obj.snr;
  80. txtStart.Text = obj.start;
  81. txtThread.Text = obj.thread;
  82. }
  83. }
  84. private async void btnCalc_Click(object sender, EventArgs e)
  85. {
  86. this.tablePanel1.Enabled = false;
  87. await Task.Run(() =>
  88. {
  89. try
  90. {
  91. Stopwatch sw = new Stopwatch();
  92. sw.Start();
  93. Process p = new Process();
  94. p.StartInfo.WorkingDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Core");
  95. p.StartInfo.FileName = Path.Combine(p.StartInfo.WorkingDirectory, "corc.exe");
  96. string snr = "";
  97. if (!string.IsNullOrWhiteSpace(txtSnr.Text))
  98. snr = $"--snr {txtSnr.Text} ";
  99. string dfoCenter = "";
  100. if (!string.IsNullOrWhiteSpace(txtDfoCenter.Text))
  101. dfoCenter = $"--dfocenter {txtDfoCenter.Text} ";
  102. string dfoRange = "";
  103. if (!string.IsNullOrWhiteSpace(txtDfoRange.Text))
  104. dfoRange = $"--dforange {txtDfoRange.Text} ";
  105. string dtoXb = "";
  106. if (!string.IsNullOrWhiteSpace(txtDtoXb.Text))
  107. dtoXb = $"--dtocorr {txtDtoXb.Text} ";
  108. string dfoXb = "";
  109. if (!string.IsNullOrWhiteSpace(txtDfoXb.Text))
  110. dfoXb = $"--dfocorr {txtDfoXb.Text} ";
  111. string thread = "";
  112. if (!string.IsNullOrWhiteSpace(txtThread.Text))
  113. thread = $"--threadnum {txtThread.Text} ";
  114. else
  115. thread = $"--threadnum {Environment.ProcessorCount} ";
  116. long Samplestart = 0;
  117. long Samplelen = 0;
  118. if (!string.IsNullOrWhiteSpace(txtStart.Text) && !string.IsNullOrWhiteSpace(txtLen.Text))
  119. {
  120. Samplestart = Convert.ToInt64(txtStart.Text);
  121. Samplelen = Convert.ToInt64(txtLen.Text);
  122. }
  123. if (!string.IsNullOrWhiteSpace(txtStart.Text) && (string.IsNullOrWhiteSpace(txtLen.Text) || Convert.ToInt32(txtLen.Text) <= 0))
  124. {
  125. FileInfo f1 = new FileInfo(txtF1.Text);
  126. FileInfo f2 = new FileInfo(txtF2.Text);
  127. long size = f1.Length;
  128. if (f1.Length > f2.Length)
  129. size = f2.Length;
  130. size /= 4;//IQ文件一个样点4个字节
  131. var len = size - Convert.ToInt32(txtStart.Text);
  132. Samplestart = Convert.ToInt64(txtStart.Text);
  133. Samplelen = len;
  134. }
  135. string slot = "";
  136. if (Samplestart != 0)
  137. {
  138. slot = $"-m {Samplestart},{Samplelen} ";
  139. }
  140. if (!string.IsNullOrWhiteSpace(txtAddZero.Text))
  141. {
  142. long addzero = Convert.ToInt16(txtAddZero.Text);
  143. //起始样点=起始位置+补零样点
  144. Samplestart = Samplestart + addzero;
  145. //样点长度=补零样点*2+补零长度
  146. Samplelen = addzero * 2 + Samplelen;
  147. }
  148. long dtocenterus = Convert.ToInt64(txtDtoCenter.Text);
  149. double offset = dtocenterus * Convert.ToDouble(txtFs.Text);
  150. //当偏移大于样点长度就需要补零
  151. if (offset > Samplelen)
  152. {
  153. long addzero = Convert.ToInt64(offset) - Samplelen;
  154. //起始样点=起始位置+补零样点
  155. Samplestart = Samplestart + addzero;
  156. //样点长度=补零样点*2+补零长度
  157. Samplelen = addzero * 2 + Samplelen;
  158. }
  159. if (Samplestart != 0)
  160. {
  161. if (dtocenterus > 200000)
  162. {
  163. slot += $"-n {Samplestart - offset},{Samplelen}";
  164. }
  165. else
  166. {
  167. slot += $"-n {Samplestart},{Samplelen}";
  168. }
  169. }
  170. //样点长度>时差范围*采样率
  171. CgParam cp = new CgParam()
  172. {
  173. addZero = txtAddZero.Text,
  174. dfoCenter = txtDfoCenter.Text,
  175. dfoRange = txtDfoRange.Text,
  176. dfoXb = txtDfoXb.Text,
  177. dtoCenter = txtDtoCenter.Text,
  178. dtoRange = txtDtoRange.Text,
  179. dtoXb = txtDtoXb.Text,
  180. F1 = txtF1.Text,
  181. F2 = txtF2.Text,
  182. fs = txtFs.Text,
  183. len = txtLen.Text,
  184. snr = txtSnr.Text,
  185. start = txtStart.Text,
  186. thread = txtThread.Text,
  187. };
  188. var jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(cp);
  189. File.WriteAllText("tmp.txt", jsonStr);
  190. p.StartInfo.Arguments = $"\"{txtF1.Text}\" \"{txtF2.Text}\" {txtFs.Text} {txtDtoCenter.Text} {txtDtoRange.Text} {snr}{dfoCenter}{dfoRange}{dtoXb}{dfoXb}{thread}{slot}";
  191. p.StartInfo.CreateNoWindow = true;
  192. p.StartInfo.RedirectStandardError = false;
  193. p.StartInfo.RedirectStandardOutput = true;
  194. p.StartInfo.UseShellExecute = false;
  195. p.Start();
  196. Stopwatch stopwatch = new Stopwatch();
  197. stopwatch.Start();
  198. p.WaitForExit();
  199. stopwatch.Stop();
  200. var str = p.StandardOutput.ReadToEnd();
  201. sw.Stop();
  202. var arr = str.Split(new string[] { "\t", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);
  203. if (arr.Length == 3)
  204. {
  205. var costTimeMs = stopwatch.Elapsed.TotalMilliseconds;
  206. var dt = Math.Round(Convert.ToDouble(arr[0]), 3);
  207. var df = Math.Round(Convert.ToDouble(arr[1]), 1);
  208. var snrRes = Math.Round(Convert.ToDouble(arr[2].Replace(";", "")), 1);
  209. if (dtocenterus > 200000 && snrRes >= 14)
  210. {
  211. dt += offset;
  212. }
  213. list.Add(new CgRes() { File1 = txtF1.Text, File2 = txtF2.Text, CostTimeMs = costTimeMs, Dto = dt, Dfo = df, Snr = snrRes });
  214. }
  215. else
  216. {
  217. this.Invoke(new Action(() => XtraMessageBox.Show("参估计算无结果")));
  218. }
  219. }
  220. catch (Exception ex)
  221. {
  222. Serilog.Log.Error("参估计算出错", ex);
  223. this.Invoke(new Action(() => XtraMessageBox.Show("参估计算出错")));
  224. }
  225. });
  226. this.gridView1.RefreshData();
  227. this.tablePanel1.Enabled = true;
  228. }
  229. }
  230. }