Acorn Electron keyboard scanner, turns an old Acorn Electron into a USB keyboard.

Dependencies:   USBDevice mbed

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;