using DevExpress.Mvvm.Native; using DevExpress.Xpo; using DevExpress.XtraEditors; using DevExpress.XtraLayout.Utils; using Ips.AdcAlgorithm; using Ips.DevAlgorithm; using Ips.Library.Basic; using Ips.Library.DxpLib; using Ips.Library.Entity; using Ips.Library.LocLib; using Ips.Sps.Adcs; using Ips.Sps.Ants; using Ips.Sps.Cfqs; using Ips.Sps.IfeSpects; using Ips.Sps.Sats; using Ips.Sps.Tsks; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Ips.Sps.IfeScans { public partial class IfeScanForm : XtraForm { public IfeScanForm() { InitializeComponent(); InitCtrls(); } private void InitCtrls() { //fft12-20 //平滑次数20-40 for (int i = 12; i <= 20; i++) { txtFft.Properties.Items.Add(i.ToString(), i, -1); } txtFft.EditValue = 17; for (int i = 20; i <= 40; i++) { txtSmooth.Properties.Items.Add(i.ToString(), i, -1); } txtSmooth.EditValue = 40; txtFreq.EditValue = 1000d; txtDoorLine.EditValue = 100; txtDetectBw.EditValue = 1.5; txtDetectSnr.EditValue = 5; txtFs.EditValue = 100; _sigChartCtrl = new IfeSpectCtrl(); _sigChartCtrl.Dock = DockStyle.Fill; grpSigChart.Controls.Add(_sigChartCtrl); txtFsType.Properties.Items.AddEnum(); txtFsType.SelectedIndex = 0; } private IfeSpectCtrl _sigChartCtrl; private TskAdCard _adCard; private CancellationTokenSource _cts; private List _scanFreqList; private IfeQTSpect.SelectIndexChanged chartSelectChanged; private ScanFreqResut[] _selectFreqs; public ScanFreqResut[] SelectedFreq => _selectFreqs; public int? SatId => txtSat.EditValue == null ? null : (int)txtSat.EditValue; public void BindSatList(object satList, int? defaultSatId) { bsSatList.DataSource = satList; if (defaultSatId != 0) { txtSat.EditValue = defaultSatId; } } public void SetAdCardInfo(TskAdCard adCard) { _adCard = adCard; } private void txtAutoDoor_CheckedChanged(object sender, EventArgs e) { lciDoorLine.Visibility = txtAutoDoor.Checked ? LayoutVisibility.Never : LayoutVisibility.Always; } private void txtAdMode_SelectedIndexChanged(object sender, EventArgs e) { int admode = (int)txtAdMode.EditValue; lciMutil.Visibility = admode == 0 ? LayoutVisibility.Never : LayoutVisibility.Always; } private void txtSigFile_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e) { txtSigFile.Text = ToolDialog.OpenFile("", "选择信号文件"); } private void btnAd_Click(object sender, EventArgs e) { if (_adCard == null) { MsgHelper.ShowError("未设置采集卡!"); return; } if (btnAd.Text == "停止") { _cts.Cancel(); } else { btnAd.Text = "停止"; if (txtSat.EditValue == null) { MsgHelper.ShowError("请选择卫星!"); return; } if (!double.TryParse(txtFreq.Text, out double sigFreq) && sigFreq >= 950 && sigFreq < 2150) { MsgHelper.ShowError("请输入正确的信号频点,范围【950MHz-2150MHz】"); return; } int adMode = (int)txtAdMode.EditValue; int mutil = adMode == 0 ? 1 : (int)txtMutil.EditValue; int satId = (int)txtSat.EditValue; var adch = _adCard.Channels.FirstOrDefault(m => m.GetSatIds().Contains(satId)); if (adch == null) { MsgHelper.ShowError("采集卡未指定采集该卫星!"); return; } var sat = txtSat.GetSelectedDataRow() as Sat; if (sat == null) { MsgHelper.ShowError("未找到卫星信息!"); return; } StartAd(_adCard, adch, sat, sigFreq, mutil).ContinueWith(task => { try { txtSigFile.Text = task.Result; } catch (Exception ex) { ex.HandleCancelEx(m => { MsgHelper.ShowError("采集文件失败,错误消息:" + m.Message); }); } finally { txtFs.EditValue = _adCard.ClockFreq / mutil; txtFsType.EditValue = adMode == 0 ? SampleType.Scy : SampleType.Fcy; btnAd.Text = "采集"; } }, TaskContinuationOptions.ExecuteSynchronously); } } private async Task StartAd(TskAdCard adCard, TskAdChannel adch, Sat sat, double sigfreq, int mutil) { txtSigFile.Text = ""; _cts = new CancellationTokenSource(); var option = new AdcOptions() { CardType = adCard.CardType, ClockType = adCard.ClockerType, TriggerMode = adCard.TriggerMode, DdcFreq = adCard.DdcFreq.E6(), ClockFreq = adCard.ClockFreq.E6l(), Mutil = mutil, TimeLen = 1, ChCount = adch.ChNum, StorePath = adCard.StorePath }; var freqInfo = SigCalcUtil.GetFreqPointBySigFreq(sigfreq.E6l(), sat.SatType, sat.SatTurn.E6l(), adch.FrqTurn.E6l()); Session session = new Session(); var ant = session.GetObjectByKey(adch.AntId); option.SetChannel(ant?.Code ?? string.Empty, adCard.Code, adch.ChNum, freqInfo.DownFreq) .AddSignal(freqInfo.DownFreq, (adCard.ClockFreq / mutil).E6(), sat.SatNum.ToString(), freqInfo.UpFreq); #warning wyq注释变频器 //if (!adch.FixCenter && adch.FrqAddr.IsNotNullOrWhitespace()) //{ // var success = false; // string errMsg; // try // { // #region 原注释 // //var addrInfo = CfqAddrInfo.Parse(adch.FrqAddr); // //double[] freqs = new double[addrInfo.ChNum]; // //freqs[addrInfo.ChNum - 1] = freqInfo.DownFreq.E6m(); // //success = CfqUtil.SetFreq(addrInfo.Addr, freqs, out errMsg); // #endregion // success = CfqManager.Default.SetCfqList(new SetCfqItem[] { new SetCfqItem(adch.FrqAddr, freqInfo.DownFreq) }, out errMsg); // } // catch (Exception ex) // { // success = false; // errMsg = ex.Message; // } // if (!success) // { // if (!MsgHelper.ShowConfirm($"设置变频器失败,{errMsg},是否继续?")) return null; // } //} option.StartTime = DateTime.Now.AddSeconds(10).ClearMillisecond(); var resExe = await new AdcController().StartAdc(option, null, _cts.Token); if (resExe.ExitCode > 0) { MsgHelper.ShowError("执行采集失败,错误消息:" + resExe.ExitMsg); return null; } var adFile = resExe.Result.FileList.FirstOrDefault(m => m.ChNum == adch.ChNum); if (adFile == null) return null; string fileName = adFile.GetLocalFullName(adCard.StorePath); if (!File.Exists(fileName)) { MsgHelper.ShowError("采集文件不存在!"); return null; } return fileName; } private void txtSigFile_EditValueChanged(object sender, EventArgs e) { btnScan.Enabled = txtSigFile.Text.IsNotNullOrWhitespace(); } private void btnScan_Click(object sender, EventArgs e) { if (txtSigFile.Text.IsNullOrWhitespace() || !File.Exists(txtSigFile.Text)) { MsgHelper.ShowError("信号文件不存在!"); return; } var autoDoor = txtAutoDoor.Checked; double doorLine = 0; if (!autoDoor && !double.TryParse(txtDoorLine.Text, out doorLine)) { MsgHelper.ShowError("请输入底噪门限"); return; } if (!double.TryParse(txtDetectBw.Text, out double _detectbw)) { MsgHelper.ShowError("请输入正确的检测带宽!"); return; } if (!int.TryParse(txtDetectSnr.Text, out int _snr)) { MsgHelper.ShowError("请输入正确的信噪比!"); return; } if (!double.TryParse(txtFs.Text, out double fs)) { MsgHelper.ShowError("请输入正确的采样率!"); return; } if (!double.TryParse(txtFreq.Text, out double sigFreq)) { MsgHelper.ShowError("请输入正确的信号频点!"); return; } var fsType = (SampleType)txtFsType.EditValue; var fft = (int)txtFft.EditValue; var smooth = (int)txtSmooth.EditValue; double[] res = _sigChartCtrl.SetSource(txtSigFile.Text, fs.E6(), fsType == SampleType.Fcy, (ulong)sigFreq.E6l(), fft, smooth, autoDoor, doorLine, _detectbw.E6(), _snr); _scanFreqList = ScanFreqResut.Parse(res); bsScanFreq.DataSource = _scanFreqList; grdSigList.RefreshDataSource(); } private void IfeScanForm_Load(object sender, EventArgs e) { chartSelectChanged = this.ChartSelectChanged; _sigChartCtrl.RegisterSelectIndexChanged(chartSelectChanged); btnScan.Enabled = txtSigFile.Text.IsNotNullOrWhitespace(); } private void ChartSelectChanged(int index) { this.Invoke(() => { gvSigList.FocusedRowHandle = gvSigList.GetRowHandle(index); }); } private void gvSigList_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e) { var scanFreq = gvSigList.GetRow(e.RowHandle) as ScanFreqResut; if (scanFreq != null) { _sigChartCtrl.HitFrequence(scanFreq.SigFreq.E6l()); } } private void btnOk_Click(object sender, EventArgs e) { _selectFreqs = gvSigList.GetSelectRow(); if (_selectFreqs.Length == 0) { MsgHelper.ShowWarn("请至少选中一个频点!"); return; } this.DialogResult = DialogResult.OK; } private void btnCancel_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; } } }