--- source_files: - DataPRO/IService/Classes/Arm/ArmCheckActions.cs - DataPRO/IService/Classes/Arm/ArmCheckResults.cs - DataPRO/IService/Classes/Arm/ArmStatus.cs generated_at: "2026-04-16T03:59:53.800390+00:00" model: "Qwen/Qwen3-Coder-Next-FP8" schema_version: 1 sha256: "51c3cf5ed1e74c4d" --- # Arm ## Documentation: ARM Status and Pre-Arm Checks Module --- ### 1. Purpose This module provides data structures and utilities for managing the **ARM state** of a Data Acquisition System (DAS) unit and for configuring/collecting **pre-arm diagnostic checks**. It enables the system to track real-time operational status (e.g., armed, triggered, faulted, recording) via `ArmStatus`, and to define and store results of diagnostic checks (e.g., battery voltage, sensor IDs, squib resistance) via `ArmCheckActions` and `ArmCheckResults`. It serves as the core data layer for the `ArmingService`, supporting safe arming workflows and post-test diagnostics. --- ### 2. Public Interface #### `ArmCheckActions` - **`bool PerformBatteryVoltageCheck { get; set; }`** Flag indicating whether to perform a battery voltage diagnostic check. - **`bool PerformInputVoltageCheck { get; set; }`** Flag indicating whether to perform an input voltage diagnostic check. - **`bool PerformSensorIdCheck { get; set; }`** Flag indicating whether to verify sensor EIDs. - **`bool PerformEventLineCheck { get; set; }`** Flag indicating whether to check for shorts on the event line. - **`bool PerformSquibResistanceCheck { get; set; }`** Flag indicating whether to measure squib resistance. - **`bool PerformTiltSensorCheck { get; set; }`** Flag indicating whether to perform tilt sensor diagnostics. - **`bool PerformTemperatureCheck { get; set; }`** Flag indicating whether to perform temperature diagnostics. - **`bool PerformClockSyncCheck { get; set; }`** Flag indicating whether to verify clock synchronization status. - **`ArmCheckActions()`** Constructor initializes all check flags to `false`. #### `ArmCheckResults` - **`Dictionary SensorIds { get; set; }`** Maps channel index (int) to an array of sensor EIDs (strings) read from that channel. - **`Dictionary SquibResistances { get; set; }`** Maps channel index (int) to measured squib resistance (Ω). - **`double?[] BatteryVoltage { get; set; }`** Array of optional battery voltage readings (mV), supporting multiple batteries per module (e.g., TDAS Pro rack). - **`double? InputVoltage { get; set; }`** Optional input voltage reading (mV). - **`bool? StartLineShorted { get; set; }`** Optional result indicating if the start line is shorted. - **`bool? EventLineShorted { get; set; }`** Optional result indicating if the event line is shorted. - **`short[] TiltSensorDataPre { get; set; }`** Raw pre-check tilt sensor ADC values. - **`double[] TiltDegrees { get; set; }`** Tilt angles (degrees) computed from `TiltSensorDataPre`. - **`Dictionary IndexedTiltSensorDataPre { get; set; } = new Dictionary();`** Indexed raw tilt data (key = device/module index). - **`Dictionary IndexedTiltDegrees { get; set; } = new Dictionary();`** Indexed tilt angles (key = device/module index). - **`float[] TemperaturesPre { get; set; }`** Raw temperature sensor readings (likely ADC counts or mV). - **`double[] Gains { get; set; }`** Channel gains used during diagnostics. - **`double[] ZeroData { get; set; }`** Zero-offset calibration data. - **`IDictionary InputClockLocks { get; set; }`** Maps clock source type (`InputClockSource`) to lock status (`true` = locked). #### `ArmStatus` - **`bool ReceivedInvalidModeDuringSetup { get; set; } = false;`** Indicates if `InvalidMode` error was received during setup; used as a heuristic to detect streaming mode. - **`void ClearTriggerCheckStatus()`** Resets trigger-related flags: `IsTriggered`, `IsArmed`, `IsRecording`, `IsTriggerShorted`, `IsStartShorted`. - **`ArmStatus()`** Default constructor. - **`ArmStatus(IArmStatusData status)`** Copy constructor from `IArmStatusData` interface; copies all properties. - **`bool IsArmed { get; set; }`** True if DAS is currently armed. - **`bool IsTriggered { get; set; }`** True if DAS has sensed a trigger event. - **`bool IsTriggerShorted { get; set; }`** True if trigger line is shorted *during trigger check only*. - **`bool IsStartShorted { get; set; }`** True if start line is shorted *during trigger check only*. - **`bool IsRecording { get; set; }`** True if DAS is currently recording samples. - **`bool IsFaulted { get; set; }`** True if DAS has faulted. - **`bool IsInRealtime { get; set; }`** True if DAS is in real-time mode. - **`bool IsInFlashWrite { get; set; }`** True if DAS is in flash write mode (G5). - **`bool IsUndefined { get; set; }`** True if `ARM STAT READ` returned no data. - **`bool IsInPostTestDiagnostics { get; set; }`** True if DAS is running post-test diagnostics. - **`double TimeRemainingSeconds { get; set; }`** Estimated seconds remaining in recording. - **`double PercentComplete { get; set; }`** Flash write progress percentage. - **`ulong TotalSamples { get; set; }`** Total samples to be recorded in the test. - **`ulong CurrentSample { get; set; }`** Current sample index being recorded. - **`uint SampleRate { get; set; }`** Current sample rate (Hz). - **`double? InputMilliVolts { get; set; }`** Input voltage (mV); auto-converts values > 100,000 from µV to mV. - **`double? BatteryMilliVolts { get; set; }`** Battery voltage (mV); auto-converts values > 100,000 from µV to mV. - **`int? EventNumber { get; set; }`** Current event number being recorded. - **`ushort? MaxEventsPossible { get; set; }`** Maximum number of events supported by the device (per issue #26817). - **`int RecordingMode { get; set; }`** Numeric recording mode identifier. - **`string FaultMessage { get; set; }`** Human-readable fault description (if any). - **`bool IsRearming { get; set; }`** True if DAS is in rearming state. - **`bool HasBeenRecording { get; set; }`** True if DAS has ever recorded during the current session. - **`double? TimeLeftInArm { get; set; }`** Time remaining in armed state (seconds). - **`static void SetArmStatus(IDASCommunication unit, IArmStatusData status, bool bSetInDb)`** Assigns `status` to `unit.DASArmStatus`. If `bSetInDb` is true and DB is connected, persists status to `ARM.SetArmStatus` stored procedure; logs exceptions via `APILogger`. --- ### 3. Invariants - **`InputMilliVolts` and `BatteryMilliVolts`**: Values > 100,000 are *always* divided by 1,000 to convert from µV to mV. Null values remain null. - **`TimeLeftInArm`**: No conversion is applied—values are stored directly as `double`. - **`ClearTriggerCheckStatus()`**: Only resets trigger-related flags (`IsTriggered`, `IsArmed`, `IsRecording`, `IsTriggerShorted`, `IsStartShorted`). Does *not* affect `IsFaulted`, `IsRecording`, or other non-trigger flags. - **`ArmCheckActions`**: All check flags default to `false`; no validation ensures at least one check is enabled. - **`ArmCheckResults.SensorIds`**: Key is channel index (0-based), value is array of EIDs (strings) per channel. - **`ArmStatus.SetArmStatus(...)`**: Does *not* throw exceptions; failures in DB persistence are silently logged via `APILogger`. --- ### 4. Dependencies #### Imports/Usings - `DTS.Common.Interface.DASFactory.Diagnostics` → Provides `IArmCheckActions`, `IArmCheckResults`, `IArmStatusData`. - `DTS.Common.Interface.DASFactory` and `DTS.Common.Interface.DASFactory.ARM` → Provides `IDASCommunication`, `IArmStatusData`, `InputClockSource`. - `DTS.Common` → Provides logging utilities (e.g., `APILogger`). - `DASFactoryDb.ARM` → Provides `ARM.SetArmStatus(...)` stored procedure. - `System.Collections.Generic`, `System` → Standard .NET types. #### Dependencies *on* this module - `ArmingService.GetArmStatus(...)` (referenced in `ArmStatus` summary) — *not shown in source*, but implied to be the primary consumer of `ArmStatus`. - Any code performing pre-arm diagnostics — uses `ArmCheckActions` to configure checks and `ArmCheckResults` to store results. - Database layer — calls `ARM.SetArmStatus(...)` via `ArmStatus.SetArmStatus(...)`. #### Dependencies *of* this module - `DASFactoryDb.DbWrapper.Connected` — checked before DB writes. - `APILogger` — used for exception logging in `SetArmStatus`. --- ### 5. Gotchas - **`InputMilliVolts`/`BatteryMilliVolts` unit conversion**: Values > 100,000 are assumed to be in µV and converted to mV. If a value is legitimately > 100,000 mV (e.g., 120,000 mV = 120 V), it will be *incorrectly* divided to 120 mV. This is likely a legacy assumption for µV inputs. - **`IsTriggerShorted` vs `IsTriggered`**: `IsTriggerShorted` is *only* set during `TriggerCheck`, while `IsTriggered` is set in many contexts. Confusing the two may lead to incorrect logic (e.g., mistaking a trigger event for a line short). - **`ReceivedInvalidModeDuringSetup` heuristic**: Used to detect streaming mode, but this is not a guaranteed or documented protocol behavior—may break if firmware changes. - **`ArmCheckResults.SensorIds` key type**: Key is `int` (channel index), but no validation ensures keys are non-negative or contiguous. - **`IndexedTiltSensorDataPre`/`IndexedTiltDegrees`**: Key is `byte` (device/module index), but no documentation clarifies how indices are assigned or whether duplicates are possible. - **`SetArmStatus(...)` silently swallows DB errors**: Exceptions during DB persistence are logged but do *not* propagate—callers may assume persistence succeeded. - **`ArmStatus` copy constructor does not guard against null `status`**: While it returns early on null, it does *not* clear the current instance’s properties—only copies non-null values from `status`. - **No validation in `ArmCheckActions`**: It is possible to configure *no* checks (all flags `false`), which may lead to unsafe arming if not handled upstream. None identified beyond the above.