--- source_files: - DataPRO/SLICECommands/RealtimeCommands/EndRealtimeMode.cs - DataPRO/SLICECommands/RealtimeCommands/UDPStreamPacket.cs - DataPRO/SLICECommands/RealtimeCommands/StartRealtimeMode.cs - DataPRO/SLICECommands/RealtimeCommands/RealtimeCommandBase.cs - DataPRO/SLICECommands/RealtimeCommands/IGetRealtimeSamples.cs - DataPRO/SLICECommands/RealtimeCommands/GetRealtimeSamplesSLICE6.cs - DataPRO/SLICECommands/RealtimeCommands/GetRealtimeSamplesSLICE2.cs - DataPRO/SLICECommands/RealtimeCommands/RetrieveSingleSample.cs - DataPRO/SLICECommands/RealtimeCommands/GetRealtimeSamplesTSRAIR.cs - DataPRO/SLICECommands/RealtimeCommands/RetrieveSampleAverage.cs - DataPRO/SLICECommands/RealtimeCommands/StartRealtimeStreamingMode.cs - DataPRO/SLICECommands/RealtimeCommands/GetRealtimeSamples.cs - DataPRO/SLICECommands/RealtimeCommands/RealtimeStreamDecoder.cs - DataPRO/SLICECommands/RealtimeCommands/UDPRealtimeByteConverter.cs - DataPRO/SLICECommands/RealtimeCommands/StreamReaderUDP.cs - DataPRO/SLICECommands/RealtimeCommands/StreamConfigUDP.cs generated_at: "2026-04-17T15:47:03.304493+00:00" model: "zai-org/GLM-5-FP8" schema_version: 1 sha256: "f9034be22d5d24be" --- # Documentation: DTS.DASLib.Command.SLICE.RealtimeCommands ## 1. Purpose This module provides the command infrastructure for realtime data acquisition from SLICE data acquisition devices. It handles the complete lifecycle of realtime operations: starting/stopping realtime mode, configuring and reading UDP data streams, retrieving samples (single, averaged, or multi-sample batches), and decoding binary stream packets. The module supports multiple hardware variants (SLICE2, SLICE6, TSRAIR) with device-specific data handling for byte ordering and sign conversion. --- ## 2. Public Interface ### Interfaces #### `IGetRealtimeSamples` Interface for objects capable of retrieving realtime samples from SLICE devices. | Member | Signature | Description | |--------|-----------|-------------| | `SampleNumber` | `ulong SampleNumber { get; }` | Returns the sample number for the first sample; subsequent samples are consecutive. | | `TimeStamp` | `ulong TimeStamp { get; }` | Returns the timestamp of the samples. | | `SequenceNumber` | `ulong SequenceNumber { get; }` | Returns the sequence number. | | `GetChannelData` | `short[] GetChannelData(int zeroBasedChannel)` | Returns all samples for the specified channel. | | `Channels` | `ushort Channels { get; set; }` | Total channel count for the unit. | | `SamplesReturned` | `int SamplesReturned { get; }` | Count of samples per channel returned. | | `LogCommands` | `bool LogCommands { get; set; }` | Whether to log commands (default false to avoid spammy logs). | | `SyncExecute` | `void SyncExecute()` | Executes the sample retrieval. | --- ### Abstract Base Class #### `RealtimeCommandBase` Abstract base class for all realtime commands. Inherits from `CommandBase`. **Protected Enum `Commands`:** | Value | Name | Code | |-------|------|------| | `Reserved` | 0x00 | | `StartRealtimeMode` | 0x01 | | `EndRealtimeMode` | 0x02 | | `GetRealtimeSamples` | 0x03 | | `RetrieveSingleSample` | 0x04 | | `RetrieveSampleAverage` | 0x05 | | `RetrieveInternalOffsetSampleAvg` | 0x06 | | `StartRealtimeStreamingMode` | 0x07 | | `GetRealtimeStreamSamples` | 0x08 | | `StartTimeStampStreamMode` | 0x09 | | `GetTimeStampStreamSamples` | 0x0A | | `ChannelTappedTest` | 0x0B | | `I106StreamConfigSet` | 0x0C | | `I106StreamConfigGet` | 0x0D | **Constructors:** - `protected RealtimeCommandBase(DTS.Common.Interface.DASFactory.ICommunication sock)` - `protected RealtimeCommandBase(DTS.Common.Interface.DASFactory.ICommunication sock, int timeoutMillisec)` **Abstract Property:** - `protected abstract Commands _Command { get; }` — Derived classes must specify their command code. --- ### Concrete Command Classes #### `EndRealtimeMode` Command to end realtime mode on a SLICE device. | Constructor | Signature | |-------------|-----------| | | `public EndRealtimeMode(DTS.Common.Interface.DASFactory.ICommunication sock)` | | | `public EndRealtimeMode(DTS.Common.Interface.DASFactory.ICommunication sock, int timeoutMillisec)` | Overrides `_Command` to return `Commands.EndRealtimeMode`. --- #### `StartRealtimeMode` Command to start realtime mode on a SLICE device. | Constructor | Signature | |-------------|-----------| | | `public StartRealtimeMode(DTS.Common.Interface.DASFactory.ICommunication sock)` | | | `public StartRealtimeMode(DTS.Common.Interface.DASFactory.ICommunication sock, int timeoutMillisec)` | | Property | Type | Description | |----------|------|-------------| | `SupportsMultipleSampleRealtime` | `bool` | Gets/sets whether multiple-sample realtime is supported. When set, allocates `byte[1]` or `byte[0]` for `command.Parameter`. | **Behavior:** The presence of `command.Parameter` (even as a single byte) signals firmware that multiple-sample realtime is supported. --- #### `GetRealtimeSamples` Base implementation of `IGetRealtimeSamples` for retrieving realtime samples. | Constructor | Signature | |-------------|-----------| | | `public GetRealtimeSamples(DTS.Common.Interface.DASFactory.ICommunication sock)` | | | `public GetRealtimeSamples(DTS.Common.Interface.DASFactory.ICommunication sock, int TimeoutMillisec, bool bPolling = false)` | | Property | Type | Description | |----------|------|-------------| | `SampleNumber` | `ulong` | First sample number; remaining samples are sequential. | | `TimeStamp` | `ulong` | Timestamp of samples. | | `SequenceNumber` | `ulong` | Sequence number. | | `Channels` | `ushort` | Channel count (must be set before execution). | | `SamplesReturned` | `int` | Number of samples returned per channel. Can be 0. | | Method | Signature | Description | |--------|-----------|-------------| | `GetChannelData` | `public short[] GetChannelData(int zeroBasedChannel)` | Returns sample array for specified channel. | **Default timeout:** 2000ms. --- #### `GetRealtimeSamplesSLICE6` SLICE6-specific implementation of `GetRealtimeSamples`. | Constructor | Signature | |-------------|-----------| | | `public GetRealtimeSamplesSLICE6(DTS.Common.Interface.DASFactory.ICommunication sock)` | | | `public GetRealtimeSamplesSLICE6(DTS.Common.Interface.DASFactory.ICommunication sock, int timeoutMillisec)` | **Data handling:** SLICE6 data is signed; byte-swapped but no offset conversion applied. --- #### `GetRealtimeSamplesSLICE2` SLICE2-specific implementation of `GetRealtimeSamples`. | Constructor | Signature | |-------------|-----------| | | `public GetRealtimeSamplesSLICE2(DTS.Common.Interface.DASFactory.ICommunication sock)` | | | `public GetRealtimeSamplesSLICE2(DTS.Common.Interface.DASFactory.ICommunication sock, int timeoutMillisec)` | **Data handling:** Converts unsigned to signed data with `+ 0x8000` offset after byte swapping. Sets `LogCommands = false` by default. --- #### `GetRealtimeSamplesTSRAIR` TSRAIR-specific implementation of `GetRealtimeSamples`. | Constructor | Signature | |-------------|-----------| | | `public GetRealtimeSamplesTSRAIR(ICommunication sock)` | | | `public GetRealtimeSamplesTSRAIR(ICommunication sock, int TimeoutMillisec)` | | Property | Type | Description | |----------|------|-------------| | `Timestamps` | `List` | List of timestamps (protected `_timestamps` field). | **Data handling:** TSRAIR data is unsigned; byte-swapped but no normalization applied. --- #### `RetrieveSingleSample` Command to retrieve a single sample from all channels. | Constructor | Signature | |-------------|-----------| | | `public RetrieveSingleSample(DTS.Common.Interface.DASFactory.ICommunication sock)` | | | `public RetrieveSingleSample(DTS.Common.Interface.DASFactory.ICommunication sock, int timeoutMillisec)` | | Property | Type | Description | |----------|------|-------------| | `Channels` | `ushort` | Number of channels (derived from `_data` length). | | Method | Signature | Description | |--------|-----------|-------------| | `GetChannelData` | `public short GetChannelData(int zeroBasedChannel)` | Returns single sample value for specified channel. | --- #### `RetrieveSampleAverage` Command to retrieve averaged sample data. | Constructor | Signature | |-------------|-----------| | | `public RetrieveSampleAverage(DTS.Common.Interface.DASFactory.ICommunication sock)` | | | `public RetrieveSampleAverage(DTS.Common.Interface.DASFactory.ICommunication sock, int timeoutMillisec)` | | Property | Type | Description | |----------|------|-------------| | `Samples` | `ushort` | Number of samples to average (sent as parameter at position 0). | | `Channels` | `ushort` | Number of channels returned. | | Method | Signature | Description | |--------|-----------|-------------| | `GetChannelData` | `public short GetChannelData(int zeroBasedChannel)` | Returns averaged value for specified channel. | **Constants:** `SAMPLES_POSITION = 0`, `DATA_POSITION = 2`. --- #### `StartRealtimeStreamingMode` Command to put firmware into realtime streaming mode for continuous data transmission. | Constructor | Signature | |-------------|-----------| | | `public StartRealtimeStreamingMode(DTS.Common.Interface.DASFactory.ICommunication sock, byte[] channelList)` | | | `public StartRealtimeStreamingMode(DTS.Common.Interface.DASFactory.ICommunication sock, int timeoutMillisec, byte[] channelList)` | | Property | Type | Description | |----------|------|-------------| | `ChannelList` | `byte[]` | Channels to collect data on; each channel represented as a byte. | --- #### `StartTimeStampStreamMode` Command to start IRIG realtime stream with timestamped data. | Constructor | Signature | |-------------|-----------| | | `public StartTimeStampStreamMode(DTS.Common.Interface.DASFactory.ICommunication sock)` | | | `public StartTimeStampStreamMode(DTS.Common.Interface.DASFactory.ICommunication sock, int timeoutMillisec)` | | Property | Type | Description | |----------|------|-------------| | `SupportsMultipleSampleRealtime` | `bool` | Controls parameter allocation (backing field `_bSupportsIrigTimeStampSampleRealtime`). | | `ParamsToSend` | `byte[]` | Parameters to send with the command. | **Behavior:** Sets `MinimumProtocolVersion` using `sock.GetMinProto(ProtocolLimitedCommands.UDPRealtimeStream)`. --- #### `StreamConfigUDPGet` Command to retrieve UDP stream configuration (I106 format). | Constructor | Signature | |-------------|-----------| | | `public StreamConfigUDPGet(Common.Interface.DASFactory.ICommunication sock)` | | | `public StreamConfigUDPGet(Common.Interface.DASFactory.ICommunication sock, int TimeoutMillisec)` | | Property | Type | Parameter Position | |----------|------|-------------------| | `Stream_Profile_Number` | `byte` | 0 | | `UdpIpPort` | `byte[]` | 1-28 | | `TimeChannelID` | `ushort` | 29 | | `DataChannelID` | `ushort` | 31 | | `TMNS_PCMSUBFRAMEID` | `uint` | 33 | | `TMNS_MSGID` | `uint` | 37 | | `TMNS_PCMINORPERMAJOR` | `uint` | 41 | | `TMNS_TMATSPORTNUMBER` | `uint` | 45 | | `IENAUDP_PortNumber` | `uint` | 49 | | `TMNS5` | `uint` | 53 | | `TMNS6` | `uint` | 57 | | `TMNS7` | `uint` | 61 | **Constant:** `COMMAND_PAYLOAD_SIZE = 65`. --- #### `StreamConfigUDPSet` Command to set UDP stream configuration (I106 format). | Constructor | Signature | |-------------|-----------| | | `public StreamConfigUDPSet(Common.Interface.DASFactory.ICommunication sock)` | | | `public StreamConfigUDPSet(Common.Interface.DASFactory.ICommunication sock, int TimeoutMillisec)` | | Property | Type | Parameter Position | |----------|------|-------------------| | `Stream_Profile_Number` | `byte` | 0 | | `UdpIpPort` | `byte[]` | 1 | | `Irig106Config0` | `ushort` | 29 | | `Irig106Config1` | `ushort` | 31 | | `TMNS_PCMSubFrameId` | `uint` | 33 | | `TMNS_MsgId` | `uint` | 37 | | `TMNS_PCMMinorPerMajor` | `uint` | 41 | | `TMNS_TMATSPortNumber` | `uint` | 45 | | `IENAUDP_PortNumber` | `uint` | 49 | | `TMNS5` | `uint` | 53 | | `TMNS6` | `uint` | 57 | | `TMNS7` | `uint` | 61 | **Constant:** `COMMAND_PAYLOAD_SIZE = 74`. --- ### Data/Utility Classes #### `UDPStreamPacket` Data structure representing a UDP stream packet (ported from FWTU). | Property | Type | Description | |----------|------|-------------| | `ChannelData` | `short[][]` | First array = channels, second array = sample index. | | `TimeStamp` | `long` | Timestamp value. | | `SampleNumber` | `ulong` | Sample number. | | `SequenceNumber` | `ulong` | Sequence number. | | `PTPTimesec` | `uint` | PTP time seconds component. | | `PTPTimeNsec` | `uint` | PTP time nanoseconds component. | | `PTPSyncStatusError` | `bool` | PTP sync error flag. | | `ADCOverflowStatus` | `bool` | ADC overflow flag. | | `PTPTimeString` | `string` | Formatted string: `"{sec}:{nsec padded to 9 digits}"`. | --- #### `RealtimeStreamDecoder` Decodes SPS realtime stream packets. **Enum `ByteIndex`:** | Value | Offset | |-------|--------| | `Sync` | 0 | | `Type` | 1 | | `Command` | 2 | | `Status` | 3 | | `Group` | 4 | | `Id` | 5 | | `DataLength` | 6 | | `SequenceNumber` | 8 | | `HeaderCRC` | 10 | | `DataCRC` | 12 | | `TimeStamp` | 14 | | `ChannelList` | 22 | | `SampleNumber` | 26 | | `DataStart` | 34 | | Constructor | Signature | |-------------|-----------| | | `public RealtimeStreamDecoder(IReadOnlyList bytes)` | | Property | Type | Description | |----------|------|-------------| | `SequenceNumber` | `ushort` | Decoded sequence number. | | `TimeStamp` | `ulong` | Decoded timestamp. | | `SampleNumber` | `ulong` | Decoded sample number. | | `Channels` | `int[]` | Array of active channel indices. | | `RtData` | `ushort[]` | Raw data for all channels (not yet converted to signed). | --- #### `UDPRealtimeByteConverter` Converts UDP realtime byte streams (ported from FWTU). **Enum `UDP_BYTE_INDEX`:** | Value | Offset | |-------|--------| | `PKT_PATTERN` | 0 | | `CHANNEL_ID` | 2 | | `PKT_LEN` | 4 | | `DATA_LEN` | 8 | | `DATA_TYPE_VER` | 12 | | `SEQ_NUMBER` | 13 | | `PKT_FLAGS` | 14 | | `DATA_TYPE` | 15 | | `REL_TIME32` | 16 | | `REL_TIME16` | 20 | | `HDR_CRC16` | 22 | | `PTP_U32_LSW` | 24 | | `PTP_U32_MSW` | 28 | | `RSV_U16` | 32 | | `HDR2CRC16` | 34 | | `CSDW` | 36 | | `DATA_START` | 40 | **Enum `UDP_DATA_TYPE`:** | Value | Code | Description | |-------|------|-------------| | `CGDP_TYPE` | 0x01 | Setup XML record. | | `TIME_DATA_PTP` | 0x12 | Time data, format 2. | | `ANALOG_DATA_FORMAT_1` | 0x21 | Analog data format 1. | | Constructor | Signature | |-------------|-----------| | | `public UDPRealtimeByteConverter(byte[] bytes)` | | Property | Type | Description | |----------|------|-------------| | `PacketPattern` | `ushort` | Packet pattern. | | `DataChannelID` | `ushort` | Channel ID. | | `PacketLength` | `uint` | Total packet length. | | `DataLength` | `uint` | Data length (not same as `RtData.Length`). | | `DataTypeVersion` | `byte` | Data type version. | | `SequenceNumber` | `byte` | Sequence number. | | `PacketFlags` | `byte` | Packet flags. | | `DataType` | `byte` | Data type indicator. | | `RelativeTime32` | `uint` | Relative time (32-bit portion). | | `RelativeTime16` | `ushort` | Relative time (16-bit portion). | | `HdrCrc16` | `ushort` | Header CRC. | | `PtpTimeStampSec` | `uint` | PTP timestamp seconds. | | `PtpTimeStampNsec` | `uint` | PTP timestamp nanoseconds. | | `Hdr2Crc16` | `uint` | Secondary header CRC. | | `ChannelMask` | `uint` | Channel mask. | | `UdpSampleCount` | `ulong` | Sample count. | | `RtData` | `ushort[]` | Realtime data array (XOR'd with 0x8000). | | `Channels` | `uint[]` | Active channels. | | `SequenceNumberPrev` | `byte` | Previous sequence number. | --- #### `StreamReaderUDP` UDP stream reader for receiving realtime data (ported from FWTU). | Constructor | Signature | |-------------|-----------| | | `public StreamReaderUDP(string streamAddress, string hostAddress, UDPStreamProfile uDPStreamType, byte[] channels)` | | Property | Type | Description | |----------|------|-------------| | `StreamAddress` | `string` | UDP stream address. | | `cmdline` | `byte[]` | Parameters sent to start command. | | `HostIPAddress` | `string` | IP of receive endpoint (default `IPAddress.Any`). | | `UDPStreamType` | `UDPStreamProfile` | Stream profile type. | | `UDPEndpoint` | `EndPoint` | UDP endpoint. | | `UDPSampleNumber` | `ulong` | Sample number counter. | | `Channels` | `byte[]` | Channels to receive. | | Method | Signature | Description | |--------|-----------|-------------| | `CloseSocket` | `public void CloseSocket()` | Closes the UDP socket. | | `Read` | `public UDPStreamPacket Read()` | Receives packets and returns decoded `UDPStreamPacket`, or `null` if no data. | **Behavior:** Supports multicast (IP range 224-239). Sets socket receive timeout to 2000ms. Hardcoded to 6 channels for UDP data parsing. --- ## 3. Invariants 1. **Command Type:** All realtime commands