154 lines
6.2 KiB
C#
154 lines
6.2 KiB
C#
|
|
using DTS.Common.Utilities;
|
|||
|
|
using System;
|
|||
|
|
using System.Collections;
|
|||
|
|
|
|||
|
|
namespace DTS.Serialization.IRIGCH10.Packets
|
|||
|
|
{
|
|||
|
|
public class TimePacketFormat2 : AbstractDataPacket, IDataPacket
|
|||
|
|
{
|
|||
|
|
public DateTime LocalTimeOfFirstSample
|
|||
|
|
{
|
|||
|
|
get;
|
|||
|
|
private set;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public enum NetworkTimeFormats
|
|||
|
|
{
|
|||
|
|
NetworkTimeProtocolVersion3 = 0x00,
|
|||
|
|
IEEE1588_2002 = 0x01,
|
|||
|
|
IEEE1588_2008 = 0x02,
|
|||
|
|
RESERVED
|
|||
|
|
}
|
|||
|
|
//bits 7-4
|
|||
|
|
public NetworkTimeFormats NetworkTimeFormat
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
var channelSpecificDataWord = BitConverter.GetBytes(ChannelSpecificDataWord);
|
|||
|
|
var bits = new BitArray(channelSpecificDataWord);
|
|||
|
|
var ntf = Utils.Utils.BitArrayToInt32(bits, 4, 7);
|
|||
|
|
switch (ntf)
|
|||
|
|
{
|
|||
|
|
case 0: return NetworkTimeFormats.NetworkTimeProtocolVersion3;
|
|||
|
|
case 1: return NetworkTimeFormats.IEEE1588_2002;
|
|||
|
|
case 2: return NetworkTimeFormats.IEEE1588_2008;
|
|||
|
|
default: return NetworkTimeFormats.RESERVED;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
var channelSpecificDataWord = BitConverter.GetBytes(ChannelSpecificDataWord);
|
|||
|
|
var b = new BitArray(channelSpecificDataWord);
|
|||
|
|
Utils.Utils.SetBits(b, (uint)value, 4, 7);
|
|||
|
|
var ret = new byte[sizeof(uint)];
|
|||
|
|
b.CopyTo(ret, 0);
|
|||
|
|
ChannelSpecificDataWord = BitConverter.ToUInt32(ret, 0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public enum TimeStatuses
|
|||
|
|
{
|
|||
|
|
TimeNotValid,
|
|||
|
|
TimeValid,
|
|||
|
|
Reserved
|
|||
|
|
}
|
|||
|
|
//bits 3-0
|
|||
|
|
|
|||
|
|
public TimeStatuses TimeStatus
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
var channelSpecificDataWord = BitConverter.GetBytes(ChannelSpecificDataWord);
|
|||
|
|
var bits = new BitArray(channelSpecificDataWord);
|
|||
|
|
var ts = Utils.Utils.BitArrayToInt32(bits, 0, 3);
|
|||
|
|
switch (ts)
|
|||
|
|
{
|
|||
|
|
case 0: return TimeStatuses.TimeNotValid;
|
|||
|
|
case 1: return TimeStatuses.TimeValid;
|
|||
|
|
default: return TimeStatuses.Reserved;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
var channelSpecificDataWord = BitConverter.GetBytes(ChannelSpecificDataWord);
|
|||
|
|
var b = new BitArray(channelSpecificDataWord);
|
|||
|
|
Utils.Utils.SetBits(b, (uint)value, 0, 3);
|
|||
|
|
var ret = new byte[sizeof(uint)];
|
|||
|
|
b.CopyTo(ret, 0);
|
|||
|
|
ChannelSpecificDataWord = BitConverter.ToUInt32(ret, 0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public uint UnsignedSeconds
|
|||
|
|
{
|
|||
|
|
get;
|
|||
|
|
private set;
|
|||
|
|
}
|
|||
|
|
public uint UnsignedNanoSeconds
|
|||
|
|
{
|
|||
|
|
get;
|
|||
|
|
private set;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public string PTPTime
|
|||
|
|
{
|
|||
|
|
get; private set;
|
|||
|
|
}
|
|||
|
|
private const byte DATA_VERSION_TIME_FORMAT2 = 0x08;
|
|||
|
|
public TimePacketFormat2(byte sequenceNumber, bool rtcSyncError, int nanoseconds, int seconds, long rtc,
|
|||
|
|
bool includeSecondaryHeader) : base(Enums.DataFileDataTypes.TimeDataFormat2, includeSecondaryHeader)
|
|||
|
|
{
|
|||
|
|
NetworkTimeFormat = NetworkTimeFormats.IEEE1588_2008;
|
|||
|
|
TimeStatus = rtcSyncError ? TimeStatuses.TimeNotValid : TimeStatuses.TimeValid;
|
|||
|
|
//CSDW+CRC+TimeData (32 bitsx2)
|
|||
|
|
var dataLength = Convert.ToUInt32(4 + sizeof(uint) * 2);
|
|||
|
|
var offset = CommonHeaderWork(1, DATA_VERSION_TIME_FORMAT2, sequenceNumber, rtc, dataLength, nanoseconds, seconds);
|
|||
|
|
var bytes = BitConverter.GetBytes(seconds);
|
|||
|
|
Buffer.BlockCopy(bytes, 0, _dataBytes, offset, bytes.Length);
|
|||
|
|
offset += bytes.Length;
|
|||
|
|
bytes = BitConverter.GetBytes(nanoseconds);
|
|||
|
|
Buffer.BlockCopy(bytes, 0, _dataBytes, offset, bytes.Length);
|
|||
|
|
}
|
|||
|
|
public TimePacketFormat2(byte[] bytes) : base(bytes)
|
|||
|
|
{
|
|||
|
|
var offset = IRIGCH10.PacketHeader.PACKET_HEADER_LENGTH;
|
|||
|
|
|
|||
|
|
if (PacketHeader.SecondaryHeaderPresent)
|
|||
|
|
{
|
|||
|
|
var secondaryHeaderBytes = new byte[SecondaryTimeFormatHeader.SECONDARY_TIME_HEADER_LENGTH];
|
|||
|
|
Buffer.BlockCopy(bytes, offset,
|
|||
|
|
secondaryHeaderBytes, 0, SecondaryTimeFormatHeader.SECONDARY_TIME_HEADER_LENGTH);
|
|||
|
|
var secondaryHeader = new SecondaryTimeFormatHeader(secondaryHeaderBytes);
|
|||
|
|
LocalTimeOfFirstSample = secondaryHeader.LocalTime;
|
|||
|
|
offset += SecondaryTimeFormatHeader.SECONDARY_TIME_HEADER_LENGTH;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ChannelSpecificDataWord = BitConverter.ToUInt32(bytes, offset);
|
|||
|
|
offset += sizeof(uint);
|
|||
|
|
var channelSpecificDataWord = BitConverter.GetBytes(ChannelSpecificDataWord);
|
|||
|
|
var bits = new BitArray(channelSpecificDataWord);
|
|||
|
|
var ntf = Utils.Utils.BitArrayToInt32(bits, 4, 7);
|
|||
|
|
switch (ntf)
|
|||
|
|
{
|
|||
|
|
case 0: NetworkTimeFormat = NetworkTimeFormats.NetworkTimeProtocolVersion3; break;
|
|||
|
|
case 1: NetworkTimeFormat = NetworkTimeFormats.IEEE1588_2002; break;
|
|||
|
|
case 2: NetworkTimeFormat = NetworkTimeFormats.IEEE1588_2008; break;
|
|||
|
|
default: NetworkTimeFormat = NetworkTimeFormats.RESERVED; break;
|
|||
|
|
}
|
|||
|
|
var ts = Utils.Utils.BitArrayToInt32(bits, 0, 3);
|
|||
|
|
switch (ts)
|
|||
|
|
{
|
|||
|
|
case 0: TimeStatus = TimeStatuses.TimeNotValid; break;
|
|||
|
|
case 1: TimeStatus = TimeStatuses.TimeValid; break;
|
|||
|
|
case 2: TimeStatus = TimeStatuses.Reserved; break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
UnsignedSeconds = BitConverter.ToUInt32(bytes, offset);
|
|||
|
|
offset += sizeof(uint);
|
|||
|
|
UnsignedNanoSeconds = BitConverter.ToUInt32(bytes, offset);
|
|||
|
|
offset += sizeof(uint);
|
|||
|
|
PTPTime = PTP1588Timestamps.ToDateTimeString((decimal)UnsignedSeconds, (decimal)UnsignedNanoSeconds);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|