public string[] Decode(byte[] DataBlockBuffer, string Time, out int NumOfMessagesDecoded) { // Define output data buffer string[] DataOut = new string[3000]; // Determine the size of the datablock int LengthOfDataBlockInBytes = DataBlockBuffer.Length; // Index into the array of record strings int DataOutIndex = 0; // Reset buffer indexes CurrentDataBufferOctalIndex = 0; int DataBufferIndexForThisExtraction = 0; // Determine SIC/SAC Index int SIC_Index = 0; int SAC_Index = 0; // Lenght of the current record's FSPECs int FSPEC_Length = 0; // Creates and initializes a BitVector32 with all bit flags set to FALSE. BitVector32 FourFSPECOctets = new BitVector32(); while (DataBufferIndexForThisExtraction < LengthOfDataBlockInBytes) { // Assume that there will be no more than 1000 bytes in one record byte[] LocalSingleRecordBuffer = new byte[3000]; Array.Copy(DataBlockBuffer, DataBufferIndexForThisExtraction, LocalSingleRecordBuffer, 0, (LengthOfDataBlockInBytes - DataBufferIndexForThisExtraction)); // Get all four data words, but use only the number specifed // by the length of FSPEC words FourFSPECOctets = ASTERIX.GetFourFSPECOctets(LocalSingleRecordBuffer); // Determine Length of FSPEC fields in bytes FSPEC_Length = ASTERIX.DetermineLenghtOfFSPEC(LocalSingleRecordBuffer); // Check wether 010 is present if (FourFSPECOctets[Bit_Ops.Bit7] == true) { // Determine SIC/SAC Index SIC_Index = FSPEC_Length; SAC_Index = SIC_Index + 1; // Extract SIC/SAC Indexes. DataOut[DataOutIndex] = LocalSingleRecordBuffer[SIC_Index].ToString() + '/' + LocalSingleRecordBuffer[SAC_Index].ToString(); // Save of the current data buffer index so it can be used by // Decoder CurrentDataBufferOctalIndex = SAC_Index + 1; } else { // Extract SIC/SAC Indexes. DataOut[DataOutIndex] = "---" + '/' + "---"; } /////////////////////////////////////////////////////////////////////////// // Populate the current SIC/SAC and Time stamp for this meesage // I002DataItems[ItemIDToIndex("010")].value = new ASTERIX.SIC_SAC_Time(LocalSingleRecordBuffer[SIC_Index], LocalSingleRecordBuffer[SAC_Index], ASTERIX.TimeOfReception); // 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.Bit7] == true) { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 010:T"; I002DataItems[ItemIDToIndex("010")].HasBeenPresent = true; I002DataItems[ItemIDToIndex("010")].CurrentlyPresent = true; } else { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 010:F"; I002DataItems[ItemIDToIndex("010")].CurrentlyPresent = false; } // 000 Message Type if (FourFSPECOctets[Bit_Ops.Bit6] == true) { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 000:T"; I002DataItems[ItemIDToIndex("000")].HasBeenPresent = true; I002DataItems[ItemIDToIndex("000")].CurrentlyPresent = true; } else { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 000:F"; I002DataItems[ItemIDToIndex("000")].CurrentlyPresent = false; } // 020 Sector Number if (FourFSPECOctets[Bit_Ops.Bit5] == true) { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 020:T"; I002DataItems[ItemIDToIndex("020")].HasBeenPresent = true; I002DataItems[ItemIDToIndex("020")].CurrentlyPresent = true; } else { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 020:F"; I002DataItems[ItemIDToIndex("020")].CurrentlyPresent = false; } // 030 Time of Day if (FourFSPECOctets[Bit_Ops.Bit4] == true) { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 030:T"; I002DataItems[ItemIDToIndex("030")].HasBeenPresent = true; I002DataItems[ItemIDToIndex("030")].CurrentlyPresent = true; } else { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 030:F"; I002DataItems[ItemIDToIndex("030")].CurrentlyPresent = false; } // 041 Antenna Rotation Period if (FourFSPECOctets[Bit_Ops.Bit3] == true) { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 041:T"; I002DataItems[ItemIDToIndex("041")].HasBeenPresent = true; I002DataItems[ItemIDToIndex("041")].CurrentlyPresent = true; } else { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 041:F"; I002DataItems[ItemIDToIndex("041")].CurrentlyPresent = false; } // 050 Station Configuration Status if (FourFSPECOctets[Bit_Ops.Bit2] == true) { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 050:T"; I002DataItems[ItemIDToIndex("050")].HasBeenPresent = true; I002DataItems[ItemIDToIndex("050")].CurrentlyPresent = true; } else { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 050:F"; I002DataItems[ItemIDToIndex("050")].CurrentlyPresent = false; } // 060 Station Processing Mode if (FourFSPECOctets[Bit_Ops.Bit1] == true) { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 060:T"; I002DataItems[ItemIDToIndex("060")].HasBeenPresent = true; I002DataItems[ItemIDToIndex("060")].CurrentlyPresent = true; } else { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 060:F"; I002DataItems[ItemIDToIndex("060")].CurrentlyPresent = false; } break; case 2: // 070 Plot Count Values if (FourFSPECOctets[Bit_Ops.Bit15] == true) { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 070:T"; I002DataItems[ItemIDToIndex("070")].HasBeenPresent = true; I002DataItems[ItemIDToIndex("070")].CurrentlyPresent = true; } else { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 070:F"; I002DataItems[ItemIDToIndex("070")].CurrentlyPresent = false; } // 100 Dynamic Window - Type 1 if (FourFSPECOctets[Bit_Ops.Bit14] == true) { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 100:T"; I002DataItems[ItemIDToIndex("100")].HasBeenPresent = true; I002DataItems[ItemIDToIndex("100")].CurrentlyPresent = true; } else { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 100:F"; I002DataItems[ItemIDToIndex("100")].CurrentlyPresent = false; } // 090 Collimation Error if (FourFSPECOctets[Bit_Ops.Bit13] == true) { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 090:T"; I002DataItems[ItemIDToIndex("090")].HasBeenPresent = true; I002DataItems[ItemIDToIndex("090")].CurrentlyPresent = true; } else { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 090:F"; I002DataItems[ItemIDToIndex("090")].CurrentlyPresent = false; } // 080 Warning/Error Conditions if (FourFSPECOctets[Bit_Ops.Bit12] == true) { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 080:T"; I002DataItems[ItemIDToIndex("080")].HasBeenPresent = true; I002DataItems[ItemIDToIndex("080")].CurrentlyPresent = true; } else { DataOut[DataOutIndex] = DataOut[DataOutIndex] + " 080:F"; I002DataItems[ItemIDToIndex("080")].CurrentlyPresent = false; } break; // Handle errors default: DataOut[DataOutIndex] = DataOut[DataOutIndex] + " UKN:T"; break; } } DataOutIndex++; CAT02DecodeAndStore.Do(LocalSingleRecordBuffer); DataBufferIndexForThisExtraction = DataBufferIndexForThisExtraction + CurrentDataBufferOctalIndex + 1; } // Return decoded data NumOfMessagesDecoded = DataOutIndex; return(DataOut); }