--- 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-17T15:50:07.536950+00:00" model: "zai-org/GLM-5-FP8" schema_version: 1 sha256: "64be47562bf23e82" --- # SLICEDBCommands Module Documentation ## 1. Purpose This module implements a command pattern architecture for communicating with SLICE DB hardware devices. It provides a hierarchical class structure for constructing, sending, and receiving command packets over a communication interface (`ICommunication`). The module handles various device operations including power management (voltage/current queries and configuration), network settings (IP, MAC, netmask), device arming/disarming for data acquisition, and device information queries (serial number, firmware versions, time synchronization). Commands are organized by functional category, each inheriting from a category-specific abstract base class that itself inherits from `CommandBase`. --- ## 2. Public Interface ### CommandBase (Abstract) **File:** `CommandBase.cs` **Namespace:** `DTS.DASLib.Command.SLICEDB` Base class for all SLICE DB commands. Inherits from `SliceCommandBase`. | Constructor | Description | |-------------|-------------| | `CommandBase(DTS.Common.Interface.DASFactory.ICommunication sock)` | Initializes with default timeout and creates a new `CommandPacket`. | | `CommandBase(DTS.Common.Interface.DASFactory.ICommunication sock, int TimeoutMillisec)` | Initializes with specified timeout in milliseconds. | | Method | Signature | Description | |--------|-----------|-------------| | `GetCommandPacket()` | `protected override CommandPacketBase GetCommandPacket()` | Factory method returning a new `CommandPacket`. | | `GetCommandPacket(byte[] buffer)` | `protected override CommandPacketBase GetCommandPacket(byte[] buffer)` | Factory method returning a `CommandPacket` constructed from byte buffer. | --- ### CommandPacket **File:** `CommandPacket.cs` **Namespace:** `DTS.DASLib.Command.SLICEDB` Represents a command packet for SLICE DB communication. Inherits from `SliceCommandPacketBase`. | Constructor | Description | |-------------|-------------| | `CommandPacket()` | Creates an empty command packet. | | `CommandPacket(byte[] Bytes)` | Creates a command packet from raw byte data. | | Enum | Values | |------|--------| | `CommandType` | `Reserved = 0x00`, `Diagnostics`, `GPIO`, `Information`, `Network`, `Power`, `Arm` | | Method | Signature | Description | |--------|-----------|-------------| | `GetNextSequenceNumber()` | `public override void GetNextSequenceNumber()` | Thread-safe assignment of a globally incrementing sequence number to `SequenceNumber`. | | `ConvertByteToCommandType(byte b)` | `public override object ConvertByteToCommandType(byte b)` | Converts a byte to `CommandType` enum. | --- ### DiagnosticsCommands (Abstract) **File:** `CalibrationCommands.cs` **Namespace:** `DTS.DASLib.Command.SLICEDB` Base class for diagnostics-related commands. | Enum | Values | |------|--------| | `Measurements` | `V1`, `BatteryVoltage`, `BatteryChargeCurrent`, `SliceBusCurrent`, `SliceBusVoltage` | | `Commands` (protected) | `Reserved = 0x00`, `QueryOffset = 0x01`, `SetOffset = 0x02`, `QueryMultiplier = 0x03`, `SetMultiplier = 0x04` | | Constructor | Description | |-------------|-------------| | `DiagnosticsCommands(DTS.Common.Interface.DASFactory.ICommunication sock)` | Sets `command.Type` to `CommandType.Diagnostics`. | | `DiagnosticsCommands(DTS.Common.Interface.DASFactory.ICommunication sock, int TimeoutMillisec)` | Sets `command.Type` to `CommandType.Diagnostics` with custom timeout. | **Note:** Concrete implementations (`QueryOffset`, `SetOffset`, `QueryMultiplier`, `SetMultiplier`) are commented out in the source. --- ### PowerCommands (Abstract) **File:** `PowerCommands.cs` **Namespace:** `DTS.DASLib.Command.SLICEDB` Base class for power-related commands. | Property | Signature | Description | |----------|-----------|-------------| | `_Command` | `protected abstract Commands _Command { get; }` | Abstract property defining the specific power command. | | Constructor | Description | |-------------|-------------| | `PowerCommands(DTS.Common.Interface.DASFactory.ICommunication sock)` | Sets `command.Type` to `CommandType.Power` and initializes command via `SetCommand`. | | `PowerCommands(DTS.Common.Interface.DASFactory.ICommunication sock, int TimeoutMillisec)` | Same as above with custom timeout. | | Method | Signature | Description | |--------|-----------|-------------| | `CommandToString` | `public override void CommandToString(ref List> lines)` | Appends `recorder.ConnectString` to output. | | `ResponseToString` | `public override void ResponseToString(ref List> lines)` | Appends `recorder.ConnectString` to output. | #### Concrete Power Command Classes | Class | `_Command` Value | Public Property | Description | |-------|------------------|-----------------|-------------| | `QueryV1VoltageMV` | `Commands.QueryV1VoltageMV` | `uint V1VoltageMV { get; }` | Queries +V1 input voltage in millivolts. | | `QueryBatteryVoltageMV` | `Commands.QueryBatteryVoltageMV` | `uint BatteryVoltageMV { get; }` | Queries battery voltage in millivolts. Sets `MinimumProtocolVersion` via `GetMinProto(QueryBatteryVoltage)`. | | `QueryBatteryChargeCurrentMA` | `Commands.QueryBatteryChargeCurrentMA` | `uint BatteryChargeCurrentMA { get; }` | Queries battery charge current in milliamps. | | `QuerySliceBusInputCurrentMA` | `Commands.QuerySliceBusInputCurrentMA` | `uint SliceBusInputCurrentMA { get; }` | Queries SLICE bus current in milliamps. | | `QuerySliceBusVoltageMV` | `Commands.QuerySliceBusVoltageMV` | `uint SliceBusVoltageMV { get; }` | Queries SLICE bus voltage in millivolts. | | `SetSliceBusVoltageMV` | `Commands.SetSliceBusVoltageMV` | `uint SliceBusVoltageMV { get; set; }` | Sets SLICE bus voltage in millivolts. Setter allocates `sizeof(uint)` parameter buffer. | Each concrete class provides two constructors matching the base class pattern and overrides `WholePackage()` to parse response data. --- ### ArmCommands (Abstract) **File:** `ArmCommands.cs` **Namespace:** `DTS.DASLib.Command.SLICEDB` Base class for arming/disarming commands. | Property | Signature | Description | |----------|-----------|-------------| | `_Command` | `protected abstract Commands _Command { get; }` | Abstract property defining the specific arm command. | | Constructor | Description | |-------------|-------------| | `ArmCommands(DTS.Common.Interface.DASFactory.ICommunication sock)` | Sets `command.Type` to `CommandType.Arm` and initializes command via `SetCommand`. | | `ArmCommands(DTS.Common.Interface.DASFactory.ICommunication sock, int TimeoutMillisec)` | Same as above with custom timeout. | #### Concrete Arm Command Classes | Class | `_Command` Value | Public Property | Protocol Limit | |-------|------------------|-----------------|----------------| | `Arm` | `Commands.arm_arm` | None | `ProtocolLimitedCommands.Arm` | | `Disarm` | `Commands.arm_disarm` | None | `ProtocolLimitedCommands.Arm` | | `EnableFaultChecking` | `Commands.arm_enablefaultchecking` | None | `ProtocolLimitedCommands.EnableFaultChecking` | | `DisableFaultChecking` | `Commands.arm_disablefaultchecking` | None | `ProtocolLimitedCommands.EnableFaultChecking` | | `SetRecordingMode` | `Commands.arm_setrecordingmode` | `byte Value { get; set; }` | `ProtocolLimitedCommands.Arm` | | `SetPostTriggerSec` | `Commands.arm_setposttriggersec` | `float Value { get; set; }` | `ProtocolLimitedCommands.Arm` | | `SetONOverride` | `Commands.arm_setonoverride` | `bool Value { get; set; }` | `ProtocolLimitedCommands.OnOverride` | | `SetInvertTriggerPolarity` | `Commands.arm_setinverttriggerpolarity` | `bool Value { get; set; }` | `ProtocolLimitedCommands.Arm` | | `SetInvertStartPolarity` | `Commands.arm_setinvertstartpolarity` | `bool Value { get; set; }` | `ProtocolLimitedCommands.Arm` | All concrete classes provide two constructors matching the base class pattern. --- ### NetworkCommands (Abstract) **File:** `NetworkCommands.cs` **Namespace:** `DTS.DASLib.Command.SLICEDB` Base class for network configuration commands. | Property | Signature | Description | |----------|-----------|-------------| | `_Command` | `protected abstract Commands _Command { get; }` | Abstract property defining the specific network command. | | Constructor | Description | |-------------|-------------| | `NetworkCommands(DTS.Common.Interface.DASFactory.ICommunication sock)` | Sets `command.Type` to `CommandType.Network` and initializes command via `SetCommand`. | | `NetworkCommands(DTS.Common.Interface.DASFactory.ICommunication sock, int TimeoutMillisec)` | Same as above with custom timeout. | #### Concrete Network Command Classes | Class | `_Command` Value | Public Property | Direction | |-------|------------------|-----------------|-----------| | `QueryIPAddress` | `Commands.QueryIPAddress` | `string IPAddress { get; }` | Query | | `SetIPAddress` | `Commands.SetIPAddress` | `string IPAddress { get; set; }` | Set | | `QueryNetmask` | `Commands.QueryNetmask` | `string Netmask { get; }` | Query | | `SetNetmask` | `Commands.SetNetmask` | `string Netmask { get; set; }` | Set | | `QueryDefaultRoute` | `Commands.QueryDefaultRoute` | `string DefaultRoute { get; }` | Query | | `SetDefaultRoute` | `Commands.SetDefaultRoute` | `string DefaultRoute { get; set; }` | Set | | `QueryMACAddress` | `Commands.QueryMACAddress` | `string MACAddress { get; }` | Query | | `SetMACAddress` | `Commands.SetMACAddress` | `string MACAddress { get; set; }` | Set | **Setter behavior:** String setters allocate `value.Length + 1` bytes for null-terminated parameter. --- ### InformationCommands (Abstract) **File:** `InformationCommands.cs` **Namespace:** `DTS.DASLib.Command.SLICEDB` Base class for device information commands. | Property | Signature | Description | |----------|-----------|-------------| | `_Command` | `protected abstract Commands _Command { get; }` | Abstract property defining the specific information command. | | Constructor | Description | |-------------|-------------| | `InformationCommands(DTS.Common.Interface.DASFactory.ICommunication sock)` | Sets `command.Type` to `CommandType.Information` and initializes command via `SetCommand`. | | `InformationCommands(DTS.Common.Interface.DASFactory.ICommunication sock, int TimeoutMillisec)` | Same as above with custom timeout. | #### Concrete Information Command Classes | Class | `_Command` Value | Public Property | Description | |-------|------------------|-----------------|-------------| | `QuerySerialNumber` | `Commands.QuerySerialNumber` | `string SerialNumber { get; }` | Queries device serial number. | | `SetSerialNumber` | `Commands.SetSerialNumber` | `string SerialNumber { get; set; }` | Sets device serial number. | | `QueryFirmwareVersion` | `Commands.QueryFirmwareVersion` | `string FirmwareVersion { get; }` | Queries firmware version. | | `QueryTime` | `Commands.QueryTime` | `DateTime CurrentTime { get; }` | Queries device time (epoch-based, returns `DateTime`). | | `SetTime` | `Commands.SetTime` | `DateTime CurrentTime { get; set; }` | Sets device time (converts to epoch seconds + microseconds). | | `QueryProtocolVersion` | `Commands.QueryProtocolVersion` | `byte ProtocolVersion { get; }` | Queries protocol version. | | `QueryKernelVersion` | `Commands.QueryKernelVersion` | `string KernelFirmwareVersion { get; }` | Queries kernel firmware version. | | `QueryMSPFirmwareVersion` | `Commands.QueryMSPFirmwareVersion` | `string MSPFirmwareVersion { get; }` | Queries MSP firmware version. | | `QueryCalibrationDaysSince1970_01_01` | `Commands.QueryCalibrationDaysSince1970_01_01` | `string CalibrationDaysSince1970_01_01 { get; }` | Queries calibration date. | | `SetCalibrationDaysSince1970_01_01` | `Commands.SetCalibrationDaysSince1970_01_01` | `string CalibrationDaysSince1970_01_01 { get; set; }` | Sets calibration date. | --- ## 3. Invariants 1. **Sequence Number Uniqueness:** `CommandPacket.GlobalSequenceNumber` is incremented atomically under `GlobalSequenceNumberLock` to ensure thread-safe unique sequence numbers across all command packets. 2. **Command Type Assignment:** All concrete command classes must set `command.Type` to the appropriate `CommandPacket.CommandType` value in their constructor (e.g., `PowerCommands` sets `CommandType.Power`). 3. **Abstract Command Property:** All concrete command classes inheriting from category base classes (`PowerCommands`, `ArmCommands`, `NetworkCommands`, `InformationCommands`) must override the abstract `_Command` property. 4. **Parameter Buffer Allocation:** Setters that modify command parameters must allocate the `command.Parameter` byte array before calling `command.SetParameter()`. 5. **Protocol Version Enforcement:** Certain commands (e.g., `QueryBatteryVoltageMV`, `Arm`, `Disarm`) set `MinimumProtocolVersion` via `sock.GetMinProto()` to ensure firmware compatibility. 6. **Time Representation:** `QueryTime` and `SetTime` use Unix epoch (1970-01-01) with seconds and microseconds components stored as `UInt32` values. --- ## 4. Dependencies ### This Module Depends On: - `DTS.Common.ICommunication` - Communication interface types - `DTS.Common.Enums.DASFactory` - `DFConstantsAndEnums.CommandStatus`, `DFConstantsAndEnums.ProtocolLimitedCommands` - `DTS.Common.Interface.DASFactory` - `ICommunication` interface - `SliceCommandBase` (inferred from inheritance) - Base class for `CommandBase` - `SliceCommandPacketBase` (inferred from inheritance) - Base class for `CommandPacket` - `CommandPacketBase` (inferred from return types) - Return type of `GetCommandPacket()` ### External Types Referenced: - `CommandReceiveAction` - Enum used in `WholePackage()` return values - `recorder` object with `ConnectString` and `SerialNumber` properties (inherited from base) --- ## 5. Gotchas 1. **Duplicate Enum Values in PowerCommands.Commands:** The `Commands` enum in `PowerCommands.cs` contains duplicate values: - `QuerySliceBusInputCurrentOvercurrentLimitMA = 0x17` and `QueryBatteryChargeCurrentOvercurrentLimitMA = 0x17` - `SetSliceBusInputCurrentOvercurrentLimitMA = 0x18` and `SetBatteryChargeCurrentOvercurrentLimitMA = 0x18` - `QuerySliceBusInputCurrentOvercurrentCount = 0x19` and `QueryBatteryChargeCurrentOvercurrentCount = 0x19` - `SetSliceBusInputCurrentOvercurrentCount = 0x1A` and `SetBatteryChargeCurrentOvercurrentCount = 0x1A` This appears to be a bug or copy-paste error. No concrete implementations exist for these commands in the provided source. 2. **Commented-Out Implementation Classes:** `CalibrationCommands.cs` contains commented-out stub classes (`QueryOffset`, `SetOffset`, `QueryMultiplier`, `SetMultiplier`), suggesting incomplete implementation. 3. **Misleading XML Documentation:** Several XML comments are inaccurate: - `SetRecordingMode.Value`: Comment says "The current Dat0 reg of the SLICE DB" but property is `byte` for recording mode. - `SetPostTriggerSec.Value`: Same incorrect comment about "Dat0 reg". - `SetONOverride.Value`: Comment says "The current StatusLED reg of the SLICE DB" but property is `bool`. - `SetCalibrationDaysSince1970_01_01.CalibrationDaysSince1970_01_01`: Comment says "The serial number of the SLICE DB". - `QueryProtocolVersion.ResponseToString`: Formats string as "Firmware Version" instead of "Protocol Version". - `QueryKernelVersion.ResponseToString` and `QueryMSPFirmwareVersion.ResponseToString`: Both format as "Firmware Version" without distinguishing kernel vs MSP. 4. **Typo in Enum Value:** `SetBattteryVoltageOvervoltageLimitMV` has three 't's in "Batttery" (value `0x14`). 5. **Inconsistent Status Checking:** Some `WholePackage()` implementations check `response.Status != StatusNoError` and return early, while others check `response.Status == StatusNoError` before processing. The behavior differs slightly in whether the output property gets set to a default value.