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