Venís de la intro y un mini POC.
Tras mirar bastante el código de PS2Keyboard, que es la clase que lee el teclado PS2 y observar el comportamiento de Keyboard, que es la clase que se hace pasar por un teclado USB, he logrado comprender bastantes cosas, empezando por las limitaciones.
[PS2Keyboard]
/ \
PC <-- USB -->[Keyboard] Teensy <-- ps2 --> Teclado
\ /
[ps2]
PS2Keyboard
PS2Keyboard es de más alto nivel, toma las secuencias de código que provienen del teclado y las convierte en caracteres de 8 bits. Mapea las teclas especiales como "print screen" y "capslock" a un código arbitrario.
Se usa asi:
if (keyboard.available()) {
// read the next key
char c = keyboard.read();
Si oprimis la tecla "4", recibís un "4" (ascii 52 o 0x34).
Tocando el código de la librería:
[$ARDUINO_FOLDER/hardware/teensy/avr/libraries/PS2Keyboard/PS2Keyboard.cpp]
while (1) {
s = get_scan_code();
if (!s) return 0;
if (s == 0xF0) {
state |= BREAK;
Serial.println("BREAK");
} else if (s == 0xE0) {
state |= MODIFIER;
Serial.println("MODIFIER");
Si oprimís "4", en el serial emitís un BREAK, si oprimís flecha arriba, MODIFIER, MODIFIER, BREAK, pero para consumir unos caracteres inútiles por ahora.
Toqué un poco en el .h:
[$ARDUINO_FOLDER/hardware/teensy/avr/libraries/PS2Keyboard/PS2Keyboard.h]
// Every call to read() returns a single byte for
// each keystroke. These configure what byte will
// be returned for each "special" key. To ignore
// a key, use zero.
#define PS2_TAB 9
#define PS2_ENTER 13
#define PS2_BACKSPACE 7
#define PS2_ESC 27
#define PS2_INSERT 65 // 0
#define PS2_DELETE 68 // 127
#define PS2_HOME 66 // 0
#define PS2_END 69 // 0
#define PS2_PAGEUP 67 // 25
#define PS2_PAGEDOWN 70 // 26
#define PS2_UPARROW 11
#define PS2_LEFTARROW 8
#define PS2_DOWNARROW 10
#define PS2_RIGHTARROW 21
Y con eso tengo las letras A-F en donde quería.
La versión actual queda:
const int DataPin = 5;
const int IRQpin = 3;
PS2Keyboard keyboard;
void setup() {
keyboard.begin(DataPin, IRQpin);
delay(1000);
}
void loop() {
if (keyboard.available()) {
char c = keyboard.read();
Keyboard.print(c);
}
}
El resto
ps2
ps2 es de bajo nivel, recibe sin interpretar cada código desde el teclado:
for (;;) { /* ever */
code = kbd.read();
Serial.println(code, HEX);
Si oprimís la tecla "4", recibís:
6B
F0
6B
Aparentemente 6B es 4-keypress y F06B es 4-keyrelease
Si oprimís flecha arriba:
E0
75
E0
F0
75
Afirmaría que E075 es upArrow-keypress y E0F075 upArrow-keyrelease.
A ver, qué pasa si hago:
- oprimir 4
- oprimir flecha
- soltar flecha
- soltar 4
6B -> 4 keypress
E0
75 -> flecha keypress
E0
F0
75 -> flecha keyrelease
F0
6B -> 4 keyrelease
Bien, si ahora oprimo el 4 y espero, aparece el 6B, si no me apuro en soltar, se llena de 6B. Ya está bien clarito, llegó el momento de mapear todo...
El código referenciado está en
$ARDUINO_FOLDER/libraries/ps2/ps2.h
$ARDUINO_FOLDER/libraries/ps2/ps2.cpp
Próximos pasos
Tengo que examinar Keyboard para ver si puedo enviar esos códigos directamente o tengo que hacer alguna conversión y quizás prender y apagar el LED. En otras palabras, que el
teclado funcione de modo transparente salvo los reemplazos de teclas
objetivo del ejercicio.
No hay comentarios:
Publicar un comentario