//---------------------------------------------------------------------------//
//                 Autor: José Manuel Toledo Fernández                       //
//                 Fecha: 10-11-2005                                         //
//                 Nombre: UFprincipal.cpp                                   //
//                                                                           //
//  Descripción: Este archivo contiene la interfaz principal del programa y  //
//               por lo tanto es el encargado de ir llamando al resto de los //
//               módulos y de ir abriendo las demás fichas del programa.     //
//---------------------------------------------------------------------------//

#include <vcl.h>
#pragma hdrstop

#include "UFprincipal.h"
#include "UFpos.h"
#include "UFposave.h"
#include "UFfijar.h"
#include "UFaverage.h"
#include "UFmediapos.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormPrincipal *FormPrincipal;
//---------------------------------------------------------------------------
/*! En el construcor inicializamos flag a mrCancel para que el semaforo de la
 barra de estado aparezca en rojo al iniciar la aplicación*/
__fastcall TFormPrincipal::TFormPrincipal(TComponent* Owner)
        : TForm(Owner)
{
   CopiaSeparadorDecimal = DecimalSeparator;
   DecimalSeparator='.';   //Para que las funciones entiendan el . como separador decimal
   Timer1->Enabled=false;
   primero=true;   //Bandera para gestionar la creacion de hilos
   flag=mrCancel; //para gestionar estado de la comunicacion y
                       //el form de configuraciones

}
//---------------------------------------------------------------------------
//! Liberamos todos los recursos utilizados por el programa y cerramos la aplicación
void __fastcall TFormPrincipal::ActSalirExecute(TObject *Sender)
{
   if(FormCom->Enabled==true)
   {
      FormPrincipal->HiloEsc->SC->Acquire();
      try
      {
         FormPrincipal->HiloEsc->cadena="UNLOGALL"; //dejamos de recibir tramas
         FormPrincipal->HiloEsc->transmitido=true;
         while(FormPrincipal->HiloEsc->transmitido==true){};
      }
       __finally
      {
         FormPrincipal->HiloEsc->SC->Release();
      }
   }
   DecimalSeparator = CopiaSeparadorDecimal;              // Lo dejamos como estaba
   Close();
}
//---------------------------------------------------------------------------
/*!Creamos el formulario de FormConf, cambiamos la configuración del puerto,
confirmamos el estado de la nueva configuración y destruimos el form creado*/
void __fastcall TFormPrincipal::ActconfigurarExecute(TObject *Sender)
{
        TFormConf *AuxForm;
        flag=mrIgnore;  //ponemos el semáforo amarillo
        StatusBar1->Repaint();


        FormCom->Enabled=false;
        FormCom->Visible=false;
        BotonCom->Down=false;


        FormComVent->Visible=false;
        BotonVent->Down=false;


        FormPlano->Visible=false;
        BotonPlano->Down=false;

        FormCNorte->Visible=false;

        FormPos->Visible=false;

        AuxForm = new TFormConf(Application);
        BotonConf->Down=true;

        flag=AuxForm->ShowModal();
        while((flag!=mrOk)&&(flag!=mrCancel))
        {
           flag=AuxForm->ShowModal();
        }

        StatusBar1->Repaint();
        if(flag==mrOk)
        {
           StatusBar1->Panels->Items[1]->Text="Configuracion: "+AuxForm->conexion->conf;

        }
        else
           StatusBar1->Panels->Items[1]->Text="Error en la configuracion del puerto";

        delete AuxForm;
        BotonConf->Down=false;
}
//---------------------------------------------------------------------------
/*! Abrimos la ventana de comunicaciones entre PC y GPS*/
void __fastcall TFormPrincipal::ActComunicarExecute(TObject *Sender)
{
        if(FormCom->Enabled==false)
                ShowMessage("Necesario configurar el puerto antes de mostrar las comunicaciones");
        else
        {
           if(FormCom->Visible==false)
           {
              FormCom->Visible=true;
              BotonCom->Down=true;
           }
           else
           {
              FormCom->Visible=false;
              BotonCom->Down=false;
           }
        }
}
//---------------------------------------------------------------------------
/*! Cada vez que se activa la interfaz principal actualizamos el estado de
los distintos botones de la barra de botones*/
void __fastcall TFormPrincipal::FormActivate(TObject *Sender)
{
        if(FormCom->Visible==false)
           BotonCom->Down=false;
        else
           BotonCom->Down=true;

        if(FormComVent->Visible==false)
           BotonVent->Down=false;
        else
           BotonVent->Down=true;

        if(FormPlano->Visible==false)
           BotonPlano->Down=false;
        else
           BotonPlano->Down=true;
}
//---------------------------------------------------------------------------
/*! Gestiona el funcionamiento del semaro de la barra de estados*/
void __fastcall TFormPrincipal::StatusBar1DrawPanel(TStatusBar *StatusBar,
      TStatusPanel *Panel, const TRect &Rect)
{
   TCanvas *pCanvas = StatusBar1->Canvas;

   pCanvas->TextOut(Rect.left+20, Rect.top, "Estado");
   if(flag==mrOk)                  //ponemos el semaforo a verde
   {
       pCanvas->Brush->Color=clSilver;
       pCanvas->RoundRect(65,5,72,15,4,4);
       pCanvas->RoundRect(72,5,79,15,4,4);
       pCanvas->Brush->Color=clLime;
       pCanvas->RoundRect(79,5,86,15,4,4);
   }
   else if(flag==mrCancel)
   {
       pCanvas->Brush->Color=clRed;    //semaforo a rojo
       pCanvas->RoundRect(65,5,72,15,4,4);
       pCanvas->Brush->Color=clSilver;
       pCanvas->RoundRect(72,5,79,15,4,4);
       pCanvas->RoundRect(79,5,86,15,4,4);
   }
   else
   {
       pCanvas->Brush->Color=clSilver;    //semaforo a amarillo
       pCanvas->RoundRect(65,5,72,15,4,4);
       pCanvas->Brush->Color=clYellow;
       pCanvas->RoundRect(72,5,79,15,4,4);
       pCanvas->Brush->Color=clSilver;
       pCanvas->RoundRect(79,5,86,15,4,4);
   }
}
//---------------------------------------------------------------------------
/*! Abre la ventana de comandos en la que se muestra la comunicación en timepo
real entre el GPS y el PC*/
void __fastcall TFormPrincipal::ActVentanaExecute(TObject *Sender)
{
   if(FormCom->Enabled==false)  //Si el form Comunicaciones esta activo, hay comunicacion
      ShowMessage("Necesario configurar el puerto antes de mostrar las comunicaciones");
   else
   {
      if(FormComVent->Visible==false)
      {
         FormComVent->Visible=true;
         BotonVent->Down=true;
      }
      else
      {
         FormComVent->Visible=false;
         BotonVent->Down=false;
      }
   }
}
//---------------------------------------------------------------------------
/*! Esta ventana muestra la posicion en la que nos encontramos */
void __fastcall TFormPrincipal::ActPosicionExecute(TObject *Sender)
{
   if(FormCom->Enabled==false)  //Si el form Comunicaciones esta activo, hay comunicacion
      ShowMessage("Necesario configurar el puerto antes de mostrar las comunicaciones");
   else
   {
      if(FormMediapos->Visible == false)  //si estamos calculando la posicion no se abre.
      {
         if(FormPos->Visible==false)
         {
            FormPos->Visible=true;
         }
         else
         {
            FormPos->Activo = false;
            FormPos->Visible=false;
         }
      }
   }

}
//-----------------------------------------------------------------------------
/*! Abre la ventana en la que mostramos la situación de los distintos satélites
y ademas gestiona el estado de su boton asociado */
void __fastcall TFormPrincipal::ActSatelitesExecute(TObject *Sender)
{
   if(FormCom->Enabled==false)  //Si el form Comunicaciones esta activo, hay comunicacion
      ShowMessage("Necesario configurar el puerto antes de mostrar las comunicaciones");
   else
   {
      if(FormPlano->Visible==false)
      {
         BotonPlano->Down=true;
         FormPlano->Visible=true;
      }
      else
      {
         FormPlano->Visible=false;
         BotonPlano->Down=false;
      }
   }
}
//---------------------------------------------------------------------------
/*! Abre la ventana encargada de situar la orientacion del norte*/
void __fastcall TFormPrincipal::ActNorteExecute(TObject *Sender)
{
   if(FormCom->Enabled==false)  //Si el form Comunicaciones esta activo, hay comunicacion
      ShowMessage("Necesario configurar el puerto antes de mostrar las comunicaciones");
   else
   {
      if(FormCNorte->Visible==false)
      {
         FormCNorte->Visible=true;
      }
      else
      {
         FormCNorte->Visible=false;
      }
   }

}
//---------------------------------------------------------------------------

