//---------------------------------------------------------------------------//
//                 Autor: José Manuel Toledo Fernández                       //
//                 Fecha: 10-5-2006                                          //
//                 Nombre: UFmediapos.cpp                                    //
//                                                                           //
//  Descripción: Este archivo contiene la interfaz encargada de calcular    //
//               la posición de la estación base mediante el comando log     //
//---------------------------------------------------------------------------//
#include <vcl.h>
#pragma hdrstop

#include "GestionTrama.h"

#include "UFmediapos.h"
#include "UFprincipal.h"
#include "hiloppal.h"
#include "hiloesc.h"
#include "UfposaveConf.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TFormMediapos *FormMediapos;
//---------------------------------------------------------------------------
//! Inicializa las variables de este Form a su valor inicial
__fastcall TFormMediapos::TFormMediapos(TComponent* Owner)
        : TForm(Owner)
{
        Timer1->Enabled = false;
        Timer2->Enabled = false;
        lat_tot = 0;
        lon_tot = 0;
        alt_tot = 0;
        num_tramas = 0;
        Log = "";
        Activo = false;
        Tipotrama = -1;   //inicialmente no hay trama elegida
        Finalizar = false;
        Label2->Caption = "Proceso . . . .";
}
//--------------------------------------------------------------------
//! Función que inicializa los valores de las variables
void __fastcall TFormMediapos::FormActivate(TObject *Sender)
{
   if(Activo == false)
   {
      Activo = true;

      gpggartk = new Tgpggartk;
      gpggartk->lat_grad=0;
      gpggartk->lat_min=0;
      gpggartk->lat_dir='N';
      gpggartk->lon_grad=0;
      gpggartk->lon_min=0;
      gpggartk->lon_dir='W';
      gpggartk->hora='0';
      gpggartk->alt=0;

      gpgll = new Tgpgll;
      gpgll->lat_grad=0;
      gpgll->lat_min=0;
      gpgll->lat_dir='N';
      gpgll->lon_grad=0;
      gpgll->lon_min=0;
      gpgll->lon_dir='W';
      gpgll->hora='0';
      gpgll->estado='V';

      TxtDuracion->Text = "";
      Txtperiodo->Text = "";
      ProgressBar1->Position = 0;
      Button2->Enabled = false;
      Button1->Enabled = true;
      Button4->Enabled = false;
   }
   else
      Repaint();
}
//---------------------------------------------------------------------------
//! Este función inicia el calculo de la posición
void __fastcall TFormMediapos::Button1Click(TObject *Sender)
{
   AnsiString Comando = "";

   periodo = atoi(Txtperiodo->Text.c_str());
   duracion = atoi(TxtDuracion->Text.c_str());

   if ((duracion <= 0)||(periodo <= 0))
      ShowMessage("Los parametros introducidos son erróneos");
   else if(duracion < periodo)
      ShowMessage("El periodo debe ser menor que el tiempo\n de duración del proceso");
   else
   {
      Tipotrama = Trama->ItemIndex;
      Finalizar = false;

      Button1->Enabled = false;
      Button2->Enabled = true;
      Button4->Enabled = false;

      if(Trama->ItemIndex == 0)
         Log = "LOG GPGLL ";
      else if(Trama->ItemIndex == 1)
         Log = "LOG GPGGA ";
      else
         Log = "LOG GPGGARTK ";

      Comando = Log+"ONTIME "+(AnsiString)periodo;

      FormPrincipal->HiloEsc->SC->Acquire();
      try
      {
         FormPrincipal->HiloEsc->cadena=Comando;  //solicita la trama gpggartk cada 30 seg
         FormPrincipal->HiloEsc->transmitido=true;
         while(FormPrincipal->HiloEsc->transmitido==true){};
      }
      __finally
      {
         FormPrincipal->HiloEsc->SC->Release();
      }

      lat_tot = 0;
      lon_tot = 0;
      alt_tot = 0;
      num_tramas = 0;
      Timer1->Interval=duracion*1000;
      Timer1->Enabled=true;
      ProgressBar1->Position = 0;
      Timer2->Interval = Timer1->Interval / 95;
      Timer2->Enabled = true;
   }
}
//--------------------------------------------------------------------------
//! Esta función detiene el proceso de calculo de la posición
void __fastcall TFormMediapos::Button2Click(TObject *Sender)
{
   Finalizar = true;
   Button4->Enabled = true;
   Button2->Enabled = false;
   Button1->Enabled = true;
   Timer1->Interval = 1;    //en una milesima de segundo se desactiva el timer
   ProgressBar1->Position = 0;
}
//--------------------------------------------------------------------------
//! Cierra el formulario encargado de calcular la posición
void __fastcall TFormMediapos::Button3Click(TObject *Sender)
{
   Timer1->Interval = 1;    //en una milesima de segundo se desactiva el timer
   Timer1->Enabled = true;
   Activo = false;
   Finalizar = true;

   FormMediapos->Visible = false;
   Close();
}
//---------------------------------------------------------------------------
//! Gestiona los valores recibidos para el calculo de la media
void __fastcall TFormMediapos::Calcular()
{
   double lat;
   double lon;
   double alt;

   if(Tipotrama == 0)
   {
      lat = gpgll->lat_grad + gpgll->lat_min/60.00000+gpgll->lat_seg/3600.00000;
      if(gpgll->lat_dir == 'S')
         lat = 0 - lat;

      lon = gpgll->lon_grad + gpgll->lon_min/60.00000+gpgll->lon_seg/3600.00000;
      if(gpgll->lon_dir == 'W')
         lon = 0 - lon;

      if (num_tramas <= 1)
      {
         lat_tot = lat;
         lon_tot = lon;
      }
      else
      {
         lat_tot = (lat_tot*(num_tramas-1))/(num_tramas);
         lat_tot+= lat/(num_tramas);
         lon_tot = (lon_tot*(num_tramas-1))/(num_tramas);
         lon_tot+= (lon/(num_tramas));
      }
   }
   else if((Tipotrama == 1)||(Tipotrama == 2))
   {
      alt = gpggartk->alt;

      lat = gpggartk->lat_grad + gpggartk->lat_min/60.00000+gpggartk->lat_seg/3600.00000;
      if(gpggartk->lat_dir == 'S')
         alt = 0 - alt;

      lon = gpggartk->lon_grad + gpggartk->lon_min/60.00000+gpggartk->lon_seg/3600.00000;
      if(gpgll->lon_dir == 'W')
         lon = 0 - lon;

      if(num_tramas<=1)
      {
         lat_tot = lat;
         lon_tot = lon;
         alt_tot = alt;
      }
      else
      {
         lat_tot = (lat_tot*(num_tramas-1))/(num_tramas);
         lat_tot+= lat/(num_tramas);
         lon_tot = (lon_tot*(num_tramas-1))/(num_tramas);
         lon_tot+= (lon/(num_tramas));
         alt_tot = (alt_tot*(num_tramas-1))/(num_tramas);
         alt_tot+= alt/(num_tramas);
      }
   }

}
//-------------------------------------------------------------------------
//! \brief Recibe las tramas desde el GPS y almacena los datos recibidos
void  TFormMediapos::Rellenamedia(struct Trama *aux)
{
   int auxgrad = 0;
   float minseg = 0;

   if((aux->Tipo == "GPGGA")&&((Tipotrama == 2)||(Tipotrama == 1)))
   {
     num_tramas++;
     auxgrad = aux->gpggartk.lat;
     gpggartk->lat_grad = auxgrad / 100.00000000;
     minseg = aux->gpggartk.lat - (gpggartk->lat_grad)*100.000000000;
     gpggartk->lat_min = (int)minseg;
     minseg = minseg - gpggartk->lat_min;
     minseg = minseg * 60.00000000;
     gpggartk->lat_seg = (int)minseg;

     gpggartk->lat_dir=aux->gpggartk.lat_dir;

     auxgrad = aux->gpggartk.lon;
     gpggartk->lon_grad = auxgrad / 100.000000000;
     minseg = aux->gpggartk.lon - (gpggartk->lon_grad)*100.000000000;
     gpggartk->lon_min = (int)minseg;
     minseg = minseg - gpggartk->lon_min;
     minseg = minseg * 60.0000000000;
     gpggartk->lon_seg = (int)minseg;

     gpggartk->lon_dir=aux->gpggartk.lon_dir;
     gpggartk->hora=aux->gpggartk.hora;
     gpggartk->alt=aux->gpggartk.alt;


//   recibido=true;
     FormPrincipal->HiloPpal->SC->Acquire();
     try
     {
        Calcular();
     }
     __finally
     {
        FormPrincipal->HiloPpal->SC->Release();
     }
     Label2->Caption = "Proceso . . . . ("+(AnsiString)num_tramas+" muestras recibidas)";
   }
   else if((aux->Tipo == "GPGLL")&&(Tipotrama == 0))
   {
     num_tramas++;
     auxgrad = aux->gpgll.lat;
     gpgll->lat_grad = auxgrad / 100.0000000000;
     minseg = aux->gpgll.lat - (gpgll->lat_grad)*100.00000000000000;
     gpgll->lat_min = (int)minseg;
     minseg = minseg - gpgll->lat_min;
     minseg = minseg * 60.000000000000;
     gpgll->lat_seg = (int)minseg;

     gpgll->lat_dir=aux->gpgll.lat_dir;

     auxgrad = aux->gpgll.lon;
     gpgll->lon_grad = auxgrad / 100.000000000000;
     minseg = aux->gpgll.lon - (gpgll->lon_grad)*100.00000000000;
     gpgll->lon_min = (int)minseg;
     minseg = minseg - gpgll->lon_min;
     minseg = minseg * 60.0000000000000;
     gpgll->lon_seg = (int)minseg;

     gpgll->lon_dir=aux->gpgll.lon_dir;
     gpgll->hora=aux->gpgll.hora;
     gpgll->estado=aux->gpgll.estado;

//     recibido=true;
     FormPrincipal->HiloPpal->SC->Acquire();
     try
     {
        Calcular();
     }
     __finally
     {
        FormPrincipal->HiloPpal->SC->Release();
     }
     Label2->Caption = "Proceso . . . . ("+(AnsiString)num_tramas+" muestras recibidas)";
   }
}

