--- source_files: - DataPRO/SLICEDBCommands/CommandBase.cs - DataPRO/SLICEDBCommands/CommandPacket.cs - DataPRO/SLICEDBCommands/CalibrationCommands.cs - DataPRO/SLICEDBCommands/PowerCommands.cs - DataPRO/SLICEDBCommands/ArmCommands.cs - DataPRO/SLICEDBCommands/NetworkCommands.cs - DataPRO/SLICEDBCommands/InformationCommands.cs generated_at: "2026-04-16T03:47:13.107401+00:00" model: "Qwen/Qwen3-Coder-Next-FP8" schema_version: 1 sha256: "054bcdedfc9b5182" --- # SLICEDB Command Library Documentation ## 1. Purpose This module provides a structured command framework for interacting with the SLICE DB (Data Acquisition System Electronics) hardware device over a communication interface. It defines an extensible hierarchy of command classes—each representing a specific operation (e.g., querying voltage, setting IP address, arming the system)—that encapsulate protocol-specific details such as command type, sequence numbering, parameter encoding/decoding, and response parsing. The library enables type-safe, consistent, and testable command construction and execution within the DAS (Data Acquisition System) ecosystem. ## 2. Public Interface ### Core Base Classes #### `CommandBase` - **Namespace**: `DTS.DASLib.Command.SLICEDB` - **Inherits**: `SliceCommandBase` - **Constructors**: - `CommandBase(ICommunication sock)` Initializes a new command instance using the provided communication socket. - `CommandBase(ICommunication sock, int TimeoutMillisec)` Initializes with a custom timeout (in milliseconds). - **Protected Overrides**: - `GetCommandPacket()` → `CommandPacketBase` Returns a new empty `CommandPacket`. - `GetCommandPacket(byte[] buffer)` → `CommandPacketBase` Returns a `CommandPacket` initialized from raw bytes. #### `CommandPacket` - **Namespace**: `DTS.DASLib.Command.SLICEDB` - **Inherits**: `SliceCommandPacketBase` - **Nested Types**: - `CommandType` enum: `Reserved = 0x00`, `Diagnostics`, `GPIO`, `Information`, `Network`, `Power`, `Arm` - **Static Members**: - `GlobalSequenceNumber` (UInt16): Thread-safe global sequence counter. - `GlobalSequenceNumberLock` (object): Lock object for sequence number increment. - **Constructors**: - `CommandPacket()` Default constructor. - `CommandPacket(byte[] Bytes)` Constructor from raw byte buffer. - **Overrides**: - `GetNextSequenceNumber()` Atomically assigns the current `GlobalSequenceNumber` to `SequenceNumber`, then increments the global counter. - `ConvertByteToCommandType(byte b)` → `object` Casts the byte to a `CommandType` enum value. ### Command Category Abstractions (Abstract Classes) #### `DiagnosticsCommands` - **Namespace**: `DTS.DASLib.Command.SLICEDB` - **Inherits**: `CommandBase` - **Nested Enums**: - `Measurements`: `V1`, `BatteryVoltage`, `BatteryChargeCurrent`, `SliceBusCurrent`, `SliceBusVoltage` - `Commands`: `Reserved`, `QueryOffset = 0x01`, `SetOffset = 0x02`, `QueryMultiplier = 0x03`, `SetMultiplier = 0x04` - **Constructors**: - `DiagnosticsCommands(ICommunication sock)` - `DiagnosticsCommands(ICommunication sock, int TimeoutMillisec)` Sets `command.Type = CommandType.Diagnostics`. - **Note**: Concrete command classes (`QueryOffset`, `SetOffset`, etc.) are commented out in source. #### `PowerCommands` - **Namespace**: `DTS.DASLib.Command.SLICEDB` - **Inherits**: `CommandBase` - **Nested Enum**: - `Commands`: Includes query/set commands for voltages, currents, thresholds, delays, and overvoltage/overcurrent limits (e.g., `QueryV1VoltageMV = 0x01`, `SetSliceBusVoltageMV = 0x06`, `QueryBatteryChargeCurrentOvercurrentLimitMA = 0x17`, etc.) - **Abstract Members**: - `_Command` (Commands): Must be implemented by derived classes to specify the command. - **Constructors**: - `PowerCommands(ICommunication sock)` - `PowerCommands(ICommunication sock, int TimeoutMillisec)` Sets `command.Type = CommandType.Power`, and calls `command.SetCommand((byte)_Command, _Command.ToString())`. - **Overrides**: - `CommandToString(ref List> lines)` Appends `recorder.ConnectString` to first line. - `ResponseToString(ref List> lines)` Appends `recorder.ConnectString` to first line. #### Concrete Power Commands (Examples) - `QueryV1VoltageMV` - `_Command`: `Commands.QueryV1VoltageMV` - `V1VoltageMV` (uint): Input voltage (+V1 on P1) in millivolts. - `WholePackage()`: Parses response parameter 0 into `_val`. - `QueryBatteryVoltageMV` - `_Command`: `Commands.QueryBatteryVoltageMV` - `BatteryVoltageMV` (uint): Battery voltage (+BAT on J1) in millivolts. - Sets `MinimumProtocolVersion` via `sock.GetMinProto(...)`. - `QueryBatteryChargeCurrentMA` - `_Command`: `Commands.QueryBatteryChargeCurrentMA` - `BatteryChargeCurrentMA` (uint): Battery charge current in milliamps. - `QuerySliceBusInputCurrentMA` - `_Command`: `Commands.QuerySliceBusInputCurrentMA` - `SliceBusInputCurrentMA` (uint): Slice bus current in milliamps. - `QuerySliceBusVoltageMV` - `_Command`: `Commands.QuerySliceBusVoltageMV` - `SliceBusVoltageMV` (uint): Slice bus voltage in millivolts. - `SetSliceBusVoltageMV` - `_Command`: `Commands.SetSliceBusVoltageMV` - `SliceBusVoltageMV` (uint, get/set): Sets `command.Parameter` to 4-byte value. #### `ArmCommands` - **Namespace**: `DTS.DASLib.Command.SLICEDB` - **Inherits**: `CommandBase` - **Nested Enum**: - `Commands`: `arm_reserved`, `arm_arm = 0x01`, `arm_disarm = 0x02`, `arm_enablefaultchecking = 0x03`, `arm_disablefaultchecking = 0x04`, `arm_setinverttriggerpolarity = 0x05`, `arm_setinvertstartpolarity = 0x06`, `arm_setrecordingmode = 0x07`, `arm_setpretriggersec = 0x08`, `arm_setposttriggersec = 0x09`, `arm_setmaxevent = 0x0A`, `arm_setonoverride = 0x0B` - **Abstract Members**: - `_Command` (Commands): Must be implemented. - **Constructors**: - `ArmCommands(ICommunication sock)` - `ArmCommands(ICommunication sock, int TimeoutMillisec)` Sets `command.Type = CommandType.Arm`, and calls `command.SetCommand(...)`. - **Overrides**: - `CommandToString(ref List> list)` Appends `recorder.SerialNumber` to first line. #### Concrete Arm Commands (Examples) - `Arm` - `_Command`: `Commands.arm_arm` - Sets `MinimumProtocolVersion` via `sock.GetMinProto(ProtocolLimitedCommands.Arm)`. - `Disarm` - `_Command`: `Commands.arm_disarm` - Sets `MinimumProtocolVersion` via `sock.GetMinProto(ProtocolLimitedCommands.Arm)`. - `EnableFaultChecking` - `_Command`: `Commands.arm_enablefaultchecking` - Sets `MinimumProtocolVersion` via `sock.GetMinProto(ProtocolLimitedCommands.EnableFaultChecking)`. - `DisableFaultChecking` - `_Command`: `Commands.arm_disablefaultchecking` - Sets `MinimumProtocolVersion` via `sock.GetMinProto(ProtocolLimitedCommands.EnableFaultChecking)`. - `SetRecordingMode` - `_Command`: `Commands.arm_setrecordingmode` - `Value` (byte, get/set): Sets `command.Parameter` to 1-byte value. - `SetPostTriggerSec` - `_Command`: `Commands.arm_setposttriggersec` - `Value` (float, get/set): Sets `command.Parameter` to 4-byte float. - `SetONOverride` - `_Command`: `Commands.arm_setonoverride` - `Value` (bool, get/set): Converts to/from byte for `command.Parameter`. - `SetInvertTriggerPolarity`, `SetInvertStartPolarity` - Similar to `SetONOverride`, with `bool Value` property. #### `NetworkCommands` - **Namespace**: `DTS.DASLib.Command.SLICEDB` - **Inherits**: `CommandBase` - **Nested Enum**: - `Commands`: `Reserved`, `QueryIPAddress = 0x01`, `SetIPAddress = 0x02`, `QueryNetmask = 0x03`, `SetNetmask = 0x04`, `QueryDefaultRoute = 0x05`, `SetDefaultRoute = 0x06`, `QueryMACAddress = 0x07`, `SetMACAddress = 0x08` - **Abstract Members**: - `_Command` (Commands): Must be implemented. - **Constructors**: - `NetworkCommands(ICommunication sock)` - `NetworkCommands(ICommunication sock, int TimeoutMillisec)` Sets `command.Type = CommandType.Network`, and calls `command.SetCommand(...)`. - **Overrides**: - `CommandToString(ref List> list)` Appends `recorder.ConnectString` to first line. - `ResponseToString(ref List> lines)` Appends `recorder.ConnectString` to first line. #### Concrete Network Commands (Examples) - `QueryIPAddress`, `SetIPAddress` - `IPAddress` (string): Read-only for query, read/write for set. Set allocates `command.Parameter` as `new byte[value.Length + 1]`. - `QueryNetmask`, `SetNetmask` - `Netmask` (string): Same pattern as IP. - `QueryDefaultRoute`, `SetDefaultRoute` - `DefaultRoute` (string): Same pattern. - `QueryMACAddress`, `SetMACAddress` - `MACAddress` (string): Same pattern. #### `InformationCommands` - **Namespace**: `DTS.DASLib.Command.SLICEDB` - **Inherits**: `CommandBase` - **Nested Enum**: - `Commands`: `Reserved`, `QuerySerialNumber = 0x01`, `SetSerialNumber = 0x02`, `QueryFirmwareVersion = 0x03`, `QueryTime = 0x04`, `SetTime = 0x05`, `QueryDebugLevel = 0x06`, `SetDebugLevel = 0x07`, `QueryKernelVersion = 0x08`, `QueryMSPFirmwareVersion = 0x09`, `QueryProtocolVersion = 0x0A`, `QueryCalibrationDaysSince1970_01_01 = 0x0F`, `SetCalibrationDaysSince1970_01_01 = 0x10` - **Abstract Members**: - `_Command` (Commands): Must be implemented. - **Constructors**: - `InformationCommands(ICommunication sock)` - `InformationCommands(ICommunication sock, int TimeoutMillisec)` Sets `command.Type = CommandType.Information`, and calls `command.SetCommand(...)`. - **Overrides**: - `CommandToString(ref List> list)` Appends `recorder.SerialNumber` to first line. #### Concrete Information Commands (Examples) - `QuerySerialNumber`, `SetSerialNumber` - `SerialNumber` (string): Read-only for query, read/write for set. Set allocates `command.Parameter` as `new byte[value.Length + 1]`. - `QueryFirmwareVersion`, `QueryKernelVersion`, `QueryMSPFirmwareVersion` - `FirmwareVersion`, `KernelFirmwareVersion`, `MSPFirmwareVersion` (string): Read-only, parsed from response parameter 0. - `QueryTime`, `SetTime` - `CurrentTime` (DateTime): Query parses seconds/microseconds from parameters 0/4 into a `DateTime` (epoch-based). Set converts `DateTime` to seconds/microseconds and writes to `command.Parameter`. - `QueryProtocolVersion` - `ProtocolVersion` (byte): Read-only, parsed from parameter 0. - `QueryCalibrationDaysSince1970_01_01`, `SetCalibrationDaysSince1970_01_01` - `CalibrationDaysSince1970_01_01` (string): Read-only for query, read/write for set. Set allocates `command.Parameter` as `new byte[value.Length + 1]`. ## 3. Invariants - **Sequence Numbering**: Sequence numbers are globally unique and monotonically increasing across all command instances due to the `lock` around `GlobalSequenceNumber` in `GetNextSequenceNumber()`. - **Command Type Assignment**: All concrete command classes must set `command.Type` to the appropriate `CommandPacket.CommandType` (e.g., `Power`, `Arm`, `Network`) in their base constructor. - **Command Code Assignment**: All concrete command classes must call `command.SetCommand((byte)_Command, _Command.ToString())` in their base constructor. - **Parameter Encoding for Strings**: For commands accepting string parameters (e.g., `SetIPAddress`, `SetSerialNumber`), the parameter buffer is allocated as `new byte[value.Length + 1]` to accommodate a null terminator. - **Parameter Encoding for Numeric Types**: - `uint` parameters use `sizeof(uint)` (4 bytes). - `float` parameters use `sizeof(float)` (4 bytes). - `byte`/`bool` parameters use `sizeof(byte)` (1 byte). - **Protocol Version Handling**: Commands that require minimum protocol versions (e.g., `QueryBatteryVoltageMV`, `Arm`) set `MinimumProtocolVersion` via `sock.GetMinProto(...)` in their constructors. - **Response Parsing**: All `WholePackage()` overrides parse response parameters only when `response.Status == CommandStatus.StatusNoError`; otherwise, they initialize output fields to default values (e.g., `0`, `string.Empty`, `DateTime(1970,1,1)`). - **Thread Safety**: Sequence number generation is thread-safe via `lock (GlobalSequenceNumberLock)`. ## 4. Dependencies ### External Dependencies (from imports): - `System.*`: Core .NET libraries (`System`, `System.Collections.Generic`, `System.Text`, `System.Threading`, `System.Reflection`, `System.IO`, `System.Diagnostics`). - `DTS.Common.ICommunication`: Provides `ICommunication` interface. - `DTS.Common.Interface.DASFactory`: Provides `ICommunication` (redundant import) and `DASFactory` types. - `DTS.Common.Enums.DASFactory`: Provides `DFConstantsAndEnums.CommandStatus` and `DFConstantsAndEnums.ProtocolLimitedCommands`. ### Internal Dependencies: - Inherits from `SliceCommandBase` and `SliceCommandPacketBase` (not shown in source, but referenced). - Uses `recorder` object (inferred from `recorder.ConnectString`, `recorder.SerialNumber`), likely a property of the base class. - Uses `response` and `command` objects (inferred from base class and usage), likely properties of `SliceCommandBase`. ### Inferred Usage: - This module is used by higher-level components that construct and execute commands via `ICommunication`. - The `CommandBase` hierarchy is the primary public interface for command execution. ## 5. Gotchas - **Duplicate Class Name**: `SetCalibrationDaysSince1970_01_01` and `QueryCalibrationDaysSince1970_01_01` are defined twice in `InformationCommands.cs` (lines 1 and 2), both with identical names and implementations. This will cause compilation errors unless one is commented out or renamed. - **Incorrect ResponseToString in QueryProtocolVersion**: Outputs `"Firmware Version: {ProtocolVersion}"` instead of `"Protocol Version: {ProtocolVersion}"`. - **Incorrect ResponseToString in QueryKernelVersion & QueryMSPFirmwareVersion**: Both output `"Firmware Version: {Version}"` instead of distinguishing `"Kernel Firmware Version"` or `"MSP Firmware Version"`. - **String Parameter Allocation**: All string-setting commands allocate `new byte[value.Length + 1]`, but there is no validation that `value` is non-null or within expected length limits. Passing `null` will throw a `NullReferenceException`. - **Float Parameter Precision**: `SetPostTriggerSec` converts `float` to `command.Parameter` without rounding or validation; floating-point precision errors may occur. - **Epoch Assumption**: `QueryTime` and `SetTime` assume Unix epoch (`1970-01-01 00:00:00 UTC`) and do not account for time zones or leap seconds. - **Missing Concrete Commands**: `DiagnosticsCommands` defines `QueryOffset`, `SetOffset`, etc., but their implementations are commented out—no concrete classes exist for these. - **Protocol Version Mismatch**: `DisableFaultChecking` uses `ProtocolLimitedCommands.EnableFaultChecking` for `MinimumProtocolVersion`, likely a copy-paste error. - **Redundant `ICommunication` Import**: `InformationCommands.cs` imports both `DTS.Common.ICommunication` and `DTS.Common.Interface.DASFactory`, and uses `ICommunication` directly in `SetCalibrationDaysSince1970_01_01` constructor—suggests inconsistent usage or legacy code. - **No Error Handling in `WholePackage()`**: Some `WholePackage()` methods (e.g., `QueryBatteryChargeCurrentMA`) check `StatusNoError` only for success path, but others (e.g., `QueryV1VoltageMV`) do not—leading to inconsistent behavior on error.