public string Decode(byte[] Data, string Time)
{
// Define output data buffer
string DataOut;
// Determine Length of FSPEC fields in bytes
int FSPEC_Length = ASTERIX.DetermineLenghtOfFSPEC(Data);
// Determine SIC/SAC Index
int SIC_Index = 3 + FSPEC_Length;
int SAC_Index = SIC_Index + 1;
// Extract SIC/SAC Indexes.
DataOut = Data[SIC_Index].ToString() + '/' + Data[SAC_Index].ToString();
// Creates and initializes a BitVector32 with all bit flags set to FALSE.
BitVector32 FourFSPECOctets = ASTERIX.GetFourFSPECOctets(Data);
// Loop for each FSPEC and determine what data item is present
for (int FSPEC_Index = 1; FSPEC_Index <= FSPEC_Length; FSPEC_Index++)
{
switch (FSPEC_Index)
{
case 1:
// 010 Data Source Identifier
if (FourFSPECOctets[Bit_Ops.Bit0] == true)
{
DataOut = DataOut + " 010:T";
I008DataItems[ItemIDToIndex("010")].IsPresent = true;
}
else
DataOut = DataOut + " 010:F";
// 000 Message Type
if (FourFSPECOctets[Bit_Ops.Bit1] == true)
{
DataOut = DataOut + " 000:T";
I008DataItems[ItemIDToIndex("000")].IsPresent = true;
}
else
DataOut = DataOut + " 000:F";
// 020 Vector Qualifier
if (FourFSPECOctets[Bit_Ops.Bit2] == true)
{
DataOut = DataOut + " 020:T";
I008DataItems[ItemIDToIndex("020")].IsPresent = true;
}
else
DataOut = DataOut + " 020:F";
// 036 Sequence of Cartesian Vectors in SPF Notation
if (FourFSPECOctets[Bit_Ops.Bit3] == true)
{
DataOut = DataOut + " 036:T";
I008DataItems[ItemIDToIndex("036")].IsPresent = true;
}
else
DataOut = DataOut + " 036:F";
// 034 Sequence of Polar Vectors in SPF Notation
if (FourFSPECOctets[Bit_Ops.Bit4] == true)
{
DataOut = DataOut + " 034:T";
I008DataItems[ItemIDToIndex("034")].IsPresent = true;
}
else
DataOut = DataOut + " 034:F";
// 040 Contour Identifier
if (FourFSPECOctets[Bit_Ops.Bit5] == true)
{
DataOut = DataOut + " 040:T";
I008DataItems[ItemIDToIndex("040")].IsPresent = true;
}
else
DataOut = DataOut + " 040:F";
// 050 Sequence of Contour Points in SPF Notation
if (FourFSPECOctets[Bit_Ops.Bit6] == true)
{
DataOut = DataOut + " 050:T";
I008DataItems[ItemIDToIndex("050")].IsPresent = true;
}
else
DataOut = DataOut + " 050:F";
break;
case 2:
// 090 Time of Day
if (FourFSPECOctets[Bit_Ops.Bit8] == true)
{
DataOut = DataOut + " 090:T";
I008DataItems[ItemIDToIndex("090")].IsPresent = true;
}
else
DataOut = DataOut + " 090:F";
// 100 Processing Status
if (FourFSPECOctets[Bit_Ops.Bit9] == true)
{
DataOut = DataOut + " 100:T";
I008DataItems[ItemIDToIndex("100")].IsPresent = true;
}
else
DataOut = DataOut + " 100:F";
// 110 Station Configuration Status
if (FourFSPECOctets[Bit_Ops.Bit10] == true)
{
DataOut = DataOut + " 110:T";
I008DataItems[ItemIDToIndex("110")].IsPresent = true;
}
else
DataOut = DataOut + " 110:F";
// 120 Total Number of Items Constituting One Weather Picture
if (FourFSPECOctets[Bit_Ops.Bit11] == true)
{
DataOut = DataOut + " 120:T";
I008DataItems[ItemIDToIndex("120")].IsPresent = true;
}
else
DataOut = DataOut + " 120:F";
// 038 Sequence of Weather Vectors in SPF Notation
if (FourFSPECOctets[Bit_Ops.Bit12] == true)
{
DataOut = DataOut + " 038:T";
I008DataItems[ItemIDToIndex("038")].IsPresent = true;
}
else
DataOut = DataOut + " 038:F";
break;
// Handle errors
default:
DataOut = DataOut + " UKN:T";
break;
}
CAT08DecodeAndStore.Do(Data);
}
// Return decoded data
return DataOut;
}