using System; using System.Collections.Generic; using System.Collections.Specialized; using System.ComponentModel; using System.IO.Ports; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Documents; using DTS.Common.Controls; using DTS.Common.Enums; using DTS.Common.Enums.Sensors; using DTS.Common.Enums.Sensors.SensorsList; using DTS.Common.Events; using DTS.Common.Interface.Groups.GroupChannelList; using DTS.Common.Interface.Sensors.SoftwareFilters; using DTS.Common.Settings; using DTS.Common.Utils; using DTS.SensorDB; using Prism.Ioc; using DTS.Common.Classes.Sensors; using Prism.Events; // ReSharper disable CheckNamespace namespace GroupChannelList { /// /// /// Interaction logic for GroupChannelListView.xaml /// public partial class GroupChannelSettingsListView : IGroupChannelSettingsListView, INotifyPropertyChanged { private int _DbVersion = DTS.Common.Storage.DbOperations.MINIMUM_LTS_DB_VERSION; public int ViewDbVersion { get => _DbVersion; set => SetProperty(ref _DbVersion, value, "ViewDbVersion"); } public GroupChannelSettingsListView() { InitializeComponent(); ChannelSettingsListListView.ItemContainerGenerator.ItemsChanged += ChannelSettingsListListView_OnItemsChanged; } /// /// sets whether to use test setup or group order column /// /// public void SetOrderMode(bool bUseTestSetupOrder) { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (bUseTestSetupOrder) { if (view.Columns.Contains(GroupOrderColumn)) { view.Columns.Remove(GroupOrderColumn); } if (!view.Columns.Contains(TestSetupOrderColumn)) { view.Columns.Insert(0, TestSetupOrderColumn); } } else { if (view.Columns.Contains(TestSetupOrderColumn)) { view.Columns.Remove(TestSetupOrderColumn); } if (!view.Columns.Contains(GroupOrderColumn)) { view.Columns.Insert(0, GroupOrderColumn); } } var showGroups = SettingsDB.GetGlobalValueBool("ShowGroups", true); if (showGroups) { AddGroupColumn(); } else { RemoveGroupColumn(); } } private void RemoveGroupColumn() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (view.Columns.Contains(GroupColumn)) { view.Columns.Remove(GroupColumn); } } private void AddGroupColumn() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (!view.Columns.Contains(GroupColumn)) { view.Columns.Insert(1, GroupColumn); } } /// /// sets whether to show User Value X columns /// /// public void SetDisplayOptions(bool bShowSensorChannelUserValues) { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } ShowSensorChannelUserValues = bShowSensorChannelUserValues; } private bool _GCAC_Visibility = true; /// /// controls the visibility of GCAC controls /// is only really relevant to this view /// public bool GCAC_Visibility { get => _GCAC_Visibility; set { _GCAC_Visibility = value; OnPropertyChanged("GCAC_Visibility"); } } private bool _showSensorChannelUserValues = false; /// /// controls the visibility of the UserValue1, UserValue2, and UserValue3 columns /// public bool ShowSensorChannelUserValues { get => _showSensorChannelUserValues; set { _showSensorChannelUserValues = value; OnPropertyChanged("ShowSensorChannelUserValues"); } } /// /// adds columns relevant to an analog sensor type (range/capacity/polarity/CFC/Sensitivity/Units) /// private void AddAnalogColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (!view.Columns.Contains(AnalogRangeColumn)) { view.Columns.Add(AnalogRangeColumn); } if (!view.Columns.Contains(AnalogCapacityColumn)) { view.Columns.Add(AnalogCapacityColumn); } if (!view.Columns.Contains(AnalogSensitivityColumn)) { view.Columns.Add(AnalogSensitivityColumn); } if (!view.Columns.Contains(AnalogUnitsColumn)) { view.Columns.Add(AnalogUnitsColumn); } if (!view.Columns.Contains(AnalogCFCColumn)) { view.Columns.Add(AnalogCFCColumn); } if (!view.Columns.Contains(AnalogPolarityColumn)) { view.Columns.Add(AnalogPolarityColumn); } //FB14606: Test Setup Specific-ize ZeroMethod parameters if (!view.Columns.Contains(AnalogZeroMethodColumn)) { view.Columns.Add(AnalogZeroMethodColumn); } if (!view.Columns.Contains(AnalogZeroMethodStartColumn)) { view.Columns.Add(AnalogZeroMethodStartColumn); } if (!view.Columns.Contains(AnalogZeroMethodEndColumn)) { view.Columns.Add(AnalogZeroMethodEndColumn); } if (!view.Columns.Contains(AnalogInitialOffsetColumn)) { view.Columns.Add(AnalogInitialOffsetColumn); } if (ShowSensorChannelUserValues) { if (!view.Columns.Contains(AnalogUserValue1Column)) { view.Columns.Add(AnalogUserValue1Column); } if (!view.Columns.Contains(AnalogUserValue2Column)) { view.Columns.Add(AnalogUserValue2Column); } if (!view.Columns.Contains(AnalogUserValue3Column)) { view.Columns.Add(AnalogUserValue3Column); } } } /// /// removes any analog channels from the view /// private void RemoveAnalogColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (view.Columns.Contains(AnalogCapacityColumn)) { view.Columns.Remove(AnalogCapacityColumn); } if (view.Columns.Contains(AnalogCFCColumn)) { view.Columns.Remove(AnalogCFCColumn); } if (view.Columns.Contains(AnalogPolarityColumn)) { view.Columns.Remove(AnalogPolarityColumn); } if (view.Columns.Contains(AnalogRangeColumn)) { view.Columns.Remove(AnalogRangeColumn); } if (view.Columns.Contains(AnalogSensitivityColumn)) { view.Columns.Remove(AnalogSensitivityColumn); } if (view.Columns.Contains(AnalogUnitsColumn)) { view.Columns.Remove(AnalogUnitsColumn); } if (view.Columns.Contains(AnalogUserValue1Column)) { view.Columns.Remove(AnalogUserValue1Column); } if (view.Columns.Contains(AnalogUserValue2Column)) { view.Columns.Remove(AnalogUserValue2Column); } if (view.Columns.Contains(AnalogUserValue3Column)) { view.Columns.Remove(AnalogUserValue3Column); } //FB14606: Test Setup Specific-ize ZeroMethod parameters if (view.Columns.Contains(AnalogZeroMethodColumn)) { view.Columns.Remove(AnalogZeroMethodColumn); } if (view.Columns.Contains(AnalogZeroMethodStartColumn)) { view.Columns.Remove(AnalogZeroMethodStartColumn); } if (view.Columns.Contains(AnalogZeroMethodEndColumn)) { view.Columns.Remove(AnalogZeroMethodEndColumn); } if (view.Columns.Contains(AnalogInitialOffsetColumn)) { view.Columns.Remove(AnalogInitialOffsetColumn); } } /// /// adds squib columns to the view /// private void AddSquibColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (!view.Columns.Contains(SquibFireModeColumn)) { view.Columns.Add(SquibFireModeColumn); } if (!view.Columns.Contains(SquibDelayColumn)) { view.Columns.Add(SquibDelayColumn); } if (!view.Columns.Contains(SquibLimitDurationColumn)) { view.Columns.Add(SquibLimitDurationColumn); } if (!view.Columns.Contains(SquibDurationColumn)) { view.Columns.Add(SquibDurationColumn); } if (!view.Columns.Contains(SquibCurrentColumn)) { view.Columns.Add(SquibCurrentColumn); } } /// /// removes squib columns from the view /// private void RemoveSquibColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (view.Columns.Contains(SquibDelayColumn)) { view.Columns.Remove(SquibDelayColumn); } if (view.Columns.Contains(SquibDurationColumn)) { view.Columns.Remove(SquibDurationColumn); } if (view.Columns.Contains(SquibFireModeColumn)) { view.Columns.Remove(SquibFireModeColumn); } if (view.Columns.Contains(SquibLimitDurationColumn)) { view.Columns.Remove(SquibLimitDurationColumn); } if (view.Columns.Contains(SquibCurrentColumn)) { view.Columns.Remove(SquibCurrentColumn); } } /// /// adds digital output columns to the view /// private void AddDigitalOutColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (!view.Columns.Contains(DigitalOutOutputModeColumn)) { view.Columns.Add(DigitalOutOutputModeColumn); } if (!view.Columns.Contains(DigitalOutDelayColumn)) { view.Columns.Add(DigitalOutDelayColumn); } if (!view.Columns.Contains(DigitalOutLimitDurationColumn)) { view.Columns.Add(DigitalOutLimitDurationColumn); } if (!view.Columns.Contains(DigitalOutDurationColumn)) { view.Columns.Add(DigitalOutDurationColumn); } } /// /// removes digital output columns from the view /// private void RemoveDigitalOutColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (view.Columns.Contains(DigitalOutDelayColumn)) { view.Columns.Remove(DigitalOutDelayColumn); } if (view.Columns.Contains(DigitalOutDurationColumn)) { view.Columns.Remove(DigitalOutDurationColumn); } if (view.Columns.Contains(DigitalOutLimitDurationColumn)) { view.Columns.Remove(DigitalOutLimitDurationColumn); } if (view.Columns.Contains(DigitalOutOutputModeColumn)) { view.Columns.Remove(DigitalOutOutputModeColumn); } } /// /// adds digital input columns to the view /// private void AddDigitalInColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (!view.Columns.Contains(DigitalInInputModeColumn)) { view.Columns.Add(DigitalInInputModeColumn); } if (!view.Columns.Contains(DigitalInDefaultValueColumn)) { view.Columns.Add(DigitalInDefaultValueColumn); } if (!view.Columns.Contains(DigitalInActiveValueColumn)) { view.Columns.Add(DigitalInActiveValueColumn); } } /// /// removes digital columns from the view /// private void RemoveDigitalInColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (view.Columns.Contains(DigitalInActiveValueColumn)) { view.Columns.Remove(DigitalInActiveValueColumn); } if (view.Columns.Contains(DigitalInDefaultValueColumn)) { view.Columns.Remove(DigitalInDefaultValueColumn); } if (view.Columns.Contains(DigitalInInputModeColumn)) { view.Columns.Remove(DigitalInInputModeColumn); } } /// /// adds uart columns to the view /// private void AddUartColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (!view.Columns.Contains(UartBaudRateColumn)) { view.Columns.Add(UartBaudRateColumn); } if (!view.Columns.Contains(UartDataBitsColumn)) { view.Columns.Add(UartDataBitsColumn); } if (!view.Columns.Contains(UartStopBitsColumn)) { view.Columns.Add(UartStopBitsColumn); } if (!view.Columns.Contains(UartParityColumn)) { view.Columns.Add(UartParityColumn); } if (!view.Columns.Contains(UartDataFormatColumn)) { view.Columns.Add(UartDataFormatColumn); } } /// /// removes uart columns from the view /// private void RemoveUartColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (view.Columns.Contains(UartBaudRateColumn)) { view.Columns.Remove(UartBaudRateColumn); } if (view.Columns.Contains(UartDataBitsColumn)) { view.Columns.Remove(UartDataBitsColumn); } if (view.Columns.Contains(UartStopBitsColumn)) { view.Columns.Remove(UartStopBitsColumn); } if (view.Columns.Contains(UartParityColumn)) { view.Columns.Remove(UartParityColumn); } if (view.Columns.Contains(UartDataFormatColumn)) { view.Columns.Remove(UartDataFormatColumn); } } /// /// adds stream out columns to the view /// private void AddStreamOutColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (!view.Columns.Contains(StreamOutUDPProfileColumn)) { view.Columns.Add(StreamOutUDPProfileColumn); } if (!view.Columns.Contains(StreamOutUDPAddressColumn)) { view.Columns.Add(StreamOutUDPAddressColumn); } if (!view.Columns.Contains(StreamOutUDPTimeChannelIdColumn)) { view.Columns.Add(StreamOutUDPTimeChannelIdColumn); } if (!view.Columns.Contains(StreamOutUDPDataChannelIdColumn)) { view.Columns.Add(StreamOutUDPDataChannelIdColumn); } if (!view.Columns.Contains(StreamOutIRIGTimeDataPacketIntervalMsColumn)) { view.Columns.Add(StreamOutIRIGTimeDataPacketIntervalMsColumn); } if (!view.Columns.Contains(StreamOutSubFrameIDColumn)) { view.Columns.Add(StreamOutSubFrameIDColumn); } if (!view.Columns.Contains(StreamOutMessageIDColumn)) { view.Columns.Add(StreamOutMessageIDColumn); } if (!view.Columns.Contains(StreamOutMinorPerMajorColumn)) { view.Columns.Add(StreamOutMinorPerMajorColumn); } if (!view.Columns.Contains(StreamOutTMATSPortColumn)) { view.Columns.Add(StreamOutTMATSPortColumn); } if (!view.Columns.Contains(StreamOutIENAKeyColumn)) { view.Columns.Add(StreamOutIENAKeyColumn); } if (!view.Columns.Contains(StreamOutIENASourcePortColumn)) { view.Columns.Add(StreamOutIENASourcePortColumn); } if (!view.Columns.Contains(StreamOutTMATSIntervalMsColumn)) { view.Columns.Add(StreamOutTMATSIntervalMsColumn); } } /// /// removes stream out columns from the view /// private void RemoveStreamOutColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (view.Columns.Contains(StreamOutUDPProfileColumn)) { view.Columns.Remove(StreamOutUDPProfileColumn); } if (view.Columns.Contains(StreamOutUDPAddressColumn)) { view.Columns.Remove(StreamOutUDPAddressColumn); } if (view.Columns.Contains(StreamOutUDPTimeChannelIdColumn)) { view.Columns.Remove(StreamOutUDPTimeChannelIdColumn); } if (view.Columns.Contains(StreamOutUDPDataChannelIdColumn)) { view.Columns.Remove(StreamOutUDPDataChannelIdColumn); } if (view.Columns.Contains(StreamOutIRIGTimeDataPacketIntervalMsColumn)) { view.Columns.Remove(StreamOutIRIGTimeDataPacketIntervalMsColumn); } if (view.Columns.Contains(StreamOutSubFrameIDColumn)) { view.Columns.Remove(StreamOutSubFrameIDColumn); } if (view.Columns.Contains(StreamOutMessageIDColumn)) { view.Columns.Remove(StreamOutMessageIDColumn); } if (view.Columns.Contains(StreamOutMinorPerMajorColumn)) { view.Columns.Remove(StreamOutMinorPerMajorColumn); } if (view.Columns.Contains(StreamOutTMATSPortColumn)) { view.Columns.Remove(StreamOutTMATSPortColumn); } if (view.Columns.Contains(StreamOutIENAKeyColumn)) { view.Columns.Remove(StreamOutIENAKeyColumn); } if (view.Columns.Contains(StreamOutIENASourcePortColumn)) { view.Columns.Remove(StreamOutIENASourcePortColumn); } if (view.Columns.Contains(StreamOutTMATSIntervalMsColumn)) { view.Columns.Remove(StreamOutTMATSIntervalMsColumn); } } /// /// adds stream out columns to the view /// private void AddStreamInColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (!view.Columns.Contains(StreamInUDPAddressColumn)) { view.Columns.Add(StreamInUDPAddressColumn); } } /// /// removes stream out columns from the view /// private void RemoveStreamInColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (view.Columns.Contains(StreamInUDPAddressColumn)) { view.Columns.Remove(StreamInUDPAddressColumn); } } private void AddCanColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (!view.Columns.Contains(CanIsFDColumn)) { view.Columns.Add(CanIsFDColumn); } if (!view.Columns.Contains(CanArbBaseBitrateColumn)) { view.Columns.Add(CanArbBaseBitrateColumn); } if (!view.Columns.Contains(CanArbBaseSJWColumn)) { view.Columns.Add(CanArbBaseSJWColumn); } if (!view.Columns.Contains(CanDataBitrateColumn)) { view.Columns.Add(CanDataBitrateColumn); } if (!view.Columns.Contains(CanDataSJWColumn)) { view.Columns.Add(CanDataSJWColumn); } if (!view.Columns.Contains(CanFileTypeColumn)) { view.Columns.Add(CanFileTypeColumn); } } private void RemoveCanColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (view.Columns.Contains(CanIsFDColumn)) { view.Columns.Remove(CanIsFDColumn); } if (view.Columns.Contains(CanArbBaseBitrateColumn)) { view.Columns.Remove(CanArbBaseBitrateColumn); } if (view.Columns.Contains(CanArbBaseSJWColumn)) { view.Columns.Remove(CanArbBaseSJWColumn); } if (view.Columns.Contains(CanDataBitrateColumn)) { view.Columns.Remove(CanDataBitrateColumn); } if (view.Columns.Contains(CanDataSJWColumn)) { view.Columns.Remove(CanDataSJWColumn); } if (view.Columns.Contains(CanFileTypeColumn)) { view.Columns.Remove(CanFileTypeColumn); } } /// /// returns the version of the currently connected database /// public int DbVersion { get => DTS.Common.Storage.DbOperations.GetConnectionDbVersion(); } /// /// sets the view to only display channels of a certain sensor type /// /// public void SetFilterMode(PossibleFilters mode) { HandleColumns(_viewMode); switch (mode) { case PossibleFilters.Analog: case PossibleFilters.All: GCAC_Visibility = true; RemoveSquibColumns(); RemoveDigitalInColumns(); RemoveDigitalOutColumns(); RemoveUartColumns(); RemoveStreamOutColumns(); RemoveStreamInColumns(); RemoveCanColumns(); AddAnalogColumns(); rbParametersAnalog.IsChecked = true; break; case PossibleFilters.Squib: GCAC_Visibility = false; RemoveAnalogColumns(); RemoveDigitalInColumns(); RemoveDigitalOutColumns(); RemoveUartColumns(); RemoveStreamOutColumns(); RemoveStreamInColumns(); RemoveCanColumns(); AddSquibColumns(); rbParametersSquib.IsChecked = true; break; case PossibleFilters.DigitalIn: GCAC_Visibility = false; RemoveSquibColumns(); RemoveAnalogColumns(); RemoveDigitalOutColumns(); RemoveUartColumns(); RemoveStreamOutColumns(); RemoveStreamInColumns(); RemoveCanColumns(); AddDigitalInColumns(); rbParametersDigitalIn.IsChecked = true; break; case PossibleFilters.DigitalOut: GCAC_Visibility = false; RemoveSquibColumns(); RemoveDigitalInColumns(); RemoveAnalogColumns(); RemoveUartColumns(); RemoveStreamOutColumns(); RemoveStreamInColumns(); RemoveCanColumns(); AddDigitalOutColumns(); rbParametersDigitalOut.IsChecked = true; break; case PossibleFilters.UART: GCAC_Visibility = false; RemoveAnalogColumns(); RemoveDigitalInColumns(); RemoveDigitalOutColumns(); RemoveSquibColumns(); RemoveStreamOutColumns(); RemoveStreamInColumns(); RemoveIsoCodeColumns(); RemoveUserCodeColumns(); RemoveCanColumns(); AddUartColumns(); rbParametersUart.IsChecked = true; break; case PossibleFilters.StreamOut: GCAC_Visibility = false; RemoveSquibColumns(); RemoveDigitalInColumns(); RemoveDigitalOutColumns(); RemoveAnalogColumns(); RemoveUartColumns(); RemoveStreamInColumns(); RemoveIsoCodeColumns(); RemoveUserCodeColumns(); RemoveCanColumns(); AddStreamOutColumns(); rbParametersStreamOut.IsChecked = true; break; case PossibleFilters.StreamIn: GCAC_Visibility = false; RemoveSquibColumns(); RemoveDigitalInColumns(); RemoveDigitalOutColumns(); RemoveAnalogColumns(); RemoveUartColumns(); RemoveStreamOutColumns(); RemoveIsoCodeColumns(); RemoveUserCodeColumns(); RemoveCanColumns(); AddStreamInColumns(); rbParametersStreamIn.IsChecked = true; break; case PossibleFilters.CAN: GCAC_Visibility = false; RemoveSquibColumns(); RemoveDigitalInColumns(); RemoveDigitalOutColumns(); RemoveAnalogColumns(); RemoveUartColumns(); RemoveStreamOutColumns(); RemoveIsoCodeColumns(); RemoveUserCodeColumns(); AddCanColumns(); rbParametersCAN.IsChecked = true; break; } } #region IPropertyNotified public event PropertyChangedEventHandler PropertyChanged; protected bool SetProperty(ref T storage, T value, string propertyName = null) { if (Equals(storage, value)) return false; storage = value; OnPropertyChanged(propertyName); return true; } protected void OnPropertyChanged(string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } #endregion #PropertyNotified /// /// handles when a user clicks on the search portion of the grid view column header /// /// /// private void GridViewColumnHeaderSearchable_OnSearch(object sender, RoutedEventArgs e) { var searchTerm = (string)e.OriginalSource; var columnTag = (sender as GridViewColumnHeaderSearchable)?.Tag; var viewModel = (IGroupChannelListViewModel)DataContext; viewModel.Filter(columnTag, searchTerm); } private IsoViewMode _viewMode = IsoViewMode.ISOAndUserCode; /// /// sets the view to only display columns relevant to the isoviewmode provided /// /// public void HandleColumns(IsoViewMode viewMode) { switch (viewMode) { case IsoViewMode.ISOOnly: RemoveUserCodeColumns(); AddIsoCodeColumns(); break; case IsoViewMode.ISOAndUserCode: AddUserAndIsoCodeColumns(); break; case IsoViewMode.UserCodeOnly: RemoveIsoCodeColumns(); AddUserCodeColumns(); break; case IsoViewMode.ChannelNameOnly: ChannelNameOnlyColumns(); break; } if (ShowSensorChannelUserValues) { AddUserValueColumns(); } else { RemoveUserValueColumns(); } _viewMode = viewMode; } /// /// adds user and isocode columns to the view /// private void AddUserAndIsoCodeColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (!view.Columns.Contains(UserCodeColumn)) { view.Columns.Insert(2, UserCodeColumn); } if (!view.Columns.Contains(UserChannelNameColumn)) { view.Columns.Insert(3, UserChannelNameColumn); } if (!view.Columns.Contains(ISOCodeColumn)) { view.Columns.Insert(4, ISOCodeColumn); } if (!view.Columns.Contains(ISOChannelNameColumn)) { view.Columns.Insert(5, ISOChannelNameColumn); } } /// /// adds iso columns to the view /// private void AddIsoCodeColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (!view.Columns.Contains(ISOCodeColumn)) { view.Columns.Insert(2, ISOCodeColumn); } if (!view.Columns.Contains(ISOChannelNameColumn)) { view.Columns.Insert(3, ISOChannelNameColumn); } } /// /// removes isocode columns from the view /// private void RemoveIsoCodeColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (view.Columns.Contains(ISOCodeColumn)) { view.Columns.Remove(ISOCodeColumn); } if (view.Columns.Contains(ISOChannelNameColumn)) { view.Columns.Remove(ISOChannelNameColumn); } } private void ChannelNameOnlyColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } RemoveIsoCodeColumns(); AddUserCodeColumns(); view.Columns.Remove(UserCodeColumn); } /// /// removes usercode columns from the view /// private void RemoveUserCodeColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (view.Columns.Contains(UserCodeColumn)) { view.Columns.Remove(UserCodeColumn); } if (view.Columns.Contains(UserChannelNameColumn)) { view.Columns.Remove(UserChannelNameColumn); } } /// /// adds usercode columns to the view /// private void AddUserCodeColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (!view.Columns.Contains(UserCodeColumn)) { view.Columns.Insert(2, UserCodeColumn); } if (!view.Columns.Contains(UserChannelNameColumn)) { view.Columns.Insert(3, UserChannelNameColumn); } } /// /// Removes UserValueX columns from the view /// private void RemoveUserValueColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (view.Columns.Contains(AnalogUserValue1Column)) { view.Columns.Remove(AnalogUserValue1Column); } if (view.Columns.Contains(AnalogUserValue2Column)) { view.Columns.Remove(AnalogUserValue2Column); } if (view.Columns.Contains(AnalogUserValue3Column)) { view.Columns.Remove(AnalogUserValue3Column); } } /// /// Adds UserValueX columns to the view /// private void AddUserValueColumns() { if (!(ChannelSettingsListListView.View is AutoSizedGridView view)) { return; } if (!view.Columns.Contains(AnalogUserValue1Column)) { view.Columns.Insert(view.Columns.Count, AnalogUserValue1Column); } if (!view.Columns.Contains(AnalogUserValue2Column)) { view.Columns.Insert(view.Columns.Count, AnalogUserValue2Column); } if (!view.Columns.Contains(AnalogUserValue3Column)) { view.Columns.Insert(view.Columns.Count, AnalogUserValue3Column); } } /// /// The list of valid range values for TSR AIR LowG channels /// public SensorConstants.AvailableRangesLowG[] AvailableRangesLowG { get; } = new[] { SensorConstants.AvailableRangesLowG.LowG64D}; /// /// The list of valid range values for TSR AIR ARS channels /// public double[] AvailableRangesARS { get; } = new[] { Convert.ToDouble(SensorConstants.AvailableRangesARS.ARS2000D)}; /// /// FB 13120 available Filter Classes for Filter dropdowns /// public List AvailableCFC { get { return new AnalogSettingDefaults().FilterOptions; } } /// /// available polarity for polarity dropdowns /// public string[] AvailablePolarity { get; } = new[] { "+", "-" }; /// /// available zero method types for zeromethod dropdowns /// public ZeroMethodType[] AvailableZeroMethod { get; } = new[] { ZeroMethodType.AverageOverTime, ZeroMethodType.UsePreEventDiagnosticsZero, ZeroMethodType.None }; /// /// ZeroMethodType.None (Absolute zero) is not available with embedded sensors (TSR AIR, DIR, DKR) /// UPDATE - I think this is a MISTAKE, I'm adding it back in ... /// all the TSR AIR channels should use none /// MS30446 and MS31788 /// public ZeroMethodType[] AvailableZeroMethodEmbeddedSensor { get; } = new[] { ZeroMethodType.None, ZeroMethodType.AverageOverTime, ZeroMethodType.UsePreEventDiagnosticsZero, }; /// /// available digital input modes for digital input mode dropdowns /// public DigitalInputModes[] AvailableDigitalInputModes { get; } = new[] { DigitalInputModes.CCNC, DigitalInputModes.CCNO, DigitalInputModes.THL, DigitalInputModes.TLH }; /// /// available squib fire modes for squib fire mode dropdowns /// public SquibFireMode[] AvailableSquibFireModes { get; } = new[] { SquibFireMode.CAP, SquibFireMode.CONSTANT }; /// /// available digital output modes for digital output mode dropdowns /// public DigitalOutputModes[] AvailableDigitalOutputModes { get; } = new[] { DigitalOutputModes.CCNC, DigitalOutputModes.CCNO, DigitalOutputModes.FVHL, DigitalOutputModes.FVLH }; /// /// available uart stop bits for uart stop bits dropdowns /// public StopBits[] AvailableUartStopBits { get; } = new[] { StopBits.None, StopBits.One, StopBits.OnePointFive, StopBits.Two }; /// /// available uart parities for uart parities dropdowns /// public Parity[] AvailableUartParities { get; } = new[] { Parity.None, Parity.Odd, Parity.Even, Parity.Mark, Parity.Space }; /// /// available uart flow controls for uart flow controls dropdowns /// public Handshake[] AvailableUartFlowControls { get; } = new[] { Handshake.None, Handshake.XOnXOff, Handshake.RequestToSend, Handshake.RequestToSendXOnXOff }; /// /// available uart data formats for uart data formats dropdowns /// public UartDataFormat[] AvailableUartDataFormats { get; } = new[] { UartDataFormat.Binary, UartDataFormat.PlainText, UartDataFormat.NMEA }; /// /// available udp stream profiles for stream profiles dropdowns /// public UDPStreamProfile[] AvailableStreamOutUDPProfiles { get { if (!(DataContext is IGroupChannelListViewModel vm)) { return new UDPStreamProfile[] { }; } return StreamOutputRecord.AvailableUDPStreamProfiles(ViewDbVersion, StreamOutputSettingDefaults.GetStreamOutputSettingsDefault(vm.UserID).UseAdvancedUDPStreamProfiles); } } /// /// available global channel amplitude class options for GCAC dropdowns /// public CACOption[] GlobalCACOptions { get; } = new[] { CACOption.Manual, CACOption.Capacity, CACOption.RangeHigh, CACOption.RangeMedium, CACOption.RangeLow }; private CACOption _selectedGlobalRangeCACOption = CACOption.Manual; /// /// the selected GCAC mode /// this is used by the apply button to make adjustments to the range for analog channels /// public CACOption SelectedGlobalRangeCACOption { get => _selectedGlobalRangeCACOption; set { _selectedGlobalRangeCACOption = value; OnPropertyChanged("SelectedGlobalRangeCACOption"); } } /// /// handler for analog radio button click /// informs the viewmodel to filter /// /// /// private void Analog_Click(object sender, RoutedEventArgs e) { if (!(DataContext is IGroupChannelListViewModel vm)) { return; } vm.Filter(PossibleFilters.Analog); SetFilterMode(PossibleFilters.Analog); } /// /// sets the vm to display squibs /// /// /// private void Squib_Click(object sender, RoutedEventArgs e) { if (!(DataContext is IGroupChannelListViewModel vm)) { return; } vm.Filter(PossibleFilters.Squib); SetFilterMode(PossibleFilters.Squib); } /// /// sets the vm to display digital outputs /// /// /// private void DigitalOut_Click(object sender, RoutedEventArgs e) { if (!(DataContext is IGroupChannelListViewModel vm)) { return; } vm.Filter(PossibleFilters.DigitalOut); SetFilterMode(PossibleFilters.DigitalOut); } /// /// sets the vm to display digital inputs /// /// /// private void DigitalIn_Click(object sender, RoutedEventArgs e) { if (!(DataContext is IGroupChannelListViewModel vm)) { return; } vm.Filter(PossibleFilters.DigitalIn); SetFilterMode(PossibleFilters.DigitalIn); } /// /// sets the vm to display uarts /// /// /// private void Uart_Click(object sender, RoutedEventArgs e) { if (!(DataContext is IGroupChannelListViewModel vm)) { return; } vm.Filter(PossibleFilters.UART); SetFilterMode(PossibleFilters.UART); } /// /// sets the vm to display stream outputs /// /// /// private void StreamOut_Click(object sender, RoutedEventArgs e) { if (!(DataContext is IGroupChannelListViewModel vm)) { return; } vm.Filter(PossibleFilters.StreamOut); SetFilterMode(PossibleFilters.StreamOut); } /// /// sets the vm to display stream inputs /// /// /// private void StreamIn_Click(object sender, RoutedEventArgs e) { if (!(DataContext is IGroupChannelListViewModel vm)) { return; } vm.Filter(PossibleFilters.StreamIn); SetFilterMode(PossibleFilters.StreamIn); } private void CAN_Click(object sender, RoutedEventArgs e) { if (!(DataContext is IGroupChannelListViewModel vm)) { return; } vm.Filter(PossibleFilters.CAN); SetFilterMode(PossibleFilters.CAN); } /// /// sets the range for all analog channels to relevant range to the GCAC /// (global channel amplitude class) /// /// /// private void btnGlobalRangeApply_Click(object sender, RoutedEventArgs e) { if (!(DataContext is IGroupChannelListViewModel vm)) { return; } vm.SetRange(SelectedGlobalRangeCACOption); } /// /// sorts the columns on click of a column /// /// /// private void GridViewColumnHeader_Click(object sender, RoutedEventArgs e) { if (!(DataContext is IGroupChannelListViewModel vm)) { return; } //I'm not sure why clicking on a hyperlink would cause the column header click to fire, but //but I saw it, don't do the grid column header click if it was sent by a hyperlink ... if (e.OriginalSource is Hyperlink) { return; } var columnTag = (sender as GridViewColumnHeaderSearchable)?.Tag ?? Utils.FindChild((DependencyObject)e.OriginalSource, null)?.Tag; vm.Sort(columnTag, true); } private void ChannelSettingsListListView_OnLoaded(object sender, RoutedEventArgs e) { if (!(DataContext is IGroupChannelListViewModel vm)) { return; } vm.SettingsViewLoaded = true; } //FB14148: handle the ListView's ItemGenerator's container generation cycle (only need one round) //and update the app to busy/available based on container generation status. remove handler once cycle over. private void ChannelSettingsListListView_OnStatusChanged(object sender, EventArgs e) { if (((ItemContainerGenerator)sender).Status == GeneratorStatus.GeneratingContainers) { if (!(DataContext is IGroupChannelListViewModel vm)) { return; } vm.SettingChannelsLoaded = false; } if (((ItemContainerGenerator)sender).Status == GeneratorStatus.ContainersGenerated || ((ItemContainerGenerator)sender).Status == GeneratorStatus.Error) { _statusHandled = false; ChannelSettingsListListView.ItemContainerGenerator.StatusChanged -= ChannelSettingsListListView_OnStatusChanged; if (!(DataContext is IGroupChannelListViewModel vm)) { return; } vm.SettingChannelsLoaded = true; } } private bool _statusHandled; //signify that we're already handling the ItemGenerator.StatusChanged event. Reset is called multiple times private void ChannelSettingsListListView_OnItemsChanged(object sender, ItemsChangedEventArgs e) { if (e.Action == NotifyCollectionChangedAction.Reset && !_statusHandled) { _statusHandled = true; ChannelSettingsListListView.ItemContainerGenerator.StatusChanged += ChannelSettingsListListView_OnStatusChanged; } } /// /// handles hyper link clicks, specifically for a sensor ... /// 15125 Navigate to selected sensor from run test diagnostics /// private void Hyperlink_Click(object sender, RoutedEventArgs e) { if (!(DataContext is GroupChannelListViewModel vm)) { return; } if (!(sender is Hyperlink hl)) { return; } if (!(hl.DataContext is DTS.Common.Classes.Groups.GroupChannel groupChannel)) { return; } var eventAggregator = ContainerLocator.Container.Resolve(); eventAggregator.GetEvent().Publish(new PageNavigationRequest( PageNavigationRequest.Destinations.Sensor, groupChannel, vm)); } /// /// called when the range low g combobox loses focus, this is used to indicate /// that all low g channels should switch to the new range (on the same das) /// /// /// private void RangeLowG_LostFocus(object sender, RoutedEventArgs e) { if (!(DataContext is GroupChannelListViewModel vm)) { return; } if (!(sender is Control control)) { return; } if (!(control.DataContext is DTS.Common.Classes.Groups.GroupChannel groupChannel)) { return; } vm.UpdateRangeLowG(groupChannel); } /// /// called when range ars combobox loses focus, this is used to indicate /// that all ars channels should switch to the new range (on the same das) /// /// /// private void RangeARS_LostFocus(object sender, RoutedEventArgs e) { if (!(DataContext is GroupChannelListViewModel vm)) { return; } if (!(sender is Control control)) { return; } if (!(control.DataContext is DTS.Common.Classes.Groups.GroupChannel groupChannel)) { return; } vm.UpdateRangeARS(groupChannel); } //http://manuscript.dts.local/f/cases/29760/Implement-ACCoupleEnable-for-TSR-AIR //user clicked on ac coupling enabled checkbox, update all the rest of the low g checkboxes with the //checkbox state private void ACCouplingEnable_Click(object sender, RoutedEventArgs e) { if (!(DataContext is GroupChannelListViewModel vm)) { return; } if (!(sender is Control control)) { return; } if (!(control.DataContext is DTS.Common.Classes.Groups.GroupChannel groupChannel)) { return; } vm.UpdateACCouplingEnabled(groupChannel); } private void TMATSIntervalON_Click(object sender, RoutedEventArgs e) { if (!(DataContext is GroupChannelListViewModel vm)) { return; } if (!(sender is CheckBox cb)) { return; } if (!(cb.DataContext is DTS.Common.Classes.Groups.GroupChannel groupChannel)) { return; } if ((bool)cb.IsChecked && groupChannel.StreamOutTMATSIntervalMs < 1) { groupChannel.StreamOutTMATSIntervalMs = StreamOutputRecord.DEFAULT_IRIG_TIME_DATA_PACKET_INTERVAL_MS; } else if (!(bool)cb.IsChecked && groupChannel.StreamOutTMATSIntervalMs >= 1) { groupChannel.StreamOutTMATSIntervalMs = 0; } } private void TimePacketIntervalOn_Click(object sender, RoutedEventArgs e) { if (!(DataContext is GroupChannelListViewModel vm)) { return; } if (!(sender is CheckBox cb)) { return; } if (!(cb.DataContext is DTS.Common.Classes.Groups.GroupChannel groupChannel)) { return; } if ((bool)cb.IsChecked && groupChannel.StreamOutIRIGTimeDataPacketIntervalMs < 1) { groupChannel.StreamOutIRIGTimeDataPacketIntervalMs = StreamOutputRecord.DEFAULT_TMATS_INTERVAL_MS; } else if (!(bool)cb.IsChecked && groupChannel.StreamOutIRIGTimeDataPacketIntervalMs >= 1) { groupChannel.StreamOutIRIGTimeDataPacketIntervalMs = 0; } } } }