using System; using System.Xml; using System.Xml.Schema; using System.Xml.Serialization; using DTS.Common.DAS.Concepts; using DTS.Common.Enums.DASFactory; using DTS.Common.Enums.Sensors; using DTS.Common.Interface.DASFactory.Config; namespace DTS.DASLib.Service { /// /// /// Base class for all DAS channels. /// [Serializable] public class DASChannel : IDASChannel, IXmlSerializable // (subset of sensor class) { public DFConstantsAndEnums.ConfigMode ConfigurationMode { get; set; } /// /// whether the channel should be put in Diagnostics mode or not /// public bool DiagnosticsMode { get; set; } /// /// Channel number with respect to it's containing module /// public int ModuleChannelNumber { get; set; } public int AbsoluteDisplayOrder { get; set; } = 1; public double UnitConverision { get; set; } = 1D; public bool AtCapacity { get; set; } = false; public double CapacityOutputIsBasedOn { get; set; } = 1D; public SensorConstants.SensUnits SensitivityUnits { get; set; } = SensorConstants.SensUnits.NONE; /// /// A link back to the Module that contains this channel. /// [XmlIgnore] public DASModule OwningModule { get; set; } /// /// The "stack channel number" of this channel with respect to the owning /// DAS (0 based). /// public byte Number { get { try { return OwningModule.OwningDAS.DASInfo.MapModuleArrayIndexAndChannelNum2DASChannel(OwningModule.ModuleArrayIndex, ModuleChannelNumber); } catch (Exception ex) { throw new ApplicationException("encountered problem getting " + GetType().FullName + ".Number property value", ex); } } } /// /// Array of (string, byte[]) for EID /// [XmlIgnore] public IEID[] IDs { get; set; } /// /// time stamp of this event /// public DateTime EventStartTime { get; set; } /// /// value indicating whether or not this channel has registered a level trigger. /// public bool LevelTriggerSeen { get; set; } public string IsoChannelName { get; set; } public string ChannelGroupName { get; set; } public string UserCode { get; set; } public string UserChannelName { get; set; } public string LinearSensorCalibration { get; set; } /// /// the number of samples to qualify over /// public int QualificationSamples { get; set; } ///// ///// Number of samples that T0 on DASes that did not directly experience the level trigger must be shifted ///// to time align with this channel's directly level triggered T0. A null value indicates that this channel ///// did not directly receive a level trigger. ///// public int? LevelTriggerT0AdjustmentSamples { get; set; } public override string ToString() { return ModuleChannelNumber.ToString(); } /// /// Is this channel configured? 'Configured' means a sensor is connected and/or there is /// information in the containg device's ConfigData object, put there with a call to /// ConfigureService.Configure(...) in the API. /// /// True if it is configured, False otherwise. public virtual bool IsConfigured() { return false; } /// /// CTOR to populate a channel's owning module and channel WRT that module. /// /// Module that contains this channel. /// ChannelNumber of this channel WRT owning module. public DASChannel(DASModule owner, int channelNumber) { ConfigurationMode = DFConstantsAndEnums.ConfigMode.Normal; ModuleChannelNumber = channelNumber; OwningModule = owner; IDs = null; EventStartTime = DateTime.Now; DiagnosticsMode = false; } public DASChannel() { } public virtual void WriteElementStart(XmlWriter writer) { writer.WriteStartElement("DASChannel"); //writer.WriteStartAttribute("type", "xsi"); var tgt = GetType(); writer.WriteAttributeString("xsi", "type", null, tgt.Name); } public virtual void WriteElementEnd(XmlWriter writer) { writer.WriteEndElement(); } public virtual void WriteXmlCRC32(XmlWriter writer) { // ConfigurationMode XMLHelper.PutString(writer, "ConfigurationMode", ConfigurationMode.ToString()); // ModuleChannelNumber XMLHelper.PutInt(writer, "ModuleChannelNumber", ModuleChannelNumber); XMLHelper.PutInt(writer, "AbsoluteDisplayOrder", AbsoluteDisplayOrder); XMLHelper.PutBool(writer, "DiagnosticsMode", DiagnosticsMode); XMLHelper.PutDouble(writer, "UnitConversion", UnitConverision); // EventStartTime //XMLHelper.PutString(writer, "EventStartTime", EventStartTime.ToString("o", XMLHelper.InvariantCulture)); } public virtual void WriteXml(XmlWriter writer) { // ConfigurationMode XMLHelper.PutString(writer, "ConfigurationMode", ConfigurationMode.ToString()); // ModuleChannelNumber XMLHelper.PutInt(writer, "ModuleChannelNumber", ModuleChannelNumber); XMLHelper.PutInt(writer, "AbsoluteDisplayOrder", AbsoluteDisplayOrder); // EventStartTime XMLHelper.PutString(writer, "EventStartTime", EventStartTime.ToString("o", XMLHelper.InvariantCulture)); //XMLHelper.PutString(writer, "QualificationSamples", QualificationSamples.ToString()); XMLHelper.PutInt(writer, "QualificationSamples", QualificationSamples); XMLHelper.PutBool(writer, "DiagnosticsMode", DiagnosticsMode); XMLHelper.PutDouble(writer, "UnitConversion", UnitConverision); XMLHelper.PutBool(writer, "AtCapacity", AtCapacity); XMLHelper.PutDouble(writer, "CapacityOutputIsBasedOn", CapacityOutputIsBasedOn); XMLHelper.PutString(writer, "SensitivityUnits", SensitivityUnits.ToString()); XMLHelper.PutString(writer, "IsoChannelName", IsoChannelName); XMLHelper.PutString(writer, "UserCode", UserCode); XMLHelper.PutString(writer, "UserChannelName", UserChannelName); XMLHelper.PutString(writer, "LinearSensorCalibration", LinearSensorCalibration); if (!string.IsNullOrEmpty(UserValue1)) { XMLHelper.PutString(writer, "UserValue1", UserValue1); } if (!string.IsNullOrEmpty(UserValue2)) { XMLHelper.PutString(writer, "UserValue2", UserValue2); } if (!string.IsNullOrEmpty(UserValue3)) { XMLHelper.PutString(writer, "UserValue3", UserValue3); } /*XMLHelper.PutInt(writer, "IdType", IdType);*/ } private const string CONFIGUARATIONMODE_TAG = "ConfigurationMode"; private const string MODULECHANNELNUMBER_TAG = "ModuleChannelNumber"; private const string EVENTSTARTTIME_TAG = "EventStartTime"; private const string QUALIFICATIONSAMPLES_TAG = "QualificationSamples"; private const string DIAGNOSTICSMODE_TAG = "DiagnosticsMode"; private const string ABSOLUTEDISPLAYORDER_TAG = "AbsoluteDisplayOrder"; private const string UNITCONVERSION_TAG = "UnitConversion"; private const string ATCAPACITY_TAG = "AtCapacity"; private const string LINEARSENSORCALIBRATION_TAG = "LinearSensorCalibration"; private const string USERCHANNELNAME_TAG = "UserChannelName"; private const string USERCODE_TAG = "UserCode"; private const string ISOCHANNELNAME_TAG = "IsoChannelName"; private const string CAPACITYOUTPUTISBASEDON_TAG = "CapacityOutputIsBasedOn"; private const string SENSITIVITYUNITS_TAG = "SensitivityUnits"; private const string USERVALUE1_TAG = "UserValue1"; private const string USERVALUE2_TAG = "UserValue2"; private const string USERVALUE3_TAG = "UserValue3"; protected virtual void HandleElement(XmlReader reader) { switch (reader.Name) { case CONFIGUARATIONMODE_TAG: var confMode = XMLHelper.GetString(reader); ConfigurationMode = (DFConstantsAndEnums.ConfigMode)Enum.Parse(typeof(DFConstantsAndEnums.ConfigMode), confMode); break; case MODULECHANNELNUMBER_TAG: ModuleChannelNumber = XMLHelper.GetInt(reader); break; case EVENTSTARTTIME_TAG: var est = XMLHelper.GetString(reader); EventStartTime = DateTime.Parse(est); break; case QUALIFICATIONSAMPLES_TAG: QualificationSamples = XMLHelper.GetInt(reader); break; case DIAGNOSTICSMODE_TAG: DiagnosticsMode = XMLHelper.GetBool(reader); break; case ABSOLUTEDISPLAYORDER_TAG: try { AbsoluteDisplayOrder = XMLHelper.GetInt(reader); } catch (Exception) { } break; case UNITCONVERSION_TAG: try { UnitConverision = XMLHelper.GetDouble(reader); } catch (Exception) { } break; case ATCAPACITY_TAG: try { AtCapacity = XMLHelper.GetBool(reader); } catch (Exception) { } break; case LINEARSENSORCALIBRATION_TAG: LinearSensorCalibration = XMLHelper.GetString(reader); break; case USERCHANNELNAME_TAG: UserChannelName = XMLHelper.GetString(reader); break; case USERCODE_TAG: UserCode = XMLHelper.GetString(reader); break; case ISOCHANNELNAME_TAG: IsoChannelName = XMLHelper.GetString(reader); break; case CAPACITYOUTPUTISBASEDON_TAG: try { CapacityOutputIsBasedOn = XMLHelper.GetDouble(reader); } catch (Exception) { } break; case SENSITIVITYUNITS_TAG: var su = XMLHelper.GetString(reader); SensitivityUnits = (SensorConstants.SensUnits)Enum.Parse(typeof(SensorConstants.SensUnits), su); break; case USERVALUE1_TAG: try { UserValue1 = XMLHelper.GetString(reader); } catch (Exception) { } break; case USERVALUE2_TAG: try { UserValue2 = XMLHelper.GetString(reader); } catch (Exception) { } break; case USERVALUE3_TAG: try { UserValue3 = XMLHelper.GetString(reader); } catch (Exception) { } break; default: // let child handle it return; } } public virtual void ReadXml(XmlReader reader) { // it must be an Element if (reader.NodeType != XmlNodeType.Element) { throw new XmlException("DASChannel.ReadXml: Unknown input: " + reader.NodeType.ToString()); } // skip our start tag if (reader.Name == "DASChannel") { reader.Read(); } // try to find our data do { if (reader.NodeType == XmlNodeType.Element) { HandleElement(reader); } if (!reader.Read()) { break; } } while (!(reader.Name.Equals("DASChannel") && reader.NodeType == XmlNodeType.EndElement)); // we're going to end with an EndElement, so clean up if (reader.Name.Equals("DASChannel") && reader.NodeType == XmlNodeType.EndElement) { reader.Read(); } } /// /// returns true if the channel is re-programable [can be switched from IEPE to analog] /// /// public bool CanReProgram() { if (null == OwningModule) { return false; } if (null == OwningModule.OwningDAS) { return false; } if (null == OwningModule.OwningDAS.DASInfo) { return false; } if (null == OwningModule.OwningDAS.DASInfo.Modules) { return false; } if (0 == OwningModule.OwningDAS.DASInfo.Modules.Length) { return false; } return OwningModule.OwningDAS.DASInfo.Modules[0].IsProgrammable; } public XmlSchema GetSchema() { return null; } public const int DEFAULT_ID_TYPE = 0; public const int BRIDGE_ID_TYPE = 1; public const int IEPE_ID_TYPE = 2; public const int BRIDGE_G5_ID_TYPE = 3; public int IdType { get; set; } = DEFAULT_ID_TYPE; public string UserValue1 { get; set; } = ""; public string UserValue2 { get; set; } = ""; public string UserValue3 { get; set; } = ""; } }