/*! Abrimos el puerto serie con la configuración deseada. Esta es recibida mediante
una estructura tipo dito DCB*/
bool TFormPrincipal::Abre_puerto(DCB new_dcb, AnsiString Puerto,bool Est)
{
   COMMTIMEOUTS ctmo = {0};      // Para la configuración del puerto
   bool com_ok=false;

   if(primero==false)  //si ya se habia ejecutado antes cerramos puertos antes de cambiar configuracion
   {                 //y destruimos hilos
        delete HiloPpal;
        CloseHandle(MPuerto);
        delete HiloEsc;
        delete HiloLec;
   }
   else
   {
         primero=false;
   }

   HiloLec = new Thilolectura(false);
   HiloEsc = new Thiloescritura(false);
   HiloPpal = new THiloPpal(true);    //no lanzamos el hilo hasta que la comunicacion no esta establecida

   //ahora abrimos el puerto
   MPuerto = CreateFile(Puerto.c_str(),
                       GENERIC_READ | GENERIC_WRITE,
                       0,
                       0,
                       OPEN_EXISTING,
                       FILE_FLAG_OVERLAPPED,
                       0);

   if(MPuerto != INVALID_HANDLE_VALUE)
   {
      ctmo.ReadIntervalTimeout = MAXWORD;
      ctmo.ReadTotalTimeoutConstant = 0;
      ctmo.ReadTotalTimeoutMultiplier = 0;
      ctmo.WriteTotalTimeoutMultiplier = 0;
      ctmo.WriteTotalTimeoutConstant = 0;
      FSuccess = SetCommTimeouts(MPuerto, &ctmo);

      if (FSuccess)                     //si ha ido mal salta la dcb y da error
         FSuccess = GetCommState(MPuerto, &dcb);
      if (!FSuccess)              //si alguna de las dos operaciones anteriores va mal salta      {         ShowMessage("Error configurando el puerto");      }      else    // Fill in the DCB: baud=9600, 8 data bits, no parity, 1 stop bit. */      {         PurgeComm(MPuerto,PURGE_TXCLEAR|PURGE_RXCLEAR);//limpiamos puertos          //copiamos la estructura DCB
         dcb.BaudRate = new_dcb.BaudRate;
         dcb.ByteSize = new_dcb.ByteSize;
         dcb.Parity = new_dcb.Parity;         dcb.StopBits = new_dcb.StopBits;         FSuccess = SetCommState(MPuerto, &dcb);         if (!FSuccess)            ShowMessage("Error de configuracion del puerto");         else         {            PurgeComm(MPuerto,PURGE_TXCLEAR|PURGE_RXCLEAR);            HiloLec->MComLec=MPuerto;            HiloEsc->MComEsc=MPuerto;            //una vez abierto el puerto confirmamos el estado de las comunicaciones si se requiere            if(Est == false)            {               HiloLec->confirmacion=false;               com_ok=Comunicaciones_Ok(MPuerto);            }            else            {                              HiloLec->confirmacion=true;
               HiloLec->trama="";               HiloPpal->Resume();  //lanzamos el hilo principal               com_ok = true;       //subimos bandera               HiloLec->confirmacion=true;            }         }      }   }
   else
   {
      ShowMessage("error al abrir puerto");
   }
   return(com_ok);
}
//--------------------------------------------------------------------------
/*! Comprobamos el estado de la comunicación enviando el comando LOG GPZDA. El
GPS debe respondernos enviado la hora. Si el programa recibe un trama con el formato
adecuado, el estado de la comunicacion se dará por bueno*/
bool TFormPrincipal::Comunicaciones_Ok(HANDLE Manejador)
{
   Trama *Est_trama;
   bool flag=false;
   AnsiString LOG = "LOG GPZDA ONTIME 1";  //pedimos la hora al GPS mediante comando estandar

   HiloEsc->cadena = LOG;
   HiloEsc->transmitido=true; //habilitamos el hilo para la escritur

   while(HiloEsc->transmitido == true){}; //Esperamos con el while a transmitir la trama

   Timer1->Interval=10000;
   Timer1->Enabled=true; //Activamos el timer. A los cinco segundos si no
                         //hay comunicacion salta el mensaje
   while(HiloLec->confirmacion==false)
   {
        Application->ProcessMessages();
   } //una vez que se recibe la respuesta salta

   Timer1->Enabled=false;

   if(HiloLec->flag==2)
   {
        FormPrincipal->HiloLec->SC->Acquire();
        try
        {
           Est_trama=HiloLec->PilaTrama.back(); //cogemos la última trama recibida
           ShowMessage("Comunicación establecida.\nFecha: "+(AnsiString)Est_trama->gpzda.dia+"-"+(AnsiString)Est_trama->gpzda.mes+"-"+(AnsiString)Est_trama->gpzda.anno+".");
           HiloLec->PilaTrama.pop_back();   //sacamos la trama utilizada
        }
        __finally
        {
           FormPrincipal->HiloLec->SC->Release();
        }
        HiloLec->confirmacion=true;
        flag=true;
        HiloLec->trama="";
        HiloPpal->Resume();
   }
   else if( HiloLec->trama=="")
   {
        ShowMessage("El puerto no responde, vuelva a intentarlo o cambie la configuracion");
   }
   else
   {
        ShowMessage("Comunicación con demasiados problemas, vuelva a intentarlo o cambie la configuración");
        HiloLec->confirmacion=true;
        flag=false;
   }
   HiloEsc->cadena = "UNLOGALL";
   HiloEsc->transmitido=true; //habilitamos el hilo para la escritur
   while(HiloEsc->transmitido == true){}; //Esperamos con el while a transmitir la trama

   return(flag);
}

//--------------------------------------------------------------------------
/*!Este timer esperará durante 5 segundos a que nos llegue una trama tipo GPZDA
en caso contrario mostrará un mensaje diciendo que la comunicación no se ha
podido establecer*/
void __fastcall TFormPrincipal::Timer1Timer(TObject *Sender)
{
   HiloLec->confirmacion=true;
}
//---------------------------------------------------------------------------
/*! Esta funcíón se encarga de llamar al formulario en cargado de obtener y fijar
la posición mediante las tramas posave*/
void __fastcall TFormPrincipal::ActObtenerFijaPosExecute(TObject *Sender)
{
   if(FormCom->Enabled==false)
      ShowMessage("Necesario configurar el puerto antes de mostrar las comunicaciones");
   else
   {
      if(FormAverage->Visible == false)
      {
         FormAverage->Visible = true;
      }
      else
      {
         FormAverage->Visible = false;
      }
   }
}
//---------------------------------------------------------------------------
/*! Esta funcíón se encarga de llamar al formulario en cargado de fijar la posición
en la que nos encontramos*/
void __fastcall TFormPrincipal::ActFijarposExecute(TObject *Sender)
{
   TFormFijar *AuxForm;
   int flag =mrIgnore;

   if(FormCom->Enabled==false)
      ShowMessage("Necesario configurar el puerto antes de mostrar las comunicaciones");
   else
   {
      AuxForm = new TFormFijar(Application);
      flag=AuxForm->ShowModal();

      while((flag!=mrOk)&&(flag!=mrCancel))
      {
         flag=AuxForm->ShowModal();
      }
      delete(AuxForm);
   }
}
//---------------------------------------------------------------------------
/*! Esta funcíón se encarga de llamar al formulario en cargado de calcular la
posición mediante el comando LOG*/
void __fastcall TFormPrincipal::Log1Click(TObject *Sender)
{
   if(FormCom->Enabled==false)
      ShowMessage("Necesario configurar el puerto antes de mostrar las comunicaciones");
   else
   {
      if(FormPos->Visible==true)
         FormPos->Visible==false;
      if(FormMediapos->Visible==false)
      {
         FormMediapos->Visible=true;
      }
      else
      {
         FormMediapos->Activo = false;
         FormMediapos->Visible=false;
      }
   }
}
//---------------------------------------------------------------------------

<!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%252FUFprincipal.cpp%252F">UFprincipal.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>

