示例#1
0
        public List <int> ICAODetectedDGPS(LectorMensaje lista) //Retorna un vector que en cada posicion tiene los indices de myList que corresponden a un unico avion (compara ICAO Adress)
        {
            //Funciona para listas de tipo D-GPS, necesita como parametro de entrada la lista general y usa Icao Adress del D-GPS

            int        indice    = 0;
            List <int> listaIcao = new List <int>();

            while ((lista.GetPlanI(indice).GetICAOAdress() == "No Data") && (indice < lista.GetNumList()))
            {
                indice++;
            }

            if (indice < lista.GetNumList())
            {
                for (int i = indice; i < lista.GetNumList(); i++)
                {
                    if (lista.GetPlanI(i).GetICAOAdress() == myList[0].GetICAOAdress())
                    {
                        listaIcao.Add(i);
                    }
                }
            }
            return(listaIcao);
        }
示例#2
0
        public int SetIndicesDGPS(LectorMensaje lista)
        {
            //Al aplicar esta funcion a una lista de DGPS, la compara con la lista introducida como parametro, y rellena el campo indiceDGPS de la lista de DGPS
            //El campo indiceDGPS asigna la posicion en el vector myList en la que se encuentra el punto con el que se va a comparar
            //Para escoger estos indices. Se busca en MyList los paquetes que tienen el mismo ICAO Address que el D-GPS
            //Despues se mira que franja de tiempo que comparten y se fija un tiempo inicial y final
            //Finalmente se escoge que puntos de la lista D-GPS estan mas cerca (en tiempo) de la lista principal. En principio se tendra 1 dato/s de MLAT y varios datos/s de D-GPS
            //Tambien retorna el numero de puntos emparejados

            for (int m = 0; m < myList.Count(); m++)
            {
                myList[m].SetIndiceDGPS(-1);//Puede que la lista se este recargando (reasignando indices), por lo que reseteamos todo a -1
            }

            int        match             = 0;
            List <int> icaoList          = ICAODetectedDGPS(lista);
            int        indiceInicialMLAT = -1;
            int        indiceFinalMLAT   = -1;
            bool       yaEsta            = false;
            int        i = 0;

            if (icaoList.Count() != 0)
            {
                if (myList[0].GetUTCcorregido() >= lista.GetPlanI(icaoList[0]).GetUTCcorregido())
                {
                    if (myList[myList.Count() - 1].GetUTCcorregido() >= lista.GetPlanI(icaoList[icaoList.Count() - 1]).GetUTCcorregido())
                    {
                        //Caso 1: D-GPS marca el inicio y MLAT el final (D-GPS empieza despues de MLAT, D-GPS acaba despues de MLAT)
                        indiceFinalMLAT = icaoList.Count() - 1;
                        while ((i < icaoList.Count()) && (!yaEsta))
                        {
                            if (lista.GetPlanI(icaoList[i]).GetUTCcorregido() >= myList[0].GetUTCcorregido())
                            {
                                indiceInicialMLAT = i;
                                yaEsta            = true;
                            }
                            i++;
                        }
                    }
                    else
                    {
                        //Caso 2: D-GPS marca el inicio y el final
                        while ((i < icaoList.Count()) && (!yaEsta))
                        {
                            if (lista.GetPlanI(icaoList[i]).GetUTCcorregido() >= myList[0].GetUTCcorregido())
                            {
                                indiceInicialMLAT = i;
                                yaEsta            = true;
                            }
                            i++;
                        }
                        yaEsta = false;
                        i      = 0;
                        while ((i < icaoList.Count()) && (!yaEsta))
                        {
                            if (lista.GetPlanI(icaoList[i]).GetUTCcorregido() > myList[myList.Count() - 1].GetUTCcorregido())
                            {
                                indiceFinalMLAT = i - 1;//Nos pasamos con el >, compensamos con -1
                                yaEsta          = true;
                            }
                            i++;
                        }
                    }
                }
                else if (myList[0].GetUTCcorregido() < lista.GetPlanI(icaoList[0]).GetUTCcorregido())
                {
                    if (myList[myList.Count() - 1].GetUTCcorregido() <= lista.GetPlanI(icaoList[icaoList.Count() - 1]).GetUTCcorregido())
                    {
                        //Caso 3: MLAT marca el inicio y D-GPS el final
                        indiceInicialMLAT = 0;
                        while ((i < icaoList.Count()) && (!yaEsta))
                        {
                            if (lista.GetPlanI(icaoList[i]).GetUTCcorregido() > myList[myList.Count() - 1].GetUTCcorregido())
                            {
                                indiceFinalMLAT = i - 1;//Nos pasamos con el >, compensamos con -1
                                yaEsta          = true;
                            }
                            i++;
                        }
                    }
                    else
                    {
                        //Caso 4: MLAT marca el inicio y el final
                        indiceInicialMLAT = 0;
                        indiceFinalMLAT   = icaoList.Count() - 1;
                    }
                }
                else
                {
                    //Caso 5: No se comparte franja de tiempo
                    indiceInicialMLAT = -1;
                    indiceFinalMLAT   = -1;
                }

                int    indiceI      = Convert.ToInt32(myList.Count() / 2);                                                             //En algunos ficheros de D-GPS los primeros paquetes llegan muy separados en tiempo. Buscamos la tasa de refresco en la mitad del fichero
                double tasaRefresco = Math.Round((myList[indiceI + 1].GetUTCcorregido() - myList[indiceI].GetUTCcorregido()) * 60, 1); //solo se comparan puntos a +/- la tasa de refresco
                if ((indiceInicialMLAT != -1) && (indiceFinalMLAT != -1))                                                              //Si hay franja compartida
                {
                    double diferenciaTiempoGanador;
                    int    indiceGanador;
                    bool   encontrado;
                    int    m = 0;         //Esta fuera del for para que no se reinicie para cada punto
                    int    guardarIndice; //Si un punto no se encuentra, el siguiente empieza a analizar desde guardarIndice
                    for (int n = indiceInicialMLAT; n <= indiceFinalMLAT; n++)
                    {
                        diferenciaTiempoGanador = Math.Pow(10, 8);
                        indiceGanador           = -1;
                        encontrado    = false;
                        guardarIndice = m;
                        while ((m < myList.Count()) && (!encontrado))
                        {
                            double diferenciaTemporalTiempo = Math.Abs(myList[m].GetUTCcorregido() - lista.GetPlanI(icaoList[n]).GetUTCcorregido()) * 60;
                            if (diferenciaTemporalTiempo <= tasaRefresco)
                            {
                                if (diferenciaTemporalTiempo < diferenciaTiempoGanador)
                                {
                                    diferenciaTiempoGanador = Math.Abs(myList[m].GetUTCcorregido() - lista.GetPlanI(icaoList[n]).GetUTCcorregido()) * 60;
                                    indiceGanador           = m;
                                }
                            }
                            else
                            {
                                if (diferenciaTiempoGanador != Math.Pow(10, 8))
                                {
                                    encontrado = true;//Si ya ha encontrado un punto ganador, paramos de analizar. En el siguiente punto seguimos desde este indice
                                    //Si no se hace asi, el tiempo de procesado augmenta considerablemente
                                    m = m - 1;
                                }
                            }

                            m++;

                            if (m == myList.Count())
                            {
                                m          = guardarIndice;
                                encontrado = true;//No se ha encontrado, pero asi se sale del bucle
                            }
                        }
                        if (indiceGanador != -1)
                        {
                            myList[indiceGanador].SetIndiceDGPS(icaoList[n]);
                            match++;
                        }
                    }
                }
            }
            return(match);
        }