Пример #1
0
        /// <summary>
        /// //////////////////////////////////////////////////////////////////////////////////////
        /// DO NOT CHANGE THE ORDER OF CALLS BELOW !!!
        /// 
        /// </summary>
        private static void UpdateGlobalList()
        {
            foreach (TargetType CurrentTarget in CurrentTargetList)
            {
                CurrentTarget.TrackTerminateTreshold = 0;
                if (CurrentTarget.TrackNumber != -1)
                {
                    GlobalTargetList[CurrentTarget.TrackNumber].ModeA = CurrentTarget.ModeA;
                    GlobalTargetList[CurrentTarget.TrackNumber].ModeC_Previous_Cycle = "";
                    if (GlobalTargetList[CurrentTarget.TrackNumber].ModeC != null)
                        GlobalTargetList[CurrentTarget.TrackNumber].ModeC_Previous_Cycle = "" + GlobalTargetList[CurrentTarget.TrackNumber].ModeC;
                    GlobalTargetList[CurrentTarget.TrackNumber].ModeC = CurrentTarget.ModeC;
                    GlobalTargetList[CurrentTarget.TrackNumber].CALC_GSPD = CurrentTarget.CALC_GSPD;
                    if (CurrentTarget.DAP_GSPD != "N/A")
                        GlobalTargetList[CurrentTarget.TrackNumber].DAP_GSPD = CurrentTarget.DAP_GSPD;
                    GlobalTargetList[CurrentTarget.TrackNumber].ACID_Mode_S = CurrentTarget.ACID_Mode_S;
                    if (CurrentTarget.Mode_S_Addr != "N/A")
                        GlobalTargetList[CurrentTarget.TrackNumber].Mode_S_Addr = CurrentTarget.Mode_S_Addr;
                    if (CurrentTarget.DAP_HDG != "N/A")
                        GlobalTargetList[CurrentTarget.TrackNumber].DAP_HDG = CurrentTarget.DAP_HDG;
                    GlobalTargetList[CurrentTarget.TrackNumber].CALC_HDG = CurrentTarget.CALC_HDG;
                    if (CurrentTarget.IAS != "N/A")
                        GlobalTargetList[CurrentTarget.TrackNumber].IAS = CurrentTarget.IAS;
                    if (CurrentTarget.TRK != "N/A")
                        GlobalTargetList[CurrentTarget.TrackNumber].TRK = CurrentTarget.TRK;
                    if (CurrentTarget.MACH != "N/A")
                        GlobalTargetList[CurrentTarget.TrackNumber].MACH = CurrentTarget.MACH;
                    if (CurrentTarget.TAS != "N/A")
                        GlobalTargetList[CurrentTarget.TrackNumber].TAS = CurrentTarget.TAS;
                    if (CurrentTarget.Roll_Ang != "N/A")
                        GlobalTargetList[CurrentTarget.TrackNumber].Roll_Ang = CurrentTarget.Roll_Ang;
                    if (CurrentTarget.SelectedAltitude_ShortTerm != "N/A")
                        GlobalTargetList[CurrentTarget.TrackNumber].SelectedAltitude_ShortTerm = CurrentTarget.SelectedAltitude_ShortTerm;
                    if (CurrentTarget.SelectedAltitude_LongTerm != "N/A")
                        GlobalTargetList[CurrentTarget.TrackNumber].SelectedAltitude_LongTerm = CurrentTarget.SelectedAltitude_LongTerm;
                    if (CurrentTarget.Rate_Of_Climb != "N/A")
                        GlobalTargetList[CurrentTarget.TrackNumber].Rate_Of_Climb = CurrentTarget.Rate_Of_Climb;
                    if (CurrentTarget.Barometric_Setting != "N/A")
                        GlobalTargetList[CurrentTarget.TrackNumber].Barometric_Setting = CurrentTarget.Barometric_Setting;
                    GlobalTargetList[CurrentTarget.TrackNumber].Lat = CurrentTarget.Lat;
                    GlobalTargetList[CurrentTarget.TrackNumber].Lon = CurrentTarget.Lon;
                    GlobalTargetList[CurrentTarget.TrackNumber].TimeSinceMidnight = CurrentTarget.TimeSinceMidnight;

                    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    // Handle history points
                    if (GlobalTargetList[CurrentTarget.TrackNumber].MyMarker.HistoryPoints.Count > 0)
                    {
                        // select a reference elllipsoid
                        Ellipsoid reference = Ellipsoid.WGS84;
                        // instantiate the calculator
                        GeodeticCalculator geoCalc = new GeodeticCalculator();
                        GlobalPosition Track_1 = new GlobalPosition(new GlobalCoordinates(CurrentTarget.Lat, CurrentTarget.Lon));
                        GlobalPosition Track_2 = new GlobalPosition(new GlobalCoordinates(GlobalTargetList[CurrentTarget.TrackNumber].MyMarker.HistoryPoints.Last().LatLong.Lat,
                            GlobalTargetList[CurrentTarget.TrackNumber].MyMarker.HistoryPoints.Last().LatLong.Lng));

                        // Calculate distance traveled
                        double DistanceTraveled = geoCalc.CalculateGeodeticMeasurement(reference, Track_1, Track_2).PointToPointDistance;
                        DistanceTraveled = DistanceTraveled * 0.00053996; // Convert to nautical miles
                        double BetweenTwoUpdates = CurrentTarget.TimeSinceMidnight - GlobalTargetList[CurrentTarget.TrackNumber].MyMarker.HistoryPoints.Last().TimeSinceMidnight;

                        int Miliseconds = (int)(((BetweenTwoUpdates - Math.Floor(BetweenTwoUpdates)) * 10.0));
                        TimeSpan TimeDifference = new TimeSpan(0, 0, 0, (int)Math.Floor(BetweenTwoUpdates), Miliseconds);

                        // Only update history position if there was actually a change in the distance
                        if (DistanceTraveled > 0)
                        {
                            if (GlobalTargetList[CurrentTarget.TrackNumber].MyMarker.HistoryPoints.Count > Max_History_Points)
                                GlobalTargetList[CurrentTarget.TrackNumber].MyMarker.HistoryPoints.Dequeue();
                            GMapTargetandLabel.HistoryPointsType HP = new GMapTargetandLabel.HistoryPointsType();
                            HP.LatLong = new PointLatLng(CurrentTarget.Lat, CurrentTarget.Lon);
                            HP.TimeSinceMidnight = CurrentTarget.TimeSinceMidnight;
                            GlobalTargetList[CurrentTarget.TrackNumber].MyMarker.HistoryPoints.Enqueue(HP);
                        }
                    }
                    else
                    {
                        GMapTargetandLabel.HistoryPointsType HP = new GMapTargetandLabel.HistoryPointsType();
                        HP.LatLong = new PointLatLng(CurrentTarget.Lat, CurrentTarget.Lon);
                        HP.TimeSinceMidnight = CurrentTarget.TimeSinceMidnight;
                        GlobalTargetList[CurrentTarget.TrackNumber].MyMarker.HistoryPoints.Enqueue(HP);
                    }
                    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

                    GlobalTargetList[CurrentTarget.TrackNumber].TrackNumber = CurrentTarget.TrackNumber;
                    GlobalTargetList[CurrentTarget.TrackNumber].TrackTerminateTreshold = CurrentTarget.TrackTerminateTreshold;
                }
                else
                {
                    int ModeAIndex = int.Parse(CurrentTarget.ModeA.ToString());
                    GlobalTargetList[ModeAIndex].ModeA = CurrentTarget.ModeA;
                    GlobalTargetList[ModeAIndex].ModeC_Previous_Cycle = "";
                    if (GlobalTargetList[ModeAIndex].ModeC != null)
                        GlobalTargetList[ModeAIndex].ModeC_Previous_Cycle = "" + GlobalTargetList[ModeAIndex].ModeC;
                    GlobalTargetList[ModeAIndex].ModeC = CurrentTarget.ModeC;
                    if (CurrentTarget.DAP_GSPD != "N/A")
                        GlobalTargetList[ModeAIndex].DAP_GSPD = CurrentTarget.DAP_GSPD;
                    GlobalTargetList[ModeAIndex].CALC_GSPD = CurrentTarget.CALC_GSPD;
                    GlobalTargetList[ModeAIndex].ACID_Mode_S = CurrentTarget.ACID_Mode_S;
                    if (CurrentTarget.Mode_S_Addr != "N/A")
                        GlobalTargetList[ModeAIndex].Mode_S_Addr = CurrentTarget.Mode_S_Addr;
                    if (CurrentTarget.DAP_HDG != "N/A")
                        GlobalTargetList[ModeAIndex].DAP_HDG = CurrentTarget.DAP_HDG;
                    GlobalTargetList[ModeAIndex].CALC_HDG = CurrentTarget.CALC_HDG;
                    if (CurrentTarget.IAS != "N/A")
                        GlobalTargetList[ModeAIndex].IAS = CurrentTarget.IAS;
                    if (CurrentTarget.TRK != "N/A")
                        GlobalTargetList[ModeAIndex].TRK = CurrentTarget.TRK;
                    if (CurrentTarget.MACH != "N/A")
                        GlobalTargetList[ModeAIndex].MACH = CurrentTarget.MACH;
                    if (CurrentTarget.TAS != "N/A")
                        GlobalTargetList[ModeAIndex].TAS = CurrentTarget.TAS;
                    if (CurrentTarget.Roll_Ang != "N/A")
                        GlobalTargetList[ModeAIndex].Roll_Ang = CurrentTarget.Roll_Ang;
                    if (CurrentTarget.SelectedAltitude_ShortTerm != "N/A")
                        GlobalTargetList[ModeAIndex].SelectedAltitude_ShortTerm = CurrentTarget.SelectedAltitude_ShortTerm;
                    if (CurrentTarget.SelectedAltitude_LongTerm != "N/A")
                        GlobalTargetList[ModeAIndex].SelectedAltitude_LongTerm = CurrentTarget.SelectedAltitude_LongTerm;
                    if (CurrentTarget.Rate_Of_Climb != "N/A")
                        GlobalTargetList[ModeAIndex].Rate_Of_Climb = CurrentTarget.Rate_Of_Climb;
                    if (CurrentTarget.Barometric_Setting != "N/A")
                        GlobalTargetList[ModeAIndex].Barometric_Setting = CurrentTarget.Barometric_Setting;
                    GlobalTargetList[ModeAIndex].Lat = CurrentTarget.Lat;
                    GlobalTargetList[ModeAIndex].Lon = CurrentTarget.Lon;
                    GlobalTargetList[ModeAIndex].TimeSinceMidnight = CurrentTarget.TimeSinceMidnight;

                    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    // Handle history points
                    if (GlobalTargetList[ModeAIndex].MyMarker.HistoryPoints.Count > 0)
                    {
                        // select a reference elllipsoid
                        Ellipsoid reference = Ellipsoid.WGS84;
                        // instantiate the calculator
                        GeodeticCalculator geoCalc = new GeodeticCalculator();
                        GlobalPosition Track_1 = new GlobalPosition(new GlobalCoordinates(CurrentTarget.Lat, CurrentTarget.Lon));
                        GlobalPosition Track_2 = new GlobalPosition(new GlobalCoordinates(GlobalTargetList[ModeAIndex].MyMarker.HistoryPoints.Last().LatLong.Lat,
                            GlobalTargetList[ModeAIndex].MyMarker.HistoryPoints.Last().LatLong.Lng));

                        // Calculate distance traveled
                        double DistanceTraveled = geoCalc.CalculateGeodeticMeasurement(reference, Track_1, Track_2).PointToPointDistance;
                        DistanceTraveled = DistanceTraveled * 0.00053996; // Convert to nautical miles
                        double BetweenTwoUpdates = CurrentTarget.TimeSinceMidnight - GlobalTargetList[ModeAIndex].MyMarker.HistoryPoints.Last().TimeSinceMidnight;

                        int Miliseconds = (int)(((BetweenTwoUpdates - Math.Floor(BetweenTwoUpdates)) * 10.0));
                        TimeSpan TimeDifference = new TimeSpan(0, 0, 0, (int)Math.Floor(BetweenTwoUpdates), Miliseconds);

                        // Only update history position if there was actually a change in the distance
                        if (DistanceTraveled > 0)
                        {
                            if (GlobalTargetList[ModeAIndex].MyMarker.HistoryPoints.Count > Max_History_Points)
                                GlobalTargetList[ModeAIndex].MyMarker.HistoryPoints.Dequeue();
                            GMapTargetandLabel.HistoryPointsType HP = new GMapTargetandLabel.HistoryPointsType();
                            HP.LatLong = new PointLatLng(CurrentTarget.Lat, CurrentTarget.Lon);
                            HP.TimeSinceMidnight = CurrentTarget.TimeSinceMidnight;
                            GlobalTargetList[ModeAIndex].MyMarker.HistoryPoints.Enqueue(HP);
                        }
                    }
                    else
                    {
                        GMapTargetandLabel.HistoryPointsType HP = new GMapTargetandLabel.HistoryPointsType();
                        HP.LatLong = new PointLatLng(CurrentTarget.Lat, CurrentTarget.Lon);
                        HP.TimeSinceMidnight = CurrentTarget.TimeSinceMidnight;
                        GlobalTargetList[ModeAIndex].MyMarker.HistoryPoints.Enqueue(HP);
                    }
                    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

                    GlobalTargetList[ModeAIndex].TrackNumber = ModeAIndex;
                    GlobalTargetList[ModeAIndex].TrackTerminateTreshold = CurrentTarget.TrackTerminateTreshold;
                }
            }

            CurrentTargetList.Clear();
            foreach (TargetType GlobalTarget in GlobalTargetList)
            {
                if (GlobalTarget.TrackTerminateTreshold < Properties.Settings.Default.TrackCoast)
                {
                    TargetType NewTarget = new TargetType();
                    GlobalTarget.TrackTerminateTreshold++;
                    NewTarget.ModeA = GlobalTarget.ModeA;
                    NewTarget.ModeC_Previous_Cycle = GlobalTarget.ModeC_Previous_Cycle;
                    NewTarget.ModeC = GlobalTarget.ModeC;
                    NewTarget.CALC_GSPD = GlobalTarget.CALC_GSPD;
                    NewTarget.DAP_GSPD = GlobalTarget.DAP_GSPD;
                    NewTarget.ACID_Mode_S = GlobalTarget.ACID_Mode_S;
                    NewTarget.Mode_S_Addr = GlobalTarget.Mode_S_Addr;
                    NewTarget.TRK = GlobalTarget.TRK;
                    NewTarget.TAS = GlobalTarget.TAS;
                    NewTarget.Roll_Ang = GlobalTarget.Roll_Ang;
                    NewTarget.SelectedAltitude_ShortTerm = GlobalTarget.SelectedAltitude_ShortTerm;
                    NewTarget.SelectedAltitude_LongTerm = GlobalTarget.SelectedAltitude_LongTerm;
                    NewTarget.Rate_Of_Climb = GlobalTarget.Rate_Of_Climb;
                    NewTarget.MACH = GlobalTarget.MACH;
                    NewTarget.DAP_HDG = GlobalTarget.DAP_HDG;
                    NewTarget.CALC_HDG = GlobalTarget.CALC_HDG;
                    NewTarget.IAS = GlobalTarget.IAS;
                    NewTarget.Barometric_Setting = GlobalTarget.Barometric_Setting;
                    NewTarget.Lat = GlobalTarget.Lat;
                    NewTarget.Lon = GlobalTarget.Lon;
                    NewTarget.TimeSinceMidnight = GlobalTarget.TimeSinceMidnight;
                    NewTarget.TrackNumber = GlobalTarget.TrackNumber;
                    NewTarget.TrackTerminateTreshold = GlobalTarget.TrackTerminateTreshold;
                    NewTarget.MyMarker = GlobalTarget.MyMarker;
                    CurrentTargetList.Add(NewTarget);
                }
                else
                {
                    if (GlobalTarget.MyMarker != null)
                        GlobalTarget.MyMarker.TerminateTarget();
                }
            }

            if (Properties.Settings.Default.DisplayPSR == true)
            {
                // Now append all the PSR tracks to the end of the display list
                foreach (TargetType PSRTgtList in PSRTargetList)
                {
                    TargetType NewTarget = new TargetType();
                    NewTarget.ModeC_Previous_Cycle = PSRTgtList.ModeC_Previous_Cycle;
                    NewTarget.Lat = PSRTgtList.Lat;
                    NewTarget.Lon = PSRTgtList.Lon;
                    NewTarget.TrackNumber = PSRTgtList.TrackNumber;
                    NewTarget.TrackTerminateTreshold = 0;
                    NewTarget.MyMarker = PSRTgtList.MyMarker;
                    CurrentTargetList.Add(NewTarget);
                }
            }
        }