//-------------------------------------------------------------------
//! \brief Gestiona el temporizador que controla el tiempo maximo de calculo
void __fastcall TFormMediapos::Timer1Timer(TObject *Sender)
{
      Timer1->Enabled = false;
      Log = "UN"+Log;

      while((ProgressBar1->Position < 100)&&(Finalizar==false))
      {
        Application->ProcessMessages();
      }

      Timer2->Enabled = false;
      FormPrincipal->HiloEsc->SC->Acquire();
      try
      {
         FormPrincipal->HiloEsc->cadena=Log; //dejamos de recibir la trama
         FormPrincipal->HiloEsc->transmitido=true;
         while(FormPrincipal->HiloEsc->transmitido==true){};
      }
      __finally
      {
         FormPrincipal->HiloEsc->SC->Release();
      }

      Button2->Enabled = false;
      Button1->Enabled = true;
      Button4->Enabled = true;
}
//---------------------------------------------------------------------------
//! Gestiona la barra de progreso
void __fastcall TFormMediapos::Timer2Timer(TObject *Sender)
{
   ProgressBar1->Position = ProgressBar1->Position +1;
}
//---------------------------------------------------------------------------
//! Cierra la aplicación y libera toda la memoria reservada
void __fastcall TFormMediapos::FormClose(TObject *Sender,
      TCloseAction &Action)
{
   Activo = false;

   delete (gpggartk);
   delete (gpgll);
}
//---------------------------------------------------------------------------
//! Fija la posición calculada durante el proceso
void __fastcall TFormMediapos::Button4Click(TObject *Sender)
{
   int flag = mrIgnore;
   TFormConfirmacion * AuxForm;

   AnsiString com ="FIX POSITION ";

   AuxForm = new TFormConfirmacion(Application);

   AuxForm->Label2->Font->Size = 8;

   if((Tipotrama == 1)||(Tipotrama == 2))
   {
        AuxForm->Log = "Latitud: "+(AnsiString)lat_tot+(char)176+"\n"
                +"Longitud: "+(AnsiString)lon_tot+(char)176+"\n"
                +"Altitud: "+(AnsiString)alt_tot+(char)176+"\n";

        com = com+(AnsiString)lat_tot+" "+(AnsiString)lon_tot+" "+(AnsiString)alt_tot;
   }
   else if(Tipotrama == 0)
   {
      AuxForm->Log = "Latitud: "+(AnsiString)lat_tot+(char)176+"\n"+
        "Longitud: "+(AnsiString)lon_tot+(char)176+"\n";

      com = com+(AnsiString)lat_tot+" "+(AnsiString)lon_tot;
   }

   AuxForm->Label1->Caption = "Ha obtenido la siguiente posicion";
   AuxForm->Label3->Caption = "Si está conforme con los cálculos\npulse SI para cambiar la posición";
   AuxForm->fijar = true;    //subimos la bandera para que la identifique como una confirmación de la posición

   Visible=false;
   flag=AuxForm->ShowModal();

   if(flag==mrOk)
   {
      FormPrincipal->HiloEsc->SC->Acquire();
      try
      {
         FormPrincipal->HiloEsc->cadena="FIX NONE"; //reseteamos la posición establecida
         FormPrincipal->HiloEsc->ComPuerto = true;
         FormPrincipal->HiloEsc->transmitido=true;
         while(FormPrincipal->HiloEsc->transmitido==true){};
      }
      __finally
      {
         FormPrincipal->HiloEsc->SC->Release();
      }

      ShowMessage(com);

      FormPrincipal->HiloEsc->SC->Acquire();
      try
      {
         FormPrincipal->HiloEsc->cadena = com; //Establecemos la nueva posición
         FormPrincipal->HiloEsc->ComPuerto = true;
         FormPrincipal->HiloEsc->transmitido=true;
         while(FormPrincipal->HiloEsc->transmitido==true){};
      }
      __finally
      {
         FormPrincipal->HiloEsc->SC->Release();
      }
   }

   delete(AuxForm);
   lat_tot=0;    //inicializamos los valores auxiliares de la posición
   lon_tot=0;
   alt_tot=0;
   Label2->Caption = "Proceso . . . .";
   if(flag == mrOk)
   {
      Timer1->Interval = 1;    //en una milesima de segundo se desactiva el timer
      Timer1->Enabled = true;
      Activo = false;
      Finalizar = true;

      FormMediapos->Visible = false;
      Close();
   }

}
//---------------------------------------------------------------------------
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es">
	<head>
            <title>e-REdING. Biblioteca de la Escuela Superior de Ingenieros de Sevilla.</title>

                <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="description" content="Buscador de proyectos ETSI" />
