--- source_files: - DataPRO/Modules/Hardware/AddEditHardware/Model/DASModule.cs generated_at: "2026-04-16T04:37:06.260294+00:00" model: "Qwen/Qwen3-Coder-Next-FP8" schema_version: 1 sha256: "05acdd30203849a0" --- # Model ## Documentation: `DASModule.cs` --- ### 1. **Purpose** The `DASModule` class models a hardware module in a Data Acquisition System (DAS) for use in a WPF-based UI for adding or editing hardware configurations. It encapsulates module-specific metadata—including type, bridge configuration (for SLICE modules), serial number, and associated visual representation—and exposes this data through a property-changed-aware model suitable for data binding. It serves as a view-model-like abstraction for hardware modules in the `AddEditHardware` workflow, implementing `IAddEditHardwareDASModule` and inheriting from `BasePropertyChanged` to support UI updates via `INotifyPropertyChanged`. --- ### 2. **Public Interface** #### `public bool Disabled { get; set; } = false;` - Indicates whether this module instance is disabled (e.g., not in use). Default is `false`. #### `public SLICEBridgeTypes SLICEBridgeType { get; set; }` - Gets or sets the bridge type for SLICE modules (e.g., `Bridge`, `IEPE`, `ARS`, `ACC`). - **Behavior**: On change, triggers `SetProperty`, then calls `SetImage()` to update the image based on the new type. #### `public HardwareTypes ModuleType { get; set; }` - Gets or sets the high-level hardware type (e.g., `SLICE_Bridge`, `TOM`, `SIM`, `DIM`, `UNDEFINED`). - **Behavior**: On change, triggers `SetProperty`, then calls `SetImage()`. #### `public string SerialNumber { get; set; }` - Gets or sets the module’s serial number (empty string by default). No validation or prefix enforcement is performed in this property. #### `public ImageSource DASImage { get; set; }` - Gets or sets the `ImageSource` used to display the module’s image in the UI. - **Behavior**: Set via `SetImage()` based on `ModuleType` and (for `SLICE_Bridge`) `SLICEBridgeType`. May be `null` if image loading fails or no matching asset is found. #### `public SLICEBridgeTypes[] AvailableNanoBridges { get; }` - Returns a read-only array of valid `SLICEBridgeTypes` for *nano*-form-factor SLICE modules: `SLICEBridgeTypes.Bridge`, `SLICEBridgeTypes.IEPE`. #### `public SLICEBridgeTypes[] AvailableMicroBridges { get; }` - Returns a read-only array of valid `SLICEBridgeTypes` for *micro*-form-factor SLICE modules: `SLICEBridgeTypes.Bridge`, `SLICEBridgeTypes.IEPE`, `SLICEBridgeTypes.ARS`, `SLICEBridgeTypes.ACC`. #### `public HardwareTypes[] AvailableRACKModules { get; }` - Returns a read-only array of valid hardware types for rack-mounted modules: `HardwareTypes.UNDEFINED`, `HardwareTypes.SIM`, `HardwareTypes.TOM`, `HardwareTypes.DIM`. #### `public IAddEditHardwareHardware OwningHardware { get; set; }` - Reference to the parent hardware object (e.g., chassis or device) that owns this module. Used for contextual navigation or validation. #### `public string GetSerialNumberPrefix()` - Returns a short string prefix used for generating or validating serial numbers based on module type: - `"DIM"` for `HardwareTypes.DIM` - `"SIM"` for `HardwareTypes.SIM` - `"TOM"` for `HardwareTypes.TOM` - For `HardwareTypes.SLICE_Bridge`, returns a 2-letter prefix based on `SLICEBridgeType`: - `"AC"` for `ACC` - `"AR"` for `ARS` - `"BR"` for `Bridge` - `"IEPE"` for `IEPE` - Returns `string.Empty` for `UNDEFINED` or unrecognized types. #### `public DASModule()` - Default constructor. Initializes `Disabled = false`, `_sliceBridgeType = Bridge`, `_moduleType = UNDEFINED`. --- ### 3. **Invariants** - **Image Consistency**: `DASImage` is always derived from `ModuleType` and (if applicable) `SLICEBridgeType`. Changing either triggers `SetImage()` and updates `DASImage`. - **Image Source URI**: All image paths are relative to the pack URI `pack://application:,,,/ResourceFile.xaml`. - **Image Loading Failure Handling**: If image loading fails (e.g., missing file), `DASImage` is set to `null`, and an error is logged via `APILogger`. - **Image Freezing**: Loaded `BitmapImage` instances are frozen for thread-safety and performance. - **Module Type Constraints**: - `SLICEBridgeType` is only meaningful when `ModuleType == HardwareTypes.SLICE_Bridge`. - `AvailableNanoBridges` and `AvailableMicroBridges` are static and immutable; they define allowed values but are not enforced by property setters. - **Serial Number Prefix**: - `GetSerialNumberPrefix()` returns `string.Empty` for unrecognized or `UNDEFINED` module types. --- ### 4. **Dependencies** #### **Imports/Usings** - `System`, `System.Windows`, `System.Windows.Input`, `System.Windows.Media`, `System.Windows.Media.Imaging` - `DTS.Common.Base` → `BasePropertyChanged` - `DTS.Common.Enums.Hardware` → `SLICEBridgeTypes`, `HardwareTypes` - `DTS.Common.Interface.Hardware.AddEditHardware` → `IAddEditHardwareDASModule`, `IAddEditHardwareHardware` - `DTS.Common.Utilities.Logging` → `APILogger` #### **External Dependencies** - **WPF**: Uses `ImageSource`, `BitmapImage`, `Uri`, `pack://` URIs. - **Common Libraries**: - `DTS.Common.Base` for `BasePropertyChanged` (likely implements `INotifyPropertyChanged`). - `DTS.Common.Enums.Hardware` for type definitions. - `DTS.Common.Interface.Hardware.AddEditHardware` for interface contracts. - `DTS.Common.Utilities.Logging` for error logging. #### **Consumers** - UI components bound to `DASModule` (e.g., `DataGrid`, `UserControl`) for editing hardware configurations. - Any class implementing or consuming `IAddEditHardwareDASModule`. - Likely instantiated and managed by a parent `IAddEditHardwareHardware` (via `OwningHardware`). --- ### 5. **Gotchas** - **No Validation on `ModuleType`/`SLICEBridgeType` Combinations**: The class allows setting `ModuleType = SLICE_Bridge` and `SLICEBridgeType = ACC`, but also allows `ModuleType = TOM` with `SLICEBridgeType = IEPE`, which is semantically invalid. Validation (if any) must occur elsewhere (e.g., in UI or service layer). - **`Disabled` Property Has No Side Effects**: Setting `Disabled = true` does not affect image loading, serial number generation, or any other logic in this class. - **Image Paths Are Hardcoded and Fragile**: `SetImage()` uses hardcoded relative paths (e.g., `@"Assets/Hardware/SLICEIEPE_Side.png"`). If assets are renamed or moved, image loading silently fails (logs error, sets `DASImage = null`). - **`GetSerialNumberPrefix()` Returns `"IEPE"` (4 chars) While Others Are 2–3 chars**: Inconsistent prefix length may cause downstream parsing issues if consumers assume fixed-width prefixes. - **No Null/Empty Handling for `SerialNumber`**: The property accepts any string, including `null` or whitespace. No validation or trimming is applied. - **`OwningHardware` Is Not Initialized**: The property is nullable and must be set externally; no constructor overloads or defaults are provided. - **`_baseUri` Is Static and Fixed**: Assumes all images are in the same resource file (`ResourceFile.xaml`). Not configurable at runtime. - **Exception Handling in `SetImage()` Is Broad**: Catches all exceptions during image loading but logs only the message (no stack trace or context), making debugging harder. - **No Explicit Interface Implementation**: The class implements `IAddEditHardwareDASModule` implicitly; if the interface defines additional members, they are not visible in this file. - **None identified from source alone.** *(Note: The above are inferred from observed behavior, not documented quirks.)*