Files
DP44/DataPRO/SLICECommands/MulticastCommands/MulticastUDPQueryQATS.cs

213 lines
10 KiB
C#
Raw Normal View History

2026-04-17 14:55:32 -04:00
using DTS.Common.Enums.DASFactory;
using DTS.Common.Interface.DASFactory;
using DTS.Common.Utilities;
using DTS.DASLib.Command.Classes;
using System;
using System.Collections.Generic;
using System.Net;
namespace DTS.DASLib.Command.SLICE.MulticastCommands
{
public class MulticastUdpQueryQATS : MulticastCommandBase
{
private const int COMMAND_PAYLOAD_SIZE = 63;
private const int RESPONSE_PAYLOAD_SIZE = 215; // 278;
protected override Commands Command => Commands.UdpQueryQTAS;
protected override bool StopAfterFirstMessage { get { return false; } }
private uint _deviceClass;
private byte _responseOption;
private IPAddress _address;
private int _port = (int)Ports.Response;
private void SetMulticastConfig()
{
IPAddress.TryParse(MulticastReceiveAddress, out _address);
string config = _address.ToString() + ":" + _port.ToString();
command.SetParameter(41, config);
}
public DFConstantsAndEnums.MultiCastDeviceClasses DeviceClass { set { _deviceClass = (uint)value; command.SetParameter(36, (int)_deviceClass); } }
public ResponseOptions ResponseOption { set { _responseOption = (byte)value; command.SetParameter(40, _responseOption); } }
public IPAddress Address { set { _address = value; SetMulticastConfig(); } }
public int Port { set { _port = value; SetMulticastConfig(); } }
private static object MyLock = new object();
public List<IUDPQATSEntry> QATSEntry { get; set; } = new List<IUDPQATSEntry>();
public MulticastUdpQueryQATS(ICommunication sock)
: base(sock)
{
Init();
}
public MulticastUdpQueryQATS(string macAddress)
: base(null)
{
Init(macAddress);
}
public MulticastUdpQueryQATS(int timeoutMillisec)
: base(null, timeoutMillisec)
{
Init();
}
public MulticastUdpQueryQATS(string macAddress, int timeoutMillisec)
: base(null, timeoutMillisec)
{
Init(macAddress);
}
public void Init(string macAddress = "")
{
command.Parameter = new byte[COMMAND_PAYLOAD_SIZE];
HostMac = string.IsNullOrEmpty(macAddress) ? GetMacAddress() : macAddress;
command.SetParameter(HOST_MAC_ADDRESS_OFFSET, HostMac);
DeviceClass = DFConstantsAndEnums.MultiCastDeviceClasses.Any;
ResponseOption = ResponseOptions.AlwaysRespond;
ReceiveTimeoutMs = 5000;
SetMulticastConfig();
}
public MulticastUdpQueryQATS(ICommunication sock, int TimeoutMillisec)
: base(sock, TimeoutMillisec)
{
Init();
}
protected const int QATS_OFFSET = 74;
protected override CommandReceiveAction WholePackage()
{
if (response.Status == DFConstantsAndEnums.CommandStatus.StatusNoError)
{
var responseHostMac = string.Empty;
response.GetParameter(HOST_MAC_ADDRESS_OFFSET, out responseHostMac);
if ((null == responseHostMac) || !HostMac.Equals(responseHostMac))
{
response.Status = DFConstantsAndEnums.CommandStatus.StatusInvalidPacket;
return CommandReceiveAction.StopReceiving;
}
if (response.ParameterLength < RESPONSE_PAYLOAD_SIZE)
{
response.Status = DFConstantsAndEnums.CommandStatus.StatusAttributeInvalidLength;
return CommandReceiveAction.StopReceiving;
}
var responseClientMac = string.Empty;
response.GetParameter(CLIENT_MAC_ADDRESS_OFFSET, out responseClientMac);
var qatsSerialNumber = string.Empty;
response.GetParameter(QATS_OFFSET, out qatsSerialNumber); /*! serial = 10B */
var armState = (byte)0;
response.GetParameter(QATS_OFFSET + 10, out armState); /*! 10 */
var armMode = (byte)0;
response.GetParameter(QATS_OFFSET + 11, out armMode); /*! 11 */
var started = (byte)0;
response.GetParameter(QATS_OFFSET + 12, out started); /*! 12 */
var eventTrigger = (byte)0;
response.GetParameter(QATS_OFFSET + 13, out eventTrigger); /*! 13 */
var faultFlags = (byte)0;
response.GetParameter(QATS_OFFSET + 14, out faultFlags); /*! 14 */
var sampleRate = (uint)0;
response.GetParameter(QATS_OFFSET + 15, out sampleRate); /*! 15 + 4 */
var totalSamples = 0UL;
response.GetParameter(QATS_OFFSET + 19, out totalSamples); /*! 19 + 8 */
var currentSample = 0UL;
response.GetParameter(QATS_OFFSET + 27, out currentSample); /*! 27 + 8 */
var eventNumber = (ushort)0;
response.GetParameter(QATS_OFFSET + 35, out eventNumber); /*! 35 + 2 */
var faultSampleNumber = 0UL;
response.GetParameter(QATS_OFFSET + 37, out faultSampleNumber); /*! 37 + 8 */
var legacyFaultFlag = (ushort)0;
response.GetParameter(QATS_OFFSET + 45, out legacyFaultFlag); /*! 45 + 2 */
var inputVoltage = 0F;
response.GetParameter(QATS_OFFSET + 47, out inputVoltage); /*! 47 + 4 */
var backupVoltage = 0F;
response.GetParameter(QATS_OFFSET + 51, out backupVoltage); /*! 51 + 4 */
var batterySoC = 0F;
response.GetParameter(QATS_OFFSET + 55, out batterySoC); /*! 55 + 4 */
var actualCurrentSample = 0UL;
response.GetParameter(QATS_OFFSET + 59, out actualCurrentSample); /*! 59 + 8 used by software to estimate remaining time in Circular mode */
var estimateMaxSamples = 0UL;
response.GetParameter(QATS_OFFSET + 67, out estimateMaxSamples); /*! 67 + 8 used by software to calculate current storage remaining */
/*! ^^^^ SPS Legacy end here ^^^^^^^*/
/*! Added by S6/S6A product */
var tiltSensorCh1 = (short)0;
response.GetParameter(QATS_OFFSET + 75, out tiltSensorCh1); /*! 75 + 2 */
var tiltSensorCh2 = (short)0;
response.GetParameter(QATS_OFFSET + 77, out tiltSensorCh2); /*! 77 + 2 */
var tiltSensorCh3 = (short)0;
response.GetParameter(QATS_OFFSET + 79, out tiltSensorCh3); /*! 79 + 2 */
var sysTempC = 0F;
response.GetParameter(QATS_OFFSET + 81, out sysTempC); /*! 71 + 4 */
// response.GetParameter(DOUBLE_MAC_ADDR_SIZE + 75, out _sensorData); /*! 75 + 12 channel 1 - 6 for S6/S6A */
/*! added for synchronization status in S6/S6A/S6DB/TSR-AIR ... */
var syncClockEnable = (byte)0;
response.GetParameter(QATS_OFFSET + 129, out syncClockEnable); /*! 129 + 1 */
var adcExtClockSyncEnable = (byte)0;
response.GetParameter(QATS_OFFSET + 130, out adcExtClockSyncEnable); /*! 130 + 1 */
var syncClockStatus = (byte)0;
response.GetParameter(QATS_OFFSET + 131, out syncClockStatus); /*! 131 + 1 */
var adcExtClockSyncStatus = (byte)0;
response.GetParameter(QATS_OFFSET + 132, out adcExtClockSyncStatus); /*! 132 + 1 */
var triggerSample = 0UL;
response.GetParameter(QATS_OFFSET + 133, out triggerSample); /*! 133 + 8 */
var curOffset = QATS_OFFSET + 133 + 4;
var stackChannelOffsetMV = new float[6];
for (var i = 0; i < 6; i++)
{
response.GetParameter(curOffset, out stackChannelOffsetMV[i]);
curOffset += 4;
}
var shuntDeviationPercent = new float[6];
for (var i = 0; i < 6; i++)
{
response.GetParameter(curOffset, out shuntDeviationPercent[i]);
curOffset += 4;
}
var timeStamp = DateTime.Now;
lock (MyLock)
{
QATSEntry.Add(
new UDPQATSEntry(responseHostMac, responseClientMac,
qatsSerialNumber, armState, armMode, started, eventTrigger, faultFlags, sampleRate, totalSamples,
currentSample, eventNumber, faultSampleNumber, legacyFaultFlag, inputVoltage,
backupVoltage, batterySoC, estimateMaxSamples, tiltSensorCh1, tiltSensorCh2, tiltSensorCh3,
sysTempC, syncClockEnable, adcExtClockSyncEnable, syncClockStatus, adcExtClockSyncStatus, triggerSample,
stackChannelOffsetMV,
shuntDeviationPercent,
timeStamp));
}
}
return CommandReceiveAction.StopReceiving;
}
/// <summary>
/// returns any waiting QATS, clear the list
/// </summary>
/// <returns></returns>
public IUDPQATSEntry[] GetUDPQATs()
{
lock (MyLock)
{
var quats = QATSEntry.ToArray();
QATSEntry.Clear();
return quats;
}
}
public override void CommandToString(ref List<List<string>> lines)
{
base.CommandToString(ref lines);
lines.Add(new List<string>() { string.Format("UdpQueryQATS: [{0}] {1} : {1}", HostMac, _address, _port) });
}
}
}