/* 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; }