IfeScanForm.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. using DevExpress.Mvvm.Native;
  2. using DevExpress.Xpo;
  3. using DevExpress.XtraEditors;
  4. using DevExpress.XtraLayout.Utils;
  5. using Ips.AdcAlgorithm;
  6. using Ips.DevAlgorithm;
  7. using Ips.Library.Basic;
  8. using Ips.Library.DxpLib;
  9. using Ips.Library.Entity;
  10. using Ips.Library.LocLib;
  11. using Ips.Sps.Adcs;
  12. using Ips.Sps.Ants;
  13. using Ips.Sps.Cfqs;
  14. using Ips.Sps.IfeSpects;
  15. using Ips.Sps.Sats;
  16. using Ips.Sps.Tsks;
  17. using System;
  18. using System.Collections;
  19. using System.Collections.Generic;
  20. using System.ComponentModel;
  21. using System.Data;
  22. using System.Drawing;
  23. using System.IO;
  24. using System.Linq;
  25. using System.Text;
  26. using System.Threading.Tasks;
  27. using System.Windows.Forms;
  28. namespace Ips.Sps.IfeScans
  29. {
  30. public partial class IfeScanForm : XtraForm
  31. {
  32. public IfeScanForm()
  33. {
  34. InitializeComponent();
  35. InitCtrls();
  36. }
  37. private void InitCtrls()
  38. {
  39. //fft12-20
  40. //平滑次数20-40
  41. for (int i = 12; i <= 20; i++)
  42. {
  43. txtFft.Properties.Items.Add(i.ToString(), i, -1);
  44. }
  45. txtFft.EditValue = 17;
  46. for (int i = 20; i <= 40; i++)
  47. {
  48. txtSmooth.Properties.Items.Add(i.ToString(), i, -1);
  49. }
  50. txtSmooth.EditValue = 40;
  51. txtFreq.EditValue = 1000d;
  52. txtDoorLine.EditValue = 100;
  53. txtDetectBw.EditValue = 1.5;
  54. txtDetectSnr.EditValue = 5;
  55. txtFs.EditValue = 100;
  56. _sigChartCtrl = new IfeSpectCtrl();
  57. _sigChartCtrl.Dock = DockStyle.Fill;
  58. grpSigChart.Controls.Add(_sigChartCtrl);
  59. txtFsType.Properties.Items.AddEnum<SampleType>();
  60. txtFsType.SelectedIndex = 0;
  61. }
  62. private IfeSpectCtrl _sigChartCtrl;
  63. private TskAdCard _adCard;
  64. private CancellationTokenSource _cts;
  65. private List<ScanFreqResut> _scanFreqList;
  66. private IfeQTSpect.SelectIndexChanged chartSelectChanged;
  67. private ScanFreqResut[] _selectFreqs;
  68. public ScanFreqResut[] SelectedFreq => _selectFreqs;
  69. public int? SatId => txtSat.EditValue == null ? null : (int)txtSat.EditValue;
  70. public void BindSatList(object satList, int? defaultSatId)
  71. {
  72. bsSatList.DataSource = satList;
  73. if (defaultSatId != 0)
  74. {
  75. txtSat.EditValue = defaultSatId;
  76. }
  77. }
  78. public void SetAdCardInfo(TskAdCard adCard)
  79. {
  80. _adCard = adCard;
  81. }
  82. private void txtAutoDoor_CheckedChanged(object sender, EventArgs e)
  83. {
  84. lciDoorLine.Visibility = txtAutoDoor.Checked ? LayoutVisibility.Never : LayoutVisibility.Always;
  85. }
  86. private void txtAdMode_SelectedIndexChanged(object sender, EventArgs e)
  87. {
  88. int admode = (int)txtAdMode.EditValue;
  89. lciMutil.Visibility = admode == 0 ? LayoutVisibility.Never : LayoutVisibility.Always;
  90. }
  91. private void txtSigFile_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
  92. {
  93. txtSigFile.Text = ToolDialog.OpenFile("", "选择信号文件");
  94. }
  95. private void btnAd_Click(object sender, EventArgs e)
  96. {
  97. if (_adCard == null)
  98. {
  99. MsgHelper.ShowError("未设置采集卡!");
  100. return;
  101. }
  102. if (btnAd.Text == "停止")
  103. {
  104. _cts.Cancel();
  105. }
  106. else
  107. {
  108. btnAd.Text = "停止";
  109. if (txtSat.EditValue == null)
  110. {
  111. MsgHelper.ShowError("请选择卫星!");
  112. return;
  113. }
  114. if (!double.TryParse(txtFreq.Text, out double sigFreq) && sigFreq >= 950 && sigFreq < 2150)
  115. {
  116. MsgHelper.ShowError("请输入正确的信号频点,范围【950MHz-2150MHz】");
  117. return;
  118. }
  119. int adMode = (int)txtAdMode.EditValue;
  120. int mutil = adMode == 0 ? 1 : (int)txtMutil.EditValue;
  121. int satId = (int)txtSat.EditValue;
  122. var adch = _adCard.Channels.FirstOrDefault(m => m.GetSatIds().Contains(satId));
  123. if (adch == null)
  124. {
  125. MsgHelper.ShowError("采集卡未指定采集该卫星!");
  126. return;
  127. }
  128. var sat = txtSat.GetSelectedDataRow() as Sat;
  129. if (sat == null)
  130. {
  131. MsgHelper.ShowError("未找到卫星信息!");
  132. return;
  133. }
  134. StartAd(_adCard, adch, sat, sigFreq, mutil).ContinueWith(task =>
  135. {
  136. try
  137. {
  138. txtSigFile.Text = task.Result;
  139. }
  140. catch (Exception ex)
  141. {
  142. ex.HandleCancelEx(m =>
  143. {
  144. MsgHelper.ShowError("采集文件失败,错误消息:" + m.Message);
  145. });
  146. }
  147. finally
  148. {
  149. txtFs.EditValue = _adCard.ClockFreq / mutil;
  150. txtFsType.EditValue = adMode == 0 ? SampleType.Scy : SampleType.Fcy;
  151. btnAd.Text = "采集";
  152. }
  153. }, TaskContinuationOptions.ExecuteSynchronously);
  154. }
  155. }
  156. private async Task<string> StartAd(TskAdCard adCard, TskAdChannel adch, Sat sat, double sigfreq, int mutil)
  157. {
  158. txtSigFile.Text = "";
  159. _cts = new CancellationTokenSource();
  160. var option = new AdcOptions()
  161. {
  162. CardType = adCard.CardType,
  163. ClockType = adCard.ClockerType,
  164. TriggerMode = adCard.TriggerMode,
  165. DdcFreq = adCard.DdcFreq.E6(),
  166. ClockFreq = adCard.ClockFreq.E6l(),
  167. Mutil = mutil,
  168. TimeLen = 1,
  169. ChCount = adch.ChNum,
  170. StorePath = adCard.StorePath
  171. };
  172. var freqInfo = SigCalcUtil.GetFreqPointBySigFreq(sigfreq.E6l(), sat.SatType, sat.SatTurn.E6l(), adch.FrqTurn.E6l());
  173. Session session = new Session();
  174. var ant = session.GetObjectByKey<Ant>(adch.AntId);
  175. option.SetChannel(ant?.Code ?? string.Empty, adCard.Code, adch.ChNum, freqInfo.DownFreq)
  176. .AddSignal(freqInfo.DownFreq, (adCard.ClockFreq / mutil).E6(), sat.SatNum.ToString(), freqInfo.UpFreq);
  177. #warning wyq注释变频器
  178. //if (!adch.FixCenter && adch.FrqAddr.IsNotNullOrWhitespace())
  179. //{
  180. // var success = false;
  181. // string errMsg;
  182. // try
  183. // {
  184. // #region 原注释
  185. // //var addrInfo = CfqAddrInfo.Parse(adch.FrqAddr);
  186. // //double[] freqs = new double[addrInfo.ChNum];
  187. // //freqs[addrInfo.ChNum - 1] = freqInfo.DownFreq.E6m();
  188. // //success = CfqUtil.SetFreq(addrInfo.Addr, freqs, out errMsg);
  189. // #endregion
  190. // success = CfqManager.Default.SetCfqList(new SetCfqItem[] { new SetCfqItem(adch.FrqAddr, freqInfo.DownFreq) }, out errMsg);
  191. // }
  192. // catch (Exception ex)
  193. // {
  194. // success = false;
  195. // errMsg = ex.Message;
  196. // }
  197. // if (!success)
  198. // {
  199. // if (!MsgHelper.ShowConfirm($"设置变频器失败,{errMsg},是否继续?")) return null;
  200. // }
  201. //}
  202. option.StartTime = DateTime.Now.AddSeconds(10).ClearMillisecond();
  203. var resExe = await new AdcController().StartAdc(option, null, _cts.Token);
  204. if (resExe.ExitCode > 0)
  205. {
  206. MsgHelper.ShowError("执行采集失败,错误消息:" + resExe.ExitMsg);
  207. return null;
  208. }
  209. var adFile = resExe.Result.FileList.FirstOrDefault(m => m.ChNum == adch.ChNum);
  210. if (adFile == null) return null;
  211. string fileName = adFile.GetLocalFullName(adCard.StorePath);
  212. if (!File.Exists(fileName))
  213. {
  214. MsgHelper.ShowError("采集文件不存在!");
  215. return null;
  216. }
  217. return fileName;
  218. }
  219. private void txtSigFile_EditValueChanged(object sender, EventArgs e)
  220. {
  221. btnScan.Enabled = txtSigFile.Text.IsNotNullOrWhitespace();
  222. }
  223. private void btnScan_Click(object sender, EventArgs e)
  224. {
  225. if (txtSigFile.Text.IsNullOrWhitespace() || !File.Exists(txtSigFile.Text))
  226. {
  227. MsgHelper.ShowError("信号文件不存在!");
  228. return;
  229. }
  230. var autoDoor = txtAutoDoor.Checked;
  231. double doorLine = 0;
  232. if (!autoDoor && !double.TryParse(txtDoorLine.Text, out doorLine))
  233. {
  234. MsgHelper.ShowError("请输入底噪门限");
  235. return;
  236. }
  237. if (!double.TryParse(txtDetectBw.Text, out double _detectbw))
  238. {
  239. MsgHelper.ShowError("请输入正确的检测带宽!");
  240. return;
  241. }
  242. if (!int.TryParse(txtDetectSnr.Text, out int _snr))
  243. {
  244. MsgHelper.ShowError("请输入正确的信噪比!");
  245. return;
  246. }
  247. if (!double.TryParse(txtFs.Text, out double fs))
  248. {
  249. MsgHelper.ShowError("请输入正确的采样率!");
  250. return;
  251. }
  252. if (!double.TryParse(txtFreq.Text, out double sigFreq))
  253. {
  254. MsgHelper.ShowError("请输入正确的信号频点!");
  255. return;
  256. }
  257. var fsType = (SampleType)txtFsType.EditValue;
  258. var fft = (int)txtFft.EditValue;
  259. var smooth = (int)txtSmooth.EditValue;
  260. double[] res = _sigChartCtrl.SetSource(txtSigFile.Text, fs.E6(), fsType == SampleType.Fcy, (ulong)sigFreq.E6l(), fft, smooth, autoDoor, doorLine, _detectbw.E6(), _snr);
  261. _scanFreqList = ScanFreqResut.Parse(res);
  262. bsScanFreq.DataSource = _scanFreqList;
  263. grdSigList.RefreshDataSource();
  264. }
  265. private void IfeScanForm_Load(object sender, EventArgs e)
  266. {
  267. chartSelectChanged = this.ChartSelectChanged;
  268. _sigChartCtrl.RegisterSelectIndexChanged(chartSelectChanged);
  269. btnScan.Enabled = txtSigFile.Text.IsNotNullOrWhitespace();
  270. }
  271. private void ChartSelectChanged(int index)
  272. {
  273. this.Invoke(() =>
  274. {
  275. gvSigList.FocusedRowHandle = gvSigList.GetRowHandle(index);
  276. });
  277. }
  278. private void gvSigList_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e)
  279. {
  280. var scanFreq = gvSigList.GetRow(e.RowHandle) as ScanFreqResut;
  281. if (scanFreq != null)
  282. {
  283. _sigChartCtrl.HitFrequence(scanFreq.SigFreq.E6l());
  284. }
  285. }
  286. private void btnOk_Click(object sender, EventArgs e)
  287. {
  288. _selectFreqs = gvSigList.GetSelectRow<ScanFreqResut>();
  289. if (_selectFreqs.Length == 0)
  290. {
  291. MsgHelper.ShowWarn("请至少选中一个频点!");
  292. return;
  293. }
  294. this.DialogResult = DialogResult.OK;
  295. }
  296. private void btnCancel_Click(object sender, EventArgs e)
  297. {
  298. this.DialogResult = DialogResult.Cancel;
  299. }
  300. }
  301. }