Página principal | Jerarquía de la clase | Lista alfabética | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros | Páginas relacionadas

tracker_vio.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= tracker_vio.cc                                        Noviembre de 1999 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definiciones de la clase TRACKER_VIO.  Manejador del tracker del casco  =
00005 //= de realidad virtual marca Virtual-IO.                                   =
00006 //=-------------------------------------------------------------------------=
00007 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO   =
00008 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN   =
00009 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES,     = 
00010 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO,        =
00011 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO,  =
00012 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA   =
00013 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES       =
00014 //= ("ACTIVIDADES DE ALGO RIESGO").                                         =
00015 //=-------------------------------------------------------------------------=
00016 //= Jesus Blanco (de 1997 a Abril de 1998)         je-blanc@uniandes.edu.co =
00017 //= Autor original: Oscar J. Chavarro G.  A.K.A. JEDILINK. Copyright (c),   =
00018 //= 1997 - 2003, oscarchavarro@hotmail.com                                  =
00019 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia   =
00020 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la  =
00021 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. =
00022 //===========================================================================
00023 
00024 #include "jed_defs.h"
00025 
00026 #include <stdio.h>
00027 #include <string.h>
00028 #include "jed_defs.h"
00029 #include "tracker_vio.h"
00030 
00031 //===========================================================================
00032 //= Constantes y macros                                                     =
00033 //===========================================================================
00034 
00035 #define TAM_BUFFER 32
00036 
00037 #define VERIFICAR( p )                                                       \
00038     if ( !(p) ) {                                                            \
00039         fprintf(stderr, "<TRACKER_VIO> ERROR: No puedo crear un objeto!\n"); \
00040         fflush(stderr);                                                      \
00041         return FALSE;                                                        \
00042     }
00043 
00044 //===========================================================================
00045 //= Funciones utilitarias                                                   =
00046 //===========================================================================
00047 
00048 void
00049 TRACKER_VIO_leer_com_callback(void *User_data, int /*accion*/)
00055 {
00056     int bytes_leidos;
00057     char buffer_com[256];
00058     TRACKER_VIO *Tracker = (TRACKER_VIO*)User_data;
00059     
00060     //- Lea la entrada del tracker ------------------------------------------
00061     bytes_leidos = Tracker->Com->leer(buffer_com, 8);
00062     Tracker->actualizar_entrada(buffer_com, bytes_leidos);    
00063 }
00064 
00065 //===========================================================================
00066 //= CLASE TRACKER_VIO                                                       =
00067 //===========================================================================
00068 
00069 TRACKER_VIO::TRACKER_VIO()
00079 {
00080     primiparo = TRUE;
00081     _yaw = 0;
00082     _pitch = 0;
00083     _roll = 0;
00084     _yaw_ref = 0;
00085     _pitch_ref = 0;
00086     _roll_ref = 0;
00087     Com = NULL;
00088     memoria = new char[TAM_BUFFER];
00089     indice_memoria = 0;
00090 }
00091 
00092 TRACKER_VIO::~TRACKER_VIO()
00093 {
00094     cerrar();
00095     delete memoria;
00096 }
00097 
00098 BOOLEAN
00099 TRACKER_VIO::abrir(char *nombre_puerto_serial)
00116 {
00117     //printf("<TRACKER_VIO> Me abro!\n");
00118 
00119     //- Abra el puerto en modo asincronico ----------------------------------
00120     Com = new PUERTO_SERIAL(nombre_puerto_serial);
00121     VERIFICAR(Com);
00122     Com->configurar(PSV19200, PSP_NONE, PSS_UNO, PSD8, PSF_NONE);
00123     if ( !Com->abrir() ) {
00124         fprintf(stderr, "<TRACKER_VIO> ERROR: No puedo abrir el puerto %s.\n",
00125             nombre_puerto_serial);
00126         fflush(stderr);
00127         return FALSE;
00128     }
00129     Com->registro_asincronico(TRACKER_VIO_leer_com_callback, this);
00130 
00131     //- Resetiee el tracker -------------------------------------------------
00132     Com->escribir("!R\n", 3);
00133     SLEEP_MICROSEC(100000); // De tiempo para que el tracker se resetee
00134     Com->escribir("!M2,P,B\n", 12);
00135     return TRUE;
00136 }
00137 
00138 void
00139 TRACKER_VIO::cerrar(void)
00145 {
00146     //printf("<TRACKER_VIO> Me cierro!\n");
00147     if ( Com ) {
00148         Com->cerrar();
00149         delete Com;
00150         Com = NULL;
00151     }
00152 }
00153 
00154 void
00155 TRACKER_VIO::consultar(double *Yaw, double *Pitch, double *Roll)
00160 {
00161     if ( !Com ) return;
00162     //Com->escribir("S", 1);
00163      
00164     (*Yaw) = _yaw;
00165     (*Pitch) = _pitch;
00166     (*Roll) = _roll;
00167 }
00168 
00169 static double TMP_double;
00170 
00171 BOOLEAN
00172 TRACKER_VIO::consultar_variable(const char *nombre_variable, int &tipo, void **ref)
00177 {
00178     double y, p, r;
00179 
00180     consultar(&y, &p, &r);
00181 
00182     if ( strcmp(nombre_variable, "yaw") == 0 ) {
00183         TMP_double = DEG2RAD(y);
00184         (*ref) = &TMP_double;
00185         tipo = T_FLOAT;
00186       }
00187       else if ( strcmp(nombre_variable, "pitch") == 0 ) {
00188         TMP_double = DEG2RAD(p);
00189         (*ref) = &TMP_double;
00190         tipo = T_FLOAT;
00191       }
00192       else if ( strcmp(nombre_variable, "roll") == 0 ) {
00193         TMP_double = DEG2RAD(r);
00194         (*ref) = &TMP_double;
00195         tipo = T_FLOAT;
00196       }
00197       else {
00198         return FALSE;
00199       }
00200     ;
00201     return TRUE;
00202 }
00203 
00204 void
00205 TRACKER_VIO::actualizar_entrada(char *buffer_com, int bytes_leidos)
00217 {
00218     //-----------------------------------------------------------------------
00219     int i, j;
00220     BYTE l;
00221     BYTE sum;
00222     int b;
00223     
00224     #define F (360.0/16384.0)
00225 
00226     //-----------------------------------------------------------------------
00227     for ( i = 0; i < bytes_leidos; i++ ) {
00228         l = (BYTE)buffer_com[i];
00229         // Si es 0xff esto PUEDE ser un inicio de paquete...
00230         if ( l == 0xff ) {
00231             for ( sum = 0, j = indice_memoria - 8;
00232                   indice_memoria > 7 && j < indice_memoria-1; j++ ) {
00233                 sum = (BYTE)((BYTE)sum + (BYTE)memoria[j]);
00234             }
00235             if ( sum == (BYTE)memoria[j] && indice_memoria > 7 ) {
00236                 //- Agarro un paquete valido ----------------------------
00237                 b = j - 6;
00238                 if ( primiparo ) {
00239                    _yaw_ref = (double)(((memoria[b])<<8)+(memoria[b+1]))*F/2;
00240                    _pitch_ref = (double)(((memoria[b+2])<<8)+(memoria[b+3]))*F;
00241                    _roll_ref = -(double)(((memoria[b+4])<<8)+(memoria[b+5]))*F;
00242                    primiparo = FALSE;
00243                   }
00244                   else {
00245                    _yaw = (double)(((memoria[b])<<8) + (memoria[b+1]))*F/2;
00246                    _pitch = (double)(((memoria[b+2])<<8) + (memoria[b+3]))*F;
00247                    _roll = -(double)(((memoria[b+4])<<8) + (memoria[b+5]))*F;
00248                    _yaw -= _yaw_ref;
00249                    _pitch -= _pitch_ref;
00250                    _roll -= _roll_ref;
00251                 }
00252                 
00253                 //- Dejo todo listo para el siguiente paquete -----------
00254                 indice_memoria = 0;
00255             }
00256         }
00257         if ( indice_memoria >= TAM_BUFFER ) {
00258             fprintf(stderr, "<TRACKER_VIO> ERROR FATAL!\n"
00259                     "A ocurrido un desfase en la secuencia de datos del\n"
00260                     "tracker. Puede gritar, rezar o lo que sea, esto es\n"
00261                     "un error grave.");
00262             fflush(stderr);
00263             exit(1);
00264         }
00265         memoria[indice_memoria] = buffer_com[i];
00266         indice_memoria++;
00267     }
00268 
00269     //-----------------------------------------------------------------------
00270     Com->escribir("S", 1);
00271     fflush(stdout);
00272 }
00273 
00274 //===========================================================================
00275 //= EOF                                                                     =
00276 //===========================================================================
00277 

Este archivo HTML ha sido generado automáticamente a partir del código fuente AQUYNZA. NO LO EDITE. Para mayor información contacte al autor.