<meta name="author" content="Daniel Callejo"/>
<meta name="author" content="Federico L&oacute;pez"/>
<meta name="author" content="Juli&aacute;n P&eacute;rez"/>
<meta name="author" content="Jos&eacute; Mar&iacute;a Vidal Vidal"/>
<base href="/bibing/proyectos/" /><link rel="shortcut icon" href="./favicon.ico" />
<link rel="stylesheet" href="./publico/css/estructura.css" type="text/css" />
<link rel="stylesheet" href="./publico/css/bootstrap.css" type="text/css" media="screen"/>
<link rel="stylesheet" href="./publico/css/enlaces-capas.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/pestanas.css" type="text/css"  /> 
<link rel="stylesheet" href="./publico/css/formularios.css" type="text/css" />
<link rel="stylesheet" href="./publico/css/lightbox.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/autocompleter.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/resultados.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/milista.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/explorador.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/ultimos.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/contactar.css" type="text/css"  />
<!-- <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" /> -->
<script src="./publico/javascript/jquery-1.9.1.min.js" type="text/javascript"></script>
<script src="./publico/javascript/bootstrap.js" type="text/javascript"></script>

<script src="./publico/javascript/mootools-1.2.4-core.js" type="text/javascript"></script>
<script src="./publico/javascript/mootools-1-1.2.4.2-more.js" type="text/javascript"></script>
<script src="./publico/javascript/targetbl.js" type="text/javascript"></script>
<script src="./publico/javascript/mensajes.js" type="text/javascript"></script>
<script src="./publico/javascript/form.js" type="text/javascript"></script>
<script src="./publico/javascript/autocompleter/Observer.js" type="text/javascript"></script>
<script src="./publico/javascript/autocompleter/Autocompleter.js" type="text/javascript"></script>
<script src="./publico/javascript/autocompleter/Autocompleter.Request.js" type="text/javascript"></script>
<script src="./publico/javascript/domready.js" type="text/javascript"></script>

