public async Task <bool> GenerateProximityAlerts()
        {
            //bool IsProximityWarning = false;
            //bool IsProximityCritical = false;
            List <Alert> Alerts = new List <Alert>();

            lock (_lockProximity) {
                int[] Keys = Proximities.Keys.ToArray();
                foreach (int Key in Keys)
                {
                    Proximity Item = Proximities[Key];
                    bool      _IsProximityWarning  = false;
                    bool      _IsProximityCritical = false;
                    Console.WriteLine($"Key: {Key}, Distance: {Item.Distance}");
                    if (Item.Distance < 1000)
                    {
                        _IsProximityCritical = true;
                    }
                    else if (Item.Distance < 2000)
                    {
                        _IsProximityWarning = true;
                    }

                    if (_IsProximityWarning && !Item.IsProximityWarning)
                    {
                        //Generate Alert for the proximity
                        var ThisAlert = new Alert(_ExtDroneFlight);
                        ThisAlert.Generate("Proximity", "High", Item);
                        Alerts.Add(ThisAlert);
                        IsAlertedProximityWarning = true;
                    }

                    if (_IsProximityCritical && !Item.IsProximityCritical)
                    {
                        //Generate Alert for proximity Ctitical
                        var ThisAlert = new Alert(_ExtDroneFlight);
                        ThisAlert.Generate("Proximity", "Critical", Item);
                        Alerts.Add(ThisAlert);
                        IsAlertedProximityCritical = true;
                    }

                    Item.IsProximityWarning  = _IsProximityWarning;
                    Item.IsProximityCritical = _IsProximityCritical;
                } //foreach(Proximity Item in Proximities)
            }     //lock (_lockProximity)

            foreach (Alert ThisAlert in Alerts)
            {
                await ThisAlert.Save();
            }

            _DroneFlight.ProximityCritical = IsAlertedProximityCritical ? 1 : 0;
            _DroneFlight.ProximityWarning  = IsAlertedProximityWarning ? 1 : 0;


            return(true);
        }
        public bool Generate(String AlertCategory, String AlertType = "High", Proximity ProximityFlight = null)
        {
            bool   IsMessageGenerated = false;
            String sAltitude          = ((Decimal)(_Flight.Altitude)).ToString("0.00");
            String sFlightTime        = ((DateTime)_Flight.GetBase().FlightDate).ToString("dd-MMM-yyyy HH:mm:ss");

            _AlertCategory = AlertCategory;
            _AlertType     = AlertType;
            switch (AlertCategory.ToLower())
            {
            case "boundary":
            case "altitude":
                _AlertMessage =
                    AlertCategory + "\n" +
                    _AccountName + "\n" +
                    _Flight.PilotName + "\n" +
                    GetLocation() + "\n" +
                    "Altitude: " + sAltitude + " Meter\n" +
                    "UTC " + sFlightTime + "\n" +
                    "Ref: " + _Flight.GetBase().ID;
                IsMessageGenerated = true;
                break;

            case "proximity":
                _AlertMessage =
                    AlertCategory + Environment.NewLine +
                    _AccountName + Environment.NewLine +
                    _Flight.PilotName + Environment.NewLine +
                    _DroneName + Environment.NewLine +
                    GetLocation() + Environment.NewLine +
                    "Altitude: " + sAltitude + " Meter" + Environment.NewLine +
                    "Ref: " + _Flight.GetBase().ID.ToString() + Environment.NewLine +
                    Environment.NewLine +

                    ProximityFlight.AccountName + Environment.NewLine +
                    ProximityFlight.PilotName + Environment.NewLine +
                    ProximityFlight.DroneName + Environment.NewLine +
                    ProximityFlight.Location + Environment.NewLine +
                    "Altitude: " + sAltitude + " Meter" + Environment.NewLine +
                    "Ref: " + ProximityFlight.FlightID.ToString() + Environment.NewLine +
                    Environment.NewLine +

                    "Distance: " + ProximityFlight.Distance.ToString("0.00") + Environment.NewLine +
                    "UTC " + sFlightTime;


                IsMessageGenerated = true;
                break;
            }
            return(IsMessageGenerated);
        }//public String GetAlert
        }//public void ProximityRemove

        public void ProximityAdd(Proximity ThisProximity)
        {
            int Key = ThisProximity.FlightID;

            if (!Proximities.ContainsKey(Key))
            {
                lock (_lockProximity) {
                    Proximities.Add(Key, ThisProximity);
                }
            }
            else
            {
                Proximities[Key].Distance = ThisProximity.Distance;
                Proximities[Key].Lat      = ThisProximity.Lat;
                Proximities[Key].Lng      = ThisProximity.Lng;
            }
        }