15 KiB
15 KiB
source_files, generated_at, model, schema_version, sha256
| source_files | generated_at | model | schema_version | sha256 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
2026-04-16T02:42:52.937741+00:00 | Qwen/Qwen3-Coder-Next-FP8 | 1 | c38901448183a71b |
Documentation: TestMetadata Module
1. Purpose
This module provides data structures and parsing logic for loading, representing, and managing test metadata from XML-based .dts files in the DTS Viewer system. It defines core domain models (TestMetadata, TestRunMetadata, TestSetupMetadata, TestModule, TestChannel, TestGraphs, TestSummary) that encapsulate test configuration, hardware setup, channel definitions, and summary information. The TestMetadataList class is responsible for deserializing XML metadata files into strongly-typed objects and constructing TestSummary instances for UI consumption, including timestamp resolution using PTP1588 timing data when available.
2. Public Interface
TestMetadataList
GetTestSummaryListAsync(IBaseViewModel parent, string path, string file, string pattern = "")
- Behavior: Asynchronous wrapper (currently synchronous implementation) that returns an
ObservableCollection<ITestSummary>by parsing.dtsfiles in the specified directory. Usespatternto filter files (default:.dts). Requiresparentfor view model hierarchy.
GetTestSummaryList(IBaseViewModel parent, string path, string file = "", string pattern = "")
- Behavior: Synchronously returns an
ObservableCollection<ITestSummary>by parsing.dtsfiles. Usesparentto setTestSummary.Parent.
GetTestSummaryList(string path, string file = "", string pattern = "")
- Behavior: Same as above but without a
parentparameter (used when parent is not applicable or set later).
GetTestMetadataList(XDocument xDoc, string path, string file)
- Behavior: Parses an
XDocument(loaded.dtsXML) into aList<ITestMetadata>. Handles channel array initialization and publishes errors viaIEventAggregatoron failure. Returns empty list on exception.
TestMetadata
- Properties:
ITestRunMetadata TestRun { get; set; }ITestSetupMetadata TestSetup { get; set; }
- Behavior: Simple container for test run and setup metadata.
TestRunMetadata
- Properties:
string Name { get; set; }— Logical test name (from XML@Idattribute).string Id { get; set; }— File name without extension (derived from@FilePath).string Description { get; set; }bool InlineSerializedData { get; set; }string TestGuid { get; set; }int FaultFlags { get; set; }string Software { get; set; }string SoftwareVersion { get; set; }string DataType { get; set; }DateTime FileDate { get; set; }string FilePath { get; set; }List<ITestModule> Modules { get; set; }List<ITestChannel> Channels { get; set; }List<ITestChannel> CalculatedChannels { get; set; }bool IsSelected { get; set; }
- Events:
event PropertyChangedEventHandler PropertyChanged— ImplementsINotifyPropertyChanged.
TestSetupMetadata
- Properties:
string SetupName { get; set; }DateTime TimeStamp { get; set; }List<ITestGraphs> TestGraphs { get; set; }CalibrationBehaviors CalibrationBehavior { get; set; }
TestGraphs
- Properties:
string Name { get; set; }string HardwareChannelName { get; set; }List<string> ChannelIds { get; set; }List<ITestChannel> Channels { get; set; }
TestModule
- Properties:
string SerialNumber { get; set; }string BaseSerialNumber { get; set; }int AaFilterRateHz { get; set; }int Number { get; set; }int NumberOfSamples { get; set; }int UnsubsampledNumberOfSamples { get; set; }double RequestedPostTriggerSeconds { get; set; }double RequestedPreTriggerSeconds { get; set; }double PostTriggerSeconds { get; set; }double PreTriggerSeconds { get; set; }string RecordingMode { get; set; }int SampleRateHz { get; set; }int StartRecordSampleNumber { get; set; }int NumberOfChannels { get; set; }bool InlineSerializedData { get; set; }int StartRecordTimestampSec { get; set; }int StartRecordTimestampNanoSec { get; set; }int TriggerTimestampSec { get; set; }int TriggerTimestampNanoSec { get; set; }List<ulong> TriggerSampleNumbers { get; set; }— Always empty (see Gotchas).bool PTPMasterSync { get; set; }int TiltSensorAxisX/Y/ZDegreesPre/Post { get; set; }int TemperatureLocation1/2/3/4Pre/Post { get; set; }List<ITestChannel> Channels { get; set; }List<ITestChannel> CalculatedChannels { get; set; }bool IsSelected { get; set; }
- Events:
event PropertyChangedEventHandler PropertyChanged
TestChannel
- Properties:
string Group { get; set; }string SubGroup { get; set; }bool IsGraphChannel { get; set; }string GraphName { get; set; }string TestId { get; set; }string TestSetupName { get; set; }string ModuleSerialNumber { get; set; }string SerialNumber { get; set; }string ChannelId { get; set; }string ChannelDisplayName { get; set; }string Description { get; set; }string IsoCode { get; set; }string IsoChannelName { get; set; }string UserCode { get; set; }string UserChannelName { get; set; }string ChannelGroupName { get; set; }string ChannelType { get; set; }bool IsCalculatedChannel { get; set; }int Number { get; set; }string DigitalMultiplier { get; set; }string DigitalMode { get; set; }DateTime Start { get; set; }string Bridge { get; set; }double BridgeResistanceOhms { get; set; }double ZeroPoint { get; set; }string ChannelDescriptionString { get; set; }string ChannelName2 { get; set; }string HardwareChannelName { get; set; }double DesiredRange { get; set; }double ActualMaxRangeEu { get; set; }double ActualMinRangeEu { get; set; }double ActualMaxRangeAdc { get; set; }— Alwaysshort.MaxValuedouble ActualMinRangeAdc { get; set; }— Alwaysshort.MinValuedouble ActualMaxRangeMv { get; set; }double ActualMinRangeMv { get; set; }double Sensitivity { get; set; }string SoftwareFilter { get; set; }bool ProportionalToExcitation { get; set; }bool IsInverted { get; set; }string LinearizationFormula { get; set; }bool IsSubsampled { get; set; }int AbsoluteDisplayOrder { get; set; }DateTime LastCalibrationDate { get; set; }string SensorId { get; set; }int OffsetToleranceLowMv { get; set; }int OffsetToleranceHighMv { get; set; }int DataFlag { get; set; }string ExcitationVoltage { get; set; }string Eu { get; set; }bool CalSignalEnabled { get; set; }bool ShuntEnabled { get; set; }bool VoltageInsertionCheckEnabled { get; set; }bool RemoveOffset { get; set; }string ZeroMethod { get; set; }double ZeroAverageWindowBegin { get; set; }double ZeroAverageWindowEnd { get; set; }int InitialEu { get; set; }string InitialOffset { get; set; }int UnsubsampledSampleRateHz { get; set; }double MeasuredShuntDeflectionMv { get; set; }double TargetShuntDeflectionMv { get; set; }double MeasuredExcitationVoltage { get; set; }double FactoryExcitationVoltage { get; set; }double TimeOfFirstSample { get; set; }double Multiplier { get; set; }double UserOffsetEu { get; set; }int UnitConversion { get; set; }bool AtCapacity { get; set; }int CapacityOutputIsBasedOn { get; set; }string SourceChannelNumber { get; set; }string SourceModuleNumber { get; set; }string SourceModuleSerialNumber { get; set; }string Calculation { get; set; }int SampleRateHz { get; set; }string SensitivityUnits { get; set; }int SensorCapacity { get; set; }string SensorPolarity { get; set; }int ChannelNumber { get; set; }string BinaryFileName { get; set; }string BinaryFilePath { get; set; }double Xmax { get; set; }double Xmin { get; set; }int SequentialNumbers { get; set; }ITestSetupMetadata ParentTestSetup { get; set; }ITestModule ParentModule { get; set; }IBaseViewModel Parent { get; set; }Color ChannelColor { get; set; }string ErrorMessage { get; set; }bool IsError { get; set; }Color? ErrorColor { get; set; }— Derived fromIsError.bool IsLocked { get; set; }bool CanLock { get; set; }bool CanSelectChannel { get; set; }bool IsExpanded { get; set; }bool IsSelected { get; set; }double MinADC/MaxADC/AveADC/StdDevADC/T0ADC { get; set; }double MinMV/MaxMV/AveMV/StdDevMV/T0MV { get; set; }double MinEU/MaxEU/AveEU/StdDevEU/T0EU { get; set; }double MinY/MaxY/AveY/StdDevY/T0Value { get; set; }
- Methods:
void SetChannelDescriptionAndDisplayName(string channelDescription)— SetsChannelDescriptionStringandChannelDisplayName.ITestChannel Copy()— Shallow copy viaMemberwiseClone().override string ToString()— ReturnsChannelDescriptionStringor"N/A"if test-specific embedded.
- Events:
event PropertyChangedEventHandler PropertyChanged— Inherited fromBasePropertyChanged.
TestSummary
- Properties:
string Id { get; set; }— Concatenation ofTestRun.Idand event number fromFilePath.string SetupName { get; set; }string Description { get; set; }int ChannelCount { get; set; }DateTime FileDate { get; set; }DateTime TimeStamp { get; set; }— Derived from module PTP timestamps if valid, elseTestSetup.TimeStamp.string DataType { get; set; }bool IsSelected { get; set; }List<ITestGraphs> Graphs { get; set; }List<ITestChannel> Channels { get; set; }List<ITestChannel> CalculatedChannels { get; set; }IBaseViewModel Parent { get; set; }CalibrationBehaviors CalibrationBehavior { get; set; }— Default:NonLinearIfAvailable.ITestMetadata TestMetadata { get; set; }
- Commands:
DelegateCommand IsSelectedCommand { get; }— Toggles selection and updatesParent.SelectedTestSummaryList.
- Methods:
void SelectionChanged()— Adds/removesthisfromParent.SelectedTestSummaryListand callsPublishSelectedTestSummaryList()on parent.void OnPropertyChanged(string propertyName)— RaisesPropertyChanged.
- Events:
event PropertyChangedEventHandler PropertyChanged
- Constants:
public const string ROI_SUFFIX = @"_ROI Period";
3. Invariants
TestMetadata: Must contain non-nullTestRunandTestSetupreferences after successful parsing.TestRunMetadata.ChannelsandTestRunMetadata.CalculatedChannels: Initialized as empty lists during parsing if missing in XML.TestModule.TriggerSampleNumbers: Always initialized as an empty list; never populated (see Gotchas).TestChannel.ChannelId: If missing or-1in XML, defaults tom.GetHashCode().ToString()(non-deterministic).TestChannel.HardwareChannelName: For calculated channels, always set to"N/A"(viaStrings.Strings.Table_NA).TestChannel.SerialNumber: For calculated channels, always set to"N/A".TestSummary.TimeStamp: Falls back toTestSetup.TimeStampif PTP timestamps are invalid or unavailable.TestSummary.Id: Always includes event number extracted fromFilePathviaParseEventNumber.TestChannel.IsCalculatedChannel: Must betruefor channels loaded viaLoadTestCalculatedChannels.TestSummary.IsSelected: Setter enforces selection logic viaSelectionChanged()andParentinteraction.
4. Dependencies
Internal Dependencies (from source):
- Interfaces:
DTS.Common.Interface.ITestMetadata,ITestRunMetadata,ITestSetupMetadata,ITestGraphs,ITestModule,ITestChannel,ITestSummary,IBaseViewModel,IGraphMainViewModel
- Enums:
DTS.Common.Enums.Sensors.CalibrationBehaviors
- Utilities:
DTS.Common.XMLUtils.TestMetadataXmlDTS.Common.Base.BasePropertyChangedDTS.Common.Constants.EventNumberDTS.Common.Utils.TestUtils,PTP1588TimestampsDTS.Common.XMLUtils.TestMetadataFields,TestSetupMetadataFields,TestGraphsFields,TestModuleFields,TestChannelFieldsDTS.Common.Strings.Strings
- Prism Framework:
Microsoft.Practices.Prism.Commands.DelegateCommandMicrosoft.Practices.Prism.Events.IEventAggregator,Events.PageErrorEventMicrosoft.Practices.ServiceLocation.ServiceLocator
External Dependencies:
System.Xml.LinqSystem.Collections.ObjectModelSystem.ComponentModelSystem.Windows.Media(forColor)
Inferred Consumers:
- UI view models (
ITestSummaryListViewModel,IGraphMainViewModel) that interact withTestSummaryandTestChannel. - XML loading utilities (
TestMetadataXml) for parsing.dtsfiles. - Event aggregation system for error reporting.
5. Gotchas
TestModule.TriggerSampleNumbersis always empty: TheLoadTriggerSampleNumbersmethod ignores its input and returnsnew List<ulong>(). This field is likely unused or deprecated.- Non-deterministic
ChannelIdfor missing IDs: IfChannelIdattribute is missing or-1,m.GetHashCode().ToString()is used, which is not stable across runs or app restarts. - Calculated channel data loss: For calculated channels, many fields (e.g.,
IsoCode,IsoChannelName,UserCode,UserChannelName,HardwareChannelName,SerialNumber) are hardcoded to"N/A". Some fields likeFactoryExcitationVoltageandTimeOfFirstSampleare incorrectly assigned values from unrelated attributes (e.g.,UnsubsampledSampleRateHz→FactoryExcitationVoltage). TestRunMetadata.IdvsNameconfusion:Idis derived from file name (Path.GetFileNameWithoutExtension(FilePath)), whileNamecomes from XML@Idattribute. This may be counterintuitive.TestSummary.TimeStampfallback behavior: UsesTestSetup.TimeStamp