<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-8T1TSNC1QY"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-8T1TSNC1QY');
</script>



<script type="text/javascript">
function seleccionar_todo(){
   for (i=0;i<document.formulario_marcados.elements.length;i++)
      if(document.formulario_marcados.elements[i].type == "checkbox")
         document.formulario_marcados.elements[i].checked=1
}
function deseleccionar_todo(){
   for (i=0;i<document.formulario_marcados.elements.length;i++)
      if(document.formulario_marcados.elements[i].type == "checkbox")
         document.formulario_marcados.elements[i].checked=0
} 
</script>
	</head>
    <body style="min-width: 960px; background-color: #e2e2e2; height: 100%">	
		<a name="arriba"></a>
<div>
<div id="header">
    <table id="Tabla_01" height="105" border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td>
            <img src="./publico/imagenes/cabecera/banner_new2_01.jpg" width="3" height="105" alt="">
        </td>
        <td>
            <img src="./publico/imagenes/cabecera/banner_new2_02.jpg" width="100" height="105" alt="">
        </td>
        <td width="100%" align="right"  style="min-width: 613px; background-repeat: no-repeat; background-position: top right; font-size: medium; font-weight: bold; color: white;">
            <table width="100%" height="105" border="0">
                <tr>
                    <td style=" vertical-align: top; width: 547px">
                        <!-- <a style="text-decoration: none" href="./"><img src="./publico/imagenes/cabecera/banner_new2_03.jpg"alt=""></a> -->
                        <a style="text-decoration: none" href="/bibing/proyectos/"><img src="./publico/imagenes/cabecera/banner_new2_03.jpg"alt=""></a>
                     </td>
                     <td  background="./publico/imagenes/cabecera/banner_new2_04.jpg" style="background-repeat: no-repeat; background-color: #c6d4e8;"><br><br><br>
                         &nbsp;
                        </td>
                    </tr>
             </table>
        </td>
    </tr>
    <tr style="border-top: 1px solid #ffffff;">
        <td colspan="3" id="menu_sup" style="font-size: small; text-align: right; background-color: #9c1f2f; vertical-align: bottom">
             
					<a href="/bibing/proyectos/" class="enlace " style=" color: #ffffff">Inicio&nbsp;&nbsp;|</a>
					<a href="/bibing/proyectos/acerca/" style=" color: #ffffff" class="enlace ">&nbsp;&nbsp;Acerca de&nbsp;&nbsp;|</a>
					
					<a href="/bibing/proyectos/contactar/" style=" color: #ffffff" class="enlace ">&nbsp;&nbsp;Contactar&nbsp;&nbsp;</a>
			 <!--       <a href="/bibing/proyectos/ayuda/" style=" color: #ffffff" class="enlace  ">&nbsp;&nbsp;Ayuda&nbsp;&nbsp;|</a> -->
					<!-- <form id="idioma" class=""  method="post" action="">
					<div class="inline" style="color: white">
					<input type="submit" class="tipo_letra " style=" color: #ffffff"name="idioma" value="Castellanossss" />&nbsp;&nbsp;
					</div>	
					</form> -->
			        </td>

    </tr>
    </table>
