Files
DP44/DataPRO/SLICECommands/.svn/pristine/e4/e441cf1a0fe15f004aea1d05be7b941fac6c889d.svn-base
2026-04-17 14:55:32 -04:00

194 lines
6.7 KiB
Plaintext

using System;
using System.Collections.Generic;
using DTS.Common.DASResource;
using DTS.Common.Enums.DASFactory;
using DTS.Common.ICommunication;
using DTS.Common.Utilities.Logging;
namespace DTS.DASLib.Command.SLICE.DownloadCommands
{
public class QueryEventDataBase : EventDataCommands
{
protected override Commands Command => Commands.QueryEventData;
private const ushort ADC_OFFSET = 0x8000;
public const byte ALL_CHANNELS = 0xFF;
protected UInt16 _eventNumber;
protected UInt64 _firstSample;
protected UInt64 _lastSample;
protected UInt64 _samplesDownloaded;
protected byte _channel;
protected int _channelsDownloaded;
protected ushort[] _data;
public UInt16 EventNumber
{
get => _eventNumber;
set { _eventNumber = value; command.SetParameter(0, _eventNumber); }
}
public virtual UInt64 FirstSample
{
get => _firstSample;
set { _firstSample = value; command.SetParameter(2, _firstSample); }
}
public virtual UInt64 LastSample
{
get => _lastSample;
set { _lastSample = value; command.SetParameter(10, _lastSample); }
}
public byte Channel
{
get => _channel;
set
{
_channel = value; command.SetParameter(18, _channel);
ChannelsDownloaded = 0xFF == _channel ? 3 : 1;
}
}
public int ChannelsDownloaded
{
get => _channelsDownloaded;
set => _channelsDownloaded = value;
}
public int Count => (int)_samplesDownloaded;
public QueryEventDataBase(DTS.Common.Interface.DASFactory.ICommunication sock)
: base(sock)
{
command.Parameter = new byte[19];
_data = null;
_eventNumber = 0;
_firstSample = 0;
_lastSample = 0;
_channel = 0;
command.ShouldLog = false;
}
public QueryEventDataBase(DTS.Common.Interface.DASFactory.ICommunication sock, int timeoutMillisec)
: base(sock, timeoutMillisec)
{
command.Parameter = new byte[19];
_data = null;
_eventNumber = 0;
_firstSample = 0;
_lastSample = 0;
_channel = 0;
command.ShouldLog = false;
}
public override void Execute(CommandCallback cb, object cbData)
{
// Do a little parameter checking
if (_firstSample > _lastSample)
{
// "QueryEventData.Execute: First Sample cannot be greater than Last Sample"
throw new ApplicationException(Strings.QueryEventData_Execute_Err1);
}
base.Execute(cb, cbData);
}
protected override CommandReceiveAction WholePackagePost()
{
// now send the data to the user
var stat = CommandStatus.Success;
if (response.Status != DFConstantsAndEnums.CommandStatus.StatusNoError)
{
var s = (int)response.Status;
APILogger.LogString("QueryEventData.WholePackagePost: reporting failure, status==" + CommandPacketBase.StatusLabels[s] + " (0x" + s.ToString("X") + ")");
stat = CommandStatus.Failure;
}
var cbReport = new QueryEventDataReport(stat, UserCallbackData);
cbReport.Data = new short[_channelsDownloaded][];
for (var i = 0; i < _channelsDownloaded; i++)
GetChannelData(i, out cbReport.Data[i]);
return UserCallback(cbReport);
}
protected override CommandReceiveAction WholePackage()
{
if (response.Status != DFConstantsAndEnums.CommandStatus.StatusNoError)
{
return CommandReceiveAction.StopReceiving;
}
_samplesDownloaded = (ulong)(response.Parameter.Length / 2) / (ulong)_channelsDownloaded;
_data = new ushort[_samplesDownloaded * (ulong)_channelsDownloaded];
for (var i = 0; (ulong)i < _samplesDownloaded * (ulong)_channelsDownloaded; i++)
{
response.GetParameter(2 * i, out _data[i]);
}
return CommandReceiveAction.StopReceiving;
}
public override void SyncExecute()
{
// Do a little parameter checking
if (_firstSample > _lastSample)
{
// "QueryEventData.SyncExecute: First Sample cannot be greater than Last Sample"
throw new ApplicationException(Strings.QueryEventData_SyncExecute_Err1);
}
base.SyncExecute();
}
public virtual void GetChannelData(int channel, out short[] signedADC)
{
if (channel < 0 || channel > _channelsDownloaded)
{
// "QueryEventData.GetChannelData: Data requested on a channel that wasn't downloaded."
throw new ApplicationException(Strings.QueryEventData_GetChannelData_Err1);
}
// Data order for a 9 channel stack
// 7 8 9 4 5 6 1 2 3 7 8 9 4 5 6 1 2 3 etc.
var rv = new short[_samplesDownloaded];
var sliceNumber = channel / 3;
var sliceOffset = (_channelsDownloaded / 3 - sliceNumber - 1) * 3;
if (sliceOffset < 0) sliceOffset = 0;
var channelInSlice = channel % 3;
for (var i = 0; i < rv.Length; i++)
{
rv[i] = (short)(_data[i * _channelsDownloaded + sliceOffset + channelInSlice] - ADC_OFFSET);
}
signedADC = rv;
}
public virtual void GetRawIndexedData(int index, out ushort[] data)
{
data = new ushort[_samplesDownloaded];
for (var i = 0; i < data.Length; i++)
{
data[i] = _data[i * _channelsDownloaded + index];
}
}
public override void CommandToString(ref List<List<string>> lines)
{
lines.Add(new List<string> { $"Event number: {EventNumber}, First sample: {FirstSample}, Last sample: {LastSample}" });
}
public override void ResponseToString(ref List<List<string>> lines)
{
lines.Add(new List<string>
{
$"ChannelsDownloaded: {ChannelsDownloaded}, Count: {Count}"
});
}
public void LogResponse()
{
LogCommand(false);
}
}
}