--- source_files: - DataPRO/IService/Classes/TDAS/TDASServiceSetupInfo.cs - DataPRO/IService/Classes/TDAS/TDASServiceSetupInfoLookup.cs - DataPRO/IService/Classes/TDAS/TDASConfig.cs - DataPRO/IService/Classes/TDAS/TDASModuleConfig.cs generated_at: "2026-04-16T03:59:19.825998+00:00" model: "Qwen/Qwen3-Coder-Next-FP8" schema_version: 1 sha256: "4eeb90f6bf6e5cce" --- # TDAS ## Documentation: TDAS Configuration and Setup Info Classes ### 1. Purpose This module provides data structures and configuration persistence for the TDAS (Test Data Acquisition System) service layer. It defines setup metadata (`TDASServiceSetupInfo`, `TDASServiceSetupInfoLookup`) used to configure acquisition parameters at runtime, and XML-serializable configuration classes (`TDASConfig`, `TDASModuleConfig`) that store per-module hardware and test settings to disk. These classes enable centralized management of DAS module configurations, channel definitions, and acquisition parameters across test sessions. ### 2. Public Interface #### `TDASServiceSetupInfo` - **Constructor**: `TDASServiceSetupInfo(string setupDescription, double? samplesPerSecond, float hardwareFilterRateHz, DFConstantsAndEnums.RecordingMode recordingMode, bool? checkoutMode)` Initializes a new instance with fixed (non-lookup) acquisition parameters. All parameters are required; `samplesPerSecond` and `checkoutMode` are nullable. - **Properties**: - `string SetupDescription` – Human-readable description of the setup. - `double? SamplesPerSecond` – Fixed sample rate (Hz); nullable to allow optional specification. - `float HardwareFilterRateHz` – Hardware anti-aliasing filter rate in Hz (non-nullable). - `DFConstantsAndEnums.RecordingMode RecordingMode` – Recording mode enum value (e.g., continuous, triggered). - `bool? CheckoutMode` – Optional flag indicating whether the setup is for hardware checkout. #### `TDASServiceSetupInfoLookup` - **Constructor**: `TDASServiceSetupInfoLookup(string setupDescription, Dictionary sampleRateLookup, Dictionary aafLookup, DFConstantsAndEnums.RecordingMode recordingMode, bool? checkoutMode)` Initializes a lookup-based setup info where sample rate and filter rate vary by DAS unit (identified by string key, likely serial number). - **Properties**: - `string SetupDescription` – Same as above. - `Dictionary SamplesPerSecondLookup` – Maps DAS identifier (e.g., serial number) to its sample rate. - `Dictionary HardwareFilterRateHzLookup` – Maps DAS identifier to its hardware filter rate. - `DFConstantsAndEnums.RecordingMode RecordingMode` – Same as above. - `bool? CheckoutMode` – Same as above. #### `TDASConfig` - **Constructor**: `TDASConfig()` – Default constructor. `TDASConfig(string fileName, bool deleteIfPresent)` – Loads config from `DASConfigs/` (relative to executing assembly directory). If `deleteIfPresent` is `true`, deletes existing file before proceeding; otherwise, attempts to deserialize. - **Properties**: - `Dictionary Modules` – Read-only dictionary of modules keyed by serial number. - `string FileName` – Full path to the config file (read-only). - **Methods**: - `void SetModule(TDASModuleConfig module)` – Adds or updates a module in `_modules` by `SerialNumber`. - `TDASModuleConfig GetModule(TDASModuleConfig module)` – Retrieves module by `SerialNumber`; if missing, adds the provided module and returns it. - `void ReadXml(XmlReader reader)` – Deserializes XML into `_modules` (expects `...` structure). - `void WriteXml(XmlWriter writer)` – Serializes `_modules` to XML. - `XmlSchema GetSchema()` – Returns `null` (per `IXmlSerializable` convention for schema-less types). #### `TDASModuleConfig` - **Constructor**: `TDASModuleConfig()` – Default constructor. `TDASModuleConfig(string fileName)` – Loads module config from `DASConfigs/`. - **Properties**: - `string SerialNumber` – Unique identifier for the module. - `string TestId` – Test identifier string. - `string TestDescription` – Human-readable test description. - `DFConstantsAndEnums.RecordingMode RecordingMode` – Recording mode (default: `InvalidArmMode`). - `float AAFilterRateHz` – Anti-aliasing filter rate (default: `0`). - `double PreTriggerSeconds` – Pre-trigger hold time (default: `0`). - `double PostTriggerSeconds` – Post-trigger record time (default: `0`). - `string FirmwareVersion` – Module firmware version string. - `UInt64? MaxEventStorageSpaceInBytes` – Optional max storage for event data. - `int ModuleArrayIndex` – Zero-based index for module ordering (default: `0`). - `string FileName` – Full path to config file (read-only). - `Dictionary Channels` – Internal dictionary of channels keyed by `ModuleChannelNumber` (not exposed directly; accessed via `SetChannel`/`GetChannel` overloads). - **Methods**: - `void SetChannel(OutputTOMDigitalChannel channel)` / `SetChannel(OutputSquibChannel channel)` / `SetChannel(AnalogInputDASChannel channel)` – Adds or updates channel by `ModuleChannelNumber`. - `AnalogInputDASChannel GetChannel(AnalogInputDASChannel channel)` / `GetChannel(OutputSquibChannel channel)` / `GetChannel(OutputTOMDigitalChannel channel)` – Retrieves channel by `ModuleChannelNumber`; if missing, adds the provided channel and returns it. - `void ReadXml(XmlReader reader)` – Deserializes XML into module properties and channels. Handles legacy configs (e.g., missing `ModuleArrayIndex` element). - `void WriteXml(XmlWriter writer)` – Serializes module properties and channels to XML. - `XmlSchema GetSchema()` – Returns `null`. - `virtual void WriteElementStart(XmlWriter writer)` – Writes `` with concrete type. - `virtual void WriteElementEnd(XmlWriter writer)` – Closes the `` element. ### 3. Invariants - **`TDASConfig`**: - `_modules` dictionary is keyed by `TDASModuleConfig.SerialNumber`; duplicates are overwritten by `SetModule`. - `FileName` is always an absolute path constructed relative to the executing assembly’s directory under `DASConfigs/`. - **`TDASModuleConfig`**: - `RecordingMode` defaults to `DFConstantsAndEnums.RecordingMode.InvalidArmMode` (invalid state); must be explicitly set to a valid mode. - `AAFilterRateHz`, `PreTriggerSeconds`, `PostTriggerSeconds` default to `0`. - `MaxEventStorageSpaceInBytes` is nullable; invalid values (negative or ≥ `ulong.MaxValue`) are logged and ignored. - `ModuleArrayIndex` defaults to `0`; invalid values (negative or ≥ `int.MaxValue`) are logged and ignored. - Channel dictionaries use `ModuleChannelNumber` as the key; duplicate channel numbers overwrite existing entries. - **XML Serialization**: - `TDASConfig` expects `...`. - `TDASModuleConfig` expects `...` with child elements in a fixed order (e.g., `SerialNumber`, `TestId`, `RecordingMode`, etc.). - Channel serialization uses `WriteElementStart`/`WriteElementEnd` to include `xsi:type` for polymorphic deserialization. ### 4. Dependencies - **Imports/Usings**: - `DTS.Common.DAS.Concepts` – Provides `DASChannel`, `AnalogInputDASChannel`, `OutputSquibChannel`, `OutputTOMDigitalChannel`. - `DTS.Common.Enums.DASFactory` – Provides `DFConstantsAndEnums.RecordingMode`. - `DTS.DASLib.Command.SLICE` – Referenced but not directly used in these classes (likely transitive dependency). - `DTS.Common.Utilities.Logging` – Provides `APILogger` for error logging during XML deserialization. - Standard .NET libraries: `System.Xml`, `System.IO`, `System.Collections.Generic`, `System`. - **Consumers**: - `TDASConfig` and `TDASModuleConfig` are used by the TDAS service layer to persist/load configurations. - `TDASServiceSetupInfo`/`TDASServiceSetupInfoLookup` are likely used by higher-level configuration or initialization logic (e.g., service startup, test setup UI). - XML serialization implies integration with external tools or UIs that read/write config files. ### 5. Gotchas - **`TDASServiceSetupInfoLookup` naming**: The constructor parameter `aafLookup` is named inconsistently with the property `HardwareFilterRateHzLookup`; this may cause confusion. - **`GetModule`/`GetChannel` behavior**: Both methods add the provided object to the dictionary if missing, which can silently mutate state. Callers must ensure the input object is fully initialized. - **XML deserialization robustness**: - `RecordingMode` and numeric fields (`AAFilterRateHz`, `PreTriggerSeconds`, etc.) use `try/catch` + `APILogger.Log` for errors, but silently default to `0`/`InvalidArmMode` on failure. - `ModuleArrayIndex` is wrapped in a `try/catch` block to handle legacy configs (missing element), but other elements lack this fallback. - **Path construction**: Config paths are hardcoded to `DASConfigs/` under the assembly directory; this may not work in all deployment scenarios (e.g., ClickOnce, containerized). - **Channel polymorphism**: `WriteElementStart` uses `GetType()` to write `xsi:type`, but `ReadXml` relies on the `type` attribute to deserialize into `OutputSquibChannel`, `OutputTOMDigitalChannel`, or `AnalogInputDASChannel`. Mismatched types in XML will cause silent fallback to `AnalogInputDASChannel`. - **No validation**: No validation is performed on `SetupDescription`, `SerialNumber`, or `TestId` (e.g., empty strings allowed). - **`SamplesPerSecond` vs `SamplesPerSecondLookup`**: The nullable `double?` in `TDASServiceSetupInfo` vs. `Dictionary` in `TDASServiceSetupInfoLookup` suggests two distinct use cases (single rate vs. per-DAS rates), but the distinction is not enforced programmatically.