public void BaseStationMessageEventArgs_Constructs_To_Known_State_And_Properties_Work() { BaseStationMessage message = new Mock <BaseStationMessage>().Object; BaseStationMessageEventArgs args = new BaseStationMessageEventArgs(message); Assert.AreSame(message, args.Message); }
public void MergedFeedListener_SetListener_Still_Considers_Old_Listeners_Offical_Sources_Of_Icaos_Until_They_Expire() { _MergedFeed.SetListeners(_Components); var messageArgs = new BaseStationMessageEventArgs(new BaseStationMessage() { Icao24 = "123456" }); var resetArgs = new EventArgs <string>("123456"); _Listener2.Raise(r => r.Port30003MessageReceived += null, messageArgs); _Listener2.Raise(r => r.PositionReset += null, resetArgs); _Listeners.Remove(_Listener2.Object); _MergedFeed.SetListeners(_Components); _MergedFeed.Port30003MessageReceived += _BaseStationMessageEventRecorder.Handler; _MergedFeed.PositionReset += _PositionResetRecorder.Handler; _Clock.UtcNowValue = _Clock.UtcNowValue.AddMilliseconds(_MergedFeed.IcaoTimeout); _Listener1.Raise(r => r.Port30003MessageReceived += null, messageArgs); _Listener1.Raise(r => r.PositionReset += null, resetArgs); Assert.AreEqual(0, _BaseStationMessageEventRecorder.CallCount); Assert.AreEqual(0, _PositionResetRecorder.CallCount); _Clock.UtcNowValue = _Clock.UtcNowValue.AddMilliseconds(1); _Listener1.Raise(r => r.Port30003MessageReceived += null, messageArgs); _Listener1.Raise(r => r.PositionReset += null, resetArgs); Assert.AreEqual(1, _BaseStationMessageEventRecorder.CallCount); Assert.AreEqual(1, _PositionResetRecorder.CallCount); }
/// <summary> /// Raises <see cref="Port30003MessageReceived"/> /// </summary> /// <param name="args"></param> private void OnPort30003MessageReceived(BaseStationMessageEventArgs args) { EventHelper.RaiseQuickly(Port30003MessageReceived, this, () => { args.Message.ReceiverId = ReceiverId; return(args); }); }
/// <summary> /// Called by the listener when a BaseStation message is received. /// </summary> /// <param name="sender"></param> /// <param name="args"></param> private void MessageListener_MessageReceived(object sender, BaseStationMessageEventArgs args) { if (_BackgroundThreadMessageQueue != null) { _BackgroundThreadMessageQueue.Enqueue(args); } }
public void BaseStationMessageEventArgs_Constructs_To_Known_State_And_Properties_Work() { BaseStationMessage message = new Mock <BaseStationMessage>().Object; BaseStationMessageEventArgs args = new BaseStationMessageEventArgs(message); Assert.AreSame(message, args.Message); Assert.AreEqual(false, args.IsOutOfBand); Assert.AreEqual(false, args.IsSatcomFeed); var args2 = new BaseStationMessageEventArgs(message, true, false); Assert.AreSame(message, args2.Message); Assert.AreEqual(true, args2.IsOutOfBand); Assert.AreEqual(false, args2.IsSatcomFeed); var args3 = new BaseStationMessageEventArgs(message, false, true); Assert.AreSame(message, args3.Message); Assert.AreEqual(false, args3.IsOutOfBand); Assert.AreEqual(true, args3.IsSatcomFeed); var args4 = new BaseStationMessageEventArgs(message, true, true); Assert.AreSame(message, args4.Message); Assert.AreEqual(true, args4.IsOutOfBand); Assert.AreEqual(true, args4.IsSatcomFeed); }
/// <summary> /// Raises <see cref="Port30003MessageReceived"/> /// </summary> /// <param name="args"></param> private void OnPort30003MessageReceived(BaseStationMessageEventArgs args) { if (Port30003MessageReceived != null) { Port30003MessageReceived(this, args); } }
/// <summary> /// Passes through events from the original <see cref="Port30003MessageReceived"/>. /// </summary> /// <param name="sender"></param> /// <param name="args"></param> private void Original_Port30003MessageReceived(object sender, BaseStationMessageEventArgs args) { args = Filter.FilterEvent(args); if (args != null) { OnPort30003MessageReceived(args); } }
/// <summary> /// Raised when the listener picks up a Port 30003 format message (or derives one from a raw message). /// </summary> /// <param name="sender"></param> /// <param name="args"></param> private void Listener_Port30003MessageReceived(object sender, BaseStationMessageEventArgs args) { if (Online) { var bytes = Encoding.ASCII.GetBytes(String.Concat(args.Message.ToBaseStationString(), "\r\n")); BroadcastProvider.Send(bytes); } }
/// <summary> /// Called when a listener raises a BaseStation message event. /// </summary> /// <param name="sender"></param> /// <param name="args"></param> private void Listener_Port30003MessageReceived(object sender, BaseStationMessageEventArgs args) { try { var listener = (IListener)sender; _MessageProcessingQueue.Enqueue(new MessageReceived(_Clock.UtcNow, listener, args)); } catch (Exception ex) { OnExceptionCaught(new EventArgs <Exception>(ex)); } }
/// <summary> /// Raised when the listener picks up a Port 30003 format message (or derives one from a raw message). /// </summary> /// <param name="sender"></param> /// <param name="args"></param> private void Listener_Port30003MessageReceived(object sender, BaseStationMessageEventArgs args) { if (RebroadcastServer.ConnectionEstablished) { byte[] bytes = Encoding.ASCII.GetBytes(String.Concat(args.Message.ToBaseStationString(_ExtendedBasestationFormat), "\r\n")); if (bytes != null && bytes.Length > 0) { RebroadcastServer.Connector.Write(bytes); } } }
/// <summary> /// Raised when the listener picks up a Port 30003 format message (or derives one from a raw message). /// </summary> /// <param name="sender"></param> /// <param name="args"></param> private void Listener_Port30003MessageReceived(object sender, BaseStationMessageEventArgs args) { if (RebroadcastServer.ConnectionEstablished) { var bytes = _Compressor.Compress(args.Message); if (bytes != null && bytes.Length > 0) { RebroadcastServer.Connector.Write(bytes); } } }
/// <summary> /// Called when the background queue pops a message off the queue of messages. /// </summary> /// <param name="args"></param> private void MessageQueue_MessageReceived(BaseStationMessageEventArgs args) { try { TrackFlight(args.Message, isMlat: args.IsOutOfBand); } catch (ThreadAbortException) { } catch (Exception ex) { AbandonSession(ex, PluginStrings.ExceptionCaughtWhenProcessingMessage); Debug.WriteLine(String.Format("BaseStationDatabaseWriter.Plugin.MessageRelay_MessageReceived caught exception {0}", ex.ToString())); Factory.Singleton.Resolve <ILog>().Singleton.WriteLine("Database writer plugin caught exception on message processing: {0}", ex.ToString()); } }
/// <summary> /// Called when the background queue pops a message off the queue of messages. /// </summary> /// <param name="args"></param> private void MessageQueue_MessageReceived(BaseStationMessageEventArgs args) { try { TrackFlight(args.Message); } catch (ThreadAbortException) { } catch (Exception ex) { Debug.WriteLine(String.Format("BaseStationDatabaseWriter.Plugin.MessageRelay_MessageReceived caught exception {0}", ex.ToString())); Factory.Singleton.Resolve <ILog>().Singleton.WriteLine("Database writer plugin caught exception on message processing: {0}", ex.ToString()); StatusDescription = String.Format(PluginStrings.ExceptionCaught, ex.Message); OnStatusChanged(EventArgs.Empty); } }
public void MergedFeedListener_SetListener_BaseStationMessage_Events_On_Listeners_Passed_Through() { _MergedFeed.SetListeners(_Components); _MergedFeed.Port30003MessageReceived += _BaseStationMessageEventRecorder.Handler; var args = new BaseStationMessageEventArgs(new BaseStationMessage()); _Listener1.Raise(r => r.Port30003MessageReceived += null, args); Assert.AreEqual(1, _BaseStationMessageEventRecorder.CallCount); Assert.AreSame(_MergedFeed, _BaseStationMessageEventRecorder.Sender); Assert.AreSame(args.Message, _BaseStationMessageEventRecorder.Args.Message); }
public void MergedFeedListener_SetListener_Passes_Through_False_IsSatcomFeed_From_Nominated_Receiver() { _MergedFeed.IsSatcomFeed = false; _Listener1.Object.IsSatcomFeed = false; _MergedFeed.SetListeners(_Components); _MergedFeed.Port30003MessageReceived += _BaseStationMessageEventRecorder.Handler; var args = new BaseStationMessageEventArgs(new BaseStationMessage()); _Listener1.Raise(r => r.Port30003MessageReceived += null, args); Assert.AreEqual(1, _BaseStationMessageEventRecorder.CallCount); Assert.AreEqual(false, _BaseStationMessageEventRecorder.Args.IsSatcomFeed); }
/// <summary> /// Processes messages from the receiver on a background thread. Using a background thread prevents /// our processing from interrupting the processing of messages by our receivers. /// </summary> /// <param name="messageReceived"></param> private void ProcessReceivedMessage(MessageReceived messageReceived) { var message = messageReceived.MessageArgs.Message; var hasNoPosition = message.Latitude.GetValueOrDefault() == 0.0 && message.Longitude.GetValueOrDefault() == 0.0; var hasTrack = message.Track != null; var hasGroundSpeed = message.GroundSpeed != null; var filterOutcome = FilterMessageFromListener(messageReceived.ReceivedUtc, messageReceived.Listener, message.Icao24, !hasNoPosition, hasTrack, hasGroundSpeed, message.IsMlat); if (filterOutcome != FilterMessageOutcome.Failed) { var args = new BaseStationMessageEventArgs(message, isOutOfBand: filterOutcome == FilterMessageOutcome.OutOfBand, isSatcomFeed: messageReceived.Listener.IsSatcomFeed); OnPort30003MessageReceived(args); ++TotalMessages; } }
public void MergedFeedListener_SetListener_Passes_Through_Receiver_Id_On_BaseStation_Messages() { _MergedFeed.ReceiverId = 1234; _MergedFeed.SetListeners(_Components); _MergedFeed.Port30003MessageReceived += _BaseStationMessageEventRecorder.Handler; var args = new BaseStationMessageEventArgs(new BaseStationMessage() { ReceiverId = 998877 }); _Listener1.Raise(r => r.Port30003MessageReceived += null, args); Assert.AreEqual(998877, _BaseStationMessageEventRecorder.Args.Message.ReceiverId); }
public void MergedFeedListener_SetListener_Does_Not_Respond_To_Events_From_Old_Listeners() { _MergedFeed.SetListeners(_Components); _MergedFeed.Port30003MessageReceived += _BaseStationMessageEventRecorder.Handler; _MergedFeed.PositionReset += _PositionResetRecorder.Handler; var messageArgs = new BaseStationMessageEventArgs(new BaseStationMessage() { Icao24 = "123456" }); var resetArgs = new EventArgs <string>("123456"); _Components.Remove(_Component2.Object); _MergedFeed.SetListeners(_Components); _Listener2.Raise(r => r.Port30003MessageReceived += null, messageArgs); _Listener2.Raise(r => r.PositionReset += null, resetArgs); Assert.AreEqual(0, _BaseStationMessageEventRecorder.CallCount); Assert.AreEqual(0, _PositionResetRecorder.CallCount); }
public void MergedFeedListener_SetListener_Not_Interferred_With_By_Background_ICAO_Cleanup() { _MergedFeed.SetListeners(_Components); _MergedFeed.Port30003MessageReceived += _BaseStationMessageEventRecorder.Handler; _MergedFeed.PositionReset += _PositionResetRecorder.Handler; var messageArgs = new BaseStationMessageEventArgs(new BaseStationMessage() { Icao24 = "123456" }); var resetArgs = new EventArgs <string>("123456"); _Listener1.Raise(r => r.Port30003MessageReceived += null, messageArgs); _Listener1.Raise(r => r.PositionReset += null, resetArgs); _Clock.UtcNowValue = _Clock.UtcNowValue.AddMilliseconds(_MergedFeed.IcaoTimeout); _HeartbeatService.Raise(r => r.SlowTick += null, EventArgs.Empty); _Listener2.Raise(r => r.Port30003MessageReceived += null, messageArgs); _Listener2.Raise(r => r.PositionReset += null, resetArgs); Assert.AreEqual(1, _BaseStationMessageEventRecorder.CallCount); Assert.AreEqual(1, _PositionResetRecorder.CallCount); }
/// <summary> /// Returns the event args passed in, possibly altered, or null if the event must not be passed on. /// </summary> /// <param name="args"></param> /// <returns></returns> public static BaseStationMessageEventArgs FilterEvent(BaseStationMessageEventArgs args) { var result = args; if (args != null && args.Message != null) { var icaoNumber = CustomConvert.Icao24(args.Message.Icao24); if (icaoNumber != -1) { if (_ParsedConfiguration.IsIcaoProhibited(icaoNumber)) { result = null; } else if ((args.Message.IsMlat || args.IsOutOfBand) && _ParsedConfiguration.IsMlatProhibited()) { result.Message.Latitude = null; result.Message.Longitude = null; result.Message.Track = null; } } } return(result); }
/// <summary> /// Raises <see cref="Port30003MessageReceived"/>. /// </summary> /// <param name="args"></param> private void OnPort30003MessageReceived(BaseStationMessageEventArgs args) { EventHelper.RaiseQuickly(Port30003MessageReceived, this, args); }
public void MergedFeedListener_SetListener_Events_Are_Filtered_Correctly() { var worksheet = new ExcelWorksheetData(TestContext); _Component1.Setup(r => r.IsMlatFeed).Returns(worksheet.Bool("L1MLAT")); _Component2.Setup(r => r.IsMlatFeed).Returns(worksheet.Bool("L2MLAT")); _MergedFeed.SetListeners(_Components); _MergedFeed.IcaoTimeout = worksheet.Int("IcaoTimeout"); _MergedFeed.IgnoreAircraftWithNoPosition = worksheet.Bool("IgnoreNoPos"); var startTime = new DateTime(2013, 10, 8, 14, 56, 21, 0); for (var i = 1; i <= 3; ++i) { var listenerNumberName = String.Format("Listener{0}", i); var icaoName = String.Format("ICAO{0}", i); var msOffsetName = String.Format("MSOffset{0}", i); var hasPosnName = String.Format("HasPosn{0}", i); var hasHeadName = String.Format("HasHead{0}", i); var hasSpeedName = String.Format("HasSpeed{0}", i); var isMlatName = String.Format("IsMlat{0}", i); var passesName = String.Format("Passes{0}", i); var isOutOfBandName = String.Format("OOB{0}", i); if (worksheet.String(listenerNumberName) != null) { var listenerNumber = worksheet.Int(listenerNumberName); var icao = worksheet.String(icaoName); var msOffset = worksheet.Int(msOffsetName); var hasZeroPosn = worksheet.String(hasPosnName) == "0"; var hasPosn = hasZeroPosn ? true : worksheet.Bool(hasPosnName); var hasHead = worksheet.Bool(hasHeadName); var hasSpeed = worksheet.Bool(hasSpeedName); var isMlat = worksheet.Bool(isMlatName); var resetExpected = worksheet.String(passesName) == "True"; var messageExpected = resetExpected || worksheet.String(passesName) == "NoReset"; var isOutOfBand = worksheet.Bool(isOutOfBandName); Mock <IListener> listener; switch (listenerNumber) { case 1: listener = _Listener1; break; case 2: listener = _Listener2; break; default: throw new NotImplementedException(); } _Clock.UtcNowValue = startTime.AddMilliseconds(msOffset); var baseStationMessageEventArgs = new BaseStationMessageEventArgs(new BaseStationMessage() { Icao24 = icao }); if (hasZeroPosn) { baseStationMessageEventArgs.Message.Latitude = baseStationMessageEventArgs.Message.Longitude = 0.0; } else if (hasPosn) { baseStationMessageEventArgs.Message.Latitude = baseStationMessageEventArgs.Message.Longitude = 1.0; } if (hasHead) { baseStationMessageEventArgs.Message.Track = 2; } if (hasSpeed) { baseStationMessageEventArgs.Message.GroundSpeed = 3; } if (isMlat) { baseStationMessageEventArgs.Message.IsMlat = true; } var baseStationMessageEventRecorder = new EventRecorder <BaseStationMessageEventArgs>(); _MergedFeed.Port30003MessageReceived += baseStationMessageEventRecorder.Handler; var positionResetEventArgs = new EventArgs <string>(icao); var positionResetEventRecorder = new EventRecorder <EventArgs <string> >(); _MergedFeed.PositionReset += positionResetEventRecorder.Handler; listener.Raise(r => r.Port30003MessageReceived += null, baseStationMessageEventArgs); listener.Raise(r => r.PositionReset += null, positionResetEventArgs); var failDetails = String.Format("Failed on message {0} {{0}}", i); if (!messageExpected) { Assert.AreEqual(0, baseStationMessageEventRecorder.CallCount, failDetails, "BaseStationMessage"); Assert.AreEqual(0, positionResetEventRecorder.CallCount, failDetails, "PostionReset"); } else { Assert.AreEqual(1, baseStationMessageEventRecorder.CallCount, failDetails, "BaseStationMessage"); Assert.AreSame(_MergedFeed, baseStationMessageEventRecorder.Sender); Assert.AreSame(baseStationMessageEventArgs.Message, baseStationMessageEventRecorder.Args.Message); Assert.AreEqual(isOutOfBand, baseStationMessageEventRecorder.Args.IsOutOfBand); if (!resetExpected) { Assert.AreEqual(0, positionResetEventRecorder.CallCount, failDetails, "PostionReset"); } else { Assert.AreEqual(1, positionResetEventRecorder.CallCount, failDetails, "PositionReset"); Assert.AreSame(_MergedFeed, positionResetEventRecorder.Sender); Assert.AreSame(positionResetEventArgs, positionResetEventRecorder.Args); } } } } }
protected virtual void OnPort30003MessageReceived(BaseStationMessageEventArgs args) { EventHelper.RaiseQuickly(Port30003MessageReceived, this, args); }
public MessageReceived(DateTime receivedUtc, IListener listener, BaseStationMessageEventArgs message) { ReceivedUtc = receivedUtc; Listener = listener; MessageArgs = message; }
/// <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); }