/// <summary> /// Decodes the fields from an extended squitter from non-transponder reply (DF = 18). /// </summary> /// <param name="reply"></param> private void DecodeExtendedSquitterNonTransponder(ModeSMessage reply) { reply.ControlField = (ControlField)_BitStream.ReadByte(3); switch (reply.ControlField) { case ControlField.AdsbDeviceTransmittingIcao24: case ControlField.AdsbRebroadcastOfExtendedSquitter: ExtractAircraftAddress(reply); ExtractExtendedSquitterMessage(reply); break; case ControlField.AdsbDeviceNotTransmittingIcao24: reply.NonIcao24Address = (int)_BitStream.ReadUInt32(24); ExtractExtendedSquitterMessage(reply); break; default: reply.ExtendedSquitterSupplementaryMessage = ReadBytes(10); break; } ExtractParityInterrogator(reply); }
public void BitStream_ReadUInt32_Throws_If_Reading_Less_Than_One_Or_More_Than_32_Bits() { for (int i = -2; i < 34; ++i) { _BitStream.Initialise(new byte[] { 0x00, 0x00, 0x00, 0x00 }); bool expectException = i < 1 || i > 32; bool sawException = false; try { _BitStream.ReadUInt32(i); } catch (ArgumentOutOfRangeException) { sawException = true; } Assert.AreEqual(expectException, sawException, "ReadUInt32 did not behave correctly when asked to read {0} bits", i); } }
/// <summary> /// Decodes an aircraft status message. /// </summary> /// <param name="message"></param> private void DecodeAircraftStatus(AdsbMessage message) { message.MessageFormat = MessageFormat.AircraftStatus; var subMessage = message.AircraftStatus = new AircraftStatusMessage(); subMessage.AircraftStatusType = (AircraftStatusType)_BitStream.ReadByte(3); switch (subMessage.AircraftStatusType) { case AircraftStatusType.EmergencyStatus: var emergency = subMessage.EmergencyStatus = new EmergencyStatus(); emergency.EmergencyState = (EmergencyState)_BitStream.ReadByte(3); var modeA = (short)_BitStream.ReadUInt16(13); if (modeA != 0) { emergency.Squawk = ModeS.ModeATranslator.DecodeModeA(modeA); } break; case AircraftStatusType.TcasResolutionAdvisoryBroadcast: var tcas = subMessage.TcasResolutionAdvisory = new TcasResolutionAdvisory(); var araCoding = _BitStream.ReadBit(); var araValue = (short)_BitStream.ReadUInt16(13); tcas.ResolutionAdvisoryComplement = (ResolutionAdvisoryComplement)_BitStream.ReadByte(4); tcas.ResolutionAdvisoryTerminated = _BitStream.ReadBit(); tcas.MultipleThreatEncounter = _BitStream.ReadBit(); if (araCoding) { tcas.SingleThreatResolutionAdvisory = (SingleThreatResolutionAdvisory)araValue; } else if (tcas.MultipleThreatEncounter) { tcas.MultipleThreatResolutionAdvisory = (MultipleThreatResolutionAdvisory)araValue; } switch (_BitStream.ReadByte(2)) { case 1: tcas.ThreatIcao24 = (int)_BitStream.ReadUInt32(24); break; case 2: var threatAltitude = _BitStream.ReadUInt16(13); var threatRange = _BitStream.ReadByte(7); var threatBearing = _BitStream.ReadByte(6); var strippedAltitude = ((threatAltitude & 0x1F80) >> 2) | ((threatAltitude & 0x20) >> 1) | (threatAltitude & 0x0f); tcas.ThreatAltitude = ModeSAltitudeConversion.LookupGillhamAltitude(strippedAltitude); if (threatRange > 0) { tcas.ThreatRange = ((float)(threatRange - 1) / 10F) + 0.05F; tcas.ThreatRangeExceeded = threatRange == 127; } if (threatBearing > 0 && threatBearing < 61) { tcas.ThreatBearing = (short)((threatBearing - 1) * 6); } break; } break; } }