uint8_t matrix_scan(void) { static enum { INIT, E0, // Pause: E1 1D 45, E1 9D C5 E1, E1_1D, E1_9D, } state = INIT; uint8_t code = xt_host_recv(); if (!code) return 0; dprintf("%02X ", code); switch (state) { case INIT: switch (code) { case 0xE0: state = E0; break; case 0xE1: state = E1; break; default: if (code < 0x80) matrix_make(code); else matrix_break(code & 0x7F); break; } break; case E0: switch (code) { case 0x2A: case 0xAA: case 0x36: case 0xB6: //ignore fake shift state = INIT; break; default: if (code < 0x80) matrix_make(move_e0code(code)); else matrix_break(move_e0code(code & 0x7F)); state = INIT; break; } break; case E1: switch (code) { case 0x1D: state = E1_1D; break; case 0x9D: state = E1_9D; break; default: state = INIT; break; } break; case E1_1D: switch (code) { case 0x45: matrix_make(0x55); break; default: state = INIT; break; } break; case E1_9D: switch (code) { case 0x45: matrix_break(0x55); break; default: state = INIT; break; } break; default: state = INIT; } return 1; }
uint8_t matrix_scan(void) { // scan code reading states static enum { INIT, E0, E0_2A, E0_2A_E0, E0_B7, E0_B7_E0, // print screen E1, E1_1D, E1_1D_45, E1_1D_45_E1, E1_1D_45_E1_9D, // pause } state = INIT; is_modified = false; // 'pseudo break code' hack if (matrix_is_on(ROW(PAUSE), COL(PAUSE))) { matrix_break(PAUSE); } uint8_t code = xt_host_recv(); switch (state) { case INIT: switch (code) { case 0xE0: state = E0; break; case 0xE1: state = E1; break; default: // normal key make if (code < 0x80 && code != 0x00) { xprintf("make: %X\r\n", code); matrix_make(code); } else if (code > 0x80 && code < 0xFF && code != 0x00) { xprintf("break %X\r\n", code); matrix_break(code - 0x80); } state = INIT; } break; case E0: // E0-Prefixed switch (code) { //move these codes to unused places on the matrix case 0x2A: state = E0_2A; break; case 0xB7: state = E0_B7; break; default: if (code < 0x80 && code != 0x00) { matrix_make(move_codes(code)); } else if (code > 0x80 && code < 0xFF && code != 0x00) { matrix_break(move_codes(code - 0x80)); } state = INIT; } break; case E0_2A: if(code == 0xE0) state = E0_2A_E0; else state = INIT; break; case E0_2A_E0: if(code == 0x37) matrix_make(PRINT_SCREEN); else state = INIT; break; case E0_B7: if(code == 0xE0) state = E0_B7; else state = INIT; break; case E0_B7_E0: if(code == 0xAA) matrix_break(PRINT_SCREEN); else state = INIT; break; case E1: if (code == 0x1D) state = E1_1D; else state = INIT; break; case E1_1D: if(code == 0x45) state = E1_1D_45; else state = INIT; break; case E1_1D_45: if(code == 0xE1) state = E1_1D_45_E1; else state = INIT; break; case E1_1D_45_E1: if(code == 0x9D) state = E1_1D_45_E1_9D; else state = INIT; break; case E1_1D_45_E1_9D: if(code == 0xC5) matrix_make(PAUSE); else state = INIT; break; default: state = INIT; } return 1; }