This commit is contained in:
2026-04-17 14:55:32 -04:00
commit bc3ac1d4c9
18017 changed files with 4371742 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
---
source_files:
- DataPRO/Modules/Hardware/AddEditHardware/AddEditHardwareModule.cs
generated_at: "2026-04-17T16:30:25.823878+00:00"
model: "zai-org/GLM-5-FP8"
schema_version: 1
sha256: "10ec7c0a38ddc3b1"
---
# AddEditHardware
### Purpose
This module provides functionality for adding and editing hardware configurations within the DataPRO system. It is a Prism module that registers its view and view model with the Unity dependency injection container, enabling the hardware management UI to be loaded dynamically. The module belongs to the "Prepare" assembly group and targets the "AddEditHardwareRegion" for UI composition.
### Public Interface
**`AddEditHardwareModule`** (class)
- `AddEditHardwareModule(IUnityContainer unityContainer)` - Constructor accepting a Unity container via dependency injection.
- `void Initialize()` - Registers `IAddEditHardwareView` to `AddEditHardwareView` and `IAddEditHardwareViewModel` to `AddEditHardwareViewModel` with the Unity container.
- `void OnInitialized(IContainerProvider containerProvider)` - Empty implementation; no initialization logic executed.
- `void RegisterTypes(IContainerRegistry containerRegistry)` - Calls `Initialize()` to perform type registration.
**`AddEditHardwareModuleNameAttribute`** (class, inherits `TextAttribute`)
- `AddEditHardwareModuleNameAttribute()` / `AddEditHardwareModuleNameAttribute(string s)` - Constructors that set `AssemblyName` to `AssemblyNames.AddEditHardware.ToString()`.
- `string AssemblyName` (property, override) - Returns the assembly name.
- `Type GetAttributeType()` - Returns `typeof(TextAttribute)`.
- `string GetAssemblyName()` - Returns the `AssemblyName` property value.
**`AddEditHardwareModuleImageAttribute`** (class, inherits `ImageAttribute`)
- `AddEditHardwareModuleImageAttribute()` / `AddEditHardwareModuleImageAttribute(string s)` - Constructors that load the assembly image via `AssemblyInfo.GetImage()`.
- `BitmapImage AssemblyImage` (property, override) - Lazy-loads and returns the module's image.
- `string AssemblyName` (property, override) - Returns `AssemblyNames.AddEditHardware.ToString()`.
- `string AssemblyGroup` (property, override) - Returns `eAssemblyGroups.Prepare.ToString()`.
- `eAssemblyRegion AssemblyRegion` (property, override) - Returns `eAssemblyRegion.AddEditHardwareRegion`.
- `BitmapImage GetAssemblyImage()`, `string GetAssemblyName()`, `string GetAssemblyGroup()`, `eAssemblyRegion GetAssemblyRegion()` - Accessor methods for respective properties.
- `Type GetAttributeType()` - Returns `typeof(ImageAttribute)`.
### Invariants
- The module must be instantiated with a non-null `IUnityContainer` reference.
- `Initialize()` must be called (via `RegisterTypes`) before views/view models can be resolved.
- View and ViewModel registrations are transient (not singleton), despite the comment claiming singleton registration.
### Dependencies
**Imports:**
- `DTS.Common` - Provides `TextAttribute`, `ImageAttribute`, `AssemblyNames`, `AssemblyInfo`, `eAssemblyGroups`, `eAssemblyRegion`.
- `DTS.Common.Interface` - Provides base interfaces.
- `DTS.Common.Interface.Hardware.AddEditHardware` - Provides `IAddEditHardwareView`, `IAddEditHardwareViewModel`.
- `Prism.Modularity` - Provides `IModule`, `ModuleAttribute`.
- `Prism.Ioc` - Provides `IContainerProvider`, `IContainerRegistry`.
- `Unity` - Provides `IUnityContainer`.
**Depended on by:** Unknown from source alone (likely shell/bootstrapper and region navigation).
### Gotchas
- The comment in `Initialize()` states "Register View & View-Model... as a singleton," but `RegisterType` registers types as transient by default in Unity. If singleton behavior is required, `RegisterSingleton` or `RegisterInstance` should be used.
- `OnInitialized` is empty but required by `IModule` interface.
- The constructor parameter `string s` in both attribute classes is accepted but never used.
---

View File

@@ -0,0 +1,43 @@
---
source_files:
- DataPRO/Modules/Hardware/AddEditHardware/Model/DASModule.cs
generated_at: "2026-04-17T15:57:30.628257+00:00"
model: "zai-org/GLM-5-FP8"
schema_version: 1
sha256: "22ac148f69b9c507"
---
# Documentation: DASModule.cs
## 1. Purpose
`DASModule` is a model class representing a Data Acquisition System (DAS) hardware module within the hardware configuration system. It serves as a data-bound view model for the Add/Edit Hardware feature, managing module metadata including type identification, bridge configuration, serial numbers, and visual representation. The class implements property change notification to support WPF data binding and automatically resolves appropriate hardware images based on module configuration.
---
## 2. Public Interface
### Class: `DASModule`
**Namespace:** `HardwareList.Model`
**Inheritance:** `BasePropertyChanged`
**Implements:** `IAddEditHardwareDASModule`
#### Properties
| Property | Type | Default | Description |
|----------|------|---------|-------------|
| `Disabled` | `bool` | `false` | Flag indicating whether the module is disabled. |
| `SLICEBridgeType` | `SLICEBridgeTypes` | `SLICEBridgeTypes.Bridge` | The bridge type for SLICE modules. Setter triggers `SetImage()`. |
| `ModuleType` | `HardwareTypes` | `HardwareTypes.UNDEFINED` | The hardware module type. Setter triggers `SetImage()`. |
| `SerialNumber` | `string` | `""` | The serial number of the module. |
| `DASImage` | `ImageSource` | `null` | The visual representation of the module as a WPF image source. |
| `AvailableNanoBridges` | `SLICEBridgeTypes[]` | `static readonly` | Array of bridge types available for Nano hardware: `[Bridge, IEPE]`. |
| `AvailableMicroBridges` | `SLICEBridgeTypes[]` | `static readonly` | Array of bridge types available for Micro hardware: `[Bridge, IEPE, ARS, ACC]`. |
| `AvailableRACKModules` | `HardwareTypes[]` | `static readonly` | Array of available rack module types: `[UNDEFINED, SIM, TOM, DIM]`. |
| `OwningHardware` | `IAddEditHardwareHardware` | N/A | Reference to the parent hardware object. |
#### Methods
**`GetSerialNumberPrefix()`**
- **Signature:** `public string GetSerialNumberPrefix()`
- **Returns:** A string prefix corresponding to the module type for serial number formatting.

