X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=converter%2Fps2_usb%2Fmatrix.c;h=c441a89b0f1c19b258c6fa1984a939f0423c95ec;hb=fb248461b8ebe3a8a68aba69f53cac7534218cf9;hp=4187ea060122455adc0cb863f2a92cd885f5059d;hpb=62d1ebb91c7b381ce3d88aad9ee0b03bea9fce26;p=max%2Ftmk_keyboard.git diff --git a/converter/ps2_usb/matrix.c b/converter/ps2_usb/matrix.c index 4187ea06..c441a89b 100644 --- a/converter/ps2_usb/matrix.c +++ b/converter/ps2_usb/matrix.c @@ -17,20 +17,18 @@ along with this program. If not, see . #include #include -#include -#include +#include "action.h" #include "print.h" #include "util.h" #include "debug.h" #include "ps2.h" +#include "host.h" +#include "led.h" #include "matrix.h" static void matrix_make(uint8_t code); static void matrix_break(uint8_t code); -#ifdef MATRIX_HAS_GHOST -static bool matrix_has_ghost_in_row(uint8_t row); -#endif /* @@ -69,20 +67,9 @@ static uint8_t matrix[MATRIX_ROWS]; static bool is_modified = false; -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - void matrix_init(void) { + debug_enable = true; ps2_host_init(); // initialize matrix state: all keys off @@ -185,8 +172,9 @@ uint8_t matrix_scan(void) matrix_break(PAUSE); } - uint8_t code; - while ((code = ps2_host_recv())) { + uint8_t code = ps2_host_recv(); + if (code) xprintf("%i\r\n", code); + if (!ps2_error) { switch (state) { case INIT: switch (code) { @@ -207,11 +195,25 @@ uint8_t matrix_scan(void) matrix_make(PRINT_SCREEN); state = INIT; break; + case 0x00: // Overrun [3]p.25 + matrix_clear(); + clear_keyboard(); + print("Overrun\n"); + state = INIT; + break; + case 0xAA: // Self-test passed + case 0xFC: // Self-test failed + printf("BAT %s\n", (code == 0xAA) ? "OK" : "NG"); + led_set(host_keyboard_leds()); + state = INIT; + break; default: // normal key make if (code < 0x80) { matrix_make(code); } else { - debug("unexpected scan code at INIT: "); debug_hex(code); debug("\n"); + matrix_clear(); + clear_keyboard(); + xprintf("unexpected scan code at INIT: %02X\n", code); } state = INIT; } @@ -232,7 +234,9 @@ uint8_t matrix_scan(void) if (code < 0x80) { matrix_make(code|0x80); } else { - debug("unexpected scan code at E0: "); debug_hex(code); debug("\n"); + matrix_clear(); + clear_keyboard(); + xprintf("unexpected scan code at E0: %02X\n", code); } state = INIT; } @@ -247,11 +251,18 @@ uint8_t matrix_scan(void) matrix_break(PRINT_SCREEN); state = INIT; break; + case 0xF0: + matrix_clear(); + clear_keyboard(); + xprintf("unexpected scan code at F0: F0(clear and cont.)\n"); + break; default: if (code < 0x80) { matrix_break(code); } else { - debug("unexpected scan code at F0: "); debug_hex(code); debug("\n"); + matrix_clear(); + clear_keyboard(); + xprintf("unexpected scan code at F0: %02X\n", code); } state = INIT; } @@ -266,7 +277,9 @@ uint8_t matrix_scan(void) if (code < 0x80) { matrix_break(code|0x80); } else { - debug("unexpected scan code at E0_F0: "); debug_hex(code); debug("\n"); + matrix_clear(); + clear_keyboard(); + xprintf("unexpected scan code at E0_F0: %02X\n", code); } state = INIT; } @@ -357,26 +370,16 @@ uint8_t matrix_scan(void) default: state = INIT; } - phex(code); } - return 1; -} -bool matrix_is_modified(void) -{ - return is_modified; -} - -inline -bool matrix_has_ghost(void) -{ -#ifdef MATRIX_HAS_GHOST - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - if (matrix_has_ghost_in_row(i)) - return true; + // TODO: request RESEND when error occurs? +/* + if (PS2_IS_FAILED(ps2_error)) { + uint8_t ret = ps2_host_send(PS2_RESEND); + xprintf("Resend: %02X\n", ret); } -#endif - return false; +*/ + return 1; } inline @@ -391,21 +394,6 @@ uint8_t matrix_get_row(uint8_t row) return matrix[row]; } -void matrix_print(void) -{ - print("\nr/c 01234567\n"); - for (uint8_t row = 0; row < matrix_rows(); row++) { - phex(row); print(": "); - pbin_reverse(matrix_get_row(row)); -#ifdef MATRIX_HAS_GHOST - if (matrix_has_ghost_in_row(row)) { - print("