| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321 | 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<SampleType>();            txtFsType.SelectedIndex = 0;        }        private IfeSpectCtrl _sigChartCtrl;        private TskAdCard _adCard;        private CancellationTokenSource _cts;        private List<ScanFreqResut> _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<string> 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<Ant>(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<ScanFreqResut>();            if (_selectFreqs.Length == 0)            {                MsgHelper.ShowWarn("请至少选中一个频点!");                return;            }            this.DialogResult = DialogResult.OK;        }        private void btnCancel_Click(object sender, EventArgs e)        {            this.DialogResult = DialogResult.Cancel;        }    }}
 |