00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #if PLATAFORMA == i386_LINUX_GCC || PLATAFORMA == ALPHA || PLATAFORMA == SPARC64_LINUX_GCC
00024
00025
00026 #include "toolkits/media/lego9751.h"
00027
00028 #include <string.h>
00029
00030
00031
00032
00033
00034 void
00035 leer_lego_callback(void *User_data, int )
00044 {
00045 LEGO9751 *L = ((LEGO9751*)User_data);
00046 PUERTO_SERIAL *Com = L->Com;
00047 char buffer[19];
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];
00055 if ( L->accum == 18 ) {
00056
00057 L->accum = -1;
00058 L->actualizar();
00059 }
00060 L->accum++;
00061 }
00062 }
00063
00064
00065
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
00105
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
00246 Com->escribir(cad, sizeof(cad));
00247
00248
00249 SLEEP_MICROSEC(1000000);
00250
00251
00252 i = Com->leer(cad, 31);
00253 if ( i < 0 ) i = -i;
00254 cad[i] = '\0';
00255
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
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
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 * ,
00292 int & , void ** )
00296 {
00297 return FALSE;
00298 }
00299
00300 #endif
00301
00302
00303
00304
00305