View File

@@ -0,0 +1,63 @@
---
source_files:
- DataPRO/Modules/Hardware/AddEditHardware/Properties/Settings.Designer.cs
- DataPRO/Modules/Hardware/AddEditHardware/Properties/AssemblyInfo.cs
generated_at: "2026-04-17T16:44:59.120131+00:00"
model: "zai-org/GLM-5-FP8"
schema_version: 1
sha256: "5f8154fbe79383b1"
---
# Documentation: AddEditHardware Module Properties
## 1. Purpose
This module provides the property and assembly configuration infrastructure for the `AddEditHardware` component within the DataPRO system. The `Settings.Designer.cs` file defines a strongly-typed settings class for persisting application configuration, while `AssemblyInfo.cs` establishes the assembly's identity, version, and COM visibility metadata. These files represent the configuration layer rather than the core business logic of hardware add/edit operations.
---
## 2. Public Interface
### `AddEditHardware.Properties.Settings` (class)
**Signature:**
```csharp
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
```
**Description:** A thread-safe singleton class that provides access to application-scoped and user-scoped settings for the AddEditHardware module. This class is auto-generated by Visual Studio's Settings Designer.
**Members:**
| Member | Signature | Description |
|--------|-----------|-------------|
| `Default` | `public static Settings Default { get; }` | Static property that returns the singleton instance of the `Settings` class. The instance is synchronized for thread-safe access. |
---
## 3. Invariants
- **Singleton Pattern:** The `Settings` class maintains exactly one instance via the `defaultInstance` field, created through `ApplicationSettingsBase.Synchronized()`.
- **Thread Safety:** The default instance is created using `Synchronized()`, ensuring thread-safe access to settings.
- **Auto-generation:** The `Settings.Designer.cs` file is machine-generated (Runtime Version: 4.0.30319.42000, Generator Version: 17.10.0.0) and will be overwritten on regeneration.
- **Internal Visibility:** The `Settings` class is marked `internal`, restricting access to within the `AddEditHardware` assembly.
- **COM Invisibility:** The assembly has `ComVisible(false)`, meaning types are not exposed to COM components by default.
---
## 4. Dependencies
### This module depends on:
- `System.Configuration.ApplicationSettingsBase` — Base class providing settings persistence and synchronization infrastructure.
- `System.Reflection` — For assembly metadata attributes.
- `System.Runtime.CompilerServices` — For `CompilerGeneratedAttribute`.
- `System.Runtime.InteropServices` — For `ComVisible` and GUID attributes.
### What depends on this module:
- **Cannot be determined from source alone.** The `AddEditHardware` assembly (identified by GUID `79856d8f-191f-4528-b78f-892283e21e7b`) is presumably consumed by other DataPRO components, but the specific consumers are not visible in these files.
---
## 5. Gotchas
- **Auto-generated Code:** The `Settings.Designer.cs` file contains

View File

@@ -0,0 +1,20 @@
---
source_files:
- DataPRO/Modules/Hardware/AddEditHardware/Resources/TranslateExtension.cs
- DataPRO/Modules/Hardware/AddEditHardware/Resources/StringResources.Designer.cs
generated_at: "2026-04-17T16:13:00.122317+00:00"
model: "zai-org/GLM-5-FP8"
schema_version: 1
sha256: "209c67de8aede7be"
---
# Resources
### 1. Purpose
This module provides localization support for the `AddEditHardware` assembly. It contains a WPF markup extension for declarative XAML binding to string resources and an auto-generated strongly-typed resource class that wraps access to culture-specific strings such as UI labels, error messages, and hardware configuration names.
### 2. Public Interface
**Class: `TranslateExtension`**
* **Signature:** `public class TranslateExtension : MarkupExtension`
* **Constructor:** `TranslateExtension(string key)` — Initializes the extension with the resource key to look up.
* **Method:** `public override object ProvideValue(IServiceProvider serviceProvider)` — Retrieves the localized string for the stored `_key`. Returns `#stringnotfound#

View File

@@ -0,0 +1,23 @@
---
source_files:
- DataPRO/Modules/Hardware/AddEditHardware/View/AddEditHardwareView.xaml.cs
generated_at: "2026-04-17T16:00:07.079272+00:00"
model: "zai-org/GLM-5-FP8"
schema_version: 1
sha256: "6e5b358ea40be28e"
---
# Documentation: AddEditHardwareView
## 1. Purpose
`AddEditHardwareView` is a WPF code-behind file that serves as the view component for adding and editing hardware configurations in a Data Acquisition System (DAS). It implements `IAddEditHardwareView` and `INotifyPropertyChanged` to provide data binding support. The view manages hardware type selection based on database version compatibility, handles module addition/removal within hardware configurations, and notifies the underlying view model of user modifications through various UI event handlers.
---
## 2. Public Interface
### Properties
| Signature | Description |
|-----------

View File

@@ -0,0 +1,24 @@
---
source_files:
- DataPRO/Modules/Hardware/AddEditHardware/ViewModel/AddEditHardwareViewModel.cs
generated_at: "2026-04-17T16:00:07.067031+00:00"
model: "zai-org/GLM-5-FP8"
schema_version: 1
sha256: "9a47572c9293f8ae"
---
# AddEditHardwareViewModel Documentation
## 1. Purpose
`AddEditHardwareViewModel` is a Prism-based ViewModel that manages the UI logic for adding and editing hardware devices within the DTS application. It serves as the intermediary between the `IAddEditHardwareView` and the underlying hardware data models, handling validation, persistence, SLICE6 database associations, and event-based communication with other modules. The class is designed as a shared singleton (via MEF `CreationPolicy.Shared`) and integrates with the application's event aggregation, region management, and dependency injection systems.
---
## 2. Public Interface
### Properties
| Name | Type | Description |
|------|------|-------------|
| `AllowStandin` | `bool

View File

