private void simulacion() //funcion donde se simula el movimiento de los objetivos { //timer para controlar el tiempo de sleep del hilo, cada ese tiempo, ejecutara la acción. TimeController temporizador = new TimeController(3, false); while (true) { if (temporizador.isCycleDone) { if (listaObjetivos.Count > 0) { for (int i = 0; i < listaObjetivos.Count; i++) { //float tiempo = 10;//hrs double timestampNow = TimeController.timeStamp(); double tiempoEnHoras = (timestampNow - listaObjetivos[i].lastTime) / 3600; //en Hrs //PONER EL NUEVO TIMESTAMP double timestampNow2 = TimeController.timeStamp(); listaObjetivos[i].lastTime = timestampNow2; //distancia en Kilometros float distanciaKm = geodesicUtils.nauticalMilesToKilometer(calculaDistanciaMN2((float)tiempoEnHoras, listaObjetivos[i].speed)); position origen = new position(listaObjetivos[i].lat, listaObjetivos[i].lon); position destino = geodesicUtils.FindPointAtDistanceFrom(origen, geodesicUtils.DegreesToRadians(listaObjetivos[i].course), distanciaKm); //ajustamos las coordenadas de la nueva posicion ajustaCoordenadas(destino, i); //ajustamos el nuevo curso o bearing en la nueva posicion. ajustaRumbo((float)geodesicUtils.bearingFinal(destino, origen), i); } //del ciclo for } } //esperar evento para detener el hilo if (eventoSimulacion.WaitOne(0, false) == true) { //just wait until the last thread is done //Sleep(500); eventoSimulacion.Reset(); //reset the event break; } } }
/* * Calcula la distancia en millas nauticas, teniendo como datos de entrada, la velocidad del objetivo * y el tiempo. */ private float calculaDistanciaMN(double lastTime, float VelEnNudos) //calcula la dist en millas nauticas { /* * Variables * velocidad en Nudos (Millas nauticas / h) * Distancia en Millas (Recordar que el extend de la Display prototype, esta en metros) * Tiempo en Hrs. * * V = D/t * Primer paso. * Tenemos un timestamp de referencia en segundos. * Si el timestamp de referencia, es menor que el timestampNow * iniciamos calculo de distancia recorrida. * */ double timestampNow = TimeController.timeStamp(); double tiempoEnHoras = (timestampNow - lastTime) / 3600; //en Hrs float DistEnMillasNaut = VelEnNudos * (float)tiempoEnHoras; return(DistEnMillasNaut); }
private void btAgregar_Click(object sender, EventArgs e) { //Agregaremos uno a uno los objetivos a la lista decodedMessage objetivo = new decodedMessage(); // MessageBox.Show("Indice" + cbTiposObjetivos.SelectedIndex); //Del tipo seleccionado en la lista, le indicamos que tipo de objetivo es a traves de su msgType switch (cbTiposObjetivos.SelectedIndex) { case 0: objetivo.msgType = 1; //class A break; case 1: objetivo.msgType = 18; //class B break; case 2: objetivo.msgType = 9; //SART break; case 3: objetivo.msgType = 21; //AtoN break; } if (objetivo.msgType > 0) { //validacion del MMSI if (conversionValidaInt64(tbMMSI.Text)) { objetivo.MMSI = System.Convert.ToInt64(tbMMSI.Text); //validacion del campo nombre del Objetivo if (tbNombre.Text != "") { objetivo.shipname = tbNombre.Text; //validacion del campo latitud if ((conversionValidaDouble(tbLatitude.Text) == true) && (tbLatitude.Text != "")) { objetivo.lat = (float)(System.Convert.ToDouble(tbLatitude.Text)); //validacion del campo longitud if ((conversionValidaDouble(tbLongitud.Text) == true) && (tbLongitud.Text != "")) { objetivo.lon = (float)(System.Convert.ToDouble(tbLongitud.Text)); //validacion del campo rumbo if (conversionValidaDouble(tbRumbo.Text) && (tbRumbo.Text != "")) { objetivo.course = (float)(System.Convert.ToDouble(tbRumbo.Text)); //validacion del campo velocidad if (conversionValidaDouble(tbVelocidad.Text) && (tbVelocidad.Text != "")) { objetivo.speed = (float)(System.Convert.ToDouble(tbVelocidad.Text)); //inicializamos con un timestamp en el campo lastTime //check for the current time stamp double now = TimeController.timeStamp(); objetivo.lastTime = now; //MessageBox.Show("mas" + now); //finalmente, agregamos el objetivo listaObjetivos.Add(objetivo); //limpiamos cajas de texto tbMMSI.Clear(); tbNombre.Clear(); tbLatitude.Clear(); tbLongitud.Clear(); tbRumbo.Clear(); tbVelocidad.Clear(); //informamos al usuario //MessageBox.Show("Objetivo Agregado"); } else { MessageBox.Show("El campo, Velocidad no es valido, o esta vacio"); tbVelocidad.Clear(); } } else { MessageBox.Show("El campo, Rumbo no es valido, o esta vacio"); tbRumbo.Clear(); } } else { MessageBox.Show("El campo, Longitud no es valido, o esta vacio"); tbLongitud.Clear(); } } else { MessageBox.Show("El campo, Latitud no es valido, ó esta vacio"); tbLatitude.Clear(); } } else { MessageBox.Show("El campo, nombre de la Embarcación, no puede estar vacio"); } } else { MessageBox.Show("El campo, MMSI de la Embarcación, no es valido ó esta vacio."); tbMMSI.Clear(); } } //de la validacion del combo box else { MessageBox.Show("Seleccione un tipo de Objetivo"); } //else de la validacion del combo box }