261 lines
13 KiB
Plaintext
261 lines
13 KiB
Plaintext
using System;
|
|
using System.Collections;
|
|
using System.Linq;
|
|
|
|
namespace DTS.Serialization.IRIGCH10.Packets
|
|
{
|
|
public class PCMDataPacket : AbstractDataPacket, IDataPacket
|
|
{
|
|
//Bit 30 Intra packet headers
|
|
public bool HasIntraPacketHeader
|
|
{
|
|
get => GetCSDWBit(30);
|
|
set => SetCSDWBit(30, value);
|
|
}
|
|
//Bit29 Major Frame Indicator
|
|
//not applicable in throughput mode
|
|
public bool IsMajorFrame
|
|
{
|
|
get => GetCSDWBit(29);
|
|
set => SetCSDWBit(29, value);
|
|
}
|
|
//Bit28 IsMinorFrame
|
|
//not applicable in throughput mode
|
|
public bool IsMinorFrame
|
|
{
|
|
get => GetCSDWBit(28);
|
|
set => SetCSDWBit(28, value);
|
|
}
|
|
public enum MinorFrameStatus
|
|
{
|
|
Reserved0 = 0, //00
|
|
Reserved1 = 1, //01
|
|
MinorFrameCheck = 2, //10
|
|
MinorFrameLock = 3 //11
|
|
}
|
|
public enum MajorFrameStatus
|
|
{
|
|
MajorFrameNotLocked = 0, //00
|
|
Reserved1 = 1, //01
|
|
MajorFrameCheck = 2, //10
|
|
MajorFrameLock = 3 //11
|
|
}
|
|
//bits 27-24
|
|
//not applicable for throughput mode
|
|
public MinorFrameStatus LockStatus
|
|
{
|
|
get
|
|
{
|
|
var csdw = BitConverter.GetBytes(ChannelSpecificDataWord);
|
|
var bits = new BitArray(csdw);
|
|
return (MinorFrameStatus)Utils.Utils.BitArrayToInt32(bits, 24, 27);
|
|
}
|
|
set
|
|
{
|
|
var iValue = (int)value;
|
|
var csdw = BitConverter.GetBytes(ChannelSpecificDataWord);
|
|
var bits = new BitArray(csdw);
|
|
Utils.Utils.SetBits(bits, (uint)iValue, 24, 27);
|
|
var ret = new Byte[sizeof(uint)];
|
|
bits.CopyTo(ret, 0);
|
|
ChannelSpecificDataWord = BitConverter.ToUInt32(ret, 0);
|
|
}
|
|
}
|
|
//bit 21
|
|
public bool Is32BitAligned
|
|
{
|
|
get => GetCSDWBit(21);
|
|
set => SetCSDWBit(21, value);
|
|
}
|
|
//bit 20
|
|
public bool IsThroughputMode
|
|
{
|
|
get => GetCSDWBit(20);
|
|
set => SetCSDWBit(20, value);
|
|
}
|
|
|
|
//bit 19 packed mode
|
|
public bool IsPackedMode
|
|
{
|
|
get => GetCSDWBit(19);
|
|
set => SetCSDWBit(19, value);
|
|
}
|
|
//bit 18 unpacked mode
|
|
public bool IsUnpackedMode
|
|
{
|
|
get => GetCSDWBit(18);
|
|
set => SetCSDWBit(18, value);
|
|
}
|
|
/// <summary>
|
|
/// it seems the EMC ch10 validation tool only supports CH10 106v5, so use this header value for the analog packet when in this mode
|
|
/// whether to include secondary time header or not
|
|
/// 33199 Add Time format 1 as an export option for CH 10 export
|
|
/// </summary>
|
|
private const byte DATA_VERSION = 0x06;
|
|
public PCMDataPacket(int nanoseconds, int seconds,
|
|
Chapter10File.GetNextSampleDelegate getNextSample, int totalChannels, long channelLength, long rtc, long numSamples, long currentSample, byte sequenceNumber,
|
|
ushort channelId, bool includeSecondaryHeader) : base(Enums.DataFileDataTypes.PCMDataFormat1, includeSecondaryHeader)
|
|
{
|
|
HasIntraPacketHeader = includeSecondaryHeader;
|
|
IsMajorFrame = false;
|
|
IsMinorFrame = false;
|
|
LockStatus = MinorFrameStatus.Reserved0;
|
|
IsThroughputMode = true;
|
|
Is32BitAligned = false;
|
|
IsPackedMode = false;
|
|
IsUnpackedMode = false;
|
|
|
|
//4 bytes for CSDW, then 4 bytes for a PCM FRAMESYNC??? this isn't in the spec but f/w is using it
|
|
var dataLength = Convert.ToUInt32(4 + 2 * totalChannels * numSamples + 4*numSamples);
|
|
|
|
var offset = CommonHeaderWork(channelId, DATA_VERSION, sequenceNumber, rtc, dataLength, nanoseconds, seconds);
|
|
for (var sampleIdx = 0; sampleIdx < numSamples; sampleIdx++)
|
|
{
|
|
Buffer.BlockCopy(new byte[] { 0x6B, 0xFE, 0x40, 0x28 }, 0, _dataBytes, offset, 4);
|
|
offset += 4;
|
|
for (var chIdx = 0; chIdx < totalChannels; chIdx++)
|
|
{
|
|
var signed = getNextSample(chIdx);
|
|
var unsigned = (ushort)(((signed - 0x8000 & 0x00FF) << 8) | ((signed - 0x8000 >> 8) & 0x00FF));
|
|
var bytes = BitConverter.GetBytes(unsigned).Reverse().ToArray();
|
|
Buffer.BlockCopy(bytes, 0, _dataBytes, offset, 2);
|
|
offset += 2;
|
|
}
|
|
currentSample++;
|
|
}
|
|
}
|
|
public PCMDataPacket() : base(Enums.DataFileDataTypes.PCMDataFormat1, true)
|
|
{
|
|
}
|
|
public PCMDataPacket(byte[] bytes) : base (bytes)
|
|
{
|
|
|
|
}
|
|
public PCMDataPacket(bool _) : base(UDP_DATA)
|
|
{
|
|
}
|
|
|
|
private static readonly byte[] UDP_DATA = { 0x25, 0xeb, 0x03, 0x00, 0x98, 0x05, 0x00, 0x00, 0x74, 0x05, 0x00, 0x00,
|
|
0x06, 0x65, 0xc4, 0x09, 0x21, 0xe5, 0x5d, 0xed, 0x07, 0x00, 0x83, 0x37, 0x42, 0x89, 0x77, 0x2a,
|
|
0x4c, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x01, 0x00, 0x00, 0x10, 0x00, 0x6b, 0xfe, 0x40, 0x28,
|
|
0x04, 0x80, 0xe3, 0x7f, 0xcf, 0x7f, 0xe1, 0x7f, 0xee, 0x7f, 0xea, 0x7f, 0x6b, 0xfe, 0x40, 0x28,
|
|
0x07, 0x80, 0xe7, 0x7f, 0xcf, 0x7f, 0xe7, 0x7f, 0xf3, 0x7f, 0xee, 0x7f, 0x6b, 0xfe, 0x40, 0x28,
|
|
0x04, 0x80, 0xe5, 0x7f, 0xcd, 0x7f, 0xe2, 0x7f, 0xf1, 0x7f, 0xed, 0x7f, 0x6b, 0xfe, 0x40, 0x28,
|
|
0x05, 0x80, 0xe9, 0x7f, 0xcd, 0x7f, 0xe2, 0x7f, 0xf1, 0x7f, 0xeb, 0x7f, 0x6b, 0xfe, 0x40, 0x28,
|
|
0x07, 0x80, 0xe9, 0x7f, 0xcd, 0x7f, 0xec, 0x7f, 0xf3, 0x7f, 0xf1, 0x7f, 0x6b, 0xfe, 0x40, 0x28,
|
|
0x06, 0x80, 0xe3, 0x7f, 0xce, 0x7f, 0xe6, 0x7f, 0xee, 0x7f, 0xee, 0x7f, 0x6b, 0xfe, 0x40, 0x28,
|
|
0x02, 0x80, 0xe1, 0x7f, 0xc9, 0x7f, 0xdc, 0x7f, 0xec, 0x7f, 0xea, 0x7f, 0x6b, 0xfe, 0x40, 0x28,
|
|
0x04, 0x80, 0xe7, 0x7f, 0xc5, 0x7f, 0xe7, 0x7f, 0xef, 0x7f, 0xed, 0x7f, 0x6b, 0xfe, 0x40, 0x28,
|
|
0x05, 0x80, 0xed, 0x7f, 0xca, 0x7f, 0xe3, 0x7f, 0xf0, 0x7f, 0xf2, 0x7f, 0x6b, 0xfe, 0x40, 0x28,
|
|
0x04, 0x80, 0xe5, 0x7f, 0xca, 0x7f, 0xe2, 0x7f, 0xec, 0x7f, 0xec, 0x7f, 0x6b, 0xfe, 0x40, 0x28,
|
|
0x04, 0x80, 0xe6, 0x7f, 0xcc, 0x7f, 0xe5, 0x7f, 0xec, 0x7f, 0xed, 0x7f, 0x6b, 0xfe, 0x40, 0x28 };/*,
|
|
0x06, 80, e7, 7f, cc, 7f, e6, 7f, f0, 7f, ef, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, e7, 7f, d2, 7f, e4, 7f, f0, 7f, f2, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, eb, 7f, cc, 7f, e7, 7f, e9, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x03, 80, e7, 7f, d1, 7f, ed, 7f, ef, 7f, f1, 7f, 6b, fe, 40, 28,
|
|
0x06, 80, ec, 7f, d7, 7f, e9, 7f, f2, 7f, ee, 7f, 6b, fe, 40, 28,
|
|
0x07, 80, ed, 7f, cf, 7f, e7, 7f, f1, 7f, f0, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, e7, 7f, d0, 7f, e6, 7f, f0, 7f, f0, 7f, 6b, fe, 40, 28,
|
|
0x03, 80, e7, 7f, cf, 7f, e2, 7f, f0, 7f, ee, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, e6, 7f, c8, 7f, dc, 7f, ef, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x06, 80, ec, 7f, cc, 7f, e4, 7f, f2, 7f, f0, 7f, 6b, fe, 40, 28,
|
|
0x06, 80, eb, 7f, c9, 7f, e8, 7f, f1, 7f, ec, 7f, 6b, fe, 40, 28,
|
|
0x02, 80, e9, 7f, c6, 7f, e6, 7f, ed, 7f, ef, 7f, 6b, fe, 40, 28,
|
|
0x03, 80, e1, 7f, c9, 7f, e2, 7f, e9, 7f, ef, 7f, 6b, fe, 40, 28,
|
|
0xff, 7f, e2, 7f, c8, 7f, de, 7f, ea, 7f, eb, 7f, 6b, fe, 40, 28,
|
|
0x03, 80, e6, 7f, ca, 7f, df, 7f, f0, 7f, ef, 7f, 6b, fe, 40, 28,
|
|
0x00, 80, e7, 7f, cb, 7f, e2, 7f, f0, 7f, ec, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, e7, 7f, d1, 7f, df, 7f, ef, 7f, f0, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, eb, 7f, d0, 7f, e5, 7f, ed, 7f, f0, 7f, 6b, fe, 40, 28,
|
|
0x07, 80, e9, 7f, d3, 7f, ee, 7f, ef, 7f, ef, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, eb, 7f, ca, 7f, e1, 7f, ef, 7f, ef, 7f, 6b, fe, 40, 28,
|
|
0x06, 80, e9, 7f, d0, 7f, e6, 7f, f2, 7f, f3, 7f, 6b, fe, 40, 28,
|
|
0x06, 80, e3, 7f, d2, 7f, e6, 7f, f2, 7f, f1, 7f, 6b, fe, 40, 28,
|
|
0x05, 80, ed, 7f, cf, 7f, e9, 7f, ed, 7f, f5, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, ed, 7f, d0, 7f, e6, 7f, ed, 7f, ef, 7f, 6b, fe, 40, 28,
|
|
0x06, 80, e8, 7f, cf, 7f, ec, 7f, ed, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x06, 80, ea, 7f, cc, 7f, e8, 7f, ec, 7f, ec, 7f, 6b, fe, 40, 28,
|
|
0x00, 80, eb, 7f, c9, 7f, e5, 7f, ef, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x03, 80, de, 7f, ce, 7f, e7, 7f, eb, 7f, f1, 7f, 6b, fe, 40, 28,
|
|
0x05, 80, e1, 7f, c6, 7f, e0, 7f, f0, 7f, ec, 7f, 6b, fe, 40, 28,
|
|
0x01, 80, df, 7f, c7, 7f, df, 7f, e9, 7f, e9, 7f, 6b, fe, 40, 28,
|
|
0x05, 80, e4, 7f, cd, 7f, e0, 7f, ea, 7f, eb, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, ea, 7f, ca, 7f, de, 7f, ed, 7f, ee, 7f, 6b, fe, 40, 28,
|
|
0x03, 80, e7, 7f, c9, 7f, de, 7f, ef, 7f, ec, 7f, 6b, fe, 40, 28,
|
|
0x05, 80, e5, 7f, c9, 7f, df, 7f, ed, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, e3, 7f, d0, 7f, e2, 7f, ed, 7f, f0, 7f, 6b, fe, 40, 28,
|
|
0x02, 80, e3, 7f, ce, 7f, e0, 7f, ed, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x06, 80, f0, 7f, cc, 7f, e3, 7f, ee, 7f, ef, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, ed, 7f, d0, 7f, e4, 7f, f3, 7f, ea, 7f, 6b, fe, 40, 28,
|
|
0x06, 80, eb, 7f, c8, 7f, e6, 7f, ec, 7f, ea, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, e9, 7f, ce, 7f, e3, 7f, ee, 7f, f0, 7f, 6b, fe, 40, 28,
|
|
0x09, 80, e9, 7f, d1, 7f, e5, 7f, ea, 7f, eb, 7f, 6b, fe, 40, 28,
|
|
0x07, 80, eb, 7f, ce, 7f, e6, 7f, f0, 7f, ec, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, ea, 7f, ce, 7f, e4, 7f, eb, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x08, 80, ed, 7f, ce, 7f, e8, 7f, ef, 7f, ef, 7f, 6b, fe, 40, 28,
|
|
0x08, 80, ee, 7f, ce, 7f, e7, 7f, ef, 7f, ee, 7f, 6b, fe, 40, 28,
|
|
0x05, 80, e3, 7f, cb, 7f, e0, 7f, ed, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x02, 80, e4, 7f, d0, 7f, e0, 7f, ed, 7f, ee, 7f, 6b, fe, 40, 28,
|
|
0x00, 80, e7, 7f, cb, 7f, e5, 7f, e9, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x02, 80, df, 7f, cb, 7f, e3, 7f, ed, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0xff, 7f, e3, 7f, cf, 7f, ea, 7f, f0, 7f, eb, 7f, 6b, fe, 40, 28,
|
|
0x02, 80, e3, 7f, cc, 7f, e2, 7f, ef, 7f, f0, 7f, 6b, fe, 40, 28,
|
|
0x03, 80, e5, 7f, d3, 7f, e4, 7f, f1, 7f, ef, 7f, 6b, fe, 40, 28,
|
|
0x07, 80, e9, 7f, ce, 7f, e6, 7f, f2, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, ed, 7f, cf, 7f, e6, 7f, ec, 7f, f1, 7f, 6b, fe, 40, 28,
|
|
0x05, 80, ef, 7f, d5, 7f, e6, 7f, ec, 7f, f1, 7f, 6b, fe, 40, 28,
|
|
0x07, 80, e7, 7f, d1, 7f, e8, 7f, f1, 7f, ef, 7f, 6b, fe, 40, 28,
|
|
0x06, 80, e7, 7f, cc, 7f, e1, 7f, ed, 7f, ef, 7f, 6b, fe, 40, 28,
|
|
0x02, 80, e6, 7f, cb, 7f, e7, 7f, f1, 7f, ef, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, e5, 7f, ce, 7f, e9, 7f, ed, 7f, ee, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, e3, 7f, cd, 7f, e6, 7f, ec, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x00, 80, ea, 7f, cd, 7f, e8, 7f, ed, 7f, ef, 7f, 6b, fe, 40, 28,
|
|
0x03, 80, e7, 7f, c8, 7f, e9, 7f, f3, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x03, 80, e5, 7f, cb, 7f, e3, 7f, f1, 7f, f0, 7f, 6b, fe, 40, 28,
|
|
0x02, 80, e3, 7f, ce, 7f, df, 7f, f0, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, e7, 7f, ca, 7f, e0, 7f, ef, 7f, ee, 7f, 6b, fe, 40, 28,
|
|
0x06, 80, e7, 7f, d3, 7f, e5, 7f, f0, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x01, 80, e9, 7f, c9, 7f, e2, 7f, ef, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x02, 80, df, 7f, c8, 7f, e1, 7f, ed, 7f, eb, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, e7, 7f, ca, 7f, e4, 7f, ee, 7f, ea, 7f, 6b, fe, 40, 28,
|
|
0x04, 80, e7, 7f, d1, 7f, e6, 7f, f0, 7f, ec, 7f, 6b, fe, 40, 28,
|
|
0x02, 80, df, 7f, cc, 7f, e6, 7f, eb, 7f, ef, 7f, 6b, fe, 40, 28,
|
|
0x05, 80, e7, 7f, d1, 7f, e4, 7f, ee, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x07, 80, e9, 7f, cf, 7f, e9, 7f, ec, 7f, ec, 7f, 6b, fe, 40, 28,
|
|
0x03, 80, e7, 7f, cb, 7f, e7, 7f, ed, 7f, ed, 7f, 6b, fe, 40, 28,
|
|
0x06, 80, e3, 7f, cf, 7f, e4, 7f, f1, 7f, ec, 7f, 6b, fe, 40, 28,
|
|
0x07, 80, e8, 7f, cc, 7f, e9, 7f, f2, 7f, ed, 7f
|
|
}*/
|
|
//public AnalogDataFormat1Packet(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 numChannels = TotChan;
|
|
// var sizeOf1SampleForAllChannels = sizeof(ushort) * numChannels;
|
|
// //There's a CSDW in the data section, then all ADC data. CSDW is uint, 4 bytes
|
|
// var numSamples = (PacketHeader.DataLength - 4) / sizeOf1SampleForAllChannels;
|
|
|
|
// Samples = new SampleData[numSamples];
|
|
// for (var i = 0; i < Samples.Length; i++)
|
|
// {
|
|
// var channels = GetChannels(bytes, offset, numChannels);
|
|
// Samples[i] = new SampleData(channels);
|
|
// offset += sizeOf1SampleForAllChannels;
|
|
// }
|
|
//}
|
|
|
|
}
|
|
}
|