@@ -0,0 +1,18 @@
---
source_files:
- DataPRO/Modules/Hardware/HardwareList/HardwareListModule.cs
generated_at: "2026-04-17T16:15:42.553640+00:00"
model: "zai-org/GLM-5-FP8"
schema_version: 1
sha256: "7d197781627bb359"
---
# HardwareList
### Purpose
This module serves as the entry point for the HardwareList feature within the DTS application. It is a Prism Module (`IModule`) responsible for registering its associated views and view models with the Unity dependency injection container. It also provides assembly-level metadata (name, image, group, and region) to the application shell, identifying itself as part of the "Prepare" group targeting the "HardwareListRegion".
### Public Interface
* **`HardwareListModule` (Class)**
* `HardwareListModule(IUnityContainer unity

View File

@@ -0,0 +1,45 @@
---
source_files:
- DataPRO/Modules/Hardware/HardwareList/Converters/FirstUseDateConverter.cs
- DataPRO/Modules/Hardware/HardwareList/Converters/StandInFieldConverter.cs
generated_at: "2026-04-17T16:45:06.957738+00:00"
model: "zai-org/GLM-5-FP8"
schema_version: 1
sha256: "efc40e7dad9708c9"
---
# HardwareList.Converters Documentation
## 1. Purpose
This module provides WPF `IValueConverter` implementations for the HardwareList UI layer. These converters transform `HardwareModel` data into display-friendly values for data-bound controls, handling edge cases such as missing data, invalid states, and stand-in hardware representations. The converters ensure consistent display formatting (e.g., returning `"---"` or `"N/A"` placeholders) across the hardware list views.
---
## 2. Public Interface
### `FirstUseDateConverter`
**Implements:** `System.Windows.Data.IValueConverter`
| Method | Signature | Description |
|--------|-----------|-------------|
| `Convert` | `(object value, Type targetType, object parameter, CultureInfo culture) → object` | Returns the first use date display value. If `value` is not a `HardwareModel`, returns `Strings.Table_NA`. If `model.IsFirstUseValid` is `false`, returns `Strings.NotApplicable`. If `model.FirstUseDate` is non-null, returns that date. Otherwise returns `Strings.Table_NA`. |
| `ConvertBack` | `(object value, Type targetType, object parameter, CultureInfo culture) → object` | Returns the input `DateTime` unchanged if `value` is a `DateTime`; otherwise returns `Strings.Table_NA`. |
---
### `StandInFieldConverter`
**Implements:** `System.Windows.Data.IValueConverter`
| Method | Signature | Description |
|--------|-----------|-------------|
| `Convert` | `(object value, Type targetType, object parameter, CultureInfo culture) → object` | Returns field values for non-stand-in hardware. If `value` is not a `HardwareModel`, returns `Strings.Table_NA`. If `model.Hardware` is not an `IISOHardware`, returns `string.Empty`. If `isoHW.StandIn` is `true`, returns `Strings.Table_NA`. Otherwise, uses the string `parameter` to select: `"CalDueDate"``model.CalDueDate`, `"CalDate"``model.CalDate`, `"Firmware"``model.Firmware`. Unrecognized parameters return `Strings.Table_NA`. |
| `ConvertBack` | `(object value, Type targetType, object parameter, CultureInfo culture) → object` | Returns the input `DateTime` unchanged if `value` is a `DateTime`; otherwise returns `Strings.Table_NA`. |
---
## 3. Invariants
-

View File

@@ -0,0 +1,173 @@
---
source_files:
- DataPRO/Modules/Hardware/HardwareList/Model/HardwareChannelAssignment.cs
- DataPRO/Modules/Hardware/HardwareList/Model/SLICE6TreeNode.cs
- DataPRO/Modules/Hardware/HardwareList/Model/Hardware.cs
generated_at: "2026-04-17T15:56:03.551323+00:00"
model: "zai-org/GLM-5-FP8"
schema_version: 1
sha256: "f80851e7f913e0b5"
---
# Hardware List Model Documentation
## 1. Purpose
This module provides the data models for representing and managing hardware devices (DAS - Data Acquisition Systems) within the Hardware List feature. It handles hardware configuration state, channel assignments, SLICE6 device tree node relationships, database persistence for device associations, and calibration date calculations. The models serve as the bridge between raw hardware interface objects (`IISOHardware`) and the UI layer, exposing computed properties for display and user interaction.
---
## 2. Public Interface
### HardwareChannelAssignment (HardwareList.Model)
A simple immutable data transfer object representing a channel-to-sensor mapping.
| Member | Signature | Description |
|--------|-----------|-------------|
| `ChannelNumber` | `string { get; }` | Read-only channel identifier. |
| `Sensor` | `string { get; }` | Read-only sensor identifier. |
| `Name` | `string { get; }` | Read-only name for the assignment. |
| Constructor | `HardwareChannelAssignment(string channelNumber, string sensor, string name)` | Initializes all three properties. |
---
### SLICE6TreeNode (HardareList.Model)
**Note:** Namespace has a typo ("HardareList" vs "HardwareList").
Represents a SLICE6 device node in a tree structure, with database operations for managing parent-child relationships between SLICE6 devices and SLICE6DB distributors.
| Member | Signature | Description |
|--------|-----------|-------------|
| `DASId` | `int { get; set; }` | Database ID of the DAS record. |
| `SerialNumber` | `string { get; set; }` | Serial number of the DAS. |
| `Port` | `int { get; set; }` | Port number on the S6DB. |
| `PortString` | `string { get; }` | Returns `"---"` if Port < 0, otherwise Port.ToString(). |
| `Number` | `int { get; set; }` | Order of the DAS on the S6DB. |
| `PositionOnChain` | `int { get; set; }` | Order on the chain for a given port. |
| `PositionOnChainString` | `string { get; }` | Returns `"---"` if PositionOnChain < 0, otherwise PositionOnChain.ToString(). |
| Constructor | `SLICE6TreeNode(int dasId, string serialNumber, int port, int number, int positionOnChain)` | Initializes all properties. |
| `GetAvailableTreeNodes` | `static ISLICE6TreeNode[](string serialNumberParent)` | Returns all SLICE6 devices NOT associated with the given S6DB serial number. Filters by `HardwareTypes.SLICE6_Base` and excludes 'Prototype' positions. Results sorted by SerialNumber. |
| `GetTreeNodes` | `static ISLICE6TreeNode[](string serialNumberParent)` | Returns all SLICE6 devices associated with the given S6DB serial number. Results sorted by Number. |
| `SwapNodes` | `static void(string serialNumberA, string serialNumberB)` | Swaps all child DAS associations between two distributors. |
| `SaveAssociations` | `static void(string serialNumber, ISLICE6TreeNode[] attachedSLICE6)` | Commits SLICE6-to-S6DB associations to the database. First clears all associations, then applies new ones. |
---
### HardwareModel (HardareList.Model)
Primary model for hardware devices, implementing `IHardware`.
| Member | Signature | Description |
|--------|-----------|-------------|
| `FirstUseDate` | `DateTime? { get; set; }` | First date of use after calibration; null if not used since calibration. |
| `IsFirstUseValid` | `bool { get; set; }` | Whether hardware supports and is using first use date. |
| `DASId` | `int { get; set; }` | Database ID. |
| `Disabled` | `bool { get; set; }` | Whether device is disabled. |
| `SerialNumber` | `string { get; set; }` | Device serial number. |
| `HardwareType` | `string { get; set; }` | Localized hardware type name. |
| `ChannelCount` | `string { get; set; }` | Formatted channel count string. |
| `HasIncludedChildren` | `bool { get; set; }` | Whether device has included child devices. |
| `Firmware` | `string { get; set; }` | Firmware version. |
| `MaxSampleRate` | `double? { get; set; }` | Maximum sample rate, null if not applicable. |
| `TestSampleRate` | `double { get; set; }` | Sample rate for testing; setter fires `SelectedSampleRateIndex` change. |
| `TestAAFilterRateHz` | `double { get; set; }` | Anti-alias filter rate; setter calls `_vm.FireAAFilterRate()`. |
| `CalDate` | `DateTime? { get; set; }` | Calibration date. |
| `CalDueDate` | `DateTime? { get; set; }` | Calculated calibration due date based on hardware type. |
| `Included` | `bool { get; set; }` | Whether device is included in test; setter fires multiple property changes and calls `_vm.FireIncluded()`. |
| `DSPStreamingFilter` | `double { get; set; }` | DSP streaming filter value. |
| `MasterProfile` | `DTS.Common.ClockSyncProfile { get; set; }` | Clock sync profile for master mode. |
| `SlaveProfile` | `DTS.Common.ClockSyncProfile { get; set; }` | Clock sync profile for slave mode. |
| `IsClockMaster` | `bool { get; set; }` | Whether device is clock master; setter calls `_vm.FireClockMaster()`. |
| `IsClockedDAS` | `bool { get; }` | True for SLICE6_AIR, S6A_EthernetRecorder, SLICE6_Base, SLICE6_AIR_BR, SLICE6DB, SLICE6DB3, SLICE6DB_InDummy, TSR_AIR, TSR_AIR_RevB, SLICE6_AIR_TC. |
| `PTPDomainID` | `byte { get; set; }` | PTP domain ID; setter calls `_vm.FirePTPDomainID()`. |
| `IsPTPSync` | `bool { get; }` | Computed from MasterProfile/SlaveProfile containing "E2E". |
| `MixedRates` | `bool { get; set; }` | Whether mixed rates are enabled. |
| `IsDistributor` | `bool { get; }` | True for SLICE_EthernetController, SLICE_Distributor, SLICE_Mini_Distributor, SLICE6DB, SLICE_LabEthernet, SLICE6DB3, SLICE6DB_InDummy, SLICE_Pro_Distributor. |
| `IsBattery` | `bool { get; }` | True for PowerPro. |
| `IsTSRAIR` | `bool { get; }` | True for TSR_AIR, TSR_AIR_RevB, DKR, DIR. |
| `IncludedAndNotMixedRatesAndCompactOrNotDistributor` | `bool { get; }` | Computed property for UI binding. |
| `IncludedAndMixedRatesAndCompact` | `bool { get; }` | Computed property for UI binding. |
| `ParentDAS` | `string { get; set; }` | Serial number of parent DAS. |
| `PositionOnChain` | `int { get; set; }` | Position on chain. |
| `PositionOnDistributor` | `int { get; set; }` | Position on distributor. |
| `Port` | `int { get; set; }` | Port number. |
| `HasTreeView` | `bool { get; set; }` | Whether device has a tree view (true for SLICE6DB, SLICE6DB3, SLICE6DB_InDummy). |
| `SerialNumberDisplay` | `string { get; }` | Returns hardware type description if `StandIn` is true, otherwise SerialNumber. |
| Constructor | `HardwareModel(IISOHardware d, int tdasCalPeriod, ...)` | Takes 14 calibration period parameters and a view model reference. Calculates CalDueDate based on hardware type. |
| `DetermineChannelCount` | `void(bool showCompact, IHardware[] allHardware)` | Builds channel count string and determines MaxSampleRate for distributors. |
| `SetIncluded` | `void(bool bIncluded)` | Sets included flag without firing `_vm.FireIncluded()`. |
| `SetMixedRates` | `void(bool mixedRates)` | Sets mixed rates flag. |
| `Filter` | `bool(string term)` | Returns true if term matches SerialNumber, Firmware, or HardwareType (case-insensitive). |
| `GetAvailableSLICE6DB` | `static IHardware[](string serialNumber)` | Returns SLICE6DB devices excluding the one matching the given serial number. |
| `ToString` | `override string()` | Returns SerialNumberDisplay. |
---
### HardwareComparer (HardareList.Model)
Comparer class for sorting `IHardware` instances.
| Member | Signature | Description |
|--------|-----------|-------------|
| `SortField` | `HardwareListTags { get; set; }` | Field to sort by. |
| `SortAscending` | `bool { get; set; }` | Sort direction; default is true. |
| `Compare` | `int(IHardware left, IHardware right)` | Compares two hardware instances based on SortField. Handles nulls and various data types. |
Supported sort fields: `Included`, `DSPStreamingFilter`, `SerialNumber`, `HardwareType`, `ChannelCount`, `Firmware`, `MaxSampleRate`, `CalDate`, `CalDueDate`, `IPAddress`, `FirstUseDate`.
---
## 3. Invariants
1. **PortString / PositionOnChainString**: Always return `"---"` when the underlying integer value is negative; otherwise return the string representation of the value.
2. **CalDueDate Calculation**: Always calculated from `dateOfFirstUse` (either `CalDate` or `FirstUseDate` or `DateTime.Today` depending on `IsFirstUseValid`) plus the hardware-type-specific calibration period. Throws `ArgumentOutOfRangeException` for unknown `HardwareTypes` values.
3. **GetAvailableTreeNodes**: Returns empty array if `serialNumberParent` is null or whitespace. Always sorts results by SerialNumber.
4. **GetTreeNodes**: Returns empty array if `serialNumberParent` is null or whitespace. Always sorts results by Number.
5. **GetAvailableSLICE6DB**: Returns empty array if `serialNumber` is null or whitespace. Filters for `Position=''` (empty string).
6. **SaveAssociations**: Always performs a two-step process: first clears all associations (sets `IsModule=0`, `PositionOnDistributor=-1`, `PositionOnChain=-1`, `Port=-1`, `ParentDAS=''`), then applies new associations.
7. **IsPTPSync**: Returns true only if the appropriate profile's description contains "E2E".
8. **IsClockMaster**: Returns false if `IsClockedDAS` is false, regardless of `_bIsClockMaster` value.
---
## 4. Dependencies
### This module depends on:
- `DTS.Common.Base.BasePropertyChanged` - Base class for property change notification
- `DTS.Common.Interface.DASFactory.Diagnostics.HardwareList.ISLICE6TreeNode` - Interface for SLICE6 tree nodes
- `DTS.Common.Interface.DASFactory.Diagnostics.IHardware` - Interface for hardware model
- `DTS.Common.Interface.DASFactory.Diagnostics.IISOHardware` - Interface for ISO hardware objects
- `DTS.Common.Enums.Hardware.HardwareTypes` - Enum for hardware type identification
- `DTS.Common.Enums.HardwareListTags` - Enum for sort field identification
- `DTS.Common.ClockSyncProfile` - Enum for clock synchronization profiles
- `DTS.Common.Storage.DbOperations` - Database access utilities
- `DTS.Common.Converters.EnumDescriptionTypeConverter` - For enum description conversion
- `DTS.Common.Classes.Hardware` - Hardware-related classes
- `System.Data.SqlClient.SqlParameter` - SQL parameter construction
- `HardwareList.Resources.StringResources` - Localized string resources
- `HardwareList.HardwareListViewModel` - View model reference (passed to HardwareModel constructor)
### Database Dependencies:
- `[DAS]` table with columns: `DASId`, `SerialNumber`, `PositionOnDistributor`, `PositionOnChain`, `Port`, `ParentDAS`, `Type`, `Position`, `IsModule`, `FirmwareVersion`, `CalDate`, `MaxSampleRate`, `IPAddress`
---
## 5. Gotchas
1. **Namespace Typo**: `SLICE6TreeNode` and `HardwareModel` are in namespace `HardareList.Model` (missing 'w'), while `HardwareChannelAssignment` is in `HardwareList.Model`. This inconsistency may cause resolution issues.
2. **Bug in SwapNodes**: The method contains a likely bug where `Associate` is called with `serialNumberB` for both lists:
```csharp
if (listA.Any()) { Associate(serialNumberB, listA.ToArray()); }
if (listB.Any()) { Associate(serialNumberB, listB.ToArray()); } // Should be serialNumberA?
```
This would result in all nodes being associated with `serialNumberB` instead of swapping.
3. **Direct Field Access in SetIncluded**: The `SetIncluded` method sets `_bIncluded` directly and calls `OnPropertyChanged`, but does NOT call `_vm.FireIncluded()`. The `Included` property setter does call `_vm.FireIncluded()`. This inconsistency may cause unexpected behavior.
4. **Database Connection Disposal**: All database

View File

@@ -0,0 +1,24 @@
---
source_files:
- DataPRO/Modules/Hardware/HardwareList/Properties/Settings.Designer.cs
- DataPRO/Modules/Hardware/HardwareList/Properties/AssemblyInfo.cs
generated_at: "2026-04-17T16:53:13.870656+00:00"
model: "zai-org/GLM-5-FP8"
schema_version: 1
sha256: "347d313124875b2c"
---
# Documentation: HardwareList Module Properties
## 1. Purpose
This module contains the assembly metadata and configuration settings infrastructure for the `HardwareList` component within the DataPRO system. It defines the assembly's identity, version information, and COM visibility attributes, while providing a strongly-typed, thread-safe wrapper for accessing application settings via the `Settings` class.
## 2. Public Interface
### `HardwareList.Properties.Settings`
**Kind:** Class (Internal, Sealed, Partial)
**Inheritance:** `System.Configuration.ApplicationSettingsBase`
This is an auto-generated class that provides access to application-scoped and user-scoped settings.
* **`Default

