Exemple #1
0
        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);
            }
        }
Exemple #2
0
 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));
             }
         }
     }
 }
Exemple #3
0
        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));
        }
Exemple #4
0
        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;
        }