3168 lines
143 KiB
C#
3168 lines
143 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Collections.ObjectModel;
|
|||
|
|
using System.ComponentModel;
|
|||
|
|
using System.ComponentModel.Composition;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
using System.Windows.Input;
|
|||
|
|
using DTS.Common.Classes.Groups;
|
|||
|
|
using DTS.Common.Enums;
|
|||
|
|
using DTS.Common.Enums.Sensors;
|
|||
|
|
using DTS.Common.Events;
|
|||
|
|
using DTS.Common.Events.Groups.GroupChannelList;
|
|||
|
|
using DTS.Common.Interface.Channels;
|
|||
|
|
using DTS.Common.Interface.Channels.ChannelCodes;
|
|||
|
|
using DTS.Common.Interface.Groups.GroupChannelList;
|
|||
|
|
using DTS.Common.Interface.Groups.GroupList;
|
|||
|
|
using DTS.Common.Interface.Sensors.SensorsList;
|
|||
|
|
using DTS.Common.Interface.Sensors;
|
|||
|
|
using DTS.Common.Interface.DataRecorders;
|
|||
|
|
using DTS.Common.Interface.TestSetups.TestSetupsList;
|
|||
|
|
using Prism.Ioc;
|
|||
|
|
using DTS.Common.Storage;
|
|||
|
|
using DTS.Common.Enums.Sensors.SensorsList;
|
|||
|
|
using System.Collections.Specialized;
|
|||
|
|
using DTS.Common.Converters;
|
|||
|
|
using DTS.Common.Enums.Hardware;
|
|||
|
|
using Prism.Events;
|
|||
|
|
using DTS.Common.Interactivity;
|
|||
|
|
using Unity;
|
|||
|
|
using Prism.Regions;
|
|||
|
|
using Prism.Commands;
|
|||
|
|
|
|||
|
|
// ReSharper disable CheckNamespace
|
|||
|
|
// ReSharper disable MemberCanBePrivate.Global
|
|||
|
|
// ReSharper disable InconsistentNaming
|
|||
|
|
|
|||
|
|
namespace GroupChannelList
|
|||
|
|
{
|
|||
|
|
/// <inheritdoc />
|
|||
|
|
/// <summary>
|
|||
|
|
/// this class handles GroupChannelList functionality
|
|||
|
|
/// </summary>
|
|||
|
|
[PartCreationPolicy(CreationPolicy.Shared)]
|
|||
|
|
public class GroupChannelListViewModel : IGroupChannelListViewModel
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// The GroupChannelList view
|
|||
|
|
/// </summary>
|
|||
|
|
public IGroupChannelListView View { get; set; }
|
|||
|
|
public IGroupChannelSettingsListView SettingsView { get; set; }
|
|||
|
|
|
|||
|
|
private IEventAggregator _eventAggregator { get; }
|
|||
|
|
private IUnityContainer UnityContainer { get; }
|
|||
|
|
|
|||
|
|
public InteractionRequest<Notification> NotificationRequest { get; }
|
|||
|
|
public InteractionRequest<Confirmation> ConfirmationRequest { get; }
|
|||
|
|
|
|||
|
|
/// <inheritdoc />
|
|||
|
|
/// <summary>
|
|||
|
|
/// Occurs when a property value changes.
|
|||
|
|
/// </summary>
|
|||
|
|
public event PropertyChangedEventHandler PropertyChanged;
|
|||
|
|
|
|||
|
|
public void OnPropertyChanged(string propertyName)
|
|||
|
|
{
|
|||
|
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
|||
|
|
if (propertyName == "ChannelCount")
|
|||
|
|
{
|
|||
|
|
_eventAggregator.GetEvent<GroupChannelsChangedEvent>()
|
|||
|
|
.Publish(new GroupChannelsChangedEventArgs(Group, ChannelCount));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#region constructors and initializers
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Creates a new instance of the GroupChannelListViewModel
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="view"></param>
|
|||
|
|
/// <param name="regionManager">The logical placeholder defined within the application's UI (in the shell or within views) into which views are displayed.</param>
|
|||
|
|
/// <param name="eventAggregator">The EventAggregator which allows different components to publish/subscribe to events without being coupled to each other.</param>
|
|||
|
|
/// <param name="unityContainer">The unityContainer.</param>
|
|||
|
|
/// <param name="settingsView"></param>
|
|||
|
|
public GroupChannelListViewModel(IGroupChannelListView view, IGroupChannelSettingsListView settingsView, IRegionManager regionManager,
|
|||
|
|
IEventAggregator eventAggregator, IUnityContainer unityContainer)
|
|||
|
|
{
|
|||
|
|
ChannelCodesFunc = new Func<IList<IChannelCode>>(GetAllChannels);
|
|||
|
|
View = view;
|
|||
|
|
View.DataContext = this;
|
|||
|
|
|
|||
|
|
SettingsView = settingsView;
|
|||
|
|
SettingsView.DataContext = this;
|
|||
|
|
|
|||
|
|
NotificationRequest = new InteractionRequest<Notification>();
|
|||
|
|
ConfirmationRequest = new InteractionRequest<Confirmation>();
|
|||
|
|
|
|||
|
|
_eventAggregator = eventAggregator;
|
|||
|
|
UnityContainer = unityContainer;
|
|||
|
|
_eventAggregator.GetEvent<RaiseNotification>().Subscribe(OnRaiseNotification);
|
|||
|
|
_eventAggregator.GetEvent<BusyIndicatorChangeNotification>()
|
|||
|
|
.Subscribe(OnBusyIndicatorNotification, ThreadOption.PublisherThread, true);
|
|||
|
|
_eventAggregator.GetEvent<TextPastedEvent>().Subscribe(OnTextPasted);
|
|||
|
|
SelectedChannelItems = new ObservableCollection<IGroupChannel>();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region Methods
|
|||
|
|
/// <summary>
|
|||
|
|
/// updates all the low g channels on the given das to the range on the channel in the parameters
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="channelChanged"></param>
|
|||
|
|
public void UpdateRangeLowG(IGroupChannel channelChanged)
|
|||
|
|
{
|
|||
|
|
foreach (var channel in Channels)
|
|||
|
|
{
|
|||
|
|
if (channel.Equals(channelChanged)) { continue; }
|
|||
|
|
if (channel.DASId != channelChanged.DASId) { continue; }
|
|||
|
|
if (channel.RangeModifiableSensorLowG)
|
|||
|
|
{
|
|||
|
|
channel.RangeLowG = channelChanged.RangeLowG;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// updates all the ars channels on the given das to the range on the channel in the parameters
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="channelChanged"></param>
|
|||
|
|
public void UpdateRangeARS(IGroupChannel channelChanged)
|
|||
|
|
{
|
|||
|
|
foreach (var channel in Channels)
|
|||
|
|
{
|
|||
|
|
if (channel.Equals(channelChanged)) { continue; }
|
|||
|
|
if (channel.DASId != channelChanged.DASId) { continue; }
|
|||
|
|
if (channel.RangeModifiableSensorARS)
|
|||
|
|
{
|
|||
|
|
channel.Range = channelChanged.Range;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// updates the state of all other channels on DAS with AC coupling mode enabled
|
|||
|
|
/// http://manuscript.dts.local/f/cases/29760/Implement-ACCoupleEnable-for-TSR-AIR
|
|||
|
|
/// </summary>
|
|||
|
|
public void UpdateACCouplingEnabled(IGroupChannel channelChanged)
|
|||
|
|
{
|
|||
|
|
foreach (var channel in Channels)
|
|||
|
|
{
|
|||
|
|
if (channel.Equals(channelChanged)) { continue; }
|
|||
|
|
if (channel.DASId != channelChanged.DASId) { continue; }
|
|||
|
|
if (channel is GroupChannel gc)
|
|||
|
|
{
|
|||
|
|
gc.ACCouplingEnabled = ((GroupChannel)channelChanged).ACCouplingEnabled;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private IEnumerable<IGroupChannel> ParseText(string text, object tag, out bool oneColumn)
|
|||
|
|
{
|
|||
|
|
oneColumn = false;
|
|||
|
|
var channelDefaults = GetChannelSettingDefaults();
|
|||
|
|
var list = new List<IGroupChannel>();
|
|||
|
|
var errors = new List<string>();
|
|||
|
|
var lines = text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
|
|||
|
|
for (var i = 0; i < lines.Length; i++)
|
|||
|
|
{
|
|||
|
|
var line = lines[i];
|
|||
|
|
if (string.IsNullOrWhiteSpace(line))
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var tokens = line.Split(',');
|
|||
|
|
if (tokens.Length < 2)
|
|||
|
|
{
|
|||
|
|
tokens = line.Split('\t');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (tokens.Length < 2)
|
|||
|
|
{
|
|||
|
|
tokens = line.Split(';');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
IGroupChannel newGroupChannel = null;
|
|||
|
|
|
|||
|
|
var groupName = string.Empty;
|
|||
|
|
var isoCode = string.Empty;
|
|||
|
|
var isoChannelName = string.Empty;
|
|||
|
|
var userCode = string.Empty;
|
|||
|
|
var userChannelName = string.Empty;
|
|||
|
|
var sensorRef = string.Empty;
|
|||
|
|
var hardwareRef = string.Empty;
|
|||
|
|
var groupNameValid = false;
|
|||
|
|
var isoCodeValid = false;
|
|||
|
|
var isoChannelNameValid = false;
|
|||
|
|
var userCodeValid = false;
|
|||
|
|
var userChannelNameValid = false;
|
|||
|
|
var tagField = Fields.GroupName;
|
|||
|
|
switch ((string)tag)
|
|||
|
|
{
|
|||
|
|
case "GroupName":
|
|||
|
|
tagField = Fields.GroupName;
|
|||
|
|
break;
|
|||
|
|
case "ISOCode":
|
|||
|
|
tagField = Fields.ISOCode;
|
|||
|
|
break;
|
|||
|
|
case "UserCode":
|
|||
|
|
tagField = Fields.UserCode;
|
|||
|
|
break;
|
|||
|
|
case "UserChannelName":
|
|||
|
|
case "ChannelName":
|
|||
|
|
tagField = Fields.UserChannelName;
|
|||
|
|
break;
|
|||
|
|
case "ISOChannelName":
|
|||
|
|
tagField = Fields.ISOChannelName;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if (tokens.Length == 1)
|
|||
|
|
{
|
|||
|
|
oneColumn = true;
|
|||
|
|
switch (tagField)
|
|||
|
|
{
|
|||
|
|
case Fields.GroupName:
|
|||
|
|
groupNameValid = true;
|
|||
|
|
groupName = tokens[0];
|
|||
|
|
break;
|
|||
|
|
case Fields.UserCode:
|
|||
|
|
userCodeValid = true;
|
|||
|
|
userCode = tokens[0];
|
|||
|
|
break;
|
|||
|
|
case Fields.UserChannelName:
|
|||
|
|
userChannelName = tokens[0];
|
|||
|
|
userChannelNameValid = true;
|
|||
|
|
break;
|
|||
|
|
case Fields.ISOCode:
|
|||
|
|
isoCode = tokens[0];
|
|||
|
|
isoCodeValid = true;
|
|||
|
|
break;
|
|||
|
|
case Fields.ISOChannelName:
|
|||
|
|
isoChannelName = tokens[0];
|
|||
|
|
isoChannelNameValid = true;
|
|||
|
|
break;
|
|||
|
|
case Fields.Sensor:
|
|||
|
|
sensorRef = tokens[0];
|
|||
|
|
break;
|
|||
|
|
case Fields.Hardware:
|
|||
|
|
hardwareRef = tokens[0];
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
var columns = GetColumns();
|
|||
|
|
|
|||
|
|
if (tokens.Length > columns.Length)
|
|||
|
|
{
|
|||
|
|
errors.Add(string.Format(Resources.StringResources.InvalidLine, line));
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (var idx = 0; idx < tokens.Length; idx++)
|
|||
|
|
{
|
|||
|
|
var token = tokens[idx];
|
|||
|
|
var column = columns[idx];
|
|||
|
|
if (tokens.Length != columns.Length)
|
|||
|
|
{
|
|||
|
|
var startIndex = columns.ToList().IndexOf(tagField);
|
|||
|
|
var columnIndex = startIndex + idx;
|
|||
|
|
if (columnIndex < columns.Length)
|
|||
|
|
{
|
|||
|
|
column = columns[columnIndex];
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
switch (column)
|
|||
|
|
{
|
|||
|
|
case Fields.GroupName:
|
|||
|
|
groupName = token;
|
|||
|
|
groupNameValid = true;
|
|||
|
|
break;
|
|||
|
|
case Fields.UserCode:
|
|||
|
|
userCode = token;
|
|||
|
|
userCodeValid = true;
|
|||
|
|
break;
|
|||
|
|
case Fields.UserChannelName:
|
|||
|
|
userChannelName = token;
|
|||
|
|
userChannelNameValid = true;
|
|||
|
|
break;
|
|||
|
|
case Fields.ISOCode:
|
|||
|
|
isoCode = token;
|
|||
|
|
isoCodeValid = true;
|
|||
|
|
break;
|
|||
|
|
case Fields.ISOChannelName:
|
|||
|
|
isoChannelName = token;
|
|||
|
|
isoChannelNameValid = true;
|
|||
|
|
break;
|
|||
|
|
case Fields.Sensor:
|
|||
|
|
sensorRef = token;
|
|||
|
|
break;
|
|||
|
|
case Fields.Hardware:
|
|||
|
|
hardwareRef = token;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (UseTestSetupOrder && string.IsNullOrWhiteSpace(groupName))
|
|||
|
|
{
|
|||
|
|
groupName = Resources.StringResources.TestChannelsGroupName;
|
|||
|
|
}
|
|||
|
|
if (UseTestSetupOrder && !string.IsNullOrWhiteSpace(groupName))
|
|||
|
|
{
|
|||
|
|
//create group if needed
|
|||
|
|
var group = CreateGroupIfNeeded(groupName);
|
|||
|
|
newGroupChannel = new GroupChannel(true, groupName, group, channelDefaults);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
newGroupChannel = new GroupChannel(false, Group?.DisplayName ?? "", Group, channelDefaults);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
isoCode = isoCode.Trim();
|
|||
|
|
if (isoCode.Length > 16)
|
|||
|
|
{
|
|||
|
|
isoCode = isoCode.Substring(0, 16);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
newGroupChannel.IsoCode = isoCode;
|
|||
|
|
newGroupChannel.IsoChannelName = isoChannelName.Trim();
|
|||
|
|
newGroupChannel.UserChannelName = userChannelName.Trim();
|
|||
|
|
newGroupChannel.UserCode = userCode;
|
|||
|
|
newGroupChannel.GroupNameValid = groupNameValid;
|
|||
|
|
newGroupChannel.IsoCodeValid = isoCodeValid;
|
|||
|
|
newGroupChannel.IsoChannelNameValid = isoChannelNameValid;
|
|||
|
|
newGroupChannel.UserCodeValid = userCodeValid;
|
|||
|
|
newGroupChannel.UserChannelNameValid = userChannelNameValid;
|
|||
|
|
sensorRef = sensorRef.Trim();
|
|||
|
|
hardwareRef = hardwareRef.Trim();
|
|||
|
|
|
|||
|
|
if (!string.IsNullOrWhiteSpace(sensorRef))
|
|||
|
|
{
|
|||
|
|
if (_serialNumberToSensorDictionary.ContainsKey(sensorRef))
|
|||
|
|
{
|
|||
|
|
var sd = _serialNumberToSensorDictionary[sensorRef];
|
|||
|
|
newGroupChannel.SensorId = sd.DatabaseId;
|
|||
|
|
((GroupChannel)newGroupChannel).SetSensorData(sd, null, true);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (int.TryParse(sensorRef, out var id))
|
|||
|
|
{
|
|||
|
|
if (_idToSensorDictionary.ContainsKey(id))
|
|||
|
|
{
|
|||
|
|
var sd = _idToSensorDictionary[id];
|
|||
|
|
newGroupChannel.SensorId = sd.DatabaseId;
|
|||
|
|
((GroupChannel)newGroupChannel).SetSensorData(sd, null, true);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
errors.Add(string.Format(Resources.StringResources.InvalidSensor, line));
|
|||
|
|
//continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
errors.Add(string.Format(Resources.StringResources.InvalidSensor, line));
|
|||
|
|
//continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!string.IsNullOrWhiteSpace(hardwareRef))
|
|||
|
|
{
|
|||
|
|
if (_displayToHardwareChannel.ContainsKey(hardwareRef))
|
|||
|
|
{
|
|||
|
|
newGroupChannel.SetHardwareChannel(_displayToHardwareChannel[hardwareRef]);
|
|||
|
|
if (TestSetup == null)
|
|||
|
|
{
|
|||
|
|
newGroupChannel.TestSampleRate = 0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
newGroupChannel.TestSampleRate = TestSetup.DASSampleRateList[newGroupChannel.HardwareChannel.GetParentDAS().SerialNumber];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
list.Add(newGroupChannel);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (errors.Any())
|
|||
|
|
{
|
|||
|
|
var eventAggregator = ContainerLocator.Container.Resolve<IEventAggregator>();
|
|||
|
|
eventAggregator.GetEvent<PageErrorEvent>().Publish(new PageErrorArg(errors.ToArray(), Page));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return list.ToArray();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public IGroup CreateGroupIfNeeded(ITestSetup testSetup, string groupName)
|
|||
|
|
{
|
|||
|
|
return GroupList.Model.Group.CreateGroupIfNeeded(testSetup, groupName);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private IGroup CreateGroupIfNeeded(string groupName)
|
|||
|
|
{
|
|||
|
|
return GroupList.Model.Group.CreateGroupIfNeeded(TestSetup, groupName);
|
|||
|
|
}
|
|||
|
|
private void OnTextPasted(ITextPastedEventArgs args)
|
|||
|
|
{
|
|||
|
|
if (args.Id != GroupChannel.PASTE_ID) { return; }
|
|||
|
|
|
|||
|
|
var tag = args.Tag;
|
|||
|
|
if (!(args.Sender is IGroupChannel groupChannel))
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var groupChannels = ParseText(args.Text, tag, out var oneColumn);
|
|||
|
|
int index = AllChannels.IndexOf((IGroupChannel)args.Sender);
|
|||
|
|
IGroupChannel last = null;
|
|||
|
|
if (AllChannels.Any())
|
|||
|
|
{
|
|||
|
|
last = AllChannels.Last();
|
|||
|
|
AllChannels.Remove(last);
|
|||
|
|
last.IsoChannelName = "";
|
|||
|
|
last.IsoCode = "";
|
|||
|
|
last.UserCode = "";
|
|||
|
|
last.UserChannelName = "";
|
|||
|
|
}
|
|||
|
|
foreach (var code in groupChannels)
|
|||
|
|
{
|
|||
|
|
if (index < AllChannels.Count && index >= 0)
|
|||
|
|
{
|
|||
|
|
var ch = AllChannels[index++];
|
|||
|
|
if (ch.Group != code.Group && code.GroupNameValid)
|
|||
|
|
{
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
var list = TestSetup.ChannelsForGroup[ch.Group].ToList();
|
|||
|
|
list.Remove(ch);
|
|||
|
|
TestSetup.ChannelsForGroup[ch.Group] = list.ToArray();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
ch.Copy(code);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
index++;
|
|||
|
|
AllChannels.Add(code);
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
var list = TestSetup.ChannelsForGroup[code.Group].ToList();
|
|||
|
|
list.Add(code);
|
|||
|
|
TestSetup.ChannelsForGroup[code.Group] = list.ToArray();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (var i = 0; i < AllChannels.Count; i++)
|
|||
|
|
{
|
|||
|
|
if (AllChannels[i].IsBlank()) { continue; }
|
|||
|
|
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
AllChannels[i].TestSetupOrder = 1 + i;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AllChannels[i].GroupChannelOrder = 1 + i;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (null != last)
|
|||
|
|
{
|
|||
|
|
AllChannels.Add(last);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Filter(SearchTerm);
|
|||
|
|
_eventAggregator.GetEvent<PageModifiedEvent>()
|
|||
|
|
.Publish(new PageModifiedArg(PageModifiedArg.Status.Modified, Page));
|
|||
|
|
OnPropertyChanged("ChannelCount");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void DoSensorAssignment(IGroupChannel groupChannel, IDragAndDropItem[] sensors)
|
|||
|
|
{
|
|||
|
|
var index = Channels.IndexOf(groupChannel);
|
|||
|
|
int i = 0;
|
|||
|
|
var defaults = GetChannelSettingDefaults();
|
|||
|
|
for (i = 0; i < sensors.Length && (index + i + 1) < Channels.Count; i++)
|
|||
|
|
{
|
|||
|
|
var channel = Channels[index + i];
|
|||
|
|
if (null != channel.HardwareChannel && channel.HardwareChannel.IsTSRAIR && !channel.HardwareChannel.IsStreamOut && !channel.HardwareChannel.IsUart)
|
|||
|
|
{
|
|||
|
|
//refuse assignment to a channel that has TSR AIR hardware, the sensor is hard wired to the channel [for now, may need to revisit when
|
|||
|
|
//or if there are external sensors]
|
|||
|
|
//18270 User should not be allowed to assign different sensors or hardware to TSR AIR channels
|
|||
|
|
//27002 (except for Stream Output)
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
channel.SetSensor(sensors[i], defaults, ApplySensorDataToBlankChannels);
|
|||
|
|
channel.BorderShouldShowOutOfDate = AllowSensorPushAndPull;
|
|||
|
|
|
|||
|
|
//36718 Handle sensors both with and without a value in the Name field
|
|||
|
|
if (channel.SensorData == null && channel.Sensor != null)
|
|||
|
|
{
|
|||
|
|
var dictionaryKey = GetSensorSerialNumber(channel.Sensor);
|
|||
|
|
if (dictionaryKey != null)
|
|||
|
|
{
|
|||
|
|
if (_serialNumberToSensorDictionary.ContainsKey(dictionaryKey))
|
|||
|
|
{
|
|||
|
|
var sd = _serialNumberToSensorDictionary[dictionaryKey];
|
|||
|
|
channel.SetSensorData(sd, null, ApplySensorDataToBlankChannels);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (!_dontFilterList.Contains(channel))
|
|||
|
|
{
|
|||
|
|
_dontFilterList.Add(channel);
|
|||
|
|
}
|
|||
|
|
if (null == channel.Group)
|
|||
|
|
{
|
|||
|
|
var group = Group;
|
|||
|
|
if (null == group)
|
|||
|
|
{
|
|||
|
|
group = CreateGroupIfNeeded(Resources.StringResources.TestChannelsGroupName);
|
|||
|
|
}
|
|||
|
|
channel.Group = group;
|
|||
|
|
channel.GroupName = group.DisplayName;
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
var channels = TestSetup.ChannelsForGroup[group].ToList();
|
|||
|
|
channels.Add(channel);
|
|||
|
|
TestSetup.ChannelsForGroup[group] = channels.ToArray();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
MarkModified(channel, false);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (i < sensors.Length)
|
|||
|
|
{
|
|||
|
|
var list = new List<IDragAndDropItem>();
|
|||
|
|
for (; i < sensors.Length; i++)
|
|||
|
|
{
|
|||
|
|
list.Add(sensors[i]);
|
|||
|
|
}
|
|||
|
|
AddChannels(list.ToArray());
|
|||
|
|
}
|
|||
|
|
NotifyChannelsChanged();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// A channel's Sensor string may contain either simply the Serial Number (if there is no Name), for example SG1,
|
|||
|
|
/// or the Name followed by the Serial Number in parentheses, for example "strain gauge 1 (SG1)".
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="channelSensor"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
private string GetSensorSerialNumber(string channelSensor)
|
|||
|
|
{
|
|||
|
|
var dictionaryKey = channelSensor;
|
|||
|
|
|
|||
|
|
if (channelSensor != null && channelSensor.Contains('('))
|
|||
|
|
{
|
|||
|
|
var startingCharIndex = channelSensor.IndexOf('(') + 1;
|
|||
|
|
var endingCharIndex = channelSensor.LastIndexOf(')') - 1;
|
|||
|
|
var contentsLength = (endingCharIndex - startingCharIndex) + 1;
|
|||
|
|
if (contentsLength > 0)
|
|||
|
|
{
|
|||
|
|
var contents = channelSensor.Substring(startingCharIndex, contentsLength);
|
|||
|
|
if (!string.IsNullOrWhiteSpace(contents))
|
|||
|
|
{
|
|||
|
|
//There is a non-blank string in the parens, because the sensor has both a name and a serial number
|
|||
|
|
dictionaryKey = contents;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return dictionaryKey;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void DoHardwareAssignment(IGroupChannel groupChannel, IHardwareChannel[] hardwareChannels)
|
|||
|
|
{
|
|||
|
|
var index = Channels.IndexOf(groupChannel);
|
|||
|
|
int i = 0;
|
|||
|
|
for (i = 0; i < hardwareChannels.Length && (index + i + 1) < Channels.Count; i++)
|
|||
|
|
{
|
|||
|
|
var channel = Channels[index + i];
|
|||
|
|
if (null != channel.HardwareChannel && channel.HardwareChannel.IsTSRAIR)
|
|||
|
|
{
|
|||
|
|
//if there's a TSR AIR channel on this channel already, there's no changing hardware or sensor ...
|
|||
|
|
//18270 User should not be allowed to assign different sensors or hardware to TSR AIR channels
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (hardwareChannels[i].GetParentDAS().IsTSRAIR())
|
|||
|
|
{
|
|||
|
|
if (!channel.IsBlank() && !channel.IsStreamOut && !channel.IsUart)
|
|||
|
|
{
|
|||
|
|
//refuse to set if a TSRAir channel is dragged to a non blank, non streamout channel ...
|
|||
|
|
//only allow going to a blank or streamout channel
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
channel.SetHardwareChannel(hardwareChannels[i]);
|
|||
|
|
if (TestSetup == null)
|
|||
|
|
{
|
|||
|
|
channel.TestSampleRate = 0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
channel.TestSampleRate = TestSetup.DASSampleRateList[channel.HardwareChannel.GetParentDAS().SerialNumber];
|
|||
|
|
}
|
|||
|
|
if (!_dontFilterList.Contains(channel))
|
|||
|
|
{
|
|||
|
|
_dontFilterList.Add(channel);
|
|||
|
|
}
|
|||
|
|
if (null == channel.Group)
|
|||
|
|
{
|
|||
|
|
var group = Group;
|
|||
|
|
if (null == group)
|
|||
|
|
{
|
|||
|
|
group = CreateGroupIfNeeded(Resources.StringResources.TestChannelsGroupName);
|
|||
|
|
}
|
|||
|
|
channel.Group = group;
|
|||
|
|
channel.GroupName = group.DisplayName;
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
var channels = TestSetup.ChannelsForGroup[group].ToList();
|
|||
|
|
channels.Add(channel);
|
|||
|
|
TestSetup.ChannelsForGroup[group] = channels.ToArray();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
MarkModified(channel);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (i < hardwareChannels.Length)
|
|||
|
|
{
|
|||
|
|
var list = new List<IHardwareChannel>();
|
|||
|
|
for (; i < hardwareChannels.Length; i++)
|
|||
|
|
{
|
|||
|
|
if (hardwareChannels[i].IsTSRAIR)
|
|||
|
|
{
|
|||
|
|
//if it's already assigned don't allow another assignment!
|
|||
|
|
if (AllChannels.Exists(chan => chan.HardwareChannel == hardwareChannels[i]))
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
list.Add(hardwareChannels[i]);
|
|||
|
|
}
|
|||
|
|
AddChannels(list.ToArray());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private IChannelSetting[] GetChannelSettingDefaults()
|
|||
|
|
{
|
|||
|
|
var channelSettings = new IChannelSetting[] { };
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
channelSettings = DbOperations.GetChannelSettingDefaults();
|
|||
|
|
}
|
|||
|
|
catch (Exception ex) { DTS.Common.Utilities.Logging.APILogger.LogException(ex); }
|
|||
|
|
return channelSettings;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Unset()
|
|||
|
|
{
|
|||
|
|
_settingsViewLoaded = false;
|
|||
|
|
AllChannels.Clear();
|
|||
|
|
Channels.Clear();
|
|||
|
|
_idToSensorDictionary.Clear();
|
|||
|
|
_serialNumberToSensorDictionary.Clear();
|
|||
|
|
_displayToHardwareChannel.Clear();
|
|||
|
|
ClearAllFilters();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void ClearAllFilters()
|
|||
|
|
{
|
|||
|
|
SearchTerm = "";
|
|||
|
|
BridgeFilter = PossibleFilters.All;
|
|||
|
|
_filterByField.Clear();
|
|||
|
|
_dontFilterList.Clear();
|
|||
|
|
_eventAggregator.GetEvent<ListViewStatusEvent>().Publish(new ListViewStatusArg(ListViewStatusArg.ListViewStatus.Unloaded, ListViewId));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void OnSetActive()
|
|||
|
|
{
|
|||
|
|
foreach (var channel in AllChannels)
|
|||
|
|
{
|
|||
|
|
if (Group != null)
|
|||
|
|
{
|
|||
|
|
channel.GroupName = Group.DisplayName;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!AllowSensorPushAndPull) continue;
|
|||
|
|
CompareAndMarkChannelParameters(channel);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
OnPropertyChanged("UseTestSetupOrder");
|
|||
|
|
OnPropertyChanged("ChannelCount");
|
|||
|
|
OnPropertyChanged("AssignedPhysicalChannelCount");
|
|||
|
|
OnPropertyChanged("AvailableChannelCount");
|
|||
|
|
View?.HandleColumns(ISOViewMode);
|
|||
|
|
SettingsView?.SetDisplayOptions(ShowSensorChannelUserValues);
|
|||
|
|
SettingsView?.HandleColumns(ISOViewMode);
|
|||
|
|
SettingsView?.SetFilterMode(BridgeFilter);
|
|||
|
|
SettingsView.SetOrderMode(UseTestSetupOrder);
|
|||
|
|
_currentSortField = Fields.Order;
|
|||
|
|
_sortAscending = true;
|
|||
|
|
SettingsViewLoaded = false;
|
|||
|
|
ResetSettingChannels();
|
|||
|
|
OnPropertyChanged("SelectedDeleteShouldBeEnabled");
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// Check to see if any of the channel's values that can be modified
|
|||
|
|
/// in the Parameters step are different than the corresponding
|
|||
|
|
/// sensor's values in the sensor database, so that they can be
|
|||
|
|
/// decorated, along with the Parameters step (FB 15245)
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="ch"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public bool CompareAndMarkChannelParameters(IGroupChannel ch)
|
|||
|
|
{
|
|||
|
|
var anyChanged = false;
|
|||
|
|
if (ch.SensorData == null ||
|
|||
|
|
ch.SensorData.SerialNumber == SensorConstants.TEST_SPECIFIC_ANALOG_SERIAL ||
|
|||
|
|
ch.SensorData.SerialNumber == SensorConstants.TEST_SPECIFIC_CLOCK_SERIAL ||
|
|||
|
|
ch.SensorData.SerialNumber == SensorConstants.TEST_SPECIFIC_DIGITAL_IN_SERIAL ||
|
|||
|
|
ch.SensorData.SerialNumber == SensorConstants.TEST_SPECIFIC_DIGITAL_OUT_SERIAL ||
|
|||
|
|
ch.SensorData.SerialNumber == SensorConstants.TEST_SPECIFIC_SQUIB_SERIAL ||
|
|||
|
|
ch.SensorData.SerialNumber == SensorConstants.TEST_SPECIFIC_UART_SERIAL ||
|
|||
|
|
ch.SensorData.SerialNumber == SensorConstants.TEST_SPECIFIC_STREAM_OUT_SERIAL ||
|
|||
|
|
ch.SensorData.SerialNumber == SensorConstants.TEST_SPECIFIC_STREAM_IN_SERIAL ||
|
|||
|
|
ch.SensorData.SerialNumber == SensorConstants.TEST_SPECIFIC_THERMOCOUPLER)
|
|||
|
|
{
|
|||
|
|
//None of these have actual sensors that can be pulled, so there's nothing to be different from.
|
|||
|
|
ch.SetNotDifferent();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
switch (ch.SensorData.Bridge)
|
|||
|
|
{
|
|||
|
|
case SensorConstants.BridgeType.FullBridge: //(Analogs)
|
|||
|
|
case SensorConstants.BridgeType.HalfBridge:
|
|||
|
|
case SensorConstants.BridgeType.HalfBridge_SigPlus:
|
|||
|
|
case SensorConstants.BridgeType.QuarterBridge:
|
|||
|
|
case SensorConstants.BridgeType.IEPE:
|
|||
|
|
anyChanged = ch.SetDifferent("Range");
|
|||
|
|
// anyChanged = ch.SetDifferent("CFC") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("FilterClass") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("Polarity") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("ZeroMethod") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("ZeroMethodStart") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("ZeroMethodEnd") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("InitialOffset") || anyChanged;
|
|||
|
|
break;
|
|||
|
|
case SensorConstants.BridgeType.SQUIB:
|
|||
|
|
anyChanged = ch.SetDifferent("SquibFireMode") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("SquibDelay") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("SquibLimitDuration") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("SquibDuration") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("SquibCurrent") || anyChanged;
|
|||
|
|
break;
|
|||
|
|
case SensorConstants.BridgeType.TOMDigital:
|
|||
|
|
anyChanged = ch.SetDifferent("DigitalOutputMode") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("DigitalOutDelay") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("DigitalOutLimitDuration") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("DigitalOutDuration") || anyChanged;
|
|||
|
|
break;
|
|||
|
|
case SensorConstants.BridgeType.DigitalInput:
|
|||
|
|
anyChanged = ch.SetDifferent("DigitalInputMode") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("DefaultValue") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("ActiveValue") || anyChanged;
|
|||
|
|
break;
|
|||
|
|
case SensorConstants.BridgeType.UART:
|
|||
|
|
anyChanged = ch.SetDifferent("UartBaudRate") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("UartDataBits") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("UartStopBits") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("UartParity") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("UartFlowControl") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("UartDataFormat") || anyChanged;
|
|||
|
|
break;
|
|||
|
|
case SensorConstants.BridgeType.StreamOut:
|
|||
|
|
anyChanged = ch.SetDifferent("StreamOutUDPProfile") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("StreamOutUDPAddress") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("StreamOutUDPTimeChannelId") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("StreamOutUDPDataChannelId") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("StreamOutUDPTmNSConfig") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("StreamOutIRIGTimeDataPacketIntervalMs") || anyChanged;
|
|||
|
|
break;
|
|||
|
|
case SensorConstants.BridgeType.StreamIn:
|
|||
|
|
anyChanged = ch.SetDifferent("StreamInUDPAddress") || anyChanged;
|
|||
|
|
break;
|
|||
|
|
case SensorConstants.BridgeType.CAN:
|
|||
|
|
anyChanged = ch.SetDifferent("Arb/BaseBitrate") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("Arb/BaseSJW") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("DataBitrate") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("DataSJW") || anyChanged;
|
|||
|
|
anyChanged = ch.SetDifferent("FileType") || anyChanged;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return anyChanged;
|
|||
|
|
}
|
|||
|
|
private void ResetSettingChannels()
|
|||
|
|
{
|
|||
|
|
SettingChannels.Clear();
|
|||
|
|
var list = Channels.ToList();
|
|||
|
|
var comparer = new GroupChannelComparer() { SortAscending = _sortAscending, SortField = _currentSortField, UseTestSetupOrder = UseTestSetupOrder };
|
|||
|
|
list.Sort(comparer);
|
|||
|
|
var settingChannels = new ObservableCollection<IGroupChannel>();
|
|||
|
|
foreach (var ch in list)
|
|||
|
|
{
|
|||
|
|
if (ch.IsBlank()) { continue; }
|
|||
|
|
settingChannels.Add(ch);
|
|||
|
|
//FB 28107 For digital out when the hardware is TDAS TOM use the max value allowed 1600
|
|||
|
|
if (ch.IsDigitalOut)
|
|||
|
|
{
|
|||
|
|
var hardwareType = ch.HardwareChannel?.GetParentDAS().DASTypeEnum;
|
|||
|
|
bool isTOM = ch.HardwareChannel?.ModuleSerialNumber.Contains("TOM") ?? false;
|
|||
|
|
if (hardwareType == HardwareTypes.TDAS_Pro_Rack && isTOM)
|
|||
|
|
{
|
|||
|
|
ch.DigitalOutDurationMax = DTS.Common.Constants.TDAS_TOM_DIGITAL_OUT_DURATION_MAX;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
SettingChannels = settingChannels;
|
|||
|
|
if (SettingsViewLoaded) OnPropertyChanged("SettingChannels");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// indicates that the attached SettingsView has loaded
|
|||
|
|
/// </summary>
|
|||
|
|
private bool _settingsViewLoaded;
|
|||
|
|
public bool SettingsViewLoaded
|
|||
|
|
{
|
|||
|
|
get => _settingsViewLoaded;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_settingsViewLoaded = value;
|
|||
|
|
if (value)
|
|||
|
|
{
|
|||
|
|
OnPropertyChanged("SettingChannels");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// indicates that the SettingChannel UI elements were created
|
|||
|
|
/// </summary>
|
|||
|
|
private bool _settingChannelsLoaded;
|
|||
|
|
public bool SettingChannelsLoaded
|
|||
|
|
{
|
|||
|
|
get => _settingChannelsLoaded;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_settingChannelsLoaded = value;
|
|||
|
|
if (value)
|
|||
|
|
{
|
|||
|
|
//FB14148 : mark App Available when the Channel UI elements have been created
|
|||
|
|
_eventAggregator.GetEvent<AppStatusEvent>().Publish(AppStatusArg.Available);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//FB14148 : mark App Busy while the Channel UI elements are being created
|
|||
|
|
_eventAggregator.GetEvent<AppStatusEvent>().Publish(AppStatusArg.Busy);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public IDictionary<IGroup, IGroupChannel[]> PopulateChannels(object page,
|
|||
|
|
IDictionary<int, ISensorData> sensorLookup,
|
|||
|
|
IDictionary<int, IDASHardware> hardwareLookup,
|
|||
|
|
IChannelSetting[] channelDefaults,
|
|||
|
|
bool allowChannelDeletionByNonAdminUser = true,
|
|||
|
|
bool userIsAdmin = true,
|
|||
|
|
bool allowSensorPushAndPull = false,
|
|||
|
|
bool keepExistingChannels = false,
|
|||
|
|
bool allowChannelDeletionFromFixedGroup = false)
|
|||
|
|
{
|
|||
|
|
Page = page;
|
|||
|
|
//17930 New channels get wiped out in Edit Group
|
|||
|
|
//keep a record of channels as they were before they get wiped out
|
|||
|
|
var existingChannels = new List<IGroupChannel>();
|
|||
|
|
if (keepExistingChannels)
|
|||
|
|
{
|
|||
|
|
foreach (var existingChannel in AllChannels)
|
|||
|
|
{
|
|||
|
|
if (existingChannel.IsBlank()) { continue; }
|
|||
|
|
existingChannels.Add(existingChannel);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
AllChannels.Clear();
|
|||
|
|
Channels.Clear();
|
|||
|
|
_idToSensorDictionary = sensorLookup;
|
|||
|
|
_displayToHardwareChannel.Clear();
|
|||
|
|
_serialNumberToSensorDictionary.Clear();
|
|||
|
|
|
|||
|
|
using (var eSensor = _idToSensorDictionary.GetEnumerator())
|
|||
|
|
{
|
|||
|
|
while (eSensor.MoveNext())
|
|||
|
|
{
|
|||
|
|
_serialNumberToSensorDictionary[eSensor.Current.Value.SerialNumber] = eSensor.Current.Value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
var includedHardwareIds = new List<int>();
|
|||
|
|
if (TestSetup != null)
|
|||
|
|
{
|
|||
|
|
includedHardwareIds = TestSetup.GetAllIncludedHardware().ToList();
|
|||
|
|
}
|
|||
|
|
if (Group != null)
|
|||
|
|
{
|
|||
|
|
includedHardwareIds = Group.IncludedHardware.ToList(); ;
|
|||
|
|
}
|
|||
|
|
var embeddedSensorChannels = new Dictionary<string, GroupChannel>();
|
|||
|
|
var hardware = hardwareLookup.Values.ToArray();
|
|||
|
|
var list = new List<IGroupChannel>();
|
|||
|
|
using (var eHardware = hardwareLookup.GetEnumerator())
|
|||
|
|
{
|
|||
|
|
while (eHardware.MoveNext())
|
|||
|
|
{
|
|||
|
|
var channels = eHardware.Current.Value.GetIHardwareChannels();
|
|||
|
|
foreach (var channel in channels)
|
|||
|
|
{
|
|||
|
|
_displayToHardwareChannel[channel.ToString(hardware)] = channel;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//Always enable the Delete button in Groups tile, but in Test Setups tile only if setting is True or user is Admin.
|
|||
|
|
AllowChannelDeletionByNonAdminUser = allowChannelDeletionByNonAdminUser;
|
|||
|
|
|
|||
|
|
//FB 18618
|
|||
|
|
AllowChannelDeletionFromFixedGroup = allowChannelDeletionFromFixedGroup;
|
|||
|
|
|
|||
|
|
UserIsAdmin = userIsAdmin;
|
|||
|
|
|
|||
|
|
if (null != Group)
|
|||
|
|
{
|
|||
|
|
var existingTSRAIRList = new List<string>();
|
|||
|
|
IGroupChannel[] channels = null;
|
|||
|
|
//if we are keeping existing channels there's no need to call Group.GetAllChannels, since we already have all the channels
|
|||
|
|
//we want to know about
|
|||
|
|
if (keepExistingChannels)
|
|||
|
|
{
|
|||
|
|
channels = existingChannels.ToArray();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
channels = Group.GetAllChannels(null == Group, sensorLookup, hardwareLookup, channelDefaults, allowSensorPushAndPull);
|
|||
|
|
}
|
|||
|
|
foreach (var channel in channels.Where(chn => !chn.IsClock))
|
|||
|
|
{
|
|||
|
|
if ((channel.HardwareChannel == null) || //A regular channel without hardware assigned
|
|||
|
|
(channel.HardwareChannel?.IsTSRAIR ?? false) || //A regular channel with hardware assigned
|
|||
|
|
includedHardwareIds.Contains(channel.DASId)) //A channel for an embedded sensor in an TSR-AIR
|
|||
|
|
{
|
|||
|
|
channel.RemoveSensorVisibility = ((channel.HardwareChannel?.IsTSRAIR ?? false) || (channel.HardwareChannel?.IsSLICETC ?? false)) ?
|
|||
|
|
System.Windows.Visibility.Hidden :
|
|||
|
|
System.Windows.Visibility.Visible;
|
|||
|
|
list.Add(channel);
|
|||
|
|
if (channel.HardwareChannel != null &&
|
|||
|
|
!existingTSRAIRList.Contains(channel.HardwareChannel.GetParentDAS().SerialNumber))
|
|||
|
|
{
|
|||
|
|
existingTSRAIRList.Add(channel.HardwareChannel.GetParentDAS().SerialNumber);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
foreach (var pair in embeddedSensorChannels)
|
|||
|
|
{
|
|||
|
|
//Only add embedded sensors from an TSR-AIR if that unit isn't already in the Group
|
|||
|
|
if (!existingTSRAIRList.Contains(pair.Value.HardwareChannel.GetParentDAS().SerialNumber))
|
|||
|
|
{
|
|||
|
|
if (pair.Value.IsBlank() || pair.Value.IsClock)
|
|||
|
|
{
|
|||
|
|
//remove any blank channels or clock channels from group
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
list.Add(pair.Value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (null != TestSetup)
|
|||
|
|
{
|
|||
|
|
foreach (var group in TestSetup.Groups)
|
|||
|
|
{
|
|||
|
|
var allChannels = TestSetup.ChannelsForGroup[group];
|
|||
|
|
foreach (var channel in allChannels)
|
|||
|
|
{
|
|||
|
|
if (channel.IsBlank() || channel.IsClock)
|
|||
|
|
{
|
|||
|
|
//remove any blank channels or clock channels from group
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
//FB 18618 Should not allow deleting the fixed group in test setup
|
|||
|
|
if (!AllowChannelDeletionFromFixedGroup)
|
|||
|
|
{
|
|||
|
|
if (group.StaticGroupId != null)
|
|||
|
|
{
|
|||
|
|
//It's in a fixed group, disable the delete button
|
|||
|
|
channel.DeleteShouldBeEnabled = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//Enable the Delete button for all channels in Test Setups if AllowChannelDeletionByNonAdminUser setting is True or user is Admin.
|
|||
|
|
channel.DeleteShouldBeEnabled = UserIsAdmin || AllowChannelDeletionByNonAdminUser;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
channel.RemoveSensorVisibility = ((channel.HardwareChannel?.IsTSRAIR ?? false) || (channel.HardwareChannel?.IsSLICETC ?? false)) ?
|
|||
|
|
System.Windows.Visibility.Hidden :
|
|||
|
|
System.Windows.Visibility.Visible;
|
|||
|
|
list.Add(channel);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
list.Sort();
|
|||
|
|
for (var i = 0; i < list.Count; i++)
|
|||
|
|
{
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
list[i].TestSetupOrder = 1 + i;
|
|||
|
|
}
|
|||
|
|
else { list[i].GroupChannelOrder = 1 + i; }
|
|||
|
|
list[i].CanMoveDown = true;
|
|||
|
|
list[i].CanMoveUp = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
AllChannels.AddRange(list.ToArray());
|
|||
|
|
|
|||
|
|
var ch = new GroupChannel(null == Group, Group?.DisplayName ?? "", Group, channelDefaults, allowSensorPushAndPull);
|
|||
|
|
AllChannels.Add(ch);
|
|||
|
|
OnPropertyChanged("ChannelCount");
|
|||
|
|
Filter(SearchTerm, false);
|
|||
|
|
if (null != TestSetup)
|
|||
|
|
{
|
|||
|
|
return TestSetup.ChannelsForGroup;
|
|||
|
|
}
|
|||
|
|
var lookup = new Dictionary<IGroup, IGroupChannel[]>();
|
|||
|
|
lookup[Group] = AllChannels.ToArray();
|
|||
|
|
return lookup;
|
|||
|
|
}
|
|||
|
|
public void Cleanup()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public Task CleanupAsync()
|
|||
|
|
{
|
|||
|
|
return Task.CompletedTask;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Initialize()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Initialize(object parameter)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Initialize(object parameter, object model)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public Task InitializeAsync()
|
|||
|
|
{
|
|||
|
|
return Task.CompletedTask;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public Task InitializeAsync(object parameter)
|
|||
|
|
{
|
|||
|
|
return Task.CompletedTask;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Activated()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Private Event handler for RaiseNotification event.
|
|||
|
|
/// </summary>
|
|||
|
|
private void OnBusyIndicatorNotification(bool eventArg)
|
|||
|
|
{
|
|||
|
|
IsBusy = eventArg;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Private Event handler for RaiseNotification event.
|
|||
|
|
/// </summary>
|
|||
|
|
private void OnRaiseNotification(NotificationContentEventArgs eventArgsWithTitle)
|
|||
|
|
{
|
|||
|
|
// The NotificationRequest.Raise triggers the Invoke() method of the PopupWindowAction object to show the NotificationWindow window
|
|||
|
|
// Notification object expects a NotificationContentEventArgsWithoutTitle object and a Title string.
|
|||
|
|
var eventArgsWithoutTitle = new NotificationContentEventArgs(eventArgsWithTitle.Message, "",
|
|||
|
|
eventArgsWithTitle.Image, string.Empty);
|
|||
|
|
|
|||
|
|
NotificationRequest.Raise(new Notification
|
|||
|
|
{
|
|||
|
|
Content = eventArgsWithoutTitle,
|
|||
|
|
Title = eventArgsWithTitle.Title
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void ReportErrors(string[] errors)
|
|||
|
|
{
|
|||
|
|
_eventAggregator.GetEvent<PageErrorEvent>().Publish(new PageErrorArg(errors, Page));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void GroupNameChanged(IGroupChannel channel)
|
|||
|
|
{
|
|||
|
|
if (null == TestSetup)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//this is slightly complicated, when the group name changes:
|
|||
|
|
//1) remove this channel from the channel list for the old group
|
|||
|
|
if (channel.Group != null && TestSetup.ChannelsForGroup[channel.Group].Contains(channel))
|
|||
|
|
{
|
|||
|
|
var groupChannels = TestSetup.ChannelsForGroup[channel.Group].ToList();
|
|||
|
|
groupChannels.Remove(channel);
|
|||
|
|
TestSetup.ChannelsForGroup[channel.Group] = groupChannels.ToArray();
|
|||
|
|
if (!groupChannels.Any())
|
|||
|
|
{
|
|||
|
|
//2) remove the old group if it's now empty
|
|||
|
|
TestSetup.RemoveGroup(channel.Group);
|
|||
|
|
TestSetup.ChannelsForGroup.Remove(channel.Group);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//3) add a new group if one doesn't exist
|
|||
|
|
//4) add the channel to the group
|
|||
|
|
var group = CreateGroupIfNeeded(channel.GroupName);
|
|||
|
|
channel.Group = group;
|
|||
|
|
var list = TestSetup.ChannelsForGroup[group].ToList();
|
|||
|
|
if (!list.Contains(channel))
|
|||
|
|
{
|
|||
|
|
list.Add(channel);
|
|||
|
|
TestSetup.ChannelsForGroup[group] = list.ToArray();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//_eventAggregator.GetEvent<PageModifiedEvent>()
|
|||
|
|
// .Publish(new PageModifiedArg(PageModifiedArg.Status.Modified, Page));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void MarkModified(IGroupChannel channel, bool bNotifyChanged = true)
|
|||
|
|
{
|
|||
|
|
if (Channels.ToList().Last() == channel)
|
|||
|
|
{
|
|||
|
|
if (Channels[0] != channel)
|
|||
|
|
{
|
|||
|
|
channel.CanMoveUp = true;
|
|||
|
|
Channels[Channels.Count - 2].CanMoveDown = true; //remember that AllChannels.Count is base 1, while index is base 0
|
|||
|
|
}
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
channel.TestSetupOrder = AllChannels.Count;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
channel.GroupChannelOrder = AllChannels.Count;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (null == channel.Group)
|
|||
|
|
{
|
|||
|
|
var group = Group;
|
|||
|
|
if (null == group)
|
|||
|
|
{
|
|||
|
|
group = CreateGroupIfNeeded(Resources.StringResources.TestChannelsGroupName);
|
|||
|
|
}
|
|||
|
|
channel.Group = group;
|
|||
|
|
channel.GroupName = group.DisplayName;
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
var list = TestSetup.ChannelsForGroup[channel.Group].ToList();
|
|||
|
|
if (!list.Contains(channel))
|
|||
|
|
{
|
|||
|
|
list.Add(channel);
|
|||
|
|
TestSetup.ChannelsForGroup[channel.Group] = list.ToArray();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
var defaults = GetChannelSettingDefaults();
|
|||
|
|
var newChannel = new GroupChannel(null == Group, Group?.DisplayName ?? "", Group, defaults);
|
|||
|
|
AllChannels.Add(newChannel);
|
|||
|
|
Channels.Add(newChannel);
|
|||
|
|
DetermineButtonState();
|
|||
|
|
//OnPropertyChanged("Channels");
|
|||
|
|
}
|
|||
|
|
if (bNotifyChanged)
|
|||
|
|
{
|
|||
|
|
NotifyChannelsChanged();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void NotifyChannelsChanged()
|
|||
|
|
{
|
|||
|
|
_eventAggregator.GetEvent<PageModifiedEvent>()
|
|||
|
|
.Publish(new PageModifiedArg(PageModifiedArg.Status.Modified, Page));
|
|||
|
|
_eventAggregator.GetEvent<GroupUpdatedEvent>()
|
|||
|
|
.Publish(new GroupUpdatedEventArgs(Page, GroupUpdatedEventArgs.Status.AssignmentsMade));
|
|||
|
|
OnPropertyChanged("ChannelCount");
|
|||
|
|
OnPropertyChanged("AssignedPhysicalChannelCount");
|
|||
|
|
}
|
|||
|
|
public void Clear(IGroupChannel channel)
|
|||
|
|
{
|
|||
|
|
channel.Clear();
|
|||
|
|
}
|
|||
|
|
public void Remove(IGroupChannel channel, bool notifyChanged = true)
|
|||
|
|
{
|
|||
|
|
if (Channels.ToList().Last() == channel)
|
|||
|
|
{
|
|||
|
|
var defaults = GetChannelSettingDefaults();
|
|||
|
|
Channels.Add(new GroupChannel(null == Group, Group?.DisplayName ?? "", Group, defaults));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
AllChannels.Remove(channel);
|
|||
|
|
Channels.Remove(channel);
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
if (null != channel.Group)
|
|||
|
|
{
|
|||
|
|
var list = TestSetup.ChannelsForGroup[channel.Group].ToList();
|
|||
|
|
list.Remove(channel);
|
|||
|
|
TestSetup.ChannelsForGroup[channel.Group] = list.ToArray();
|
|||
|
|
if (!list.Any())
|
|||
|
|
{
|
|||
|
|
TestSetup.RemoveGroup(channel.Group);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
DetermineButtonState();
|
|||
|
|
//OnPropertyChanged("Channels");
|
|||
|
|
OnPropertyChanged("ChannelCount");
|
|||
|
|
if (notifyChanged)
|
|||
|
|
{
|
|||
|
|
NotifyChannelsChanged();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void DetermineButtonState()
|
|||
|
|
{
|
|||
|
|
if (!Channels.Any())
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
foreach (var channel in Channels)
|
|||
|
|
{
|
|||
|
|
channel.CanMoveDown = true;
|
|||
|
|
channel.CanMoveUp = true;
|
|||
|
|
}
|
|||
|
|
Channels[0].CanMoveUp = false;
|
|||
|
|
|
|||
|
|
var bFoundBottom = false;
|
|||
|
|
for (var i = Channels.Count - 1; i >= 0; i--)
|
|||
|
|
{
|
|||
|
|
if (Channels[i].IsBlank())
|
|||
|
|
{
|
|||
|
|
Channels[i].CanMoveDown = false;
|
|||
|
|
Channels[i].CanMoveUp = false;
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (i > 0)
|
|||
|
|
{
|
|||
|
|
Channels[0].CanMoveDown = true;
|
|||
|
|
}
|
|||
|
|
Channels[i].CanMoveDown = false;
|
|||
|
|
bFoundBottom = true;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!bFoundBottom)
|
|||
|
|
{
|
|||
|
|
Channels[0].CanMoveDown = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void Filter(string term, bool initiatedByUser)
|
|||
|
|
{
|
|||
|
|
if (initiatedByUser) { _dontFilterList.Clear(); }
|
|||
|
|
SearchTerm = term;
|
|||
|
|
AllChannels.Sort();
|
|||
|
|
List<IGroupChannel> newChannels = new List<IGroupChannel>();
|
|||
|
|
foreach (var channel in AllChannels)
|
|||
|
|
{
|
|||
|
|
if (channel.IsBlank())
|
|||
|
|
{
|
|||
|
|
newChannels.Add(channel);
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
if (_dontFilterList.Contains(channel))
|
|||
|
|
{
|
|||
|
|
newChannels.Add(channel);
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
if (string.IsNullOrWhiteSpace(SearchTerm))
|
|||
|
|
{
|
|||
|
|
//no filtering needed
|
|||
|
|
}
|
|||
|
|
else if (!channel.Filter(SearchTerm))
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ISensorData sensor = null;
|
|||
|
|
if (channel.SensorId >= 0 && _idToSensorDictionary.ContainsKey(channel.SensorId))
|
|||
|
|
{
|
|||
|
|
sensor = _idToSensorDictionary[channel.SensorId];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
switch (BridgeFilter)
|
|||
|
|
{
|
|||
|
|
case PossibleFilters.All:
|
|||
|
|
break;
|
|||
|
|
case PossibleFilters.Analog:
|
|||
|
|
if (channel.IsAnalog) { break; }
|
|||
|
|
else { continue; }
|
|||
|
|
case PossibleFilters.Squib:
|
|||
|
|
if (!channel.IsSquib) { continue; }
|
|||
|
|
break;
|
|||
|
|
case PossibleFilters.DigitalIn:
|
|||
|
|
if (!channel.IsDigitalIn) { continue; }
|
|||
|
|
break;
|
|||
|
|
case PossibleFilters.DigitalOut:
|
|||
|
|
if (!channel.IsDigitalOut) { continue; }
|
|||
|
|
break;
|
|||
|
|
case PossibleFilters.UART:
|
|||
|
|
if (!channel.IsUart) { continue; }
|
|||
|
|
break;
|
|||
|
|
case PossibleFilters.StreamOut:
|
|||
|
|
if (!channel.IsStreamOut) { continue; }
|
|||
|
|
break;
|
|||
|
|
case PossibleFilters.StreamIn:
|
|||
|
|
if (!channel.IsStreamIn) { continue; }
|
|||
|
|
break;
|
|||
|
|
case PossibleFilters.CAN:
|
|||
|
|
if (!channel.IsCan) { continue; }
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
throw new ArgumentOutOfRangeException();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var filters = Enum.GetValues(typeof(Fields)).Cast<Fields>().ToArray();
|
|||
|
|
var passed = true;
|
|||
|
|
foreach (var filter in filters)
|
|||
|
|
{
|
|||
|
|
if (!passed) { break; }
|
|||
|
|
if (_filterByField.ContainsKey(filter))
|
|||
|
|
{
|
|||
|
|
var fieldTerm = _filterByField[filter];
|
|||
|
|
if (string.IsNullOrWhiteSpace(fieldTerm))
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
switch (filter)
|
|||
|
|
{
|
|||
|
|
case Fields.GroupName:
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(
|
|||
|
|
channel.GroupName, fieldTerm, System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.IEPE:
|
|||
|
|
{
|
|||
|
|
var s = channel.IEPESupport;
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(
|
|||
|
|
s, fieldTerm, System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.Sensor:
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(
|
|||
|
|
((GroupChannel)channel).Sensor, fieldTerm, System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.Hardware:
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(
|
|||
|
|
((GroupChannel)channel).Hardware, fieldTerm, System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.UserCode:
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(
|
|||
|
|
channel.UserCode, fieldTerm, System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.UserChannelName:
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(
|
|||
|
|
channel.UserChannelName, fieldTerm, System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.ISOCode:
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(
|
|||
|
|
channel.IsoCode, fieldTerm, System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.ISOChannelName:
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(
|
|||
|
|
channel.IsoChannelName, fieldTerm, System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.Range:
|
|||
|
|
if (BridgeFilter == PossibleFilters.Analog)
|
|||
|
|
{
|
|||
|
|
var range = channel.Range.ToString("N2");
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(range, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.Capacity:
|
|||
|
|
if (BridgeFilter == PossibleFilters.Analog)
|
|||
|
|
{
|
|||
|
|
var capacity = channel.Capacity.ToString("N2");
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(capacity, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.Sensitivity:
|
|||
|
|
if (BridgeFilter == PossibleFilters.Analog)
|
|||
|
|
{
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(channel.Sensitivity, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.Units:
|
|||
|
|
if (BridgeFilter == PossibleFilters.Analog)
|
|||
|
|
{
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(channel.Units, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.InitialOffset:
|
|||
|
|
{
|
|||
|
|
if (BridgeFilter == PossibleFilters.Analog)
|
|||
|
|
{
|
|||
|
|
var converter = new EnumDescriptionTypeConverter(typeof(InitialOffsetTypes));
|
|||
|
|
var initialOffset = converter.ConvertToString(channel.InitialOffset.Form);
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(initialOffset, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.ZeroMethod:
|
|||
|
|
if (BridgeFilter == PossibleFilters.Analog)
|
|||
|
|
{
|
|||
|
|
var zm = channel.ZeroMethod.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(zm, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.ZeroMethodStart:
|
|||
|
|
if (BridgeFilter == PossibleFilters.Analog)
|
|||
|
|
{
|
|||
|
|
var zms = channel.ZeroMethodStart.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(zms, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.ZeroMethodEnd:
|
|||
|
|
if (BridgeFilter == PossibleFilters.Analog)
|
|||
|
|
{
|
|||
|
|
var zme = channel.ZeroMethodEnd.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(zme, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
//FB 13120 set filter class
|
|||
|
|
case Fields.FilterClass:
|
|||
|
|
if (BridgeFilter == PossibleFilters.Analog)
|
|||
|
|
{
|
|||
|
|
var filterClass = channel.FilterClass.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(filterClass, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.Polarity:
|
|||
|
|
if (BridgeFilter == PossibleFilters.Analog)
|
|||
|
|
{
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(channel.Polarity, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.InputMode:
|
|||
|
|
if (BridgeFilter == PossibleFilters.DigitalIn)
|
|||
|
|
{
|
|||
|
|
var mode = channel.DigitalInputMode.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(mode, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.DefaultValue:
|
|||
|
|
if (BridgeFilter == PossibleFilters.DigitalIn)
|
|||
|
|
{
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(channel.DefaultValue, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.ActiveValue:
|
|||
|
|
if (BridgeFilter == PossibleFilters.DigitalIn)
|
|||
|
|
{
|
|||
|
|
var range = channel.Range.ToString("N2");
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(channel.ActiveValue, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.OutputMode:
|
|||
|
|
if (BridgeFilter == PossibleFilters.DigitalOut)
|
|||
|
|
{
|
|||
|
|
var mode = channel.DigitalOutputMode.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(mode, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.OutputDelay:
|
|||
|
|
if (BridgeFilter == PossibleFilters.DigitalOut)
|
|||
|
|
{
|
|||
|
|
var delay = channel.DigitalOutDelay.ToString("N1");
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(delay, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.OutputLimitDuration:
|
|||
|
|
if (BridgeFilter == PossibleFilters.DigitalOut)
|
|||
|
|
{
|
|||
|
|
var limit = channel.DigitalOutLimitDuration.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(limit, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.OutputDuration:
|
|||
|
|
if (BridgeFilter == PossibleFilters.DigitalOut)
|
|||
|
|
{
|
|||
|
|
var duration = channel.DigitalOutDuration.ToString("N1");
|
|||
|
|
if (channel.DigitalOutLimitDuration)
|
|||
|
|
{
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(duration, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.SquibFireMode:
|
|||
|
|
if (BridgeFilter == PossibleFilters.Squib)
|
|||
|
|
{
|
|||
|
|
var mode = channel.SquibFireMode.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(mode, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.SquibDelay:
|
|||
|
|
if (BridgeFilter == PossibleFilters.Squib)
|
|||
|
|
{
|
|||
|
|
//FB14623 Set the default to 0.0 but since we are not setting the value to null this should always get over written.
|
|||
|
|
string delay = "0.0";
|
|||
|
|
|
|||
|
|
if (channel.SquibDelay.HasValue)
|
|||
|
|
delay = channel.SquibDelay.Value.ToString("N1");
|
|||
|
|
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(delay, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.SquibCurrent:
|
|||
|
|
if (BridgeFilter == PossibleFilters.Squib)
|
|||
|
|
{
|
|||
|
|
var current = channel.SquibCurrent.ToString("N1");
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(current, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.SquibLimitDuration:
|
|||
|
|
if (BridgeFilter == PossibleFilters.Squib)
|
|||
|
|
{
|
|||
|
|
var limit = channel.SquibLimitDuration.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(limit, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.SquibDuration:
|
|||
|
|
if (BridgeFilter == PossibleFilters.Squib)
|
|||
|
|
{
|
|||
|
|
var duration = channel.SquibDuration.ToString("N1");
|
|||
|
|
if (channel.SquibLimitDuration)
|
|||
|
|
{
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(duration, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
//18363 UART-settings-as-channels
|
|||
|
|
case Fields.UartBaudRate:
|
|||
|
|
if (BridgeFilter == PossibleFilters.UART)
|
|||
|
|
{
|
|||
|
|
var baudrate = channel.UartBaudRate.ToString("N0");
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(baudrate, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.UartDataBits:
|
|||
|
|
if (BridgeFilter == PossibleFilters.UART)
|
|||
|
|
{
|
|||
|
|
var databits = channel.UartDataBits.ToString("N0");
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(databits, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.UartStopBits:
|
|||
|
|
if (BridgeFilter == PossibleFilters.UART)
|
|||
|
|
{
|
|||
|
|
var stopbits = channel.UartStopBits.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(stopbits, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.UartParity:
|
|||
|
|
if (BridgeFilter == PossibleFilters.UART)
|
|||
|
|
{
|
|||
|
|
var parity = channel.UartParity.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(parity, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.UartFlowControl:
|
|||
|
|
if (BridgeFilter == PossibleFilters.UART)
|
|||
|
|
{
|
|||
|
|
var flowcontrol = channel.UartFlowControl.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(flowcontrol, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.UartDataFormat:
|
|||
|
|
if (BridgeFilter == PossibleFilters.UART)
|
|||
|
|
{
|
|||
|
|
var dataformat = channel.UartDataFormat.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(dataformat, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.StreamInUDPAddress:
|
|||
|
|
if (BridgeFilter == PossibleFilters.StreamIn)
|
|||
|
|
{
|
|||
|
|
var address = channel.StreamInUDPAddress.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(address, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.StreamOutUDPProfile:
|
|||
|
|
if (BridgeFilter == PossibleFilters.StreamOut)
|
|||
|
|
{
|
|||
|
|
var profile = channel.StreamOutUDPProfile.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(profile, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.StreamOutUDPAddress:
|
|||
|
|
if (BridgeFilter == PossibleFilters.StreamOut)
|
|||
|
|
{
|
|||
|
|
var address = channel.StreamOutUDPAddress.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(address, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.StreamOutUDPTimeChannelId:
|
|||
|
|
if (BridgeFilter == PossibleFilters.StreamOut)
|
|||
|
|
{
|
|||
|
|
var chid = channel.StreamOutUDPTimeChannelId.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(chid, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.StreamOutUDPDataChannelId:
|
|||
|
|
if (BridgeFilter == PossibleFilters.StreamOut)
|
|||
|
|
{
|
|||
|
|
var chid = channel.StreamOutUDPDataChannelId.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(chid, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.StreamOutUDPTmNSConfig:
|
|||
|
|
if (BridgeFilter == PossibleFilters.StreamOut)
|
|||
|
|
{
|
|||
|
|
var config = channel.StreamOutUDPTmNSConfig.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(config, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.StreamOutIRIGTimeDataPacketIntervalMs:
|
|||
|
|
if (BridgeFilter == PossibleFilters.StreamOut)
|
|||
|
|
{
|
|||
|
|
var interval = channel.StreamOutIRIGTimeDataPacketIntervalMs.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(interval, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.CanIsFD:
|
|||
|
|
if (BridgeFilter == PossibleFilters.CAN)
|
|||
|
|
{
|
|||
|
|
var isFD = channel.CanIsFD.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(isFD, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.CanArbBaseBitrate:
|
|||
|
|
if (BridgeFilter == PossibleFilters.CAN)
|
|||
|
|
{
|
|||
|
|
var arbBaseBitrate = channel.CanArbBaseBitrate.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(arbBaseBitrate, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.CanArbBaseSJW:
|
|||
|
|
if (BridgeFilter == PossibleFilters.CAN)
|
|||
|
|
{
|
|||
|
|
var arbBaseSJW = channel.CanArbBaseSJW.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(arbBaseSJW, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.CanDataBitrate:
|
|||
|
|
if (BridgeFilter == PossibleFilters.CAN)
|
|||
|
|
{
|
|||
|
|
var dataBitrate = channel.CanDataBitrate.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(dataBitrate, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.CanDataSJW:
|
|||
|
|
if (BridgeFilter == PossibleFilters.CAN)
|
|||
|
|
{
|
|||
|
|
var dataSJW = channel.CanDataSJW.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(dataSJW, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case Fields.CanFileType:
|
|||
|
|
if (BridgeFilter == PossibleFilters.CAN)
|
|||
|
|
{
|
|||
|
|
var fileType = channel.CanFileType.ToString();
|
|||
|
|
if (System.Globalization.CultureInfo.CurrentCulture.CompareInfo.IndexOf(fileType, fieldTerm,
|
|||
|
|
System.Globalization.CompareOptions.OrdinalIgnoreCase) < 0)
|
|||
|
|
{
|
|||
|
|
passed = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (!passed) { continue; }
|
|||
|
|
newChannels.Add(channel);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!Channels.SequenceEqual(newChannels))
|
|||
|
|
{
|
|||
|
|
Channels.Clear();
|
|||
|
|
Channels.AddRange(newChannels);
|
|||
|
|
//OnPropertyChanged("Channels");
|
|||
|
|
}
|
|||
|
|
DetermineButtonState();
|
|||
|
|
ResetSettingChannels();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Filter(string term)
|
|||
|
|
{
|
|||
|
|
Filter(term, true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//sets the persistent filter to a given type and performs the filter
|
|||
|
|
private IGroup _group;
|
|||
|
|
|
|||
|
|
public IGroup Group
|
|||
|
|
{
|
|||
|
|
get => _group;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
var hash = value?.GetHashCode();
|
|||
|
|
_group = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private ITestSetup _testSetup;
|
|||
|
|
|
|||
|
|
public ITestSetup TestSetup
|
|||
|
|
{
|
|||
|
|
get => _testSetup;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_testSetup = value;
|
|||
|
|
OnPropertyChanged("UseTestSetupOrder");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void SetFilter(PossibleFilters bridgeFilter)
|
|||
|
|
{
|
|||
|
|
BridgeFilter = bridgeFilter;
|
|||
|
|
Filter(SearchTerm);
|
|||
|
|
SettingsView?.SetFilterMode(bridgeFilter);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public bool UseTestSetupOrder => TestSetup != null;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// whether to show or hide the dallas id column
|
|||
|
|
/// </summary>
|
|||
|
|
public bool ShowDallasIdColumn { get; set; } = false;
|
|||
|
|
public bool CanMoveSelectedUp => SelectedChannelItems.Count > 0 && SelectedChannelItems.All(ch => ch.CanMoveUp);
|
|||
|
|
public bool CanMoveSelectedDown => SelectedChannelItems.Count > 0 && SelectedChannelItems.All(ch => ch.CanMoveDown);
|
|||
|
|
public bool SelectedDeleteShouldBeEnabled => SelectedChannelItems.Count > 0 && (UserIsAdmin || AllowChannelDeletionByNonAdminUser);
|
|||
|
|
public bool SelectedDeleteShouldDisplayTooltip => !UserIsAdmin && !AllowChannelDeletionByNonAdminUser && UseTestSetupOrder; //Only display tooltip if in Edit Test Setup, not Edit Group
|
|||
|
|
|
|||
|
|
public void MoveDown(IGroupChannel[] channels)
|
|||
|
|
{
|
|||
|
|
var list1 = channels.ToList();
|
|||
|
|
list1.Sort((a, b) => Channels.IndexOf(a).CompareTo(Channels.IndexOf(b)));
|
|||
|
|
var index0 = Channels.IndexOf(list1[0]);
|
|||
|
|
for (var i = list1.Count - 1; i >= 0; i--)//start moving from the bottom-most item
|
|||
|
|
{
|
|||
|
|
var channel = list1[i];
|
|||
|
|
if (channel.IsBlank()) { continue; }
|
|||
|
|
var index = Channels.IndexOf(channel);
|
|||
|
|
if (index == Channels.Count - 2) { continue; }
|
|||
|
|
if (list1.Contains(Channels[index0 + i + 1]))
|
|||
|
|
{
|
|||
|
|
//avoid swapping, so if the channel we are moving to is also a channel we are moving, then
|
|||
|
|
//we are swapping, so just ignore
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
// FB14637: "snap" selected items together when moving
|
|||
|
|
Channels.Move(index, index0 + i + 1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var list = Channels.ToList();
|
|||
|
|
SetOrderAndButtonState(list.ToArray());
|
|||
|
|
_eventAggregator.GetEvent<PageModifiedEvent>()
|
|||
|
|
.Publish(new PageModifiedArg(PageModifiedArg.Status.Modified, Page));
|
|||
|
|
OnPropertyChanged("CanMoveSelectedDown");
|
|||
|
|
OnPropertyChanged("CanMoveSelectedUp");
|
|||
|
|
OnPropertyChanged("SelectedDeleteShouldBeEnabled");
|
|||
|
|
OnPropertyChanged("SelectedDeleteShouldDisplayTooltip");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void SetOrderAndButtonState(IGroupChannel[] channels)
|
|||
|
|
{
|
|||
|
|
var listDisplayOrders = new List<int>();
|
|||
|
|
foreach (var channel in channels)
|
|||
|
|
{
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
listDisplayOrders.Add(channel.TestSetupOrder);
|
|||
|
|
}
|
|||
|
|
else { listDisplayOrders.Add(channel.GroupChannelOrder); }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
listDisplayOrders.Sort();
|
|||
|
|
//the negative numbers are at the top now, we have to fix that ...
|
|||
|
|
var negatives = new List<int>();
|
|||
|
|
for (int i = listDisplayOrders.Count - 1; i >= 0; i--)
|
|||
|
|
{
|
|||
|
|
if (listDisplayOrders[i] < 1)
|
|||
|
|
{
|
|||
|
|
negatives.Add(listDisplayOrders[i]);
|
|||
|
|
listDisplayOrders.RemoveAt(i);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (negatives.Any())
|
|||
|
|
{
|
|||
|
|
negatives.Sort();
|
|||
|
|
listDisplayOrders.AddRange(negatives);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
for (var i = 0; i < channels.Length; i++)
|
|||
|
|
{
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
channels[i].TestSetupOrder = listDisplayOrders[i];
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
channels[i].GroupChannelOrder = listDisplayOrders[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
DetermineButtonState();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void MoveBottom(IGroupChannel[] channels)
|
|||
|
|
{
|
|||
|
|
foreach (var channel in channels)
|
|||
|
|
{
|
|||
|
|
if (channel.IsBlank()) { continue; }
|
|||
|
|
var index = Channels.IndexOf(channel);
|
|||
|
|
var bottom = -1;
|
|||
|
|
for (var i = Channels.Count - 1; i >= 0; i--)
|
|||
|
|
{
|
|||
|
|
if (Channels[i].IsBlank())
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
bottom = i;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if (index == bottom) { continue; }
|
|||
|
|
Channels.Move(index, bottom);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var list = Channels.ToList();
|
|||
|
|
SetOrderAndButtonState(list.ToArray());
|
|||
|
|
_eventAggregator.GetEvent<PageModifiedEvent>()
|
|||
|
|
.Publish(new PageModifiedArg(PageModifiedArg.Status.Modified, Page));
|
|||
|
|
OnPropertyChanged("CanMoveSelectedDown");
|
|||
|
|
OnPropertyChanged("CanMoveSelectedUp");
|
|||
|
|
OnPropertyChanged("SelectedDeleteShouldBeEnabled");
|
|||
|
|
OnPropertyChanged("SelectedDeleteShouldDisplayTooltip");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void MoveUp(IGroupChannel[] channels)
|
|||
|
|
{
|
|||
|
|
var list1 = channels.ToList();
|
|||
|
|
list1.Sort((a, b) => Channels.IndexOf(a).CompareTo(Channels.IndexOf(b)));
|
|||
|
|
var index0 = Channels.IndexOf(list1[0]);
|
|||
|
|
for (var i = 0; i < list1.Count; i++)
|
|||
|
|
{
|
|||
|
|
var channel = list1[i];
|
|||
|
|
if (channel.IsBlank()) { continue; }
|
|||
|
|
var index = Channels.IndexOf(channel);
|
|||
|
|
if (index == 0) { continue; }
|
|||
|
|
if (list1.Contains(Channels[index0 + i - 1]))
|
|||
|
|
{
|
|||
|
|
//avoid swapping channels, if the channel we are moving to is
|
|||
|
|
//also in the list of channels to move, then we hit a swap condition, ignore it.
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
// FB14637: "snap" selected items together when moving
|
|||
|
|
Channels.Move(index, index0 + i - 1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var list = Channels.ToList();
|
|||
|
|
SetOrderAndButtonState(list.ToArray());
|
|||
|
|
_eventAggregator.GetEvent<PageModifiedEvent>()
|
|||
|
|
.Publish(new PageModifiedArg(PageModifiedArg.Status.Modified, Page));
|
|||
|
|
OnPropertyChanged("CanMoveSelectedDown");
|
|||
|
|
OnPropertyChanged("CanMoveSelectedUp");
|
|||
|
|
OnPropertyChanged("SelectedDeleteShouldBeEnabled");
|
|||
|
|
OnPropertyChanged("SelectedDeleteShouldDisplayTooltip");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void MoveTop(IGroupChannel[] channels)
|
|||
|
|
{
|
|||
|
|
var list1 = channels.ToList();
|
|||
|
|
list1.Reverse();
|
|||
|
|
foreach (var channel in list1)
|
|||
|
|
{
|
|||
|
|
if (channel.IsBlank()) { continue; }
|
|||
|
|
var index = Channels.IndexOf(channel);
|
|||
|
|
if (0 == index) { continue; }
|
|||
|
|
Channels.Move(index, 0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var list = Channels.ToList();
|
|||
|
|
SetOrderAndButtonState(list.ToArray());
|
|||
|
|
_eventAggregator.GetEvent<PageModifiedEvent>()
|
|||
|
|
.Publish(new PageModifiedArg(PageModifiedArg.Status.Modified, Page));
|
|||
|
|
OnPropertyChanged("CanMoveSelectedDown");
|
|||
|
|
OnPropertyChanged("CanMoveSelectedUp");
|
|||
|
|
OnPropertyChanged("SelectedDeleteShouldBeEnabled");
|
|||
|
|
OnPropertyChanged("SelectedDeleteShouldDisplayTooltip");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//FB 23327 Move the selected channels to the expected index
|
|||
|
|
public void MoveToIndex(IGroupChannel[] channels, int expectedIndex)
|
|||
|
|
{
|
|||
|
|
bool moveDown = false;
|
|||
|
|
var list1 = channels.ToList();
|
|||
|
|
if (Channels.IndexOf(list1[0]) > expectedIndex)
|
|||
|
|
{
|
|||
|
|
list1.Reverse();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
moveDown = true;
|
|||
|
|
}
|
|||
|
|
foreach (var channel in list1)
|
|||
|
|
{
|
|||
|
|
if (channel.IsBlank()) { continue; }
|
|||
|
|
var index = Channels.IndexOf(channel);
|
|||
|
|
|
|||
|
|
if (-1 == index) { continue; }
|
|||
|
|
if (expectedIndex - 1 >= Channels.Count - 1) { continue; }
|
|||
|
|
if (index == expectedIndex) { break; }
|
|||
|
|
if (moveDown)
|
|||
|
|
{
|
|||
|
|
Channels.Move(index, expectedIndex - 1);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Channels.Move(index, expectedIndex);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var list = Channels.ToList();
|
|||
|
|
SetOrderAndButtonState(list.ToArray());
|
|||
|
|
_eventAggregator.GetEvent<PageModifiedEvent>()
|
|||
|
|
.Publish(new PageModifiedArg(PageModifiedArg.Status.Modified, Page));
|
|||
|
|
OnPropertyChanged("CanMoveSelectedDown");
|
|||
|
|
OnPropertyChanged("CanMoveSelectedUp");
|
|||
|
|
OnPropertyChanged("SelectedDeleteShouldBeEnabled");
|
|||
|
|
OnPropertyChanged("SelectedDeleteShouldDisplayTooltip");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Filter(PossibleFilters filter)
|
|||
|
|
{
|
|||
|
|
BridgeFilter = filter;
|
|||
|
|
Filter(SearchTerm);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Filter(object tag, string term)
|
|||
|
|
{
|
|||
|
|
if (Enum.TryParse((string)tag, out Fields field))
|
|||
|
|
{
|
|||
|
|
_filterByField[field] = term;
|
|||
|
|
Filter(SearchTerm, true);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void AddChannels(IDragAndDropItem[] sensors)
|
|||
|
|
{
|
|||
|
|
var defaults = GetChannelSettingDefaults();
|
|||
|
|
var last = AllChannels.Last();
|
|||
|
|
AllChannels.Remove(last);
|
|||
|
|
|
|||
|
|
foreach (var sensor in sensors)
|
|||
|
|
{
|
|||
|
|
var group = Group;
|
|||
|
|
if (null == group)
|
|||
|
|
{
|
|||
|
|
group = CreateGroupIfNeeded(Resources.StringResources.TestChannelsGroupName);
|
|||
|
|
}
|
|||
|
|
IGroupChannel channel = null;
|
|||
|
|
if (sensor is IAnalogSensor analogSensor)
|
|||
|
|
{
|
|||
|
|
channel = new GroupChannel(UseTestSetupOrder, group.DisplayName, group, defaults)
|
|||
|
|
{
|
|||
|
|
//FB 13120 set filter class
|
|||
|
|
FilterClass = analogSensor.FilterClass,
|
|||
|
|
Range = analogSensor.Capacity,
|
|||
|
|
Polarity = analogSensor.Polarity ? "+" : "-",
|
|||
|
|
SensorId = sensor.DatabaseId,
|
|||
|
|
IsoCode = analogSensor.ISOCode,
|
|||
|
|
IsoChannelName = analogSensor.ISOChannelName,
|
|||
|
|
UserCode = analogSensor.UserCode,
|
|||
|
|
UserChannelName = analogSensor.UserChannelName,
|
|||
|
|
ZeroMethod = analogSensor.ZeroMethod,
|
|||
|
|
ZeroMethodStart = analogSensor.ZeroMethodStart,
|
|||
|
|
ZeroMethodEnd = analogSensor.ZeroMethodEnd,
|
|||
|
|
UserValue1 = analogSensor.UserValue1,
|
|||
|
|
UserValue2 = analogSensor.UserValue2,
|
|||
|
|
UserValue3 = analogSensor.UserValue3,
|
|||
|
|
AvailableInitialOffsets = analogSensor.InitialOffsets
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
else if (sensor is IDigitalInputSetting digitalInput)
|
|||
|
|
{
|
|||
|
|
channel = new GroupChannel(UseTestSetupOrder, group.DisplayName, group, defaults)
|
|||
|
|
{
|
|||
|
|
SensorId = sensor.DatabaseId,
|
|||
|
|
IsoCode = digitalInput.ISOCode,
|
|||
|
|
IsoChannelName = digitalInput.ISOChannelName,
|
|||
|
|
UserCode = digitalInput.UserCode,
|
|||
|
|
UserChannelName = digitalInput.UserChannelName,
|
|||
|
|
ActiveValue = digitalInput.ActiveValue,
|
|||
|
|
DefaultValue = digitalInput.DefaultValue,
|
|||
|
|
DigitalInputMode = digitalInput.Mode
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
else if (sensor is ISquib squib)
|
|||
|
|
{
|
|||
|
|
channel = new GroupChannel(UseTestSetupOrder, group.DisplayName, group, defaults)
|
|||
|
|
{
|
|||
|
|
SensorId = sensor.DatabaseId,
|
|||
|
|
IsoCode = squib.ISOCode,
|
|||
|
|
IsoChannelName = squib.ISOChannelName,
|
|||
|
|
UserCode = squib.UserCode,
|
|||
|
|
UserChannelName = squib.UserChannelName,
|
|||
|
|
SquibFireMode = squib.Mode,
|
|||
|
|
SquibLimitDuration = squib.LimitDuration,
|
|||
|
|
SquibDelay = squib.SQDelay,
|
|||
|
|
SquibDuration = squib.SQDuration,
|
|||
|
|
SquibCurrent = squib.SQCurrent
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
else if (sensor is IDigitalOutputSetting digitalOut)
|
|||
|
|
{
|
|||
|
|
channel = new GroupChannel(UseTestSetupOrder, group.DisplayName, group, defaults)
|
|||
|
|
{
|
|||
|
|
SensorId = sensor.DatabaseId,
|
|||
|
|
IsoCode = digitalOut.ISOCode,
|
|||
|
|
IsoChannelName = digitalOut.ISOChannelName,
|
|||
|
|
UserCode = digitalOut.UserCode,
|
|||
|
|
UserChannelName = digitalOut.UserChannelName,
|
|||
|
|
DigitalOutDelay = digitalOut.DODelay,
|
|||
|
|
DigitalOutDuration = digitalOut.DODuration,
|
|||
|
|
DigitalOutputMode = digitalOut.DOMode,
|
|||
|
|
DigitalOutLimitDuration = digitalOut.LimitDuration
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
else if (sensor is IUartIOSetting uart)
|
|||
|
|
{
|
|||
|
|
channel = new GroupChannel(UseTestSetupOrder, group.DisplayName, group, defaults)
|
|||
|
|
{
|
|||
|
|
SensorId = sensor.DatabaseId,
|
|||
|
|
IsoCode = uart.ISOCode,
|
|||
|
|
IsoChannelName = uart.ISOChannelName,
|
|||
|
|
UserCode = uart.UserCode,
|
|||
|
|
UserChannelName = uart.UserChannelName,
|
|||
|
|
UartBaudRate = uart.BaudRate,
|
|||
|
|
UartDataBits = uart.DataBits,
|
|||
|
|
UartStopBits = uart.StopBits,
|
|||
|
|
UartParity = uart.Parity,
|
|||
|
|
UartDataFormat = uart.DataFormat
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
else if (sensor is IStreamOutputSetting streamOut)
|
|||
|
|
{
|
|||
|
|
channel = new GroupChannel(UseTestSetupOrder, group.DisplayName, group, defaults)
|
|||
|
|
{
|
|||
|
|
SensorId = sensor.DatabaseId,
|
|||
|
|
IsoCode = streamOut.ISOCode,
|
|||
|
|
IsoChannelName = streamOut.ISOChannelName,
|
|||
|
|
UserCode = streamOut.UserCode,
|
|||
|
|
UserChannelName = streamOut.UserChannelName,
|
|||
|
|
StreamOutUDPProfile = streamOut.UDPProfile,
|
|||
|
|
StreamOutUDPAddress = streamOut.UDPAddress,
|
|||
|
|
StreamOutUDPTimeChannelId = streamOut.UDPTimeChannelId,
|
|||
|
|
StreamOutUDPDataChannelId = streamOut.UDPDataChannelId,
|
|||
|
|
StreamOutUDPTmNSConfig = streamOut.UDPTmNSConfig,
|
|||
|
|
StreamOutIRIGTimeDataPacketIntervalMs = streamOut.IRIGTimeDataPacketIntervalMs,
|
|||
|
|
StreamOutTMATSIntervalMs = streamOut.TMATSIntervalMs
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
else if (sensor is IStreamInputSetting streamIn)
|
|||
|
|
{
|
|||
|
|
channel = new GroupChannel(UseTestSetupOrder, group.DisplayName, group, defaults)
|
|||
|
|
{
|
|||
|
|
SensorId = sensor.DatabaseId,
|
|||
|
|
IsoCode = streamIn.ISOCode,
|
|||
|
|
IsoChannelName = streamIn.ISOChannelName,
|
|||
|
|
UserCode = streamIn.UserCode,
|
|||
|
|
UserChannelName = streamIn.UserChannelName,
|
|||
|
|
StreamInUDPAddress = streamIn.UDPAddress
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
else if (sensor is ICanIOSetting can)
|
|||
|
|
{
|
|||
|
|
channel = new GroupChannel(UseTestSetupOrder, group.DisplayName, group, defaults)
|
|||
|
|
{
|
|||
|
|
SensorId = sensor.DatabaseId,
|
|||
|
|
IsoCode = can.ISOCode,
|
|||
|
|
IsoChannelName = can.ISOChannelName,
|
|||
|
|
UserCode = can.UserCode,
|
|||
|
|
UserChannelName = can.UserChannelName,
|
|||
|
|
CanIsFD = can.CanIsFD,
|
|||
|
|
CanArbBaseBitrate = can.CanArbBaseBitrate,
|
|||
|
|
CanArbBaseSJW = can.CanArbBaseSJW,
|
|||
|
|
CanDataBitrate = can.CanDataBitrate,
|
|||
|
|
CanDataSJW = can.CanArbBaseSJW,
|
|||
|
|
CanFileType = can.CanFileType
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
if (null != channel)
|
|||
|
|
{
|
|||
|
|
channel.SetSensor(sensor, defaults, ApplySensorDataToBlankChannels);
|
|||
|
|
if (channel.SensorData == null)
|
|||
|
|
{
|
|||
|
|
channel.BorderShouldShowOutOfDate = AllowSensorPushAndPull;
|
|||
|
|
var sd = _serialNumberToSensorDictionary[sensor.SerialNumber];
|
|||
|
|
channel.SetSensorData(sd, null, false);
|
|||
|
|
}
|
|||
|
|
AllChannels.Add(channel);
|
|||
|
|
_dontFilterList.Add(channel);
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
var list = TestSetup.ChannelsForGroup[channel.Group].ToList();
|
|||
|
|
if (!list.Contains(channel))
|
|||
|
|
{
|
|||
|
|
list.Add(channel);
|
|||
|
|
TestSetup.ChannelsForGroup[channel.Group] = list.ToArray();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
MarkModified(channel);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (int i = 0; i < AllChannels.Count; i++)
|
|||
|
|
{
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
AllChannels[i].TestSetupOrder = 1 + i;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AllChannels[i].GroupChannelOrder = 1 + i;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
AllChannels.Add(last);
|
|||
|
|
Filter(SearchTerm, false);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// sets the range of all analog sensors according to input
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="option"></param>
|
|||
|
|
public void SetRange(CACOption option)
|
|||
|
|
{
|
|||
|
|
if (option == CACOption.Manual) { return; }//nothing to do ...
|
|||
|
|
foreach (var ch in AllChannels)
|
|||
|
|
{
|
|||
|
|
if (ch.IsBlank()) { continue; }
|
|||
|
|
if (ch.SensorId < 1) { continue; }
|
|||
|
|
if (!ch.IsAnalog) { continue; }
|
|||
|
|
ch.SetRange(option);
|
|||
|
|
}
|
|||
|
|
Filter(SearchTerm);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void AddChannels(IGroupChannel[] channels)
|
|||
|
|
{
|
|||
|
|
IGroupChannel last;
|
|||
|
|
if (AllChannels.Any()) // http://fogbugz/fogbugz/default.asp?14507 - Unhandled exception after clicking save in hardware disco
|
|||
|
|
{
|
|||
|
|
last = AllChannels.Last();
|
|||
|
|
AllChannels.Remove(last);
|
|||
|
|
AllChannels.AddRange(channels);
|
|||
|
|
AllChannels.Add(last);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AllChannels.AddRange(channels);
|
|||
|
|
}
|
|||
|
|
if (null != TestSetup)
|
|||
|
|
{
|
|||
|
|
foreach (var ch in channels)
|
|||
|
|
{
|
|||
|
|
if (!TestSetup.ChannelsForGroup.ContainsKey(ch.Group))
|
|||
|
|
{
|
|||
|
|
TestSetup.ChannelsForGroup[ch.Group] = new IGroupChannel[0];
|
|||
|
|
}
|
|||
|
|
var list = TestSetup.ChannelsForGroup[ch.Group].ToList();
|
|||
|
|
if (!list.Contains(ch))
|
|||
|
|
{
|
|||
|
|
list.Add(ch);
|
|||
|
|
}
|
|||
|
|
TestSetup.ChannelsForGroup[ch.Group] = list.ToArray();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Filter(SearchTerm, false);
|
|||
|
|
}
|
|||
|
|
public void AddChannels(IHardwareChannel[] channels)
|
|||
|
|
{
|
|||
|
|
var defaults = GetChannelSettingDefaults();
|
|||
|
|
var last = AllChannels.Last();
|
|||
|
|
AllChannels.Remove(last);
|
|||
|
|
|
|||
|
|
foreach (var hardwarechannel in channels)
|
|||
|
|
{
|
|||
|
|
var group = Group;
|
|||
|
|
if (null == group)
|
|||
|
|
{
|
|||
|
|
group = CreateGroupIfNeeded(Resources.StringResources.TestChannelsGroupName);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var sensorId = -1;
|
|||
|
|
var sensorName = "";
|
|||
|
|
|
|||
|
|
ISensorData sd = null;
|
|||
|
|
if (hardwarechannel.IsDigitalOut)
|
|||
|
|
{
|
|||
|
|
sd = DTS.SensorDB.SensorsCollection.SensorsList.GetSensorBySerialNumber(
|
|||
|
|
SensorConstants.TEST_SPECIFIC_DIGITAL_OUT_SERIAL);
|
|||
|
|
}
|
|||
|
|
else if (hardwarechannel.IsSquib)
|
|||
|
|
{
|
|||
|
|
sd = DTS.SensorDB.SensorsCollection.SensorsList.GetOriginalSensorBySerialNumber(
|
|||
|
|
SensorConstants.TEST_SPECIFIC_SQUIB_SERIAL);
|
|||
|
|
}
|
|||
|
|
else if (hardwarechannel.IsTSRAIR)
|
|||
|
|
{
|
|||
|
|
sd = hardwarechannel.IsClock
|
|||
|
|
? DTS.SensorDB.SensorsCollection.SensorsList.GetOriginalSensorBySerialNumber(SensorConstants.TEST_SPECIFIC_CLOCK_SERIAL)
|
|||
|
|
: hardwarechannel.IsStreamOut
|
|||
|
|
? DTS.SensorDB.SensorsCollection.SensorsList.GetOriginalSensorBySerialNumber(SensorConstants.TEST_SPECIFIC_STREAM_OUT_SERIAL)
|
|||
|
|
: hardwarechannel.IsUart
|
|||
|
|
? DTS.SensorDB.SensorsCollection.SensorsList.GetOriginalSensorBySerialNumber(SensorConstants.TEST_SPECIFIC_UART_SERIAL)
|
|||
|
|
: DTS.SensorDB.SensorsCollection.SensorsList.GetOriginalSensorBySerialNumber(SensorConstants.TEST_SPECIFIC_ANALOG_SERIAL);
|
|||
|
|
}
|
|||
|
|
else if (hardwarechannel.IsUart)
|
|||
|
|
{
|
|||
|
|
sd = DTS.SensorDB.SensorsCollection.SensorsList.GetSensorBySerialNumber(
|
|||
|
|
SensorConstants.TEST_SPECIFIC_UART_SERIAL);
|
|||
|
|
}
|
|||
|
|
else if (hardwarechannel.IsStreamOut)
|
|||
|
|
{
|
|||
|
|
sd = DTS.SensorDB.SensorsCollection.SensorsList.GetSensorBySerialNumber(
|
|||
|
|
SensorConstants.TEST_SPECIFIC_STREAM_OUT_SERIAL);
|
|||
|
|
}
|
|||
|
|
else if (hardwarechannel.IsStreamIn)
|
|||
|
|
{
|
|||
|
|
sd = DTS.SensorDB.SensorsCollection.SensorsList.GetSensorBySerialNumber(
|
|||
|
|
SensorConstants.TEST_SPECIFIC_STREAM_IN_SERIAL);
|
|||
|
|
}
|
|||
|
|
else if (hardwarechannel.IsThermocoupler)
|
|||
|
|
{
|
|||
|
|
sd = DTS.SensorDB.SensorsCollection.SensorsList.GetSensorBySerialNumber(
|
|||
|
|
SensorConstants.TEST_SPECIFIC_THERMOCOUPLER);
|
|||
|
|
}
|
|||
|
|
else if (hardwarechannel.IsCan)
|
|||
|
|
{
|
|||
|
|
sd = DTS.SensorDB.SensorsCollection.SensorsList.GetSensorBySerialNumber(
|
|||
|
|
SensorConstants.TEST_SPECIFIC_CAN_SERIAL);
|
|||
|
|
}
|
|||
|
|
else if (hardwarechannel.IsAnalog)
|
|||
|
|
{
|
|||
|
|
if (CreateVoltageInputChannels)
|
|||
|
|
{
|
|||
|
|
sd = DTS.SensorDB.SensorsCollection.SensorsList.GetSensorBySerialNumber(
|
|||
|
|
SensorConstants.TEST_SPECIFIC_ANALOG_SERIAL, false, false);
|
|||
|
|
sd.Calibration.ZeroMethods = new DTS.Common.Classes.Sensors.ZeroMethods(new[] { new DTS.Common.Classes.Sensors.ZeroMethod(ZeroMethodType.None, -.05, .05),
|
|||
|
|
new DTS.Common.Classes.Sensors.ZeroMethod(ZeroMethodType.UsePreEventDiagnosticsZero, -.05, .05),
|
|||
|
|
new DTS.Common.Classes.Sensors.ZeroMethod(ZeroMethodType.AverageOverTime, -.05, .05) });
|
|||
|
|
sd.Calibration.RemoveOffset = false;
|
|||
|
|
sd.BridgeResistance = -1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (null != sd)
|
|||
|
|
{
|
|||
|
|
sensorId = sd.DatabaseId;
|
|||
|
|
sensorName = GroupChannel.GetString(sd, hardwarechannel);
|
|||
|
|
}
|
|||
|
|
GroupChannel channel = null;
|
|||
|
|
if (null != sd && sd.IsTestSpecificEmbedded)
|
|||
|
|
{
|
|||
|
|
if (hardwarechannel.IsTSRAIR)
|
|||
|
|
{
|
|||
|
|
channel = GroupChannel.CreateTSRAirChannel(hardwarechannel, group, sd, defaults);
|
|||
|
|
}
|
|||
|
|
else { channel = GroupChannel.CreateVoltageInsertionChannel(hardwarechannel, group, sd, defaults); }
|
|||
|
|
channel.GroupNameEditable = UseTestSetupOrder;
|
|||
|
|
}
|
|||
|
|
else if (null != sd && sd.IsTestSpecificThermo)
|
|||
|
|
{
|
|||
|
|
if (hardwarechannel.IsThermocoupler)
|
|||
|
|
{
|
|||
|
|
channel = GroupChannel.CreateSLICETCChannel(hardwarechannel, group, sd, defaults);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
channel = new GroupChannel(UseTestSetupOrder, group.DisplayName, group, defaults)
|
|||
|
|
{
|
|||
|
|
DASId = hardwarechannel.GetParentDAS().DASId,
|
|||
|
|
DASChannelIndex = hardwarechannel.ChannelNumber,
|
|||
|
|
Hardware = hardwarechannel.ToString(),
|
|||
|
|
SensorId = sensorId
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
channel.SetHardwareChannel(hardwarechannel);
|
|||
|
|
channel.RemoveSensorVisibility = hardwarechannel.IsTSRAIR ? System.Windows.Visibility.Hidden : System.Windows.Visibility.Visible;// channel.HardwareChannel.IsTSRAIR ? System.Windows.Visibility.Hidden : System.Windows.Visibility.Visible;
|
|||
|
|
if (null != sd)
|
|||
|
|
{
|
|||
|
|
channel.SetSensor(sd, true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
var groupChannels = TestSetup.ChannelsForGroup[channel.Group].ToList();
|
|||
|
|
groupChannels.Add(channel);
|
|||
|
|
TestSetup.ChannelsForGroup[channel.Group] = groupChannels.ToArray();
|
|||
|
|
}
|
|||
|
|
MarkModified(channel, false);
|
|||
|
|
AllChannels.Add(channel);
|
|||
|
|
_dontFilterList.Add(channel);
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
var list = TestSetup.ChannelsForGroup[channel.Group].ToList();
|
|||
|
|
if (!list.Contains(channel))
|
|||
|
|
{
|
|||
|
|
list.Add(channel);
|
|||
|
|
TestSetup.ChannelsForGroup[channel.Group] = list.ToArray();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (int i = 0; i < AllChannels.Count; i++)
|
|||
|
|
{
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
AllChannels[i].TestSetupOrder = 1 + i;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
AllChannels[i].GroupChannelOrder = 1 + i;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
AllChannels.Add(last);
|
|||
|
|
Filter(SearchTerm, false);
|
|||
|
|
NotifyChannelsChanged();
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// the code here warns the user if they are currently filtering.
|
|||
|
|
/// it doesn't seem necessary anymore, but I've left it in incase things change.
|
|||
|
|
/// </summary>
|
|||
|
|
public void NotifyUserIfFiltering()
|
|||
|
|
{
|
|||
|
|
//bool bFiltering = false;
|
|||
|
|
//using( var enumFilters = _filterByField.GetEnumerator() )
|
|||
|
|
//{
|
|||
|
|
// while( enumFilters.MoveNext() )
|
|||
|
|
// {
|
|||
|
|
// if( string.IsNullOrWhiteSpace(enumFilters.Current.Value) ) { continue; }
|
|||
|
|
// bFiltering = true;
|
|||
|
|
// break;
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
//if( !string.IsNullOrWhiteSpace(SearchTerm) ){ bFiltering = true; }
|
|||
|
|
|
|||
|
|
//if( bFiltering )
|
|||
|
|
//{
|
|||
|
|
// _eventAggregator.GetEvent<PageErrorEvent>().Publish(new PageErrorArg(new []{ Resources.StringResources.DragAndDropFilterWarning }, Page) );
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
private Fields[] GetColumns()
|
|||
|
|
{
|
|||
|
|
var list = new List<Fields>();
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
list.Add(Fields.GroupName);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (ShowUserCodes)
|
|||
|
|
{
|
|||
|
|
list.Add(Fields.UserCode);
|
|||
|
|
list.Add(Fields.UserChannelName);
|
|||
|
|
}
|
|||
|
|
if (ShowISOCodes)
|
|||
|
|
{
|
|||
|
|
list.Add(Fields.ISOCode);
|
|||
|
|
list.Add(Fields.ISOChannelName);
|
|||
|
|
}
|
|||
|
|
if (ChannelNamesOnly)
|
|||
|
|
{
|
|||
|
|
list.Add(Fields.UserChannelName);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
list.Add(Fields.Sensor);
|
|||
|
|
list.Add(Fields.Hardware);
|
|||
|
|
|
|||
|
|
return list.ToArray();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void SetIncludedHardware(IDASHardware[] hardwares)
|
|||
|
|
{
|
|||
|
|
_includedHardware = hardwares;
|
|||
|
|
OnPropertyChanged("AvailableChannelCount");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void SelectedChannelItemsOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
|
|||
|
|
{
|
|||
|
|
OnPropertyChanged("CanMoveSelectedDown");
|
|||
|
|
OnPropertyChanged("CanMoveSelectedUp");
|
|||
|
|
OnPropertyChanged("SelectedDeleteShouldBeEnabled");
|
|||
|
|
OnPropertyChanged("SelectedDeleteShouldDisplayTooltip");
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region Properties
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// whether voltage insertion channels should be created when dragging on an analog hardware channel onto
|
|||
|
|
/// a blank channel with no sensor set yet
|
|||
|
|
/// </summary>
|
|||
|
|
public bool CreateVoltageInputChannels { get; set; } = true;
|
|||
|
|
|
|||
|
|
private bool _readOnlyChannelsMode = false;
|
|||
|
|
/// <summary>
|
|||
|
|
/// returns whether the user input controls in the view should be read only
|
|||
|
|
/// 16284 Channels table in EditTestSetup is enabled when it shouldn't be
|
|||
|
|
/// </summary>
|
|||
|
|
public bool ReadOnlyChannelsMode
|
|||
|
|
{
|
|||
|
|
get => _readOnlyChannelsMode;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_readOnlyChannelsMode = value;
|
|||
|
|
OnPropertyChanged("ReadOnlyChannelsMode");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private bool _readOnlyParametersMode = false;
|
|||
|
|
|
|||
|
|
public bool ReadOnlyParametersMode
|
|||
|
|
{
|
|||
|
|
get => _readOnlyParametersMode;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_readOnlyParametersMode = value;
|
|||
|
|
OnPropertyChanged("ReadOnlyParametersMode");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// describes whether the isocode should always match the filter and vice versa
|
|||
|
|
/// 13871 Changing ISO code of a channel in a group does not automatically change the CFC drop-down in parameters
|
|||
|
|
/// </summary>
|
|||
|
|
public bool UseISOCodeFilterMapping { get; set; }
|
|||
|
|
/// <summary>
|
|||
|
|
/// list of channels which should _NOT_ be filtered out
|
|||
|
|
/// 13534 Cannot assign sensors or hardware channels when the column filter is set
|
|||
|
|
/// new rows were being filtered out, we want to keep them at least for the operation after filtering
|
|||
|
|
/// </summary>
|
|||
|
|
private List<IGroupChannel> _dontFilterList = new List<IGroupChannel>();
|
|||
|
|
|
|||
|
|
private IDASHardware[] _includedHardware = new IDASHardware[0];
|
|||
|
|
|
|||
|
|
public int AvailableChannelCount
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
int count = 0;
|
|||
|
|
foreach (var h in _includedHardware)
|
|||
|
|
{
|
|||
|
|
var channels = h.GetIHardwareChannels();
|
|||
|
|
//don't count ECM in channel count
|
|||
|
|
if (h.IsSLICEEthernetController) { continue; }
|
|||
|
|
for (var i = 0; i < channels.Length; i++)
|
|||
|
|
{
|
|||
|
|
if (h.IsTSRAIR())
|
|||
|
|
{
|
|||
|
|
GroupChannel.GetTSRAppendString(channels[i], out var serial, out var moduleName, out var channelNumber, out var hardware);
|
|||
|
|
if (!HardwareConstants.HasEmbeddedChannelType(h.DASTypeEnum, moduleName)) { continue; }
|
|||
|
|
if (GroupChannel.ExcludeChannelFromCount(channels[i]))
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
count++;
|
|||
|
|
if (channels[i].IsSquib)
|
|||
|
|
{
|
|||
|
|
i++;//skip next squib channel [voltage/current]
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return count;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public int AssignedPhysicalChannelCount
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
int count = 0;
|
|||
|
|
var hash = new HashSet<string>();
|
|||
|
|
foreach (var ch in AllChannels)
|
|||
|
|
{
|
|||
|
|
if (ch.IsBlank() || !ch.HardwareValid)
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
var key = $"{ch.DASId}_{ch.DASChannelIndex}";
|
|||
|
|
if (!hash.Contains(key))
|
|||
|
|
{
|
|||
|
|
hash.Add(key);
|
|||
|
|
count++;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return count;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public int ChannelCount => AllChannels.Count - 1;
|
|||
|
|
|
|||
|
|
private IDictionary<int, ISensorData> _idToSensorDictionary = new Dictionary<int, ISensorData>();
|
|||
|
|
|
|||
|
|
private IDictionary<string, ISensorData> _serialNumberToSensorDictionary = new Dictionary<string, ISensorData>();
|
|||
|
|
|
|||
|
|
private IDictionary<string, IHardwareChannel> _displayToHardwareChannel =
|
|||
|
|
new Dictionary<string, IHardwareChannel>();
|
|||
|
|
public enum Fields
|
|||
|
|
{
|
|||
|
|
GroupName,
|
|||
|
|
UserCode,
|
|||
|
|
UserChannelName,
|
|||
|
|
ISOCode,
|
|||
|
|
ISOChannelName,
|
|||
|
|
Sensor,
|
|||
|
|
Hardware,
|
|||
|
|
Range,
|
|||
|
|
Capacity,
|
|||
|
|
Sensitivity,
|
|||
|
|
Units,
|
|||
|
|
FilterClass,
|
|||
|
|
Polarity,
|
|||
|
|
InputMode,
|
|||
|
|
DefaultValue,
|
|||
|
|
ActiveValue,
|
|||
|
|
OutputMode,
|
|||
|
|
OutputDelay,
|
|||
|
|
OutputLimitDuration,
|
|||
|
|
OutputDuration,
|
|||
|
|
SquibFireMode,
|
|||
|
|
SquibDelay,
|
|||
|
|
SquibLimitDuration,
|
|||
|
|
SquibDuration,
|
|||
|
|
SquibCurrent,
|
|||
|
|
Order,
|
|||
|
|
IEPE,
|
|||
|
|
ZeroMethod,
|
|||
|
|
ZeroMethodStart,
|
|||
|
|
ZeroMethodEnd,
|
|||
|
|
InitialOffset,
|
|||
|
|
UartBaudRate,
|
|||
|
|
UartDataBits,
|
|||
|
|
UartStopBits,
|
|||
|
|
UartParity,
|
|||
|
|
UartFlowControl,
|
|||
|
|
UartDataFormat,
|
|||
|
|
StreamOutUDPProfile,
|
|||
|
|
StreamOutUDPAddress,
|
|||
|
|
StreamOutUDPTimeChannelId,
|
|||
|
|
StreamOutUDPDataChannelId,
|
|||
|
|
StreamOutUDPTmNSConfig,
|
|||
|
|
StreamOutIRIGTimeDataPacketIntervalMs,
|
|||
|
|
StreamInUDPAddress,
|
|||
|
|
//44881
|
|||
|
|
CanIsFD,
|
|||
|
|
CanArbBaseBitrate,
|
|||
|
|
CanArbBaseSJW,
|
|||
|
|
CanDataBitrate,
|
|||
|
|
CanDataSJW,
|
|||
|
|
CanFileType
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private Dictionary<Fields, string> _filterByField = new Dictionary<Fields, string>();
|
|||
|
|
private PossibleFilters BridgeFilter { get; set; } = PossibleFilters.All;
|
|||
|
|
private string SearchTerm { get; set; }
|
|||
|
|
|
|||
|
|
public object Page { get; private set; }
|
|||
|
|
|
|||
|
|
public bool IsDirty { get; private set; }
|
|||
|
|
private bool _isBusy = false;
|
|||
|
|
public bool IsBusy
|
|||
|
|
{
|
|||
|
|
get => _isBusy;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_isBusy = value;
|
|||
|
|
OnPropertyChanged("IsBusy");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private bool _isMenuIncluded;
|
|||
|
|
public bool IsMenuIncluded
|
|||
|
|
{
|
|||
|
|
get => _isMenuIncluded;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_isMenuIncluded = value;
|
|||
|
|
OnPropertyChanged("IsMenuIncluded");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private bool _isNavigationIncluded;
|
|||
|
|
public bool IsNavigationIncluded
|
|||
|
|
{
|
|||
|
|
get => _isNavigationIncluded;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_isNavigationIncluded = value;
|
|||
|
|
OnPropertyChanged("IsNavigationIncluded");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public string ListViewId => "GroupChannelListView";
|
|||
|
|
|
|||
|
|
public List<IGroupChannel> AllChannels { get; } = new List<IGroupChannel>();
|
|||
|
|
|
|||
|
|
private IList<IChannelCode> GetAllChannels()
|
|||
|
|
{
|
|||
|
|
return ChannelCodes.Model.ChannelCode.ChannelCodes;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Sort(object columnTag, bool bUserClick)
|
|||
|
|
{
|
|||
|
|
if (!(columnTag is string sField))
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (!(Enum.TryParse(sField, out Fields field))) { return; }
|
|||
|
|
if (bUserClick)
|
|||
|
|
{
|
|||
|
|
if (field != _currentSortField)
|
|||
|
|
{
|
|||
|
|
_currentSortField = field;
|
|||
|
|
_sortAscending = true;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
_sortAscending = !_sortAscending;
|
|||
|
|
}
|
|||
|
|
ResetSettingChannels();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public class GroupChannelComparer : IComparer<IGroupChannel>
|
|||
|
|
{
|
|||
|
|
public Fields SortField { get; set; }
|
|||
|
|
public bool SortAscending { get; set; }
|
|||
|
|
public bool UseTestSetupOrder { get; set; }
|
|||
|
|
public int Compare(IGroupChannel x, IGroupChannel y)
|
|||
|
|
{
|
|||
|
|
if (x == y) { return 0; }
|
|||
|
|
if (null == x) { return 1; }
|
|||
|
|
if (null == y) { return -1; }
|
|||
|
|
|
|||
|
|
var left = x;
|
|||
|
|
var right = y;
|
|||
|
|
if (!SortAscending)
|
|||
|
|
{
|
|||
|
|
left = y;
|
|||
|
|
right = x;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
switch (SortField)
|
|||
|
|
{
|
|||
|
|
case Fields.GroupName: return left.GroupName.CompareTo(right.GroupName);
|
|||
|
|
case Fields.UserCode: return left.UserCode.CompareTo(right.UserCode);
|
|||
|
|
case Fields.UserChannelName: return left.UserChannelName.CompareTo(right.UserChannelName);
|
|||
|
|
case Fields.ISOCode: return left.IsoCode.CompareTo(right.IsoCode);
|
|||
|
|
case Fields.ISOChannelName: return left.IsoChannelName.CompareTo(right.IsoChannelName);
|
|||
|
|
case Fields.Sensor: return left.Sensor.CompareTo(right.Sensor);
|
|||
|
|
case Fields.Hardware: return left.Hardware.CompareTo(right.Hardware);
|
|||
|
|
case Fields.Range: return left.Range.CompareTo(right.Range);
|
|||
|
|
case Fields.Capacity: return left.Capacity.CompareTo(right.Capacity);
|
|||
|
|
case Fields.Sensitivity: return left.Sensitivity.CompareTo(right.Sensitivity);
|
|||
|
|
case Fields.Units: return left.Units.CompareTo(right.Units);
|
|||
|
|
case Fields.ZeroMethod: return left.ZeroMethod.CompareTo(right.ZeroMethod);
|
|||
|
|
//FB 13120 set filter class
|
|||
|
|
case Fields.FilterClass: return left.FilterClass.CompareTo(right.FilterClass);
|
|||
|
|
case Fields.Polarity: return left.Polarity.CompareTo(right.Polarity);
|
|||
|
|
case Fields.InputMode: return left.DigitalInputMode.ToString().CompareTo(right.DigitalInputMode.ToString());
|
|||
|
|
case Fields.DefaultValue: return left.DefaultValue.CompareTo(right.DefaultValue);
|
|||
|
|
case Fields.ActiveValue: return left.ActiveValue.CompareTo(right.ActiveValue);
|
|||
|
|
case Fields.OutputMode: return left.DigitalOutputMode.ToString().CompareTo(right.DigitalOutputMode.ToString());
|
|||
|
|
case Fields.OutputDelay: return left.DigitalOutDelay.CompareTo(right.DigitalOutDelay);
|
|||
|
|
case Fields.OutputLimitDuration: return left.DigitalOutDuration.CompareTo(right.DigitalOutDuration);
|
|||
|
|
case Fields.OutputDuration: return left.DigitalOutDuration.CompareTo(right.DigitalOutDuration);
|
|||
|
|
case Fields.SquibFireMode: return left.SquibFireMode.ToString().CompareTo(right.SquibFireMode);
|
|||
|
|
//FB14623 Not setting any null value so this should work as before.
|
|||
|
|
case Fields.SquibDelay: return left.SquibDelay.Value.CompareTo(right.SquibDelay.Value);
|
|||
|
|
case Fields.SquibCurrent: return left.SquibCurrent.CompareTo(right.SquibCurrent);
|
|||
|
|
case Fields.SquibLimitDuration: return left.SquibLimitDuration.CompareTo(right.SquibLimitDuration);
|
|||
|
|
case Fields.SquibDuration: return left.SquibDuration.CompareTo(right.SquibDuration);
|
|||
|
|
case Fields.IEPE: return left.IEPESupport.CompareTo(right.IEPESupport);
|
|||
|
|
//18363 UART-settings-as-channels
|
|||
|
|
case Fields.UartBaudRate: return left.UartBaudRate.CompareTo(right.UartBaudRate);
|
|||
|
|
case Fields.UartDataBits: return left.UartDataBits.CompareTo(right.UartDataBits);
|
|||
|
|
case Fields.UartStopBits: return left.UartStopBits.ToString().CompareTo(right.UartStopBits.ToString());
|
|||
|
|
case Fields.UartParity: return left.UartParity.ToString().CompareTo(right.UartParity.ToString());
|
|||
|
|
case Fields.UartFlowControl: return left.UartFlowControl.ToString().CompareTo(right.UartFlowControl.ToString());
|
|||
|
|
case Fields.UartDataFormat: return left.UartDataFormat.ToString().CompareTo(right.UartDataFormat.ToString());
|
|||
|
|
//18364 Streaming Out-settings-as-channels
|
|||
|
|
case Fields.StreamOutUDPProfile: return left.StreamOutUDPProfile.CompareTo(right.StreamOutUDPProfile);
|
|||
|
|
case Fields.StreamOutUDPAddress: return left.StreamOutUDPAddress.CompareTo(right.StreamOutUDPAddress);
|
|||
|
|
case Fields.StreamOutUDPTimeChannelId: return left.StreamOutUDPTimeChannelId.CompareTo(right.StreamOutUDPTimeChannelId);
|
|||
|
|
case Fields.StreamOutUDPDataChannelId: return left.StreamOutUDPDataChannelId.CompareTo(right.StreamOutUDPDataChannelId);
|
|||
|
|
case Fields.StreamOutUDPTmNSConfig: return left.StreamOutUDPTmNSConfig.CompareTo(right.StreamOutUDPTmNSConfig);
|
|||
|
|
case Fields.StreamOutIRIGTimeDataPacketIntervalMs: return left.StreamOutIRIGTimeDataPacketIntervalMs.CompareTo(right.StreamOutIRIGTimeDataPacketIntervalMs);
|
|||
|
|
//26828 Streaming In-settings-as-channels
|
|||
|
|
case Fields.StreamInUDPAddress: return left.StreamInUDPAddress.CompareTo(right.StreamInUDPAddress);
|
|||
|
|
//FB 44881
|
|||
|
|
case Fields.CanIsFD: return left.CanIsFD.CompareTo(right.CanIsFD);
|
|||
|
|
case Fields.CanArbBaseBitrate: return left.CanArbBaseBitrate.CompareTo(right.CanArbBaseBitrate);
|
|||
|
|
case Fields.CanArbBaseSJW: return left.CanArbBaseSJW.CompareTo(right.CanArbBaseSJW);
|
|||
|
|
case Fields.CanDataBitrate: return left.CanDataBitrate.CompareTo(right.CanDataBitrate);
|
|||
|
|
case Fields.CanDataSJW: return left.CanDataSJW.CompareTo(right.CanDataSJW);
|
|||
|
|
case Fields.CanFileType: return left.CanFileType.CompareTo(right.CanFileType);
|
|||
|
|
|
|||
|
|
case Fields.InitialOffset:
|
|||
|
|
{
|
|||
|
|
var converter = new EnumDescriptionTypeConverter(typeof(InitialOffsetTypes));
|
|||
|
|
var leftIO = converter.ConvertToString(left.InitialOffset.Form);
|
|||
|
|
var rightIO = converter.ConvertToString(right.InitialOffset.Form);
|
|||
|
|
return leftIO.CompareTo(rightIO);
|
|||
|
|
}
|
|||
|
|
case Fields.Order:
|
|||
|
|
default:
|
|||
|
|
{
|
|||
|
|
if (UseTestSetupOrder) { return left.TestSetupOrder.CompareTo(right.TestSetupOrder); }
|
|||
|
|
else { return left.GroupChannelOrder.CompareTo(right.GroupChannelOrder); }
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
private bool _sortAscending = true;
|
|||
|
|
private Fields _currentSortField = Fields.Order;
|
|||
|
|
public Func<IList<IChannelCode>> ChannelCodesFunc { get; }
|
|||
|
|
public string CapacityFormat { get; set; }
|
|||
|
|
|
|||
|
|
public ObservableCollection<IGroupChannel> Channels { get; set; } = new ObservableCollection<IGroupChannel>();
|
|||
|
|
|
|||
|
|
public ObservableCollection<IGroupChannel> SettingChannels { get; set; } = new ObservableCollection<IGroupChannel>();
|
|||
|
|
|
|||
|
|
private IsoViewMode _isoViewMode = IsoViewMode.ISOAndUserCode;
|
|||
|
|
|
|||
|
|
public bool ApplySensorDataToBlankChannels { get; set; }
|
|||
|
|
public bool AllowChannelDeletionByNonAdminUser { get; set; }
|
|||
|
|
public bool AllowChannelDeletionFromFixedGroup { get; set; }
|
|||
|
|
public bool UserIsAdmin { get; set; }
|
|||
|
|
public bool AllowSensorPushAndPull { get; set; }
|
|||
|
|
|
|||
|
|
public IsoViewMode ISOViewMode
|
|||
|
|
{
|
|||
|
|
get => _isoViewMode;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_isoViewMode = value;
|
|||
|
|
OnPropertyChanged("ShowISOCodes");
|
|||
|
|
OnPropertyChanged("ShowUserCodes");
|
|||
|
|
OnPropertyChanged("ChannelNamesOnly");
|
|||
|
|
OnPropertyChanged("ISOViewMode");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public bool ShowISOCodes => _isoViewMode == IsoViewMode.ISOOnly || _isoViewMode == IsoViewMode.ISOAndUserCode;
|
|||
|
|
|
|||
|
|
public bool ShowUserCodes => _isoViewMode == IsoViewMode.ISOAndUserCode || _isoViewMode == IsoViewMode.UserCodeOnly;
|
|||
|
|
|
|||
|
|
public bool ChannelNamesOnly => _isoViewMode == IsoViewMode.ChannelNameOnly;
|
|||
|
|
|
|||
|
|
private bool _showISOStringBuilder = true;
|
|||
|
|
public bool ShowISOStringBuilder
|
|||
|
|
{
|
|||
|
|
get => _showISOStringBuilder;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_showISOStringBuilder = value;
|
|||
|
|
OnPropertyChanged("ShowISOStringBuilder");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private bool _uniqueISOCodesRequired = false;
|
|||
|
|
public bool UniqueISOCodesRequired
|
|||
|
|
{
|
|||
|
|
get => _uniqueISOCodesRequired;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_uniqueISOCodesRequired = value;
|
|||
|
|
OnPropertyChanged("UniqueISOCodesRequired");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private bool _showChannelCodeLookupHelper = true;
|
|||
|
|
public bool ShowChannelCodeLookupHelper
|
|||
|
|
{
|
|||
|
|
get => _showChannelCodeLookupHelper;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_showChannelCodeLookupHelper = value;
|
|||
|
|
OnPropertyChanged("ShowChannelCodeLookupHelper");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private bool _showSensorChannelUserValues = false;
|
|||
|
|
public bool ShowSensorChannelUserValues
|
|||
|
|
{
|
|||
|
|
get => _showSensorChannelUserValues;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_showSensorChannelUserValues = value;
|
|||
|
|
OnPropertyChanged("ShowSensorChannelUserValues");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private ObservableCollection<IGroupChannel> _selectedChannelItems;
|
|||
|
|
public ObservableCollection<IGroupChannel> SelectedChannelItems
|
|||
|
|
{
|
|||
|
|
get => _selectedChannelItems;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
if (_selectedChannelItems != null)
|
|||
|
|
{
|
|||
|
|
_selectedChannelItems.CollectionChanged -= SelectedChannelItemsOnCollectionChanged;
|
|||
|
|
}
|
|||
|
|
_selectedChannelItems = value;
|
|||
|
|
if (_selectedChannelItems != null)
|
|||
|
|
{
|
|||
|
|
_selectedChannelItems.CollectionChanged += SelectedChannelItemsOnCollectionChanged;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private int _expectedIndex = 0;
|
|||
|
|
public int ExpectedIndex
|
|||
|
|
{
|
|||
|
|
get => _expectedIndex;
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_expectedIndex = value;
|
|||
|
|
OnPropertyChanged("ExpectedIndex");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public int UserID { get; set; }
|
|||
|
|
#endregion Properties
|
|||
|
|
|
|||
|
|
#region Commands
|
|||
|
|
private ICommand _moveSelectedChannelsToTopCommand;
|
|||
|
|
public ICommand MoveSelectedChannelsToTopCommand =>
|
|||
|
|
|
|||
|
|
_moveSelectedChannelsToTopCommand ?? (_moveSelectedChannelsToTopCommand = new DelegateCommand(MoveSelectedChannelsToTop));
|
|||
|
|
|
|||
|
|
private void MoveSelectedChannelsToTop()
|
|||
|
|
{
|
|||
|
|
MoveTop(SelectedChannelItems.OrderBy(ch => Channels.IndexOf(ch)).ToArray());
|
|||
|
|
NotifyChannelsChanged();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private ICommand _moveSelectedChannelsToIndexCommand;
|
|||
|
|
public ICommand MoveSelectedChannelsToIndexCommand =>
|
|||
|
|
|
|||
|
|
_moveSelectedChannelsToIndexCommand ?? (_moveSelectedChannelsToIndexCommand = new DelegateCommand(MoveSelectedChannelsToIndex));
|
|||
|
|
|
|||
|
|
private void MoveSelectedChannelsToIndex()
|
|||
|
|
{
|
|||
|
|
MoveToIndex(SelectedChannelItems.OrderBy(ch => Channels.IndexOf(ch)).ToArray(), ExpectedIndex);
|
|||
|
|
NotifyChannelsChanged();
|
|||
|
|
}
|
|||
|
|
private ICommand _moveSelectedChannelsUpCommand;
|
|||
|
|
public ICommand MoveSelectedChannelsUpCommand =>
|
|||
|
|
|
|||
|
|
_moveSelectedChannelsUpCommand ?? (_moveSelectedChannelsUpCommand = new DelegateCommand(MoveSelectedChannelsUp));
|
|||
|
|
|
|||
|
|
private void MoveSelectedChannelsUp()
|
|||
|
|
{
|
|||
|
|
MoveUp(SelectedChannelItems.OrderBy(ch => Channels.IndexOf(ch)).ToArray());
|
|||
|
|
NotifyChannelsChanged();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private ICommand _moveSelectedChannelsDownCommand;
|
|||
|
|
public ICommand MoveSelectedChannelsDownCommand =>
|
|||
|
|
|
|||
|
|
_moveSelectedChannelsDownCommand ?? (_moveSelectedChannelsDownCommand = new DelegateCommand(MoveSelectedChannelsDown));
|
|||
|
|
|
|||
|
|
private void MoveSelectedChannelsDown()
|
|||
|
|
{
|
|||
|
|
MoveDown(SelectedChannelItems.OrderBy(ch => Channels.IndexOf(ch)).ToArray());
|
|||
|
|
NotifyChannelsChanged();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private ICommand _moveSelectedChannelsToBottomCommand;
|
|||
|
|
public ICommand MoveSelectedChannelsToBottomCommand =>
|
|||
|
|
|
|||
|
|
_moveSelectedChannelsToBottomCommand ?? (_moveSelectedChannelsToBottomCommand = new DelegateCommand(MoveSelectedChannelsToBottom));
|
|||
|
|
|
|||
|
|
private void MoveSelectedChannelsToBottom()
|
|||
|
|
{
|
|||
|
|
MoveBottom(SelectedChannelItems.OrderBy(ch => Channels.IndexOf(ch)).ToArray());
|
|||
|
|
NotifyChannelsChanged();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private ICommand _removeSelectedSensorsCommand;
|
|||
|
|
public ICommand RemoveSelectedSensorsCommand =>
|
|||
|
|
|
|||
|
|
_removeSelectedSensorsCommand ?? (_removeSelectedSensorsCommand = new DelegateCommand(RemoveSelectedSensors));
|
|||
|
|
|
|||
|
|
private void RemoveSelectedSensors()
|
|||
|
|
{
|
|||
|
|
foreach (var channel in SelectedChannelItems)
|
|||
|
|
{
|
|||
|
|
if (!(channel as GroupChannel).EmbeddedSensor)
|
|||
|
|
{
|
|||
|
|
Clear(channel);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
NotifyChannelsChanged();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private ICommand _deleteSelectedChannelsCommand;
|
|||
|
|
public ICommand DeleteSelectedChannelsCommand =>
|
|||
|
|
|
|||
|
|
_deleteSelectedChannelsCommand ?? (_deleteSelectedChannelsCommand = new DelegateCommand(DeleteSelectedChannels));
|
|||
|
|
|
|||
|
|
private void DeleteSelectedChannels()
|
|||
|
|
{
|
|||
|
|
for (var i = 0; i < SelectedChannelItems.Count; i++)
|
|||
|
|
{
|
|||
|
|
var channel = SelectedChannelItems[i];
|
|||
|
|
if (channel.IsBlank())
|
|||
|
|
{
|
|||
|
|
//14546
|
|||
|
|
// Cannot use delete action button in edit group/test
|
|||
|
|
// it's possible the channel is blank but still has an order assigned, we have to allow it to be
|
|||
|
|
// deleted still then ...
|
|||
|
|
if (UseTestSetupOrder)
|
|||
|
|
{
|
|||
|
|
if (channel.TestSetupOrder <= 0)
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (channel.GroupChannelOrder <= 0)
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Remove(channel);
|
|||
|
|
i--;
|
|||
|
|
}
|
|||
|
|
NotifyChannelsChanged();
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
}
|