View File

@@ -0,0 +1,140 @@
---
source_files:
- DataPRO/Modules/Hardware/HardwareList/Resources/TranslateExtension.cs
- DataPRO/Modules/Hardware/HardwareList/Resources/StringResources.Designer.cs
generated_at: "2026-04-17T15:58:02.305916+00:00"
model: "zai-org/GLM-5-FP8"
schema_version: 1
sha256: "044fd045b3bc16bb"
---
# Documentation: HardwareList Resources Module
## 1. Purpose
This module provides localization/internationalization support for the HardwareList component of the DataPRO system. It enables XAML-based UI elements to declaratively reference localized strings through a markup extension pattern, while the underlying resource class provides strongly-typed access to hardware-related display text (device names, column headers, action labels, etc.). The module abstracts the resource lookup mechanism, allowing UI code to reference string resources by key without direct interaction with `ResourceManager`.
---
## 2. Public Interface
### `TranslateExtension` Class
**Namespace:** `HardwareList`
**Inheritance:** `System.Windows.Markup.MarkupExtension`
**Attribute:** `[MarkupExtensionReturnType(typeof(string))]`
| Member | Signature | Description |
|--------|-----------|-------------|
| Constructor | `TranslateExtension(string key)` | Initializes the extension with the resource key to look up. The key is stored in a readonly field `_key`. |
| `ProvideValue` | `override object ProvideValue(IServiceProvider serviceProvider)` | Returns the localized string for the stored key. Returns `#stringnotfound#` if key is null/empty, or `#stringnotfound# <key>` if the key is not found in resources. |
### `StringResources` Class
**Namespace:** `HardwareList.Resources`
**Accessibility:** `internal`
**Attribute:** Auto-generated by `StronglyTypedResourceBuilder`
| Member | Signature | Description |
|--------|-----------|-------------|
| `ResourceManager` | `static global::System.Resources.ResourceManager ResourceManager { get; }` | Returns the cached ResourceManager instance for the `HardwareList.Resources.StringResources` resource set. Lazily initialized on first access. |
| `Culture` | `static global::System.Globalization.CultureInfo Culture { get; set; }` | Gets or sets the culture used for resource lookups. Overrides `Thread.CurrentUICulture` for this resource class. |
**Static String Properties (selection):**
| Property | Default Value (English) |
|----------|------------------------|
| `Add` | "Add" |
| `Remove` | "Remove" |
| `Replace` | "Replace" |
| `Swap` | "Swap" |
| `SerialNumber` | "Serial Number" |
| `Firmware` | "Firmware" |
| `IPAddress` | "IP Address" |
| `Port` | "Port" |
| `HardwareType` | "Type" |
| `ChannelCount` | "Channels" |
| `MaxSampleRate` | "Max Sample Rate" |
| `TestSampleRate` | "Test Sample Rate" |
| `CalDate` | "Cal Date" |
| `CalDueDate` | "Cal Due Date" |
| `FirstUseDate` | "First Use Date" |
| `Connection` | "Connection" |
| `USB` | "USB" |
| `CAN` | "CAN" |
| `UART` | "UART" |
| `PositionOnChain` | "Position on chain" |
| `IsHWClockMaster` | "Clock Master?" |
| `PTPDomain` | "PTP Domain" |
| `NotFound` (constant in `TranslateExtension`) | `#stringnotfound#` |
**Hardware Device Name Properties (partial list):**
| Property | Default Value |
|----------|--------------|
| `SLICE_Base` | "SLICE" |
| `SLICE6_Base` | "SLICE 6" |
| `SLICE6_AIR` | "SLICE 6 AIR" |
| `SLICE2_Base` | "SLICE PRO SIM" |
| `SLICE2_DIM` | "SLICE PRO DIM" |
| `SLICE_IEPE` | "SLICE (IEPE)" |
| `SLICE_NANO_Base` | "SLICE (Nano)" |
| `SLICE_Micro_Base` | "SLICE (Micro)" |
| `SLICE1_5_Micro_Base` | "SLICE+" |
| `SLICE_Distributor` | "SLICE Distributor" |
| `SLICE_EthernetController` | "SLICE Ethernet Controller" |
| `TDAS_Pro_Rack` | "TDAS PRO Rack" |
| `TDAS_LabRack` | "TDAS PRO Lab Rack" |
| `G5VDS` | "G5 (VDS)" |
| `TSR_AIR` | "TSR AIR" |
| `Ribeye` | "Ribeye" |
| `PowerPro` | "PowerPRO Battery" |
---
## 3. Invariants
1. **Key Immutability:** The `_key` field in `TranslateExtension` is `readonly` and can only be set via the constructor.
2. **Error String Format:** Missing translations always follow the pattern:
- Null/empty key → `#stringnotfound#`
- Key not found → `#stringnotfound# <key>` (note the space before the key)
3. **Resource Manager Singleton:** The `ResourceManager` property uses lazy initialization with a null-check pattern; once initialized, the same instance is returned for all subsequent calls.
4. **Auto-generation Constraint:** `StringResources` is marked with `GeneratedCodeAttribute` and `CompilerGeneratedAttribute`. Manual edits will be overwritten when the `.resx` file is regenerated.
5. **Internal Visibility:** `StringResources` is `internal`, restricting access to within the defining assembly.
---
## 4. Dependencies
### This Module Depends On:
- `System` (core types)
- `System.Windows.Markup` (`MarkupExtension` base class, `MarkupExtensionReturnTypeAttribute`)
- `System.Resources` (`ResourceManager` for resource lookup)
- `System.Globalization` (`CultureInfo` for culture-specific lookups)
- `System.CodeDom.Compiler` (attributes on generated code)
- `System.ComponentModel` (`EditorBrowsableAttribute`)
- `System.Diagnostics` (`DebuggerNonUserCodeAttribute`)
- `System.Runtime.CompilerServices` (`CompilerGeneratedAttribute`)
### External Resource Dependency:
- A `.resx` file named `StringResources.resx` (and culture-specific variants) must exist in the `HardwareList.Resources` namespace at compile time.
### What Depends On This Module:
- **Inferred:** Any XAML files in the `HardwareList` module that use `{local:Translate KeyName}` syntax for localized strings.
- **Inferred:** Code-behind files that reference `StringResources.<PropertyName>` directly.
---
## 5. Gotchas
1. **Silent Failure Pattern:** `TranslateExtension.ProvideValue` never throws exceptions for missing keys. It returns error strings instead, which may appear directly in the UI. Consumers should test for the `#stringnotfound#` prefix if they need to detect missing translations programmatically.
2. **Culture Must Be Set Explicitly:** The `StringResources.Culture` property allows overriding the current thread's UI culture. If set, all subsequent lookups use this culture until reset. This can cause unexpected language switches if not managed carefully.
3. **Auto-generated File Warning:** The file header explicitly warns that changes to `StringResources.Designer.cs` will be lost on regeneration. Developers must edit the underlying `.resx` file instead.
4. **No Null Key Validation in Constructor:** `TranslateExtension` accepts null or empty keys without throwing; the validation only occurs in `ProvideValue()`. This means XAML with `{x:Null}` or empty string bindings will compile but produce `#stringnotfound#` at runtime.
5. **Inconsistent Device Naming:** Some device strings appear to have copy-paste errors in comments (e.g., `SLICE2_Bridge_Hi`, `SLICE2_Bridge_Lo`, `SLICE2_IEPE_Hi`, `SLICE2_IEPE_Lo` all have summary comments saying "SLICE PRO SIM" rather than their actual device type). This is documentation debt in the auto-generated file, not a runtime issue.

