/// <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);
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        /// <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;
            }
        }