213 lines
10 KiB
C#
213 lines
10 KiB
C#
|
|
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) });
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|