using DTS.Common.Classes.Sensors; using DTS.Common.Enums.Sensors; using DTS.Common.Interface.Sensors; using DTS.Common.Interface.Sensors.SoftwareFilters; using Prism.Ioc; using System; using System.Collections.Generic; using System.Linq; using DTS.Common.Settings; using Prism.Events; namespace DTS.SensorDB { public class AnalogSettingDefaults : Common.Base.BasePropertyChanged, IAnalogDefaults { private List _softwareFilters; private IEventAggregator _eventAggregator; public AnalogSettingDefaults() { _softwareFilters = SoftwareFilter.GetSoftwareFilters().ToList(); _eventAggregator = ContainerLocator.Container.Resolve(); _eventAggregator.GetEvent().Subscribe(SelectSoftwareFilter); } //FB 13120 select default filter for new add hoc filter private void SelectSoftwareFilter(double frequency) { if (_softwareFilters.Where(p => p.Frequency == frequency).Any()) { return; } SoftwareFilter softwareFilter = new SoftwareFilter(-1, frequency.ToString(), 'S', DateTime.Now, "", frequency, true); foreach (var sf in _softwareFilters) { sf.IsDefault = false; } _softwareFilters.Add(softwareFilter); Save(); SelectedFilterOption = new FilterClass(FilterClassType.AdHoc, frequency); OnPropertyChanged("FilterOptions"); } //Fb 13120 save the filters to db public void Save() { foreach (var sf in _softwareFilters) { sf.Commit(); } } //FB 13120 identify the selected filter option to be used in combo box public IFilterClass SelectedFilterOption { get { var softwareFilter = _softwareFilters.Find(p => p.IsDefault); FilterClass fc = null; if (softwareFilter?.Id == 1) { fc = new FilterClass(FilterClassType.Unfiltered); } else if (softwareFilter?.Id == 2) { fc = new FilterClass(FilterClassType.None); } else if (softwareFilter?.ISOCode == 'S') { fc = new FilterClass(FilterClassType.AdHoc, softwareFilter.Frequency); } else { foreach (var fct in Enum.GetValues(typeof(FilterClassType)) .Cast().ToArray()) { if (fct == FilterClassType.AdHoc || fct == FilterClassType.CFC10) { continue; } if (fct.ToString() == softwareFilter?.Description.Replace(" ", "")) { fc = new FilterClass(fct); break; } } } return fc; } set { if (value == null) return; foreach (var sf in _softwareFilters) { sf.IsDefault = false; } ISoftwareFilter softwareFilter = null; if (value.FClass == FilterClassType.Unfiltered) { softwareFilter = _softwareFilters.Find(p => p.Id == 1); } else if (value.FClass == FilterClassType.None) { softwareFilter = _softwareFilters.Find(p => p.Id == 2); } else if (value.FClass == FilterClassType.AdHoc && !_softwareFilters.Where(p => p.Frequency == value.Frequency).Any()) { _filterOptions.Add(new FilterClass(FilterClassType.AdHoc, value.Frequency)); _softwareFilters.Add(new SoftwareFilter(-1, value.Frequency.ToString(), 'S', DateTime.Now, "", value.Frequency, false)); softwareFilter = _softwareFilters.Find(p => p.Frequency == value.Frequency); } else { softwareFilter = _softwareFilters.Find(p => p.Frequency == value.Frequency); } softwareFilter.IsDefault = true; OnPropertyChanged("SelectedFilterOption"); } } public static IAnalogDefaults GetAnalogDefaults() { return new AnalogSettingDefaults(); } private List _filterOptions; //FB 13120 available filter classes to be used in drop down public List FilterOptions { get { if (null == _filterOptions) { var softwareFilters = SoftwareFilter.GetSoftwareFilters(); var customFilters = softwareFilters.Where(p => p.ISOCode == 'S'); _filterOptions = new List(); foreach (var fct in Enum.GetValues(typeof(FilterClassType)) .Cast().ToArray()) { if (fct == FilterClassType.AdHoc || fct == FilterClassType.CFC10) { //Dont include until we can handle this type. continue; } FilterClass fc = new FilterClass(fct); _filterOptions.Add(fc); } foreach (var filter in customFilters) { FilterClass fc = new FilterClass(FilterClassType.AdHoc, filter.Frequency); _filterOptions.Add(fc); } } _filterOptions.Sort(CompareFilters); return _filterOptions; } } //FB 18727 UseMeasuredExcitation setting public bool UseMeasuredExcitation { get { return SettingsDB.GetGlobalValueBool(Common.Constants.UseMeasuredExcitation, false); } set { SettingsDB.SetGlobalValueBoolean(Common.Constants.UseMeasuredExcitation, value); OnPropertyChanged(Common.Constants.UseMeasuredExcitation); } } public bool TrackAnalogDiagnosticsEnabled { get => DTS.Common.Storage.DbOperations.GetConnectionDbVersion() >= Common.Constants.TRACK_ANALOG_DIAGNOSTICS_DB_VERSION; } //http://manuscript.dts.local/f/cases/39148/DataPRO-Instrumentation-Tracking-Functions-FAA-Request-Diagnostics-Tracking public bool TrackAnalogDiagnostics { get => TrackAnalogDiagnosticsEnabled && SettingsDB.GetGlobalValueBool(Common.Constants.TrackAnalogDiagnostics, false); set { SettingsDB.SetGlobalValueBoolean(Common.Constants.TrackAnalogDiagnostics, value); OnPropertyChanged(Common.Constants.TrackAnalogDiagnostics); } } private static int CompareFilters(IFilterClass f1, IFilterClass f2) { if (f1 == null) { if (f2 == null) { // both null, equal return 0; } // left null but not right return -1; } if (f2 == null) { // left not null, right null return 1; } if (f1.FClass != FilterClassType.None) return f2.FClass == FilterClassType.None ? 1 : f1.Frequency.CompareTo(f2.Frequency); if (f2.FClass == FilterClassType.None) { return 0; } return -1; } public bool Validate() { return true; } public void ReadXML(System.Xml.XmlElement root) { var frequency = 0D; var fClass = FilterClassType.None; foreach (var node in root.ChildNodes) { if (node is System.Xml.XmlElement nodex) { if (Enum.TryParse(nodex.Name, out FilterXMLFields field)) { switch (field) { case FilterXMLFields.Frequency: frequency = Convert.ToDouble(nodex.InnerText); break; case FilterXMLFields.FClass: if (Enum.TryParse(nodex.InnerText, out FilterClassType filterClass)) { fClass = filterClass; } break; default: throw new NotSupportedException( "AnalogSettingDefaults::ReadXML unsupported field: " + field); } } } } SelectedFilterOption = new FilterClass(fClass, frequency); } public void WriteXML(ref System.Xml.XmlWriter writer) { writer.WriteStartElement("AnalogSettingDefaults"); writer.WriteStartElement("SelectedFilterOption"); writer.WriteStartElement(FilterXMLFields.Frequency.ToString()); writer.WriteString(SelectedFilterOption.Frequency.ToString(System.Globalization.CultureInfo.InvariantCulture)); writer.WriteEndElement(); writer.WriteStartElement(FilterXMLFields.FClass.ToString()); writer.WriteString(SelectedFilterOption.FClass.ToString()); writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndElement(); } /// /// restores digital input settings to defaults /// /// public static void RestoreDefaults(IAnalogDefaults sensorDefaults) { sensorDefaults.TrackAnalogDiagnostics = false; } } public enum FilterXMLFields { FilterName, Frequency, FClass } }