Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}