00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "jed_defs.h"
00024 #include "toolkits/media/glove.h"
00025 #include <stdio.h>
00026
00027
00028
00029
00030
00031 #define MAXCOM 5
00032
00033 DATAGLOVE::DATAGLOVE()
00034 {
00035 Com = NULL;
00036 }
00037
00038 DATAGLOVE::~DATAGLOVE()
00039 {
00040 cerrar();
00041 }
00042
00043 BOOLEAN
00044 DATAGLOVE::consultar_variable(const char * ,
00045 int & , void ** )
00046 {
00047 fprintf(stderr,
00048 "<DATAGLOVE> ATENCION: consultar_variable no implementado.\n");
00049 fflush(stderr);
00050
00051 return FALSE;
00052 }
00053
00054
00055 int
00056 DATAGLOVE::comando(char comando, char *buffer, int tam_buffer)
00068 {
00069 int tam_respuesta, loop = 0;
00070
00071 do {
00072 Com->escribir(&comando, 1);
00073 SLEEP_MICROSEC(1);
00074 tam_respuesta = Com->leer(buffer, tam_buffer);
00075 } while ( (tam_respuesta <= 0) && (loop++ < MAXCOM) );
00076
00077 return tam_respuesta;
00078 }
00079
00080 BOOLEAN
00081 DATAGLOVE::inicializar(char *Port)
00087 {
00088 char buffer[100];
00089 int lenbuff;
00090
00091 Com = new PUERTO_SERIAL(Port);
00092 if ( !Com ) {
00093 fprintf(stderr, "<DATAGLOVE> ERROR: No puedo crear una conexion con "
00094 "un puerto serial (memoria insuficiente)!\n");
00095 fflush(stderr);
00096 return FALSE;
00097 }
00098 Com->configurar(PSV19200, PSP_NONE, PSS_UNO, PSD8, PSF_NONE);
00099 if ( !Com->abrir() ) {
00100 fprintf(stderr, "<DATAGLOVE> ERROR: No puedo crear una conexion con "
00101 "un puerto serial (acceso denegado)!\n");
00102 fflush(stderr);
00103 delete Com;
00104 Com = NULL;
00105 return FALSE;
00106 }
00107
00108
00109 comando('\x41', buffer,1);
00110 if ( buffer[0] != '\x55' ) {
00111 fprintf(stderr, "<DATAGLOVE> ERROR: No se encontro el guante!\n");
00112 fflush(stderr);
00113 delete Com;
00114 Com = NULL;
00115 return FALSE;
00116 }
00117
00118 lenbuff = comando('\x47', buffer, 32);
00119 if ( lenbuff != 32 ) {
00120 fprintf(stderr, "<DATAGLOVE> ERROR: el guante no esta funcionando "
00121 "correctamente\n");
00122 delete Com;
00123 Com = NULL;
00124 return FALSE;
00125 }
00126
00127 return TRUE;
00128 }
00129
00130 void
00131 DATAGLOVE::cerrar(void)
00135 {
00136 if ( Com ) {
00137 Com->cerrar();
00138 delete Com;
00139 Com = NULL;
00140 }
00141 }
00142
00143 BOOLEAN
00144 DATAGLOVE::consultar(unsigned char *Pitch, unsigned char *Roll,
00145 unsigned char *f1, unsigned char *f2, unsigned char *f3,
00146 unsigned char *f4, unsigned char *f5)
00160 {
00161 char buffer[100];
00162 int tam_buffer;
00163 int loop = 0;
00164 short l;
00165 int cs;
00166 int j;
00167
00168 if ( !Com ) return FALSE;
00169
00170 do {
00171 tam_buffer = comando('\x43', buffer,9);
00172 if ( (tam_buffer == 9) && (buffer[0] == '\x80') ) {
00173 cs = 0;
00174 for (j=1; j<=7; j++) {
00175 l = buffer[j];
00176 cs ^= l;
00177 }
00178 if (cs == buffer[8]) {
00179 *f1 = buffer[1];
00180 *f2 = buffer[2];
00181 *f3 = buffer[3];
00182 *f4 = buffer[4];
00183 *f5 = buffer[5];
00184 *Pitch = buffer[6];
00185 *Roll = buffer[7];
00186 return TRUE;
00187 }
00188 }
00189 } while ( loop++ < 15 );
00190 return FALSE;
00191 }
00192
00193
00194
00195
00196