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); }
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); }