public void AirPressure_GeometricAltitudeToPressureAltitude_Returns_Correct_Values() { var testValues = new List <ConvertParameters>() { new ConvertParameters(null, null, 29.00F), new ConvertParameters(500, 1100, 29.32F), new ConvertParameters(1000, 1000, 29.92F), new ConvertParameters(500, 270, 30.15F), }; foreach (var useStaticVersion in new bool[] { true, false }) { foreach (var testValue in testValues) { int?actual; if (useStaticVersion) { actual = AirPressure.GeometricAltitudeToPressureAltitude(testValue.InputAltitude, testValue.PressureInHg); } else { var airPressure = new AirPressure() { PressureInHg = testValue.PressureInHg }; actual = airPressure.GeometricAltitudeToPressureAltitude(testValue.InputAltitude); } Assert.AreEqual(testValue.ExpectedAltitude, actual, "Altitude: {0}, Pressure: {1}", testValue.InputAltitude, testValue.PressureInHg); } } }
public void AirPressure_Constructor_Initialises_To_Known_State_And_Properties_Work() { var airPressure = new AirPressure(); TestUtilities.TestProperty(airPressure, r => r.AgeSeconds, (short)0, (short)1); TestUtilities.TestProperty(airPressure, r => r.Latitude, 0F, 1.1F); TestUtilities.TestProperty(airPressure, r => r.Longitude, 0F, 1.2F); TestUtilities.TestProperty(airPressure, r => r.PressureInHg, 0F, 1.3F); }
public void AirPressure_ObservationTimeUtc_Returns_Correct_Time() { var airPressure = new AirPressure() { AgeSeconds = 10 }; var fetchTime = DateTime.UtcNow; var expected = fetchTime.AddSeconds(10); Assert.AreEqual(expected, airPressure.ObservationTimeUtc(fetchTime)); }
/// <summary> /// See interface docs. /// </summary> /// <param name="latitude"></param> /// <param name="longitude"></param> /// <returns></returns> public AirPressure FindClosest(double latitude, double longitude) { AirPressure result = null; var kdTree = _AirPressures; if (kdTree != null) { var nearestPoints = kdTree.GetNearestNeighbours(new float[] { (float)latitude, (float)longitude }, 1); var nearestPoint = nearestPoints.FirstOrDefault(); result = nearestPoint == null ? null : nearestPoint.Value; } return(result); }
public void AirPressure_InHgToMillibars_Returns_Correct_Values() { Assert.AreEqual((float?)null, AirPressure.InHgToMillibars(null)); Assert.AreEqual(1000F, AirPressure.InHgToMillibars(29.5301F)); }
public void AirPressure_MillibarsToInHg_Returns_Correct_Values() { Assert.AreEqual((float?)null, AirPressure.MillibarsToInHg(null)); Assert.AreEqual(29.5301F, AirPressure.MillibarsToInHg(1000F)); }
/// <summary> /// See interface docs. /// </summary> /// <param name="aircraftListJson"></param> /// <returns></returns> public IEnumerable <BaseStationMessageEventArgs> ConvertIntoBaseStationMessageEventArgs(AircraftListJson aircraftListJson) { var result = new List <BaseStationMessageEventArgs>(); foreach (var json in aircraftListJson.Aircraft) { var message = new BaseStationMessage() { MessageType = BaseStationMessageType.Transmission, TransmissionType = BaseStationTransmissionType.AirToAir, // This needs to be something other than "None" or "AllCallReply" if we want to have these messages work with the message compressor StatusCode = BaseStationStatusCode.None, }; if (json.Callsign != null) { message.Callsign = json.Callsign; } if (json.Emergency != null) { message.Emergency = json.Emergency; } if (json.GroundSpeed != null) { message.GroundSpeed = json.GroundSpeed; } if (json.Icao24 != null) { message.Icao24 = json.Icao24; } if (json.OnGround != null) { message.OnGround = json.OnGround; } if (json.SignalLevel != null) { message.SignalLevel = json.SignalLevel; } if (json.Track != null) { message.Track = json.Track; } if (json.VerticalRate != null) { message.VerticalRate = json.VerticalRate; } if (json.Latitude != null || json.Longitude != null) { if (json.Latitude != null) { message.Latitude = json.Latitude; } if (json.Longitude != null) { message.Longitude = json.Longitude; } if (json.PositionIsMlat != null) { message.IsMlat = json.PositionIsMlat.Value; } } if (json.Squawk != null) { int squawk; if (int.TryParse(json.Squawk, out squawk)) { message.Squawk = squawk; } } if (json.AltitudeType != null) { AddSupplementaryValue(message, r => r.AltitudeIsGeometric = json.AltitudeType == 1); } if (json.CallsignIsSuspect != null) { AddSupplementaryValue(message, r => r.CallsignIsSuspect = json.CallsignIsSuspect); } if (json.SpeedType != null) { AddSupplementaryValue(message, r => r.SpeedType = (SpeedType)json.SpeedType); } if (json.TargetAltitude != null) { AddSupplementaryValue(message, r => r.TargetAltitude = json.TargetAltitude); } if (json.TargetTrack != null) { AddSupplementaryValue(message, r => r.TargetHeading = json.TargetTrack); } if (json.TrackIsHeading != null) { AddSupplementaryValue(message, r => r.TrackIsHeading = json.TrackIsHeading); } if (json.TransponderType != null) { AddSupplementaryValue(message, r => r.TransponderType = (TransponderType)json.TransponderType); } if (json.VerticalRateType != null) { AddSupplementaryValue(message, r => r.VerticalRateIsGeometric = json.VerticalRateType == 1); } if (json.AirPressureInHg != null) { AddSupplementaryValue(message, r => r.PressureSettingMb = AirPressure.InHgToMillibars(json.AirPressureInHg)); } if (json.Altitude != null) { // When pressure altitude calculations were introduced the sending side was modified to // send Altitude, GeometricAltitude and AltitudeType as a set. However, before that was // introduced they'd only be sent if they changed. if (json.GeometricAltitude == null || json.AltitudeType == null) { message.Altitude = json.Altitude; } else { switch (json.AltitudeType) { case (int)AltitudeType.Barometric: message.Altitude = json.Altitude; break; case (int)AltitudeType.Geometric: message.Altitude = json.GeometricAltitude; break; default: throw new NotImplementedException(); } } } var eventArgs = new BaseStationMessageEventArgs(message, isOutOfBand: false, isSatcomFeed: json.IsSatcomFeed); result.Add(eventArgs); } return(result); }