View File

@@ -0,0 +1,30 @@
---
source_files:
- DataPRO/Modules/Hardware/HardwareList/View/HardwareListOverdueView.xaml.cs
- DataPRO/Modules/Hardware/HardwareList/View/HardwareListReplaceView.xaml.cs
- DataPRO/Modules/Hardware/HardwareList/View/SLICE6TreeView.xaml.cs
- DataPRO/Modules/Hardware/HardwareList/View/HardwareListSelectView.xaml.cs
- DataPRO/Modules/Hardware/HardwareList/View/HardwareListView.xaml.cs
generated_at: "2026-04-17T15:52:26.243728+00:00"
model: "zai-org/GLM-5-FP8"
schema_version: 1
sha256: "aa0519467c51d90d"
---
# Hardware List Views Documentation
## 1. Purpose
This module provides the WPF view components for the Hardware List feature within the DataPRO diagnostics system. It contains five partial classes that implement view interfaces for displaying, selecting, and managing hardware items—including overdue hardware tracking, hardware replacement operations, and SLICE6 device tree associations. These views serve as the UI layer that binds user interactions to the `IHardwareListViewModel` and related view models, handling events such as sorting, filtering, column management, and hardware association workflows.
---
## 2. Public Interface
### HardwareListOverdueView
**Implements:** `IHardwareListOverdueView`
| Member | Signature | Description |
|--------|-----------|-------------|
| Constructor | `public HardwareListOverdueView()` | Initializes the component via `InitializeComponent()`. |
| ListViewHeader_Click | `private void ListViewHeader_Click(object sender, RoutedEventArgs e)` | Handles column header clicks; extracts `GridViewColumnHeader` from `e.OriginalSource`, retrieves