</div>
<br><br>
<div class="colmask rightmenu">
<div class="panel panel-default" style="margin:20px">
            <div class="panel-heading"><h4>SOFTWARE PARA LA MONITORIZACIÃ“N Y CONTROL DE RECEPTORES GPS. APLICACIÃ“N A RECEPTORES NOVATEL RT-2</h4><h5 style="color:grey"><span class="glyphicon glyphicon-user""></span> : <b>TOLEDO FERNÃ�NDEZ, JOSÃ‰ MANUEL</b><br><span class="glyphicon glyphicon-book""></span>  :<b> Ingenier&iacute;a TelecomunicaciÃ³n</b></h5></div><div class="panel-body"><div class="contenido_proyecto"><div class="titulo2_explorador">Contenido del proyecto:</div><div class="ruta"><a href="use/abreproy/11271">Directorio ra&iacute;z</a>&nbsp;&nbsp;>&nbsp;&nbsp;<a href="use/abreproy/11271/direccion/InterGPS%252F">InterGPS</a>&nbsp;&nbsp;>&nbsp;&nbsp;<a href="use/abreproy/11271/direccion/InterGPS%252FInterGPS_codigo%252F">InterGPS_codigo</a>&nbsp;&nbsp;>&nbsp;&nbsp;<a href="use/abreproy/11271/direccion/InterGPS%252FInterGPS_codigo%252FUFmediapos.cpp%252F">UFmediapos.cpp</a></div><div class="listing"></div></div></div></div>
</div>
</div>

        
	</body>
 
 
<!-- Inicio Google Analytics -->
<!--
	<script type="text/javascript">
		var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
		document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
	</script>
	
	<script type="text/javascript">
		try {
		var pageTracker = _gat._getTracker("UA-7789620-1");
		pageTracker._trackPageview();
	} 
		catch(err) {}
	</script>
-->
<!-- Fin Google Analytics -->

</html>

