Example #1
0
/* intialize matrix for scanning. should be called once. */
void matrix_init(void)
{
#ifdef DEBUG_ON_INIT
    debug_enable = true;
#endif

    // I've found that the matrix likes a little while for things to
    // settle down before it gets started.  Not sure why :)
    _delay_ms(250);

    dprintf("[ Intializing NeXT keyboard ]\n");
    NEXT_KBD_LED1_DDR |=  (1<<NEXT_KBD_LED1_BIT);  // LED pin to output
    NEXT_KBD_LED1_ON;

    NEXT_KBD_PWR_DDR &= ~(1<<NEXT_KBD_PWR_BIT);  // Power Button pin to input
    NEXT_KBD_PWR_PIN |=  (1<<NEXT_KBD_PWR_BIT);  // KBD_PWR pull up

    power_state = NEXT_KBD_PWR_READ ? false : true;
    dprintf("Initial power button state: %b\n", power_state);

    next_kbd_init();

    // initialize matrix state: all keys off
    for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00;

#ifdef NEXT_KBD_INIT_FLASH_LEDS
    dprintf("flashing LEDs:");
    // flash the LEDs after initialization
    bool leds_on = true;
    for (uint8_t i = 0; i <= 6; i++)
    {
        leds_on = leds_on ? false : true;
        dprintf(" %b", leds_on);
        next_kbd_set_leds(leds_on, leds_on);
        _delay_ms(250);
    }
    dprintf("\n");
#endif

    dprintf("[ NeXT keyboard initialized ]\n");

    return;
}
uint8_t NeXTMatrix::scan()
{
    //_delay_ms(20);
    
    //next_kbd_set_leds(false, false);
    NEXT_KBD_LED1_OFF;
    
    _is_modified = false;
    
    if (!NEXT_KBD_PWR_READ) {
        _make(NEXT_KBD_PWR_KEYCODE);
        _power_state = 1;
        if (_is_modified)
        {
            dprintf("Power state 1\n");
            
        }
    } else {
        _break(NEXT_KBD_PWR_KEYCODE);
        _power_state = 0;
        if (_is_modified)
        {
            dprintf("Power state 0\n");
            
        }
    }
    
    uint32_t resp = (next_kbd_recv());
    
    if (resp == NEXT_KBD_KMBUS_IDLE)
    {
        return 0;
    }
    
    NEXT_KBD_LED1_ON;
    
    next_kbd_set_leds(
        NEXT_KBD_PRESSED_SHIFT_LEFT(resp) ? true : false, 
        NEXT_KBD_PRESSED_SHIFT_RGHT(resp) ? true : false
    );
    
    dprintf("[ r=%04lX keycode=%02X pressed=%X CTRL=%X SHIFT_LEFT=%X SHIFT_RGHT=%X CMD_LEFT=%X CMD_RGHT=%X ALT_LEFT=%X ALT_RGHT=%X ]\n", \
        resp, \
        NEXT_KBD_KEYCODE(resp), \
        NEXT_KBD_PRESSED_KEYCODE(resp), \
        NEXT_KBD_PRESSED_CONTROL(resp), \
        NEXT_KBD_PRESSED_SHIFT_LEFT(resp), \
        NEXT_KBD_PRESSED_SHIFT_RGHT(resp), \
        NEXT_KBD_PRESSED_CMD_LEFT(resp), \
        NEXT_KBD_PRESSED_CMD_RGHT(resp), \
        NEXT_KBD_PRESSED_ALT_LEFT(resp), \
        NEXT_KBD_PRESSED_ALT_RGHT(resp) \
    );
    
    // Modifier keys don't return keycode; have to check the upper bits    
    NEXT_KBD_MAKE_OR_BREAK(ALT_RGHT,   0x51);
    NEXT_KBD_MAKE_OR_BREAK(ALT_LEFT,   0x52);
    NEXT_KBD_MAKE_OR_BREAK(CMD_RGHT,   0x53);
    NEXT_KBD_MAKE_OR_BREAK(CMD_LEFT,   0x54);
    NEXT_KBD_MAKE_OR_BREAK(SHIFT_RGHT, 0x55);
    NEXT_KBD_MAKE_OR_BREAK(SHIFT_LEFT, 0x56);
    NEXT_KBD_MAKE_OR_BREAK(CONTROL,    0x57);
    NEXT_KBD_MAKE_OR_BREAK(KEYCODE,    NEXT_KBD_KEYCODE(resp));
    
    return 1;
}