View File

@@ -0,0 +1,242 @@
---
source_files:
- DataPRO/Modules/Hardware/HardwareList/ViewModel/HardwareListViewModel.cs
generated_at: "2026-04-17T16:01:30.188313+00:00"
model: "zai-org/GLM-5-FP8"
schema_version: 1
sha256: "516e7030d5d58a0c"
---
# HardwareListViewModel Documentation
## 1. Purpose
`HardwareListViewModel` is the ViewModel for the Hardware List module in a WPF/Prism-based application. It manages the display, filtering, sorting, and manipulation of hardware devices (DAS units, SLICE modules, racks, etc.) within the system. The class handles hardware configuration including sample rates, anti-aliasing filter rates, clock synchronization, PTP domain IDs, calibration tracking, and SLICE6-to-SLICE6DB associations. It serves as the intermediary between hardware data models and the UI views, exposing bindable properties and commands for hardware management operations.
---
## 2. Public Interface
### Constructor
```csharp
public HardwareListViewModel(IHardwareListView view, IRegionManager regionManager, IEventAggregator eventAggregator, IUnityContainer unityContainer)
```
Initializes the ViewModel with its associated view, Prism region manager, event aggregator for pub/sub messaging, and Unity DI container. Sets up event subscriptions for `RaiseNotification` and `BusyIndicatorChangeNotification` events.
### Properties
| Property | Type | Description |
|----------|------|-------------|
| `View` | `IHardwareListView` | The associated view, with DataContext set to this ViewModel |
| `OverdueView` | `IHardwareListOverdueView` | View for overdue hardware display |
| `SelectView` | `IHardwareListSelectView` | View for hardware selection |
| `ReplaceView` | `IHardwareListReplaceView` | View for hardware replacement |
| `SLICE6TreeView` | `ISLICE6TreeView` | Tree view for SLICE6/Slice 6 Air hardware hierarchy |
| `NotificationRequest` | `InteractionRequest<Notification>` | Interaction request for showing notifications |
| `ConfirmationRequest` | `InteractionRequest<Confirmation>` | Interaction request for confirmations |
| `StreamingDSPProfile` | `IStreamingFilterProfile` | Profile for DSP streaming filter calculations |
| `Hardware` | `IHardware[]` | Array of hardware items for display |
| `OverdueHardware` | `IHardware[]` | Array of hardware with overdue calibration |
| `SelectedHardwareItems` | `ObservableCollection<IHardware>` | Currently selected hardware items |
| `ShowCompact` | `bool` | Whether to show compact view (hides rack modules) |
| `IsBusy` | `bool` | Busy indicator state for UI |
| `IsEdit` | `bool` | Edit mode flag |
| `ListViewId` | `string` | Returns `"HardwareListView"` |
### Calibration Period Properties
```csharp
public int TDASCalPeriod { get; set; }
public int G5CalPeriod { get; set; }
public int SLICE1CalPeriod { get; set; }
public int SLICE1_5CalPeriod { get; set; }
public int SLICE2_CalPeriod { get; set; }
public int SLICE6_CalPeriod { get; set; }
public int POWERPRO_CalPeriod { get; set; }
public int SLICE6Air_CalPeriod { get; set; }
public int SLICE6AirBridge_CalPeriod { get; set; }
public int SLICE6DB_CalPeriod { get; set; }
public int TSRAir_CalPeriod { get; set; }
public int SLICETC_CalPeriod { get; set; }
public int SLICE_PRO_CAN_FD_CalPeriod { get; set; }
```
### Key Methods
#### Hardware Loading and Management
```csharp
public void GetHardware(bool bIncludeModules, bool bIncludeOverdue, bool bIncludeBridges, int? testId, int? groupId)
```
Loads all DAS hardware from the system, applies filtering based on parameters, aggregates child module properties to parent devices, and populates `Hardware` and `OverdueHardware` arrays.
```csharp
public void LoadTreeView(string serialNumber)
```
Loads SLICE6 tree nodes for a given serial number, populating `SLICE6TreeNodes` and `AvailableSLICE6`.
```csharp
public void Unset()
```
Clears all hardware arrays, filters, cached data, and publishes `ListViewStatusEvent` with `Unloaded` status.
#### Sample Rate Methods
```csharp
public void GetAvailableSampleRates(int[] availableSampleRates)
public void SetTestSampleRates(Dictionary<string, double> testSampleRates)
public void UpdateTestSampleRate(string childSerialNumber, double testSampleRate)
```
Manage sample rate configuration for hardware. `SetTestSampleRates` automatically selects the next highest available rate if a requested rate is unavailable (except for TSRAIR hardware).
#### Anti-Aliasing Filter Methods
```csharp
public void SetTestAAFRates(Dictionary<string, float> testAAFRates)
public void UpdateTestAAFilterRate(string childSerialNumber, float testAAFilterRate)
public internal float GetAAFForHardware(IISOHardware h, int sampleRate)
```
Configure anti-aliasing filter rates. `GetAAFForHardware` routes to different AAF calculations based on `DASTypeEnum` (TDAS vs SLICE types).
```csharp
public Func<SerializableAAF.DAS_TYPE, int, float> GetAAFForHardwareFunc { get; set; }
```
Injectable function for AAF calculation, allowing external implementation.
#### Clock and PTP Methods
```csharp
public void SetTestClockProfiles(DTS.Common.ClockSyncProfile masterProfile, DTS.Common.ClockSyncProfile slaveProfile)
public void SetTestClockMasters(Dictionary<string, bool> testClockMasters)
public void UpdateTestClockMaster(string childSerialNumber, bool testClockMaster)
public void SetTestPTPDomainIDs(Dictionary<string, byte> testPTPDomainIDs)
public void UpdateTestPTPDomainID(string childSerialNumber, byte ptpDomainId)
```
#### Event Publishing Methods
```csharp
public void FireAAFilterRate(IHardware hardware, string testAAFilterRate)
public void FireSampleRate(IHardware hardware, string testSampleRate)
public void FireClockMaster(IHardware hardware, bool isClockMaster)
public void FireIncluded(IHardware hardware)
public void FirePTPDomainID(IHardware hardware, byte ptpDomainID)
```
Publish corresponding Prism events via `IEventAggregator`.
#### Filtering and Sorting
```csharp
public void Filter(string term)
public void Filter(object tag, string term)
public void Sort(object o, bool bColumnClick)
public void SortOverdue(object o, bool bColumnClick)
public void ClearAllFilters()
```
#### Hardware Replacement
```csharp
public void InitializeReplace(ITestSetup testSetup, IsoViewMode viewMode)
public void Replace()
```
`InitializeReplace` prepares the replacement workflow by loading channel assignments. `Replace` executes the replacement and publishes `HardwareReplaceEvent`.
#### SLICE6 Association Methods
```csharp
public void SaveSLICE6Associations(string serialNumber)
public void Associate(ISLICE6TreeNode node)
public void Associate(IHardware node)
public void UnAssociate(ISLICE6TreeNode node)
```
Manage SLICE6-to-SLICE6DB associations. Changes are in-memory until `SaveSLICE6Associations` is called.
#### Selection
```csharp
public IHardware[] GetSelectedItems()
public void SetIncluded(string[] serialNumbers, bool included)
public void SetIncluded(int[] ids)
```
### Nested Enum
```csharp
public enum Fields
{
SerialNumber, HardwareType, IPAddress, ChannelCount, Firmware,
MaxSampleRate, TestSampleRate, CalDate, CalDueDate,
IsClockMaster, FirstUseDate, PTPDomainID
}
```
Used for field-specific filtering.
### Event
```csharp
public event PropertyChangedEventHandler PropertyChanged
public void OnPropertyChanged(string propertyName)
```
Standard `INotifyPropertyChanged` implementation.
---
## 3. Invariants
1. **Selection Synchronization**: `SelectedHardwareItems` collection changes trigger `FireSelectionChanged()`, which publishes `HardwareListHardwareSelectedEvent` with serial numbers, unless `SelectedItemsStatus.GetUpdating()` returns true.
2. **Parent-Child Hardware Aggregation**: In `GetHardware()`, child module properties (channel counts, calibration dates, max sample rates) are aggregated to parent DAS devices. Parent `MaxSampleRate` takes the minimum of children; parent `CalDate`/`CalDueDate` takes the earliest date.
3. **Duplicate Prevention**: `GetHardware()` uses a `HashSet<string>` (`processed`) to prevent double-counting hardware by serial number during aggregation.
4. **Mixed Rate Detection**: When a child's sample rate differs from siblings with the same `ParentDAS`, the parent's `MixedRates` property is set to `true`.
5. **Overdue Hardware Separation**: Hardware with `CalDueDate <= DateTime.Today` is always added to `OverdueHardware` array regardless of other filters.
6. **Sort State Consistency**: `_sortField` and `_sortAscending` track current sort state; clicking the same column toggles direction.
---
## 4. Dependencies
### Imports (This Module Depends On)
- `DTS.Common.Classes.Hardware` - Hardware data classes
- `DTS.Common.Enums.Hardware` - Hardware type enumerations
- `DTS.Common.Events` / `DTS.Common.Events.Hardware.HardwareList` - Event definitions
- `DTS.Common.Interface.DASFactory.Diagnostics.HardwareList` - Diagnostic interfaces
- `DTS.Common.Interface.DASFactory.Diagnostics` - DAS factory interfaces
- `DTS.Common.Interface.TestSetups.TestSetupsList` - Test setup interfaces
- `DTS.Common.Enums` / `DTS.Common.Enums.DASFactory` - Enumerations
- `DTS.Common.Utilities.Logging` - `APILogger` for logging
- `DTS.Common.Classes.DSP` - DSP-related classes
- `DTS.Common.Interactivity` - `InteractionRequest`, `Notification`, `Confirmation`
- `DTS.Common.ISO.Hardware` - ISO hardware interfaces (referenced via `IISOHardware`)
- `HardareList.Model` - Note: namespace appears to have a typo (missing 'w')
- `Unity` - IoC container
- `Prism.Regions` / `Prism.Events` - Prism framework
### Published Events (Consumed By Others)
- `HardwareListEditHardwareEvent`
- `HardwareListHardwareTestAAFilterRateEvent`
- `HardwareListHardwareTestSampleRateEvent`
- `HardwareListHardwareTestClockMasterEvent`
- `HardwareListHardwareIncludedEvent`
- `HardwareListHardwareSelectedEvent`
- `HardwareListHardwareTestPTPDomainIDEvent`
- `HardwareReplaceEvent`
- `HardwareListShowCompactEvent`
- `ListViewStatusEvent`
- `PageErrorEvent`
### Subscribed Events
- `RaiseNotification`
- `BusyIndicatorChangeNotification`
---
## 5. Gotchas
1. **Incomplete `SetCache` Implementation**: The method `SetCache(IISOHardware[] hardware)` only clears `_cachedHardware` but never populates it with the passed parameter. This appears to be incomplete functionality.
2. **Namespace Typo**: The namespace `HardareList.Model` is imported (missing 'w' in "Hardware"), suggesting a historical naming inconsistency.
3. **`IsDirty` Never Set**: The `IsDirty` property is declared with a private setter but is never assigned `true` anywhere in the class. Its purpose is unclear from the source.
4. **Empty Lifecycle Methods**: `Initialize()`, `Initialize(object)`, `Initialize(object, object)`, `InitializeAsync()`, `InitializeAsync(object)`, `Activated()`, `Cleanup()`, and `CleanupAsync()` all have empty or `Task.CompletedTask` implementations, suggesting either interface compliance or placeholder code.
5. **ReSharper Suppressions**: The file includes `// ReSharper disable` directives for `CheckNamespace`, `MemberCanBePrivate.Global`, and `InconsistentNaming`, indicating intentional deviations from standard conventions.
6. **TSRAIR Special Handling**: `GetAvailableSampleRates()` applies different valid sample rates (`DFConstantsAndEnums.TSRAIR_ValidSampleRates`) for TSRAIR hardware, and `SetTestSampleRates()` skips the "next highest rate" fallback for TSRAIR.
7. **AAF Rate Fallback Behavior**: In `SetTestAAFRates()`, if a serial number is missing from the dictionary, the code logs a warning, calculates a default AAF rate, and shows a user notification—but only on the first occurrence (`shown` flag).
8. **Module Visibility Logic**: In `Filter(string term)`, when `ShowCompact` is true, modules with a non-empty `ParentDAS` are excluded from the main list but still added to `OverdueHardware` if calibration is overdue.