private void TrackFactory_OnTrackListDoneEvent(object sender, TrackDataEventArgs e) { SetCursorPosition(0, 2); Console.Write($"Outside: {e.TrackData.Count - _airplanesInAirspace} Inside: {_airplanesInAirspace}", CultureInfo.CurrentCulture); var printValidPlanesEntered = _screenTimerEnter.Where(x => (DateTime.Now - x.Value) <= TimeSpan.FromSeconds(5)).Select(x => x.Key).ToList(); var expiredPlanesEntered = _screenTimerEnter.Keys.Except(printValidPlanesEntered).ToList(); SetCursorPosition(0, 3); Console.Write($"Following planes has entered the airspace: {string.Join(", ", printValidPlanesEntered)} {string.Join(" ", expiredPlanesEntered.Select(x => "".PadRight(x.Length, ' ')))}", CultureInfo.CurrentCulture); var printValidPlanesExited = _screenTimerExit.Where(x => (DateTime.Now - x.Value) <= TimeSpan.FromSeconds(5)).Select(x => x.Key).ToList(); var expiredPlanesExited = _screenTimerExit.Keys.Except(printValidPlanesExited).ToList(); SetCursorPosition(0, 4); Console.Write($"Following planes has exited the airspace: {string.Join(", ", printValidPlanesExited)} {string.Join(" ", expiredPlanesExited.Select(x => "".PadRight(x.Length, ' ')))}", CultureInfo.CurrentCulture); foreach (var tag in expiredPlanesEntered) { _screenTimerEnter.Remove(tag); } foreach (var tag in expiredPlanesExited) { _screenTimerExit.Remove(tag); } }
private void FindPlanesOnCollision(object sender, TrackDataEventArgs e) { foreach (var plane1 in e.TrackData) { foreach (var plane2 in e.TrackData) { string collisionKey = $"{plane1.Key};{plane2.Key}"; if (plane1.Key == plane2.Key) { continue; } if (Math.Abs(plane1.Value.Altitude - plane2.Value.Altitude) <= verticalSeparation && Math.Abs(plane1.Value.XCoord - plane2.Value.XCoord) <= horizontalSeparation && Math.Abs(plane1.Value.YCoord - plane2.Value.YCoord) <= horizontalSeparation) { if (!_planesOnCollision.Contains(collisionKey)) { _planesOnCollision.Add(collisionKey); OnPlaneCollision?.Invoke(this, new CollisionEventArgs(plane1.Value, plane2.Value)); } } else if (_planesOnCollision.Contains(collisionKey)) { _planesOnCollision.Remove(collisionKey); OnPlaneAvoidedCollision?.Invoke(this, new CollisionEventArgs(plane1.Value, plane2.Value)); } } } }
private void Track_OnTrackListDoneEvent(object sender, TrackDataEventArgs e) { foreach (var track in e.TrackData) { var _countx = e.TrackData.Count; if (IsInsideAirspace(track.Value)) { if (!insideAirspace.Contains(track.Key)) { insideAirspace.Add(track.Key); OnPlaneEnteringAirspace?.Invoke(this, new TrackEventArgs(track.Value)); } if (outsideAirspace.Contains(track.Key)) { outsideAirspace.Remove(track.Key); // If true track just entered airspace. } Utilities.CalculateHeading(track.Value); Utilities.CalculateVelocity(track.Value); // TODO: Raise “TrackEnteredAirspace”-event for 5 seconds. Include rendition of the track and the time. //Console.SetCursorPosition(0, 9); //Console.Write($"{track.Key} - entered Airspace.",CultureInfo.CurrentCulture); } else { if (!outsideAirspace.Contains(track.Key)) { outsideAirspace.Add(track.Key); } if (insideAirspace.Contains(track.Key)) { insideAirspace.Remove(track.Key); // If true track just left airspace. OnPlaneExitingAirspace?.Invoke(this, new TrackEventArgs(track.Value)); // TODO: Raise "Track Left Airspace”-event for 5 seconds. Include rendition of the track and the time. //Console.SetCursorPosition(0, 10); //Console.Write($"{track.Key} - left Airspace.",CultureInfo.CurrentCulture); } } } // TODO: Remove all tracks, from the global track dictionary, which are outside the airspace. var AirspaceTracks = e.TrackData.Where(x => insideAirspace.Contains(x.Key)).ToDictionary(x => x.Key, v => v.Value); OnAirspaceCheckEventDone?.Invoke(this, new TrackDataEventArgs(AirspaceTracks)); }
private void Airspace_OnAirspaceCheckEventDone(object sender, TrackDataEventArgs e) { var nCharCount = 0; for (int i = 0; i < e.TrackData.Count; i++) { var track = e.TrackData.ElementAt(i); var collidingPlanesText = "".PadRight(50, ' '); List <string> collidingPlaneTag; if (_screenTimerCollisions.TryGetValue(track.Value.Tag, out collidingPlaneTag) && collidingPlaneTag.Any()) { collidingPlanesText = $"Planes on collision path: {string.Join(", ", collidingPlaneTag)}"; Console.ForegroundColor = ConsoleColor.Red; } else { Console.ForegroundColor = ConsoleColor.White; } SetCursorPosition(0, 5 + i); var outputData = ($"Tag: {track.Value.Tag.PadRight(8,' ')}" + $"X-Coord: {track.Value.XCoord.ToString().PadRight(7, ' ')}" + $"Y-Coord: {track.Value.YCoord.ToString().PadRight(7, ' ')}" + $"Altitude: {track.Value.Altitude.ToString().PadRight(7, ' ')}" + $"Timestamp: {track.Value.TimeStamp:yyyyMMddHHmmssfff} " + $"Heading: {track.Value.Heading.ToString().PadRight(5, ' ')}" + $"Velocity: {track.Value.Velocity.ToString().PadRight(5, ' ')}" + $"{collidingPlanesText}"); nCharCount = Math.Max(outputData.Length, nCharCount); Console.Write(outputData + "".PadRight(Math.Max(0, nCharactersCollidingPlanes - outputData.Length), ' ')); } var emptyLines = _airplanesInAirspace - e.TrackData.Count; for (int i = 0; i < emptyLines; i++) { SetCursorPosition(0, 5 + e.TrackData.Count + i); Console.Write(" "); } _airplanesInAirspace = e.TrackData.Count; nCharactersCollidingPlanes = nCharCount; }