// Copyright (c) UESTC. All Rights Reserved // QC // 2022/4/11 namespace Uestc.Auto6.Dso.Core.Vsa { using System; using Uestc.Auto6.Dso.ComModel; public class VectorAnalysisPrsnt : MulticastPrsnt, IVsaPrsnt { public VectorAnalysisPrsnt(IVsaView? view, ModelCreateOptions mco = ModelCreateOptions.Dependant) { Model = mco switch { ModelCreateOptions.Dependant => DsoModel.Default.VectorAnalysisModel, ModelCreateOptions.Standalone => new(), _ => throw new ArgumentException($"Argument '{nameof(mco)}' can not assign to '{nameof(ModelCreateOptions.InitializedByChild)}'."), }; Model.PropertyChanged += OnPropertyChanged; if (view != null) { view.Presenter = this; TryAddView(view); } } public Int32 BitsPerSym { get => Model.BitsPerSym; set => Model.BitsPerSym = value; } public Boolean Enabled { get => Model.Enabled; set => Model.Enabled = value; } public VsaItplOpt Interpolation { get => Model.Interpolation; set => Model.Interpolation = value; } public Int32 MaxBitsPerSym => Model.MaxBitsPerSym; public Int32 MaxSampPerBaud => Model.MaxSampPerBaud; public Double MaxSymbolRate => Model.MaxSymbolRate; public Int32 MinBitsPerSym => Model.MinBitsPerSym; public Int32 MinSampPerBaud => Model.MinSampPerBaud; public Double MinSymbolRate => Model.MinSymbolRate; public VsaFormatOpt Format { get => Model.Format; set => Model.Format = value; } public Int32 SampPerBaud { get => Model.SampPerBaud; set => Model.SampPerBaud = value; } public ChannelId Source { get => Model.Source; set => Model.Source = value; } public ChannelId Source2nd { get => Model.Source2nd; set => Model.Source2nd = value; } public Double SymbolRate { get => Model.SymbolRate; set => Model.SymbolRate = value; } public VsaTemplateOpt Template { get => Model.Template; set => Model.Template = value; } public VsaTimingEstOpt TimingEst { get => Model.TimingEst; set => Model.TimingEst = value; } private protected override VectorAnalysisModel Model { get; } private DspNodePrsnt MakeNode(VsaNodeTypeOpt type) { return type switch { VsaNodeTypeOpt.Mixer => new MixerNodePrsnt(this, Model.MakeMixerNode()), VsaNodeTypeOpt.Filter => new FilterNodePrsnt(this, Model.MakeFilterNode()), VsaNodeTypeOpt.Equalizer => new EqualizerNodePrsnt(this, Model.MakeEqualizerNode()), VsaNodeTypeOpt.DCBlock => new DCBlockNodePrsnt(this, Model.MakeDCBlockNode()), VsaNodeTypeOpt.CarrierEst => new CarrierEstNodePrsnt(this, Model.MakeCarrierEstNode()), VsaNodeTypeOpt.PhaseEst => new PhaseEstNodePrsnt(this, Model.MakePhaseEstNode()), VsaNodeTypeOpt.Custom => new CustomNodePrsnt(this, Model.MakeCustomNode()), _ => new NoOpNodePrsnt(this, Model.MakeNoOpNode()), }; } public DspNodePrsnt? GetNode(Int32 index) { var node = Model.GetNode(index); return node?.NodeType switch { VsaNodeTypeOpt.NoOp => new NoOpNodePrsnt(this, (NoOpNode)node), VsaNodeTypeOpt.Mixer => new MixerNodePrsnt(this, (MixerNode)node), VsaNodeTypeOpt.Filter => new FilterNodePrsnt(this, (FilterNode)node), VsaNodeTypeOpt.Equalizer => new EqualizerNodePrsnt(this, (EqualizerNode)node), VsaNodeTypeOpt.DCBlock => new DCBlockNodePrsnt(this, (DCBlockNode)node), VsaNodeTypeOpt.CarrierEst => new CarrierEstNodePrsnt(this, (CarrierEstNode)node), VsaNodeTypeOpt.PhaseEst => new PhaseEstNodePrsnt(this, (PhaseEstNode)node), VsaNodeTypeOpt.Custom => new CustomNodePrsnt(this, (CustomNode)node), _ => null, }; } public DspNodePrsnt? SetCustomNode(Int32 index, VsaNodeTypeOpt type) { var node = Model.GetNode(index); if (node?.NodeType != type) { var dnp = MakeNode(type); Model.SetNode(index, dnp.Model); return dnp; } return null; } public DspNodePrsnt? AddCustomNode(VsaNodeTypeOpt type = VsaNodeTypeOpt.NoOp) { if (Model.Count < 8) { var dnp = MakeNode(type); Model.AddNode(dnp.Model); return dnp; } return null; } public void RemoveCustomNodeAt(Int32 index) => Model.RemoveNodeAt(index); } }