Files
DP44/enriched-qwen3-coder-next/DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/SensorDB.md

316 lines
14 KiB
Markdown
Raw Normal View History

2026-04-17 14:55:32 -04:00
---
source_files:
- DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/SensorDB/SensorRange.cs
- DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/SensorDB/SensorDB.cs
- DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/SensorDB/DigitalInputSetting.cs
- DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/SensorDB/ZeroMethod.cs
- DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/SensorDB/DigitalOutputSetting.cs
- DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/SensorDB/FilterClass.cs
- DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/SensorDB/SquibSetting.cs
- DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/SensorDB/IsoCode.cs
- DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/SensorDB/CalibrationRecords.cs
- DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/SensorDB/SensorsCollection.cs
generated_at: "2026-04-16T04:58:51.573580+00:00"
model: "Qwen/Qwen3-Coder-Next-FP8"
schema_version: 1
sha256: "56b13794f7fbf4fa"
---
# Documentation: `DatabaseExport` Sensor Data Types (Version 57)
---
## 1. Purpose
This module defines data structures and types used to represent sensor configurations, calibration metadata, and related settings for legacy database version 57 in the DataPRO system. It provides strongly-typed classes to deserialize sensor and channel configuration data from database rows (`System.Data.DataRow`) and serialize them for persistence or exchange. These types serve as an abstraction layer between the raw database schema and higher-level application logic, enabling consistent handling of sensor metadata, digital I/O settings, calibration records, and ISO location codes across the system.
---
## 2. Public Interface
### `SensorRange`
- **Namespace**: `DatabaseExport`
- **Fields**:
- `double Low { get; set; }`
- `double Medium { get; set; }`
- `double High { get; set; }`
- **Constructor**: `SensorRange(double _low, double _medium, double _high)`
Initializes all three range values.
### `LowHigh`
- **Namespace**: `DatabaseExport`
- **Fields**:
- `double Low { get; set; }`
- `double High { get; set; }`
- **Constructor**: `LowHigh(double _low, double _high)`
Initializes low and high bounds.
### `SensorStatus`
- **Namespace**: `DatabaseExport`
- **Enum Values**:
- `Available`
- `InUse`
- `OutForService`
- `OutForCalibration`
- `Retired`
### `ShuntMode`
- **Namespace**: `DatabaseExport`
- **Enum Values**:
- `None`
- `Emulation`
- `Internal`
- `External`
### `BridgeLeg`
- **Namespace**: `DatabaseExport`
- **Enum Values**:
- `First`
- `Second`
- `Third`
- `Fourth`
### `CouplingModes`
- **Namespace**: `DatabaseExport`
- **Enum Values**:
- `AC = 0`
- `DC`
### `DigitalInputSetting`
- **Namespace**: `DatabaseExport`
- **Inherits**: `SensorData`
- **Constructors**:
- `DigitalInputSetting()`
Initializes with defaults via `SetDefaults`.
- `DigitalInputSetting(DigitalInputSetting copy)`
Copy constructor; initializes with defaults after copying.
- **Static Method**:
- `static void SetDefaults(SensorData sd)`
Sets default values for a `SensorData` instance:
- `AxisNumber = 0`
- `NumberOfAxes = 1`
- `Capacity = 1` (overwrites earlier `2400`)
- `Bridge = Test.Module.Channel.Sensor.BridgeType.DigitalInput`
- `DisplayUnit = "V"`
- `BridgeResistance = double.NaN`
- `CheckOffset = false`
- `Manufacturer = "Generic"`
- `OffsetToleranceHigh = 2500`
- `OffsetToleranceLow = 2500`
- `Model = "Digital Input Setting"`
- `Shunt = ShuntMode.None`
- `MeasureExcitation = false`
- `MeasureNoise = false`
### `ZeroMethod`
- **Namespace**: `DatabaseExport`
- **Fields**:
- `Test.Module.Channel.Sensor.ZeroMethodType Method { get; set; }`
- `double Start { get; set; }`
- `double End { get; set; }`
- **Constructors**:
- `ZeroMethod(Test.Module.Channel.Sensor.ZeroMethodType zm, double _start, double _end)`
- `ZeroMethod(string zm)`
Parses a comma-separated string: `"MethodName,start,end"`; throws no exception on failure—silently returns uninitialized if tokens < 3.
- `ZeroMethod(ZeroMethod copy)`
Deep copy.
- **Methods**:
- `string ToDbString()`
Returns `"Method,start,end"` using default formatting.
- `string ToSerializeString()`
Returns `"Method,start,end"` using `InvariantCulture` for numbers.
### `DigitalOutputSetting`
- **Namespace**: `DatabaseExport`
- **Inherits**: `SensorData`
- **Properties**:
- `string ChannelDescription { get; set; }`
Getter returns `SerialNumber`; setter updates `SerialNumber` and raises `OnPropertyChanged("ChannelDescription")`.
- **Constructors**:
- `DigitalOutputSetting()`
Initializes with defaults via `SetDefaults`.
- `DigitalOutputSetting(System.Data.DataRow dr)`
Populates instance from database row. Supports fields from `DbOperations.DigitalOutputSettings.Fields`:
- `Version`, `OutputMode`, `LocalOnly`, `LimitDuration`, `LastModifiedBy`, `LastModified`, `DurationMSFloat`, `DelayMS`, `ChannelDescription`, `UserTags`
- `DurationMS` is ignored (marked obsolete).
- **Static Method**:
- `static void SetDefaults(SensorData sd)`
Sets defaults:
- `SupportedExcitation = [Volt5]`
- `Bridge = Test.Module.Channel.Sensor.BridgeType.TOMDigital`
- `AxisNumber = 0`, `NumberOfAxes = 1`
- `Capacity = 1`
- `DisplayUnit = "V"`
- `BridgeResistance = double.NaN`
- `CheckOffset = false`
- `Manufacturer = "Generic"`
- `OffsetToleranceHigh = 2500`
- `OffsetToleranceLow = 2500`
- `Model = "Digital Output Setting"`
- `Shunt = ShuntMode.None`
- `MeasureExcitation = false`
- `MeasureNoise = false`
### `FilterClass`
- **Namespace**: `DatabaseExport`
- **Nested Enum**: `FilterClassType`
- `None = 0`
- `AdHoc = -1`
- `CFC10 = 17`
- `CFC60 = 100`
- `CFC180 = 300`
- `CFC600 = 1000`
- `CFC1000 = 1650`
- **Fields**:
- `FilterClassType FClass { get; set; }`
- `double Frequency { get; set; }`
- **Constructors**:
- `FilterClass(FilterClassType fc)`
Initializes `FClass` and `Frequency` (e.g., `CFC60``Frequency = 100.0`). Throws on unknown type.
- `FilterClass(string fclass)`
Parses string (e.g., `"100"`, `"CFC60"`, `"123.45"`). Maps known numeric codes to enum values; falls back to `AdHoc` with parsed frequency.
- **Methods**:
- `override string ToString()`
Returns `"None"`, `"17 (CFC10)"`, etc., or numeric string for `AdHoc`.
### `SquibSetting`
- **Namespace**: `DatabaseExport`
- **Inherits**: `SensorData`
- **Properties**:
- `string SquibDescription { get; set; }`
Getter returns `SerialNumber`; setter updates `SerialNumber` and raises `OnPropertyChanged("SquibDescription")`.
- `bool BypassCurrentFilter { get; set; }`
- `bool BypassVoltageFilter { get; set; }`
- `string ArticleId { get; set; }`
Getter returns `Id`; setter updates `Id` and raises `OnPropertyChanged("ArticleId")`.
- **Constructors**:
- `SquibSetting(System.Data.DataRow dr)`
Populates from `tblTOMSquibChannels`. Supports fields from `DbOperations.Squib.Fields`:
- `Version`, `SquibToleranceLow`, `SquibToleranceHigh`, `SquibOutputCurrent`, `SquibDescription`, `MeasurementType`, `LocalOnly`, `LimitDuration`, `LastModifiedBy`, `LastModified`, `ISOCode`, `FireMode`, `DurationMS`, `DelayMS`, `BypassVoltageFilter`, `BypassCurrentFilter`, `ArticleId`, `UserValue1`, `UserValue2`, `UserValue3`, `UserTags`
- **Static Method**:
- `static void SetDefaults(SensorData sd)`
Sets defaults:
- `AxisNumber = 0`, `Capacity = 5`, `NumberOfAxes = 1`
- `Manufacturer = "Generic"`, `Model = "Squib Setting"`
- `Shunt = ShuntMode.None`
- `CheckOffset = false`
- `BridgeResistance = -1`
- `MeasureNoise = false`, `MeasureExcitation = false`
- `Bridge = Test.Module.Channel.Sensor.BridgeType.SQUIB`
- `SupportedExcitation = [Volt5]`
- `DisplayUnit = "V"`
- `Comment = SerialNumber` (if `UserValue1` is empty/whitespace)
### `IsoCode`
- **Namespace**: `DatabaseExport`
- **Fields**:
- `string TestObject { get; set; }` (1 char, index 0)
- `string Position { get; set; }` (1 char, index 1)
- `string MainLocation { get; set; }` (4 chars, indices 25)
- `string FineLocation1 { get; set; }` (2 chars, indices 67)
- `string FineLocation2 { get; set; }` (2 chars, indices 89)
- `string FineLocation3 { get; set; }` (2 chars, indices 1011)
- `string PhysicalDimension { get; set; }` (2 chars, indices 1213)
- `string Direction { get; set; }` (1 char, index 14)
- `string FilterClass { get; set; }` (1 char, index 15)
- **Constructors**:
- `IsoCode(string isoCode)`
Normalizes input to 16 chars: truncates if >16, pads with `'?'` if <16.
- **Properties**:
- `string StringRepresentation { get; set; }`
Getter returns full 16-char string; setter normalizes to 16 chars (truncates/pads with `'0'` if shorter).
### `CalibrationRecords`
- **Namespace**: `DatabaseExport`
- **Fields**:
- `CalibrationRecord[] Records { get; set; }`
- **Constructors**:
- `CalibrationRecords()`
Initializes with one default `CalibrationRecord`.
- `CalibrationRecords(CalibrationRecords copy)`
Deep copy of `Records`.
- `CalibrationRecords(string records)`
Parses serialized string via `FromSerializedString`.
- **Methods**:
- `void FromSerializedString(string s)`
Splits on `"__x__"` (with fallback `"___xx___"`), constructs `CalibrationRecord`s.
- `string ToSerializedString(SensorCalibration sc)`
Serializes each `CalibrationRecord`, escapes `"__x__"``"___xx___"`.
### `CalibrationRecord`
- **Namespace**: `DatabaseExport`
- **Fields**:
- `double Sensitivity { get; set; }`
- `double ZeroPoint { get; set; }`
Computed from `Poly.ZeroPositionIntercept / Poly.CalibrationFactor` if `Poly.CalibrationFactor ≠ 0`; else returns stored `_zeroPoint`.
- `LinearizationFormula Poly { get; set; }`
- `bool AtCapacity { get; set; } = false`
- `string EngineeringUnits { get; set; } = "g"`
- `Test.Module.Channel.Sensor.SensUnits SensitivityUnits { get; set; } = NONE`
- `Test.Module.Channel.Sensor.ExcitationVoltageOption Excitation { get; set; } = Volt5`
- `int CapacityOutputIsBasedOn { get; set; } = 1`
- **Constructors**:
- `CalibrationRecord()`
Initializes `Poly = new LinearizationFormula()`.
- `CalibrationRecord(string s)`
Parses via `FromString`.
- `CalibrationRecord(CalibrationRecord copy)`
Deep copy.
- **Methods**:
- `string ToSerializedString(SensorCalibration parentCal)`
Serializes fields (including `Poly`) with escaping of list separators.
- `void FromString(string s)`
Parses serialized string.
---
## 3. Invariants
- **`SensorRange`**: No explicit validation; `Low`, `Medium`, `High` may be any `double`.
- **`ZeroMethod`**: Parsing from string silently fails if fewer than 3 comma-separated tokens; no exception thrown.
- **`FilterClass`**: Constructor from `FilterClassType` throws `System.Exception` for unknown types. Constructor from string may assign `AdHoc` with arbitrary frequency.
- **`IsoCode`**: All 16 positions are always populated; missing/short inputs are padded with `'?'`, excess truncated. Setter for `StringRepresentation` pads with `'0'` (not `'?'`) if shorter than 16.
- **`CalibrationRecord.ZeroPoint`**: Computed value takes precedence over stored `_zeroPoint` if `Poly.CalibrationFactor ≠ 0`.
- **`SensorsCollection`**:
- Singleton via `SensorsList` (thread-safe via `lock`).
- `GetSensorBySerialNumber` excludes sensors with `Broken = true`, `DoNotUse = true`, or `NumberOfAxes > 1` or `AxisNumber > 0`.
- `AllSensorsDb` excludes multi-axis sensors but *not* `Broken`/`DoNotUse`.
- Sensors loaded from `tblSensors`, `tblDigitalInputSetting`, `tblTOMSquibChannels`, `tblTOMDigitalChannels` into a single `_sensorDictionary`.
---
## 4. Dependencies
### Internal Dependencies (Inferred from Source)
- **`Test.Module.Channel.Sensor` namespace**:
- Types used: `ZeroMethodType`, `BridgeType`, `ExcitationVoltageOption`, `SensUnits`
- **`DbOperations` namespace**:
- Nested types: `DigitalOutputSettings.Fields`, `Squib.Fields`, `DigitalInputSettings.Fields`
- Methods: `GetCommand()`, `Connection.QueryDataSet(...)`
- **`SensorData` base class**: Used by `DigitalInputSetting`, `DigitalOutputSetting`, `SquibSetting`. Not provided in source, but assumed to define common properties like `SerialNumber`, `Id`, `Version`, `LastModified`, `TagsBlobBytes`, `Broken`, `DoNotUse`, `UserValue1`, etc.
- **`LinearizationFormula`**: Referenced by `CalibrationRecord`. Not provided in source.
### External Dependencies
- `System` (core types: `Enum`, `Convert`, `StringBuilder`, `CultureInfo`)
- `System.Data` (`DataRow`, `DataSet`, `DBNull`)
- `System.Collections.Generic`
### What Depends on This Module?
- `SensorsCollection.SensorsList` is used to load and cache all sensor configurations at runtime.
- `DigitalInputSetting`, `DigitalOutputSetting`, `SquibSetting` are instantiated from database rows during initialization.
- `CalibrationRecords` and `CalibrationRecord` are used to serialize/deserialize calibration metadata.
---
## 5. Gotchas
- **`DigitalInputSetting.SetDefaults` sets `Capacity = 2400` then immediately overwrites to `1`** — likely a typo or legacy artifact.
- **`ZeroMethod` constructor from string silently ignores malformed input** — no exception, no logging; returns partially initialized object.
- **`IsoCode.StringRepresentation` setter pads with `'0'`, but constructor/partial setters pad with `'?'`** — inconsistent default padding.
- **`CalibrationRecord.ZeroPoint` is computed only when `Poly.CalibrationFactor ≠ 0`** — stored `_zeroPoint` may be stale if `Poly` changes.
- **`SensorsCollection.GetSensorBySerialNumber` returns `null` for multi-axis sensors** — even if valid — due to legacy restriction "Disable 6-axis sensor capability".
- **`FilterClass` constructor from string may assign `AdHoc` for unrecognized values** — no validation that frequency is positive or meaningful.
- **`DigitalOutputSetting` copy constructor is commented out** — no deep copy support for this type.
- **`CalibrationRecords` uses custom separators (`"__x__"` and `"___xx___"`)** — risk of collision if data contains these strings; escaping is manual and error-prone.
- **`SensorData` is not defined in provided sources** — behavior of inherited properties (e.g., `Id`, `SerialNumber`, `TagsBlobBytes`) must be inferred from usage.
- **`SquibSetting.Comment` defaults to `SerialNumber` if `UserValue1` is empty**, but `UserValue1` is set from DB row — potential for unintended override.