teclado.c

Go to the documentation of this file.
00001 
00004 #include "routix/system.h"
00005 #include "drivers/teclado.h"
00006 #include "drivers/video.h"
00007 #include "routix/atomic.h"
00008 #include "routix/event.h"
00009 #include "routix/8259.h"
00010 #include <routix/kstdio.h>
00011 
00013 unsigned int *keymap = keymap_std;
00014 
00016 #define MAX_BUFF_TECLADO   16
00017 char buff_teclado[MAX_BUFF_TECLADO + 2];
00018 char *buff_head = buff_teclado;     /* Apunta al lugar donde debo guardar el prox caracter */
00019 char *buff_tail = buff_teclado;     /* apunta al caracter que debo sacar primero */
00020 word buff_cant = 0;
00021 
00022 char shift=0, alt=0, ctrl=0;
00023 char num_lock, caps_lock, scr_lock;
00024 
00026 #define MAX_BUFF_CONSOLA   32
00027 char buff_consola[MAX_BUFF_CONSOLA + 2];
00028 char *consola_head = buff_consola;          /* Apunta al lugar donde debo guardar el prox caracter */
00029 char *consola_tail = buff_consola;          /* apunta al caracter que debo sacar primero */
00030 word consola_cant = 0;
00031 
00032 
00035 void Teclado(void) 
00036 {
00037     byte scode;
00038     scode = inportb (TECLADO_PORT);
00039 
00040     if ( buff_cant >= MAX_BUFF_TECLADO )        /* Buffer lleno, no puede guardarse el scancode */
00041         goto salir_int_teclado;
00042 
00043     unsigned int car = _getascii (scode & 0x7F);
00044     
00045     if (scode >= 0x80 )         /* Breakcode */
00046         if ( car!=CTRL  &&  car!=ALT  &&  car!=SHIFT )
00047             goto salir_int_teclado;             /* Fue el release de un caracter normal... me voy */
00048     
00049     /* Se presiono alguna combinacion de ALT+F ,switchear de tty en consola*/
00050 
00051 /*
00052         if ( car==F1 &&  alt) {
00053                 unsigned long _pos, _cur;
00054                 _pos = pos;
00055                 _cur = cursorr;
00056                 kprintf("Pos: %d Cursor: %d\n", _pos, _cur);
00057         }
00058 */
00059     /* (TEMPORAL) Si se presiona CTRL + F, poner al shell en ForeGround */
00060 /*      
00061     if (toupper(car)=='F' && ctrl) {
00062         shell_to_fg(); 
00063         goto salir_int_teclado;
00064     }
00065 */          
00066     *buff_head = scode;
00067     buff_head++;
00068     buff_cant++;
00069     if (buff_head == (buff_teclado + MAX_BUFF_TECLADO) ) {
00070         buff_head = buff_teclado;
00071     }
00072 
00073 salir_int_teclado:
00074     endOfInterrupt();   
00075 }
00076 
00079 void leer_buff_teclado (void)
00080 {
00081     unsigned int car;
00082     cli();      
00083     while ( (consola_cant <= MAX_BUFF_CONSOLA) && (buff_cant > 0) ) {
00084         car = getascii (*buff_tail++);
00085         if (buff_tail == (buff_teclado + MAX_BUFF_TECLADO) )
00086             buff_tail = buff_teclado;
00087         buff_cant--;
00088 
00089         if (car > 0xff)     /* Si el codigo levantado del buffer pertenece a alguna tecla de función */
00090             continue;       /* o ALT, CTRL, NUM_LOCK, por ahora, no la tengo en cuenta */
00091 
00092         *consola_head++ = (unsigned char) car;
00093         consola_cant++;
00094         if (consola_head >= (buff_consola + MAX_BUFF_CONSOLA) ) {
00095             consola_head = buff_consola;
00096         }
00097     }
00098 //    if (consola_cant>0)
00099         // Actualizamos los eventos de TECLADO
00100   //      actualizar_eventos( TECLADO );
00101 
00102     sti();
00103 
00104 }
00105 
00107 inline unsigned int _getascii (unsigned char code)
00108 {
00109     return keymap[code];
00110 }
00111 
00116 unsigned int getascii (unsigned char code)
00117 {
00118     unsigned int *_keymap = keymap;
00119     if (shift==1)
00120                 _keymap = keymap_std_shift;
00121 
00122     char presionada = 1;
00123     unsigned int car = _keymap[code & 0x7F];
00124     if ( code >= 0x80 ) {       /* tecla fue soltada */
00125                 presionada = 0; 
00126     }
00127     
00128     switch (car) {
00129                 case ALT:
00130                     alt = TRUE & presionada;        
00131                 car = TECLA_MODIFICADORA;
00132                     break;
00133                 case CTRL:
00134                     ctrl = TRUE & presionada; 
00135                     car = TECLA_MODIFICADORA;
00136                 break;
00137                 case SHIFT: 
00138                     shift = TRUE & presionada;
00139                 car = TECLA_MODIFICADORA;
00140                     break;
00141                 default: 
00142                 car = car | alt | ctrl;
00143     }
00144 
00145     return car;    
00146     
00147 }
00148 
00149 
00150 unsigned char getchar(void)
00151 {
00152     unsigned char car;
00153     while ( consola_cant <= 0 );
00154         cli();
00155     car = *consola_tail++;
00156     if (consola_tail == (buff_consola + MAX_BUFF_CONSOLA) )
00157                 consola_tail = buff_consola;
00158     consola_cant--;
00159         sti();
00160         return car;
00161 }
00162 
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 /*
00172 unsigned char getchar(void)
00173 {
00174  event_t *nuevo;
00175  char caracter;
00176 
00177  // Si hay un caracter en el buffer lo devolvemos
00178  if ( ptrbufferTeclado >= bufferTeclado ) {
00179    __asm__ __volatile__("cli");
00180    --ptrbufferTeclado;
00181    caracter = *ptrbufferTeclado;
00182    __asm__ __volatile__("sti");
00183    return(caracter); 
00184  }
00185 
00186  // Sino agregamos un nodo a la lista de eventos y esperamos
00187  
00188  // Alocamos un nuevo nodo en memoria
00189  nuevo = (event_t *) malloc( sizeof(event_t) );
00190 
00191  // Error al intentar alocar memoria (setear errno)
00192  if ( nuevo == NULL ) {
00193    return -1;
00194  }
00195  
00196  // Dispositivo TECLADO
00197  nuevo->dispositivo = TECLADO;
00198  nuevo->proceso=actual;
00199  
00200  // Finalmente lo agregamos a la lista de eventos
00201  insertar_evento(nuevo);
00202 
00203  // y nos ponemos a dormir
00204  dormir_task(actual);
00205 
00206  // Switcheamos de proceso mediante la macro _reschedule quien realiza una llamada
00207  // a la interrupción 0x51
00208  _reschedule();
00209 
00210  // Volvimos ! Hay por lo menos una tecla en el buffer, eliminamos el nodo de la lista de eventos
00211  remover_evento(nuevo);
00212 
00213  // Liberamos el espacio
00214  free(nuevo);
00215 
00216  // Devolvemos finalmente la tecla ingresada
00217  __asm__ __volatile__("cli");
00218  --ptrbufferTeclado;
00219  caracter = *ptrbufferTeclado;
00220  __asm__ __volatile__("sti");
00221 
00222  return(caracter);
00223 }
00224 */
00225 char *gets(char *s)
00226 {
00227         unsigned char valor;
00228         char *string=s;
00229         char flag=1;
00230 
00231         while ( flag ) {
00232                 valor = getchar();
00233 
00234                 if ( valor == '\b' ) {
00235                         if ( string != s ) {
00236                                 string--;
00237                                 putchar(valor);
00238                         }
00239                 } 
00240                 else if ( valor == '\0' ) { flag--; }
00241                         
00242                 else {
00243                         *string++=valor;
00244                     putchar(valor);
00245                         if ( valor == '\n' ) { string--; flag--; }
00246                 }
00247  
00248         }
00249 
00250         if ( string == s ) { s=NULL; }
00251         else { *string = '\0'; }
00252 
00253         return s;
00254 }
00255 

Generated on Sun May 30 18:38:35 2004 for Routix OS by doxygen 1.3.6