Files
DP44/DataPRO/Modules/Groups/GroupChannelList/View/GroupChannelSettingsListView.xaml.cs

1169 lines
50 KiB
C#
Raw Normal View History

2026-04-17 14:55:32 -04:00
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
{
/// <inheritdoc cref="IGroupChannelSettingsListView" />
/// <summary>
/// Interaction logic for GroupChannelListView.xaml
/// </summary>
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;
}
/// <summary>
/// sets whether to use test setup or group order column
/// </summary>
/// <param name="bUseTestSetupOrder"></param>
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);
}
}
/// <summary>
/// sets whether to show User Value X columns
/// </summary>
/// <param name="bUseTestSetupOrder"></param>
public void SetDisplayOptions(bool bShowSensorChannelUserValues)
{
if (!(ChannelSettingsListListView.View is AutoSizedGridView view))
{
return;
}
ShowSensorChannelUserValues = bShowSensorChannelUserValues;
}
private bool _GCAC_Visibility = true;
/// <summary>
/// controls the visibility of GCAC controls
/// is only really relevant to this view
/// </summary>
public bool GCAC_Visibility
{
get => _GCAC_Visibility;
set
{
_GCAC_Visibility = value;
OnPropertyChanged("GCAC_Visibility");
}
}
private bool _showSensorChannelUserValues = false;
/// <summary>
/// controls the visibility of the UserValue1, UserValue2, and UserValue3 columns
/// </summary>
public bool ShowSensorChannelUserValues
{
get => _showSensorChannelUserValues;
set
{
_showSensorChannelUserValues = value;
OnPropertyChanged("ShowSensorChannelUserValues");
}
}
/// <summary>
/// adds columns relevant to an analog sensor type (range/capacity/polarity/CFC/Sensitivity/Units)
/// </summary>
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); }
}
}
/// <summary>
/// removes any analog channels from the view
/// </summary>
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);
}
}
/// <summary>
/// adds squib columns to the view
/// </summary>
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); }
}
/// <summary>
/// removes squib columns from the view
/// </summary>
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); }
}
/// <summary>
/// adds digital output columns to the view
/// </summary>
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); }
}
/// <summary>
/// removes digital output columns from the view
/// </summary>
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); }
}
/// <summary>
/// adds digital input columns to the view
/// </summary>
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); }
}
/// <summary>
/// removes digital columns from the view
/// </summary>
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); }
}
/// <summary>
/// adds uart columns to the view
/// </summary>
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); }
}
/// <summary>
/// removes uart columns from the view
/// </summary>
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); }
}
/// <summary>
/// adds stream out columns to the view
/// </summary>
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); }
}
/// <summary>
/// removes stream out columns from the view
/// </summary>
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); }
}
/// <summary>
/// adds stream out columns to the view
/// </summary>
private void AddStreamInColumns()
{
if (!(ChannelSettingsListListView.View is AutoSizedGridView view))
{
return;
}
if (!view.Columns.Contains(StreamInUDPAddressColumn)) { view.Columns.Add(StreamInUDPAddressColumn); }
}
/// <summary>
/// removes stream out columns from the view
/// </summary>
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); }
}
/// <summary>
/// returns the version of the currently connected database
/// </summary>
public int DbVersion
{
get => DTS.Common.Storage.DbOperations.GetConnectionDbVersion();
}
/// <summary>
/// sets the view to only display channels of a certain sensor type
/// </summary>
/// <param name="mode"></param>
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<T>(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
/// <summary>
/// handles when a user clicks on the search portion of the grid view column header
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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;
/// <summary>
/// sets the view to only display columns relevant to the isoviewmode provided
/// </summary>
/// <param name="viewMode"></param>
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;
}
/// <summary>
/// adds user and isocode columns to the view
/// </summary>
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);
}
}
/// <summary>
/// adds iso columns to the view
/// </summary>
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);
}
}
/// <summary>
/// removes isocode columns from the view
/// </summary>
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);
}
/// <summary>
/// removes usercode columns from the view
/// </summary>
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);
}
}
/// <summary>
/// adds usercode columns to the view
/// </summary>
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);
}
}
/// <summary>
/// Removes UserValueX columns from the view
/// </summary>
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);
}
}
/// <summary>
/// Adds UserValueX columns to the view
/// </summary>
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);
}
}
/// <summary>
/// The list of valid range values for TSR AIR LowG channels
/// </summary>
public SensorConstants.AvailableRangesLowG[] AvailableRangesLowG { get; } = new[] { SensorConstants.AvailableRangesLowG.LowG64D};
/// <summary>
/// The list of valid range values for TSR AIR ARS channels
/// </summary>
public double[] AvailableRangesARS { get; } = new[] { Convert.ToDouble(SensorConstants.AvailableRangesARS.ARS2000D)};
/// <summary>
/// FB 13120 available Filter Classes for Filter dropdowns
/// </summary>
public List<IFilterClass> AvailableCFC
{
get
{
return new AnalogSettingDefaults().FilterOptions;
}
}
/// <summary>
/// available polarity for polarity dropdowns
/// </summary>
public string[] AvailablePolarity { get; } = new[] { "+", "-" };
/// <summary>
/// available zero method types for zeromethod dropdowns
/// </summary>
public ZeroMethodType[] AvailableZeroMethod { get; } = new[]
{
ZeroMethodType.AverageOverTime,
ZeroMethodType.UsePreEventDiagnosticsZero,
ZeroMethodType.None
};
/// <summary>
/// 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
/// </summary>
public ZeroMethodType[] AvailableZeroMethodEmbeddedSensor { get; } = new[]
{
ZeroMethodType.None,
ZeroMethodType.AverageOverTime,
ZeroMethodType.UsePreEventDiagnosticsZero,
};
/// <summary>
/// available digital input modes for digital input mode dropdowns
/// </summary>
public DigitalInputModes[] AvailableDigitalInputModes { get; } = new[]
{
DigitalInputModes.CCNC, DigitalInputModes.CCNO, DigitalInputModes.THL, DigitalInputModes.TLH
};
/// <summary>
/// available squib fire modes for squib fire mode dropdowns
/// </summary>
public SquibFireMode[] AvailableSquibFireModes { get; } = new[]
{
SquibFireMode.CAP, SquibFireMode.CONSTANT
};
/// <summary>
/// available digital output modes for digital output mode dropdowns
/// </summary>
public DigitalOutputModes[] AvailableDigitalOutputModes { get; } = new[]
{
DigitalOutputModes.CCNC, DigitalOutputModes.CCNO, DigitalOutputModes.FVHL, DigitalOutputModes.FVLH
};
/// <summary>
/// available uart stop bits for uart stop bits dropdowns
/// </summary>
public StopBits[] AvailableUartStopBits { get; } = new[]
{
StopBits.None, StopBits.One, StopBits.OnePointFive, StopBits.Two
};
/// <summary>
/// available uart parities for uart parities dropdowns
/// </summary>
public Parity[] AvailableUartParities { get; } = new[]
{
Parity.None, Parity.Odd, Parity.Even, Parity.Mark, Parity.Space
};
/// <summary>
/// available uart flow controls for uart flow controls dropdowns
/// </summary>
public Handshake[] AvailableUartFlowControls { get; } = new[]
{
Handshake.None, Handshake.XOnXOff, Handshake.RequestToSend, Handshake.RequestToSendXOnXOff
};
/// <summary>
/// available uart data formats for uart data formats dropdowns
/// </summary>
public UartDataFormat[] AvailableUartDataFormats { get; } = new[]
{
UartDataFormat.Binary, UartDataFormat.PlainText, UartDataFormat.NMEA
};
/// <summary>
/// available udp stream profiles for stream profiles dropdowns
/// </summary>
public UDPStreamProfile[] AvailableStreamOutUDPProfiles
{
get
{
if (!(DataContext is IGroupChannelListViewModel vm)) { return new UDPStreamProfile[] { }; }
return StreamOutputRecord.AvailableUDPStreamProfiles(ViewDbVersion, StreamOutputSettingDefaults.GetStreamOutputSettingsDefault(vm.UserID).UseAdvancedUDPStreamProfiles);
}
}
/// <summary>
/// available global channel amplitude class options for GCAC dropdowns
/// </summary>
public CACOption[] GlobalCACOptions { get; } = new[]
{
CACOption.Manual, CACOption.Capacity, CACOption.RangeHigh, CACOption.RangeMedium, CACOption.RangeLow
};
private CACOption _selectedGlobalRangeCACOption = CACOption.Manual;
/// <summary>
/// the selected GCAC mode
/// this is used by the apply button to make adjustments to the range for analog channels
/// </summary>
public CACOption SelectedGlobalRangeCACOption
{
get => _selectedGlobalRangeCACOption;
set
{
_selectedGlobalRangeCACOption = value;
OnPropertyChanged("SelectedGlobalRangeCACOption");
}
}
/// <summary>
/// handler for analog radio button click
/// informs the viewmodel to filter
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Analog_Click(object sender, RoutedEventArgs e)
{
if (!(DataContext is IGroupChannelListViewModel vm)) { return; }
vm.Filter(PossibleFilters.Analog);
SetFilterMode(PossibleFilters.Analog);
}
/// <summary>
/// sets the vm to display squibs
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Squib_Click(object sender, RoutedEventArgs e)
{
if (!(DataContext is IGroupChannelListViewModel vm)) { return; }
vm.Filter(PossibleFilters.Squib);
SetFilterMode(PossibleFilters.Squib);
}
/// <summary>
/// sets the vm to display digital outputs
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DigitalOut_Click(object sender, RoutedEventArgs e)
{
if (!(DataContext is IGroupChannelListViewModel vm)) { return; }
vm.Filter(PossibleFilters.DigitalOut);
SetFilterMode(PossibleFilters.DigitalOut);
}
/// <summary>
/// sets the vm to display digital inputs
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DigitalIn_Click(object sender, RoutedEventArgs e)
{
if (!(DataContext is IGroupChannelListViewModel vm)) { return; }
vm.Filter(PossibleFilters.DigitalIn);
SetFilterMode(PossibleFilters.DigitalIn);
}
/// <summary>
/// sets the vm to display uarts
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Uart_Click(object sender, RoutedEventArgs e)
{
if (!(DataContext is IGroupChannelListViewModel vm)) { return; }
vm.Filter(PossibleFilters.UART);
SetFilterMode(PossibleFilters.UART);
}
/// <summary>
/// sets the vm to display stream outputs
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void StreamOut_Click(object sender, RoutedEventArgs e)
{
if (!(DataContext is IGroupChannelListViewModel vm)) { return; }
vm.Filter(PossibleFilters.StreamOut);
SetFilterMode(PossibleFilters.StreamOut);
}
/// <summary>
/// sets the vm to display stream inputs
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
/// <summary>
/// sets the range for all analog channels to relevant range to the GCAC
/// (global channel amplitude class)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnGlobalRangeApply_Click(object sender, RoutedEventArgs e)
{
if (!(DataContext is IGroupChannelListViewModel vm)) { return; }
vm.SetRange(SelectedGlobalRangeCACOption);
}
/// <summary>
/// sorts the columns on click of a column
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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<GridViewColumnHeaderSearchable>((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;
}
}
/// <summary>
/// handles hyper link clicks, specifically for a sensor ...
/// 15125 Navigate to selected sensor from run test diagnostics
/// </summary>
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<IEventAggregator>();
eventAggregator.GetEvent<PageNavigationRequestEvent>().Publish(new PageNavigationRequest(
PageNavigationRequest.Destinations.Sensor,
groupChannel,
vm));
}
/// <summary>
/// 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)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
/// <summary>
/// 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)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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;
}
}
}
}