Ian Harvey
/
electron_kbd
Acorn Electron keyboard scanner, turns an old Acorn Electron into a USB keyboard.
Diff: main.cpp
- Revision:
- 1:84cd616cc684
- Parent:
- 0:9fd3dad2dc25
- Child:
- 2:9352b1232e6d
--- a/main.cpp Wed Apr 30 21:26:27 2014 +0000 +++ b/main.cpp Mon May 12 20:15:52 2014 +0000 @@ -11,20 +11,45 @@ { KEY_PERIOD, KEY_L, KEY_O, KEY_9, KEY_BACKSPACE, KEY_SLASH, KEY_SEMICOLON, KEY_P, KEY_0, KEY_NONE, - KEY_NONE, KEY_EQUALS, KEY_UP_ARROW, KEY_MINUS, KEY_NONE, - KEY_DELETE, KEY_ENTER, KEY_DOWN_ARROW, KEY_LEFT_ARROW, KEY_NONE, + KEY_NONE, KEY_SINGLE_QUOTE,KEY_UP_ARROW, KEY_MINUS, KEY_NONE, + KEY_LEFT_ALT, KEY_ENTER, KEY_DOWN_ARROW, KEY_LEFT_ARROW, KEY_NONE, + KEY_SPACE, KEY_NONE, KEY_OPEN_SQUARE, KEY_RIGHT_ARROW, KEY_NONE, KEY_COMMA, KEY_K, KEY_I, KEY_8, KEY_NONE, KEY_M, KEY_J, KEY_U, KEY_7, KEY_NONE, KEY_N, KEY_H, KEY_Y, KEY_6, KEY_NONE, + KEY_B, KEY_G, KEY_T, KEY_5, KEY_NONE, KEY_V, KEY_F, KEY_R, KEY_4, KEY_NONE, KEY_C, KEY_D, KEY_E, KEY_3, KEY_NONE, KEY_X, KEY_S, KEY_W, KEY_2, KEY_NONE, + KEY_Z, KEY_A, KEY_Q, KEY_1, KEY_NONE, KEY_LEFT_SHIFT, KEY_LEFT_CTRL, KEY_TAB, KEY_ESC, KEY_NONE, }; +const uint8_t alt_keys[MAX_ROWS * MAX_COLS] = +{ + KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, + KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, + KEY_NONE, KEY_NONE, KEY_HASH_TILDE, KEY_EQUALS, KEY_NONE, + KEY_NONE, KEY_NONE, KEY_NONE, KEY_BACKTICK_TILDE, KEY_NONE, + + KEY_NONE, KEY_NONE, KEY_CLOSE_SQUARE, KEY_BACKSLASH, KEY_NONE, + KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, + KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, + KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, + + KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, + KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, + KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, + KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, + + KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, + KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, KEY_NONE, + +}; + BusOut leds(LED1, LED2, LED3); @@ -55,13 +80,17 @@ // Drive output low to scan scanCols.write(0x3FFF ^ (1 << col)); leds.write(col >> 1); - wait(0.01); + wait(0.001); rowBits = inRows.read(); scanCols.write(0x3FFF); // Inputs also active-low return rowBits ^ 0x1F; } - + +static const uint8_t altKeys = + MODIFIER_BIT(KEY_LEFT_ALT) | MODIFIER_BIT(KEY_RIGHT_ALT); + + int main() { // Setup @@ -73,6 +102,7 @@ { int col, ocount; HID_REPORT report; + uint8_t keyIfAlt = KEY_NONE; report.data[0] = REPORT_ID_KEYBOARD; report.data[1] = 0; // modifiers @@ -98,11 +128,24 @@ if ( ocount < REPORT_LEN ) report.data[ocount++] = key; } + + key = alt_keys[col * MAX_ROWS + row]; + if ( key != KEY_NONE ) + keyIfAlt = key; //kbd.printf("c%dr%d ", col, row); } } } + if ( (report.data[1] & altKeys) != 0 && + keyIfAlt != KEY_NONE + ) + { + report.data[3] = keyIfAlt; + ocount = 4; // Zero out the rest + report.data[1] &= ~altKeys; // And put alt key up + } + while( ocount < REPORT_LEN ) report.data[ocount++] = KEY_NONE;