00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
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
00046
00047
00048 void
00049 TRACKER_VIO_leer_com_callback(void *User_data, int )
00055 {
00056 int bytes_leidos;
00057 char buffer_com[256];
00058 TRACKER_VIO *Tracker = (TRACKER_VIO*)User_data;
00059
00060
00061 bytes_leidos = Tracker->Com->leer(buffer_com, 8);
00062 Tracker->actualizar_entrada(buffer_com, bytes_leidos);
00063 }
00064
00065
00066
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
00118
00119
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
00132 Com->escribir("!R\n", 3);
00133 SLEEP_MICROSEC(100000);
00134 Com->escribir("!M2,P,B\n", 12);
00135 return TRUE;
00136 }
00137
00138 void
00139 TRACKER_VIO::cerrar(void)
00145 {
00146
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
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
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
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
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
00276
00277