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

lego9751.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= lego9751.cc                                              Agosto de 1998 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definiciones de la clase para el control de la interface LEGO9751       =
00005 //=-------------------------------------------------------------------------=
00006 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO   =
00007 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN   =
00008 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES,     = 
00009 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO,        =
00010 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO,  =
00011 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA   =
00012 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES       =
00013 //= ("ACTIVIDADES DE ALGO RIESGO").                                         =
00014 //=-------------------------------------------------------------------------=
00015 //= Autor original: Oscar J. Chavarro G.  A.K.A. JEDILINK. Copyright (c),   =
00016 //= 1997 - 2003, oscarchavarro@hotmail.com                                  =
00017 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia   =
00018 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la  =
00019 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. =
00020 //= Con la colaboracion de Harold Cruz              ha-cruz@uniandes.edu.co =
00021 //===========================================================================
00022 
00023 #if PLATAFORMA == i386_LINUX_GCC || PLATAFORMA == ALPHA || PLATAFORMA == SPARC64_LINUX_GCC
00024  // OJO: Esto es machete!
00025 
00026 #include "toolkits/media/lego9751.h"
00027 
00028 #include <string.h>
00029 
00030 //===========================================================================
00031 //= Funciones de soporte                                                    =
00032 //===========================================================================
00033 
00034 void
00035 leer_lego_callback(void *User_data, int /*accion*/)
00044 {
00045     LEGO9751 *L = ((LEGO9751*)User_data);
00046     PUERTO_SERIAL *Com = L->Com;
00047     char buffer[19];  // La interface enviara maximo 19 bytes
00048     int bytes_leidos;
00049     int p;
00050 
00051     bytes_leidos = Com->leer(buffer, 19);
00052 
00053     for ( p = 0; p < bytes_leidos; p++ ) {
00054         L->input_state[L->accum] = buffer[p];  // OJO: { 0 <= L->accum < 19 }
00055         if ( L->accum == 18 ) {
00056             // Nos topamos con un principio de paquete!
00057             L->accum = -1;
00058             L->actualizar();
00059         }
00060         L->accum++;
00061     }
00062 }
00063 
00064 //===========================================================================
00065 // Clase LEGO9751                                                           =
00066 //===========================================================================
00067 
00068 LEGO9751::LEGO9751()
00069 {
00070     int i;
00071 
00072     accum = 0;
00073     for ( i = 0; i < 19; i++ ) input_state[i] = 0; 
00074     for ( i = 0; i < 19; i++ ) data_state[i] = 0;
00075 }
00076 
00077 LEGO9751::~LEGO9751()
00078 {
00079     cerrar();
00080 }
00081 
00082 void
00083 LEGO9751::cerrar(void)
00084 {
00085     if ( Com ) {
00086         Com->cerrar();
00087         delete Com;
00088         Com = 0;
00089     }
00090 }
00091 
00092 WORD
00093 LEGO9751::lea_sensor(int num_sensor)
00094 {
00095     BYTE msb, lsb;
00096     int grupo;
00097 
00098     num_sensor--;
00099     grupo = 3-(num_sensor%4);
00100 
00101     msb = data_state[2 + 2*(2*grupo+num_sensor/4)];
00102     lsb = data_state[2 + 2*(2*grupo+num_sensor/4)];
00103 
00104     //printf("N = %d [%3d][%3d]\n", num_sensor+1, msb, lsb);
00105     //fflush(stdout);
00106 
00107     return (WORD)(65535 - ((WORD)msb * 256 + (WORD)lsb));
00108 }
00109 
00110 void
00111 LEGO9751::encendido(int actuador)
00112 {
00113     char c;
00114 
00115     if ( actuador < 1 || actuador > 8 ) return;
00116     switch ( actuador ) {
00117       case 1: c = '('; break;
00118       case 2: c = ')'; break;
00119       case 3: c = '*'; break;
00120       case 4: c = '+'; break;
00121       case 5: c = ','; break;
00122       case 6: c = '-'; break;
00123       case 7: c = '.'; break;
00124       case 8: default: c = '/'; break;
00125     }
00126     Com->escribir(&c, 1);
00127 }
00128 
00129 void
00130 LEGO9751::apagado(int actuador)
00131 {
00132     char c;
00133 
00134     if ( actuador < 1 || actuador > 8 ) return;
00135     switch ( actuador ) {
00136       case 1: c = '8'; break;
00137       case 2: c = '9'; break;
00138       case 3: c = ':'; break;
00139       case 4: c = ';'; break;
00140       case 5: c = '<'; break;
00141       case 6: c = '='; break;
00142       case 7: c = '>'; break;
00143       case 8: default: c = '?'; break;
00144     }
00145     Com->escribir(&c, 1);
00146 }
00147 
00148 void
00149 LEGO9751::fderecha(int actuador)
00150 {
00151     char c;
00152 
00153     if ( actuador < 1 || actuador > 8 ) return;
00154     switch ( actuador ) {
00155       case 1: c = 'H'; break;
00156       case 2: c = 'I'; break;
00157       case 3: c = 'J'; break;
00158       case 4: c = 'K'; break;
00159       case 5: c = 'L'; break;
00160       case 6: c = 'M'; break;
00161       case 7: c = 'N'; break;
00162       case 8: default: c = 'O'; break;
00163     }
00164     Com->escribir(&c, 1);
00165 }
00166 
00167 void
00168 LEGO9751::fizquierda(int actuador)
00169 {
00170     char c;
00171 
00172     if ( actuador < 1 || actuador > 8 ) return;
00173     switch ( actuador ) {
00174       case 1: c = '@'; break;
00175       case 2: c = 'A'; break;
00176       case 3: c = 'B'; break;
00177       case 4: c = 'C'; break;
00178       case 5: c = 'D'; break;
00179       case 6: c = 'E'; break;
00180       case 7: c = 'F'; break;
00181       case 8: default: c = 'G'; break;
00182     }
00183     Com->escribir(&c, 1);
00184 }
00185 
00186 void
00187 LEGO9751::fpotencia(int actuador, int potencia)
00188 {
00189     unsigned char buffer[2];
00190 
00191     if ( actuador < 1 || actuador > 7 || potencia < 0 || potencia > 7 ) return;
00192 
00193     buffer[0] = (unsigned char)(0xB0 + potencia);
00194     switch ( actuador ) {
00195       case 1: buffer[1] = 0x01; break;
00196       case 2: buffer[1] = 0x02; break;
00197       case 3: buffer[1] = 0x04; break;
00198       case 4: buffer[1] = 0x08; break;
00199       case 5: buffer[1] = 0x10; break;
00200       case 6: buffer[1] = 0x20; break;
00201       case 7: buffer[1] = 0x40; break;
00202       case 8: default: buffer[1] = 0x80; break;
00203     }
00204 
00205     Com->escribir((char *)buffer, 2);
00206 }
00207 
00208 void
00209 LEGO9751::enviar_latido(void)
00210 {
00211     char latido = 2;
00212 
00213     Com->escribir(&latido, 1);
00214 }
00215 
00216 void
00217 LEGO9751::actualizar(void)
00218 {
00219     int i;
00220 
00221     for ( i = 0; i < 19; i++ ) {
00222         data_state[i] = input_state[i];
00223     }
00224 
00225     static int j = 0;
00226     if ( j % 150 == 0 ) {
00227         enviar_latido();
00228         j = 0;
00229     }
00230     j++;
00231 }
00232 
00233 BOOLEAN
00234 LEGO9751::busque_controlador(void)
00235 {
00236     char cad[100];
00237     int i;
00238 
00239     strcpy(cad, "p\0###Do you byte, when I knock?$$$");
00240     
00241     if ( !Com ) {
00242         return FALSE;
00243     }
00244 
00245     //- Escriba el comando de inicializacion-
00246     Com->escribir(cad, sizeof(cad));
00247     //printf("Envie la cadena de busqueda.\n");
00248     // OJO: Aqui se le da un rato al modem. Porque toca hacer esto?
00249     SLEEP_MICROSEC(1000000);
00250 
00251     //- Lea una respuesta, que se espera, sea de 99 o menos caracteres -
00252     i = Com->leer(cad, 31);
00253     if ( i < 0 ) i = -i;
00254     cad[i] = '\0';
00255     //printf("Recibi como respuesta los siguientes %d bytes:\n%s\n", i, cad);
00256 
00257     return TRUE;
00258 }
00259 
00260 
00261 BOOLEAN
00262 LEGO9751::inicialice(char *nombre_puerto)
00263 {
00264     Com = new PUERTO_SERIAL(nombre_puerto);
00265 
00266     if ( !Com ) {
00267         return FALSE;
00268     }
00269 
00270     //- Inicializacion del puerto serial -
00271     Com->configurar(PSV9600, PSP_NONE, PSS_UNO, PSD8, PSF_NONE);
00272     if ( !Com->abrir() ) {
00273         delete Com;
00274         Com = 0;
00275         return FALSE;
00276     }
00277     //Com->imprimir(); // Muestra la configuracion actual del puerto
00278 
00279     if ( !busque_controlador() ) {
00280         delete Com;
00281         Com = FALSE;
00282         return FALSE;
00283     }
00284 
00285     Com->registro_asincronico(leer_lego_callback, this);
00286 
00287     return TRUE;
00288 }
00289 
00290 BOOLEAN
00291 LEGO9751::consultar_variable(const char * /*nombre_variable*/, 
00292                    int & /*tipo*/, void ** /*ref*/)
00296 {
00297     return FALSE;
00298 }
00299 
00300 #endif
00301 
00302 //===========================================================================
00303 //= EOF                                                                     =
00304 //===========================================================================
00305 

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.