using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using DTS.Common.Base; using DTS.Common.Classes.Hardware; using DTS.Common.Converters; using DTS.Common.Enums; using DTS.Common.Enums.Hardware; using DTS.Common.Interface.DASFactory.Diagnostics; using DTS.Common.Interface.DASFactory.Diagnostics.HardwareList; namespace HardareList.Model { public class HardwareModel : BasePropertyChanged, IHardware { /// /// first date of use after calibration /// only valid if IsFirstUseValid is true /// null value indicates hardware has not been used since calibration /// (once again, only if IsFirstUseValid is true) /// 15524 DAS "First Use Date" /// public DateTime? FirstUseDate { get; set; } = null; /// /// whether hardware supports and is using first use date /// 15524 DAS "First Use Date" /// public bool IsFirstUseValid { get; set; } = false; public int DASId { get; set; } public bool Disabled { get; set; } public string SerialNumber { get; set; } public string HardwareType { get; set; } public string ChannelCount { get; set; } public bool HasIncludedChildren { get; set; } = false; public string Firmware { get; set; } public double? MaxSampleRate { get; set; } private double _testSampleRate = 0; public double TestSampleRate { get => _testSampleRate; set { SetProperty(ref _testSampleRate, value, "TestSampleRate"); OnPropertyChanged("SelectedSampleRateIndex"); } } private double _testAafilterRateHz = 0; public double TestAAFilterRateHz { get => _testAafilterRateHz; set { SetProperty(ref _testAafilterRateHz, value, "TestAAFilterRateHz"); _vm.FireAAFilterRate(this, value.ToString()); } } public DateTime? CalDate { get; set; } public DateTime? CalDueDate { get; set; } public List _availableSampleRates { get; set; } public string[] AvailableSampleRates { get; set; } public string SelectedSampleRateItem { get; set; } = string.Empty; public int SelectedSampleRateIndex { get { if (null == _availableSampleRates) { return -1; } if (_availableSampleRates.IndexOf(TestSampleRate) == -1) { return -1; } SelectedSampleRateItem = AvailableSampleRates[_availableSampleRates.IndexOf(TestSampleRate)]; //They're all the same return _availableSampleRates.IndexOf(TestSampleRate); } set { if (SelectedSampleRateIndex == value) return; TestSampleRate = _availableSampleRates[value]; _vm.FireSampleRate(this, _availableSampleRates[value].ToString()); TestAAFilterRateHz = _vm.GetAAFForHardware((IISOHardware)Hardware, (int)TestSampleRate); OnPropertyChanged("SelectedSampleRateIndex"); } } public object Hardware { get; set; } public int AnalogChannels { get; set; } public int SquibChannels { get; set; } public int DigitalInChannels { get; set; } public int DigitalOutChannels { get; set; } public int UartChannels { get; set; } public int StreamOutChannels { get; set; } public int StreamInChannels { get; set; } public int CanChannels { get; set; } public string IPAddress { get; set; } private bool _bIncluded = false; public bool Included { get => _bIncluded; set { _bIncluded = value; OnPropertyChanged("Included"); _vm.FireIncluded(this); OnPropertyChanged("MixedRates"); OnPropertyChanged("IncludedAndNotMixedRatesAndCompactOrNotDistributor"); OnPropertyChanged("IncludedAndMixedRatesAndCompact"); } } private double _dspStreamingFilter = double.NaN; public double DSPStreamingFilter { get => _dspStreamingFilter; set => SetProperty(ref _dspStreamingFilter, value, "DSPStreamingFilter"); } public DTS.Common.ClockSyncProfile MasterProfile { get; set; } = DTS.Common.ClockSyncProfile.None; public DTS.Common.ClockSyncProfile SlaveProfile { get; set; } = DTS.Common.ClockSyncProfile.None; private bool _bIsClockMaster = false; public bool IsClockMaster { get => IsClockedDAS && _bIsClockMaster; set { SetProperty(ref _bIsClockMaster, value, "IsClockMaster"); _vm.FireClockMaster(this, IsClockMaster); OnPropertyChanged("IsPTPSync"); } } public bool IsClockedDAS { get { switch(((IISOHardware)Hardware)?.DASTypeEnum) { case HardwareTypes.SLICE6_AIR: case HardwareTypes.S6A_EthernetRecorder: case HardwareTypes.SLICE6_Base: case HardwareTypes.SLICE6_AIR_BR: case HardwareTypes.SLICE6DB: case HardwareTypes.SLICE6DB3: case HardwareTypes.SLICE6DB_InDummy: case HardwareTypes.TSR_AIR: case HardwareTypes.TSR_AIR_RevB: case HardwareTypes.SLICE6_AIR_TC: return true; } return false; } } private byte _ptpDomainId = 0; public byte PTPDomainID { get => _ptpDomainId; set { SetProperty(ref _ptpDomainId, value, "PTPDomainID"); _vm.FirePTPDomainID(this, PTPDomainID); } } public bool IsPTPSync => (IsClockMaster && MasterProfile.GetDescription().Contains("E2E")) || (!IsClockMaster && SlaveProfile.GetDescription().Contains("E2E")); private bool _mixedRates = false; public bool MixedRates { get => _mixedRates; set { _mixedRates = value; OnPropertyChanged("MixedRates"); OnPropertyChanged("IncludedAndNotMixedRatesAndCompactOrNotDistributor"); OnPropertyChanged("IncludedAndMixedRatesAndCompact"); } } public bool IsDistributor => (Hardware as IISOHardware).DASTypeEnum == HardwareTypes.SLICE_EthernetController || (Hardware as IISOHardware).DASTypeEnum == HardwareTypes.SLICE_Distributor || (Hardware as IISOHardware).DASTypeEnum == HardwareTypes.SLICE_Mini_Distributor || (Hardware as IISOHardware).DASTypeEnum == HardwareTypes.SLICE6DB || (Hardware as IISOHardware).DASTypeEnum == HardwareTypes.SLICE_LabEthernet || (Hardware as IISOHardware).DASTypeEnum == HardwareTypes.SLICE6DB3 || (Hardware as IISOHardware).DASTypeEnum == HardwareTypes.SLICE6DB_InDummy || (Hardware as IISOHardware).DASTypeEnum == HardwareTypes.SLICE_Pro_Distributor; public bool IsBattery => (Hardware as IISOHardware).DASTypeEnum == HardwareTypes.PowerPro; public bool IsTSRAIR => (Hardware as IISOHardware).DASTypeEnum == HardwareTypes.TSR_AIR || (Hardware as IISOHardware).DASTypeEnum == HardwareTypes.TSR_AIR_RevB || (Hardware as IISOHardware).DASTypeEnum == HardwareTypes.DKR || (Hardware as IISOHardware).DASTypeEnum == HardwareTypes.DIR; public bool IncludedAndNotMixedRatesAndCompactOrNotDistributor => Included && !MixedRates && ((_vm.ShowCompact && HasIncludedChildren) || !IsDistributor) && !IsBattery; public bool IncludedAndMixedRatesAndCompact => Included && MixedRates && _vm.ShowCompact && !IsBattery; private HardwareList.HardwareListViewModel _vm; public HardwareModel(IISOHardware d, int tdasCalPeriod, int g5CalPeriod, int slice1CalPeriod, int slice2CalPeriod, int slice15CalPeriod, int slice6CalPeriod, int powerProCalPeriod, int slice6AirCalPeriod, int slice6AirBridgeCalPeriod, int slice6DBCalPeriod, int tsrAirCalPeriod, int sliceTcCalPeriod, int sliceProCanFdPeriod, HardwareList.HardwareListViewModel vm) { FirstUseDate = d.FirstUseDate; IsFirstUseValid = d.IsFirstUseValid; _vm = vm; Hardware = d; DASId = d.DASId; SerialNumber = d.SerialNumber; Port = d.Port; ParentDAS = d.ParentDAS; PositionOnChain = d.PositionOnChain; PositionOnDistributor = d.PositionOnDistributor; HardwareType = HardwareList.Resources.StringResources.ResourceManager.GetString(d.DASTypeEnum.ToString()); if (string.IsNullOrEmpty(HardwareType)) { HardwareType = EnumDescriptionTypeConverter.GetEnumDescription(d.DASTypeEnum); } Firmware = d.FirmwareVersion; if ((d.MaxSampleRate > 0.0D) && !Equals(d.MaxSampleRate, (double)uint.MaxValue)) { MaxSampleRate = d.MaxSampleRate; } else { MaxSampleRate = null; } if (d.CalDate > DASDBRecord.INVALID_DATE) { CalDate = d.CalDate; } else { CalDate = null; } d.GetChannelsString(out var analog, out var digitalIn, out var digitalOut, out var squib, out var uart, out var streamOut, out var streamIn, out var can); AnalogChannels = analog; DigitalInChannels = digitalIn; DigitalOutChannels = digitalOut; SquibChannels = squib; UartChannels = uart; StreamOutChannels = streamOut; StreamInChannels = streamIn; CanChannels = can; var dateOfFirstUse = CalDate; if (IsFirstUseValid) { if (null == FirstUseDate) { dateOfFirstUse = DateTime.Today; } else { dateOfFirstUse = FirstUseDate; } } switch (d.DASTypeEnum) { case HardwareTypes.SLICE_Base: case HardwareTypes.SLICE_Bridge: case HardwareTypes.SLICE_Distributor: //FB 16148 similar to slice db case HardwareTypes.SLICE_Mini_Distributor: case HardwareTypes.SLICE_IEPE: case HardwareTypes.Ribeye: case HardwareTypes.RibeyeLED: case HardwareTypes.SLICE_Micro_Base: case HardwareTypes.SLICE_NANO_Base: case HardwareTypes.SLICE1_G5Stack: CalDueDate = dateOfFirstUse?.AddDays(slice1CalPeriod); break; case HardwareTypes.TDAS_Pro_Rack: case HardwareTypes.TDAS_LabRack: case HardwareTypes.TOM: case HardwareTypes.SIM: case HardwareTypes.DIM: CalDueDate = dateOfFirstUse?.AddDays(tdasCalPeriod); break; case HardwareTypes.SLICE2_IEPE_Hi: case HardwareTypes.SLICE2_IEPE_Lo: case HardwareTypes.SLICE2_Bridge_Hi: case HardwareTypes.SLICE2_Bridge_Lo: case HardwareTypes.SLICE2_Base: case HardwareTypes.SLICE2_SIM: case HardwareTypes.SLICE2_DIM: case HardwareTypes.SLICE2_TOM: case HardwareTypes.SLICE_EthernetController: case HardwareTypes.SLICE_LabEthernet: case HardwareTypes.SLICE2_SLS: case HardwareTypes.SLICE2_SLT: case HardwareTypes.SLICE2_SLD: CalDueDate = dateOfFirstUse?.AddDays(slice2CalPeriod); break; case HardwareTypes.TSR_AIR: case HardwareTypes.TSR_AIR_RevB: case HardwareTypes.DKR: case HardwareTypes.DIR: case HardwareTypes.EMB_ANG_ACC: case HardwareTypes.EMB_ANG_ARS: case HardwareTypes.EMB_ATM: case HardwareTypes.EMB_LIN_ACC_LO: case HardwareTypes.EMB_LIN_ACC_HI: case HardwareTypes.EMB_MAG: case HardwareTypes.EMB_MAG_SWITCH: case HardwareTypes.EMB_MIC: case HardwareTypes.EMB_OPT: case HardwareTypes.EMB_RTC_S_MARK: case HardwareTypes.EMB_RTC_NS_PAD: CalDueDate = dateOfFirstUse?.AddDays(tsrAirCalPeriod); break; case HardwareTypes.G5VDS: case HardwareTypes.G5INDUMMY: CalDueDate = dateOfFirstUse?.AddDays(g5CalPeriod); break; case HardwareTypes.SLICE1_5_Nano_Base: case HardwareTypes.SLICE1_5_Micro_Base: CalDueDate = dateOfFirstUse?.AddDays(slice15CalPeriod); break; case HardwareTypes.SLICE6_Base: //put some fall-through logic here CalDueDate = dateOfFirstUse?.AddDays(slice6CalPeriod); break; case HardwareTypes.SLICE6_AIR: case HardwareTypes.S6A_EthernetRecorder: CalDueDate = dateOfFirstUse?.AddDays(slice6AirCalPeriod); break; case HardwareTypes.SLICE6_AIR_BR: //put some fall-through logic here CalDueDate = dateOfFirstUse?.AddDays(slice6AirBridgeCalPeriod); break; case HardwareTypes.SLICE_Pro_Distributor: CalDueDate = dateOfFirstUse?.AddDays(slice6DBCalPeriod); break; case HardwareTypes.SLICE6DB: case HardwareTypes.SLICE6DB3: case HardwareTypes.SLICE6DB_InDummy: CalDueDate = dateOfFirstUse?.AddDays(slice6DBCalPeriod); HasTreeView = true; break; case HardwareTypes.PowerPro: CalDueDate = dateOfFirstUse?.AddDays(powerProCalPeriod); break; case HardwareTypes.SLICE6_AIR_TC: CalDueDate = dateOfFirstUse?.AddDays(sliceTcCalPeriod); break; case HardwareTypes.SLICE_PRO_CAN_FD: CalDueDate = dateOfFirstUse?.AddDays(sliceProCanFdPeriod); break; default: throw new ArgumentOutOfRangeException(); } if (d.IPAddress.ToLower().Contains("usb")) { IPAddress = HardwareList.Resources.StringResources.USB; } else { IPAddress = d.IPAddress; } } public void DetermineChannelCount(bool showCompact, IHardware[] allHardware) { var channelsText = new List(); if (AnalogChannels > 0) { channelsText.Add($"{AnalogChannels} {HardwareList.Resources.StringResources.Analog}"); } if (DigitalInChannels > 0) { channelsText.Add($"{DigitalInChannels} {HardwareList.Resources.StringResources.DigitalIn}"); } if (SquibChannels > 0) { channelsText.Add($"{SquibChannels / 2} {HardwareList.Resources.StringResources.Squib}"); } if (DigitalOutChannels > 0) { channelsText.Add($"{DigitalOutChannels} {HardwareList.Resources.StringResources.DigitalOut}"); } if (UartChannels > 0) { channelsText.Add($"{UartChannels} {HardwareList.Resources.StringResources.UART}"); } if (StreamOutChannels > 0) { channelsText.Add($"{StreamOutChannels} {HardwareList.Resources.StringResources.StreamOut}"); } if (StreamInChannels > 0) { channelsText.Add($"{StreamInChannels} {HardwareList.Resources.StringResources.StreamIn}"); } if (CanChannels > 0) { channelsText.Add($"{CanChannels} {HardwareList.Resources.StringResources.CAN}"); } ChannelCount = string.Join(System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator, channelsText.ToArray()) + " " + HardwareList.Resources.StringResources.DAS_Channels; if (Hardware is IISOHardware hardware) { if (hardware.DASTypeEnum == HardwareTypes.SLICE_EthernetController || hardware.DASTypeEnum == HardwareTypes.SLICE_Distributor || hardware.DASTypeEnum == HardwareTypes.PowerPro || hardware.DASTypeEnum == HardwareTypes.SLICE_Mini_Distributor || hardware.DASTypeEnum == HardwareTypes.SLICE6DB || hardware.DASTypeEnum == HardwareTypes.SLICE6DB3 || hardware.DASTypeEnum == HardwareTypes.SLICE_Pro_Distributor ) //add SLICE6DB and others here? { if (!showCompact || hardware.DASTypeEnum == HardwareTypes.PowerPro || string.IsNullOrWhiteSpace(ChannelCount)) { ChannelCount = HardwareList.Resources.StringResources.Table_NA; MaxSampleRate = null; } else { var minRate = hardware.MaxSampleRate; var matches = from h in allHardware where h.ParentDAS == SerialNumber && null != h.MaxSampleRate select (double)h.MaxSampleRate; if (matches.Any()) { minRate = Math.Min(minRate, matches.Min()); MaxSampleRate = minRate; } else { //no DAS associated, so rate is unknown ChannelCount = HardwareList.Resources.StringResources.Table_NA; MaxSampleRate = null; } } } else if (hardware.IsTSRAIR()) { ChannelCount = HardwareList.Resources.StringResources.EmbeddedSensors + (UartChannels > 0 ? $", {UartChannels} {HardwareList.Resources.StringResources.UART}" : String.Empty) + (StreamOutChannels > 0 ? $", {StreamOutChannels} {HardwareList.Resources.StringResources.StreamOut} {HardwareList.Resources.StringResources.DAS_Channels}" : String.Empty); } } } public void SetIncluded(bool bIncluded) { _bIncluded = bIncluded; OnPropertyChanged("Included"); OnPropertyChanged("MixedRates"); OnPropertyChanged("IncludedAndNotMixedRatesAndCompactOrNotDistributor"); OnPropertyChanged("IncludedAndMixedRatesAndCompact"); } public void SetMixedRates(bool mixedRates) { _mixedRates = mixedRates; OnPropertyChanged("MixedRates"); OnPropertyChanged("IncludedAndNotMixedRatesAndCompactOrNotDistributor"); OnPropertyChanged("IncludedAndMixedRatesAndCompact"); } public bool Filter(string term) { if (string.IsNullOrWhiteSpace(term)) { return true; } term = term.ToLower(); if (SerialNumber.ToLower().Contains(term)) { return true; } if (Firmware.ToLower().Contains(term)) { return true; } if (HardwareType.ToLower().Contains(term)) { return true; } return false; } public string ParentDAS { get; set; } public int PositionOnChain { get; set; } public int PositionOnDistributor { get; set; } public int Port { get; set; } private bool _bHasTreeView = false; public bool HasTreeView { get => _bHasTreeView; set { _bHasTreeView = value; OnPropertyChanged("HasTreeView"); } } public override string ToString() { return SerialNumberDisplay; } protected HardwareModel() { } /// /// returns all SLICE6DB available (except any matching the serial number indicated) /// /// /// public static IHardware[] GetAvailableSLICE6DB(string serialNumber) { if (string.IsNullOrWhiteSpace(serialNumber)) { return new IHardware[0]; } serialNumber = serialNumber.ToUpper(); var list = new List(); using (var sql = DTS.Common.Storage.DbOperations.GetSQLCommand(true)) { try { sql.CommandType = System.Data.CommandType.Text; sql.CommandText = $"SELECT [DASId], [SerialNumber] FROM [DAS] where [Type] in ({(int)HardwareTypes.SLICE6DB},{(int)HardwareTypes.SLICE6DB_InDummy}) AND [Position]=''"; var reader = sql.ExecuteReader(); while (reader.Read()) { var h = new HardwareModel(); h.DASId = Convert.ToInt32(reader["DASId"]); h.SerialNumber = Convert.ToString(reader["SerialNumber"]); if (h.SerialNumber.ToUpper() == serialNumber) { continue; } list.Add(h); } } finally { sql.Connection.Dispose(); } } return list.ToArray(); } public string SerialNumberDisplay { get { if (!(Hardware is IISOHardware isoHW)) { return SerialNumber; } return isoHW.StandIn ? EnumDescriptionTypeConverter.GetEnumDescription(isoHW.DASTypeEnum) : SerialNumber; } } } public class HardwareComparer : IComparer { public HardwareListTags SortField { get; set; } private bool _bSortAscending = true; public bool SortAscending { get => _bSortAscending; set => _bSortAscending = value; } public int Compare(IHardware left, IHardware right) { if (left == right) { return 0; } var a = left; var b = right; if (!SortAscending) { a = right; b = left; } if (null == a) { return 1; } if (null == b) { return -1; } switch (SortField) { case HardwareListTags.Included: return a.Included.CompareTo(b.Included); case HardwareListTags.DSPStreamingFilter: return a.DSPStreamingFilter.CompareTo(b.DSPStreamingFilter); case HardwareListTags.SerialNumber: if (a is HardwareModel hmA && b is HardwareModel hmB) { return string.Compare(hmA.SerialNumberDisplay, hmB.SerialNumberDisplay, StringComparison.OrdinalIgnoreCase); } else { return string.Compare(a.SerialNumber, b.SerialNumber, StringComparison.OrdinalIgnoreCase); } case HardwareListTags.HardwareType: return string.Compare(a.HardwareType, b.HardwareType, StringComparison.OrdinalIgnoreCase); case HardwareListTags.ChannelCount: return string.Compare(a.ChannelCount, b.ChannelCount, StringComparison.OrdinalIgnoreCase); case HardwareListTags.Firmware: return string.Compare(a.Firmware, b.Firmware, StringComparison.OrdinalIgnoreCase); case HardwareListTags.MaxSampleRate: { return NumericCompare(a.MaxSampleRate, b.MaxSampleRate); } case HardwareListTags.CalDate: { return NumericCompare(a.CalDate, b.CalDate); } case HardwareListTags.CalDueDate: { return NumericCompare(a.CalDueDate, b.CalDueDate); } case HardwareListTags.IPAddress: { return string.Compare(a.IPAddress, b.IPAddress, StringComparison.OrdinalIgnoreCase); } case HardwareListTags.FirstUseDate: { if (!a.IsFirstUseValid) { if (!b.IsFirstUseValid) { return 0; } else { return 1; } } else { if (!b.IsFirstUseValid) { return -1; } if (null == a.FirstUseDate) { if (null == b.FirstUseDate) { return 0; } return 1; } if (null == b.FirstUseDate) { return -1; } return ((DateTime)a.FirstUseDate).CompareTo((DateTime)b.FirstUseDate); } } } return a.GetHashCode().CompareTo(b.GetHashCode()); } private static int NumericCompare(object a, object b) { if (a == null && b == null) return 0; if (a == null) return 1; if (b == null) return -1; if (Equals(a, b)) return 0; switch (a) { case double d: if (d > (double)b) return -1; break; case DateTime dt: if (dt > (DateTime)b) return -1; break; } return 1; } } }