]> git.donarmstrong.com Git - kiibohd-controller.git/commitdiff
Adding Kaypro1 functional support
authorJacob Alexander <triplehaata@gmail.com>
Thu, 3 Nov 2011 07:09:10 +0000 (00:09 -0700)
committerJacob Alexander <triplehaata@gmail.com>
Thu, 3 Nov 2011 07:09:10 +0000 (00:09 -0700)
- Uses USART instead of polling
- Supports two way communication (only 3 commands to the keyboard
  though)
- Kaypro sends data as ASCII, which severely limits the handling of
  modifiers
- No release signal is sent, so even faking modifiers is next to
  impossible outside of Shift and Ctrl
- Includes default QWERTY and Colemak layouts
- Developed a new buffer macro, which will become the basic macro module
  once all the other modules have been ported (much more efficient, as
  it keeps serial scanning schemes serial, and parallel scanning schemes
  such as matrix, that already serialized into a sort of buffer for the
  debouncing evaluation)
- This module is quite efficient, and would be able to handle very
  excessive macro processing in the future.
- If more of the keypboard communication protocol is desired, I have a
  rom dump of the microcontroller (M5L8049)

Keymap/kaypro1.h [new file with mode: 0644]
Keymap/keymap.h
Scan/Kaypro1/scan_loop.c
Scan/Kaypro1/scan_loop.h
Scan/Kaypro1/setup.cmake
setup.cmake

diff --git a/Keymap/kaypro1.h b/Keymap/kaypro1.h
new file mode 100644 (file)
index 0000000..db8d096
--- /dev/null
@@ -0,0 +1,551 @@
+/* Copyright (C) 2011 by Jacob Alexander
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef __KAYPRO1_H
+#define __KAYPRO1_H
+
+// This file contains various key layouts for the Kaypro 1 keyboard
+
+
+// ----- Variables -----
+
+static uint8_t kaypro1_ModifierMask[] = { 0xF5, 0xF6 };
+
+static uint8_t kaypro1_DefaultMap[] = { 0,
+                               0, // 0x01
+                               0, // 0x02
+                               0, // 0x03
+                               0, // 0x04
+                               0, // 0x05
+                               0, // 0x06
+                               0, // 0x07
+                               KEY_BACKSPACE, // 0x08
+                               KEY_TAB, // 0x09
+                               0, // 0x0A
+                               0, // 0x0B
+                               0, // 0x0C
+                               KEY_ENTER, // 0x0D
+                               0, // 0x0E
+                               0, // 0x0F
+                               0, // 0x10
+                               0, // 0x11
+                               0, // 0x12
+                               0, // 0x13
+                               0, // 0x14
+                               0, // 0x15
+                               0, // 0x16
+                               0, // 0x17
+                               0, // 0x18
+                               0, // 0x19
+                               0, // 0x1A
+                               KEY_ESC, // 0x1B
+                               0, // 0x1C
+                               0, // 0x1D
+                               0, // 0x1E
+                               0, // 0x1F
+                               KEY_SPACE, // 0x20
+                               0, // 0x21
+                               0, // 0x22
+                               0, // 0x23
+                               0, // 0x24
+                               0, // 0x25
+                               0, // 0x26
+                               KEY_QUOTE, // 0x27
+                               0, // 0x28
+                               0, // 0x29
+                               0, // 0x2A
+                               0, // 0x2B
+                               KEY_COMMA, // 0x2C
+                               KEY_MINUS, // 0x2D
+                               KEY_PERIOD, // 0x2E
+                               KEY_SLASH, // 0x2F
+                               KEY_0, // 0x30
+                               KEY_1, // 0x31
+                               KEY_2, // 0x32
+                               KEY_3, // 0x33
+                               KEY_4, // 0x34
+                               KEY_5, // 0x35
+                               KEY_6, // 0x36
+                               KEY_7, // 0x37
+                               KEY_8, // 0x38
+                               KEY_9, // 0x39
+                               0, // 0x3A
+                               KEY_SEMICOLON, // 0x3B
+                               0, // 0x3C
+                               KEY_EQUAL, // 0x3D
+                               0, // 0x3E
+                               0, // 0x3F
+                               0, // 0x40
+                               0, // 0x41
+                               0, // 0x42
+                               0, // 0x43
+                               0, // 0x44
+                               0, // 0x45
+                               0, // 0x46
+                               0, // 0x47
+                               0, // 0x48
+                               0, // 0x49
+                               0, // 0x4A
+                               0, // 0x4B
+                               0, // 0x4C
+                               0, // 0x4D
+                               0, // 0x4E
+                               0, // 0x4F
+                               0, // 0x50
+                               0, // 0x51
+                               0, // 0x52
+                               0, // 0x53
+                               0, // 0x54
+                               0, // 0x55
+                               0, // 0x56
+                               0, // 0x57
+                               0, // 0x58
+                               0, // 0x59
+                               0, // 0x5A
+                               KEY_LEFT_BRACE, // 0x5B
+                               KEY_BACKSLASH, // 0x5C
+                               KEY_RIGHT_BRACE, // 0x5D
+                               0, // 0x5E
+                               0, // 0x5F
+                               KEY_TILDE, // 0x60
+                               KEY_A, // 0x61
+                               KEY_B, // 0x62
+                               KEY_C, // 0x63
+                               KEY_D, // 0x64
+                               KEY_E, // 0x65
+                               KEY_F, // 0x66
+                               KEY_G, // 0x67
+                               KEY_H, // 0x68
+                               KEY_I, // 0x69
+                               KEY_J, // 0x6A
+                               KEY_K, // 0x6B
+                               KEY_L, // 0x6C
+                               KEY_M, // 0x6D
+                               KEY_N, // 0x6E
+                               KEY_O, // 0x6F
+                               KEY_P, // 0x70
+                               KEY_Q, // 0x71
+                               KEY_R, // 0x72
+                               KEY_S, // 0x73
+                               KEY_T, // 0x74
+                               KEY_U, // 0x75
+                               KEY_V, // 0x76
+                               KEY_W, // 0x77
+                               KEY_X, // 0x78
+                               KEY_Y, // 0x79
+                               KEY_Z, // 0x7A
+                               0, // 0x7B
+                               0, // 0x7C
+                               0, // 0x7D
+                               0, // 0x7E
+                               KEY_DELETE, // 0x7F
+                               0, // 0x80
+                               0, // 0x81
+                               0, // 0x82
+                               0, // 0x83
+                               0, // 0x84
+                               0, // 0x85
+                               0, // 0x86
+                               0, // 0x87
+                               0, // 0x88
+                               0, // 0x89
+                               0, // 0x8A
+                               0, // 0x8B
+                               0, // 0x8C
+                               0, // 0x8D
+                               0, // 0x8E
+                               0, // 0x8F
+                               0, // 0x90
+                               0, // 0x91
+                               0, // 0x92
+                               0, // 0x93
+                               0, // 0x94
+                               0, // 0x95
+                               0, // 0x96
+                               0, // 0x97
+                               0, // 0x98
+                               0, // 0x99
+                               0, // 0x9A
+                               0, // 0x9B
+                               0, // 0x9C
+                               0, // 0x9D
+                               0, // 0x9E
+                               0, // 0x9F
+                               0, // 0xA0
+                               0, // 0xA1
+                               0, // 0xA2
+                               0, // 0xA3
+                               0, // 0xA4
+                               0, // 0xA5
+                               0, // 0xA6
+                               0, // 0xA7
+                               0, // 0xA8
+                               0, // 0xA9
+                               0, // 0xAA
+                               0, // 0xAB
+                               0, // 0xAC
+                               0, // 0xAD
+                               0, // 0xAE
+                               0, // 0xAF
+                               0, // 0xB0
+                               KEYPAD_0, // 0xB1
+                               KEYPAD_PERIOD, // 0xB2
+                               0, // 0xB3
+                               0, // 0xB4
+                               0, // 0xB5
+                               0, // 0xB6
+                               0, // 0xB7
+                               0, // 0xB8
+                               0, // 0xB9
+                               0, // 0xBA
+                               0, // 0xBB
+                               0, // 0xBC
+                               0, // 0xBD
+                               0, // 0xBE
+                               0, // 0xBF
+                               KEYPAD_1, // 0xC0
+                               KEYPAD_2, // 0xC1
+                               KEYPAD_3, // 0xC2
+                               KEYPAD_ENTER, // 0xC3
+                               0, // 0xC4
+                               0, // 0xC5
+                               0, // 0xC6
+                               0, // 0xC7
+                               0, // 0xC8
+                               0, // 0xC9
+                               0, // 0xCA
+                               0, // 0xCB
+                               0, // 0xCC
+                               0, // 0xCD
+                               0, // 0xCE
+                               0, // 0xCF
+                               KEYPAD_4, // 0xD0
+                               KEYPAD_5, // 0xD1
+                               KEYPAD_6, // 0xD2
+                               KEYPAD_COMMA, // 0xD3
+                               0, // 0xD4
+                               0, // 0xD5
+                               0, // 0xD6
+                               0, // 0xD7
+                               0, // 0xD8
+                               0, // 0xD9
+                               0, // 0xDA
+                               0, // 0xDB
+                               0, // 0xDC
+                               0, // 0xDD
+                               0, // 0xDE
+                               0, // 0xDF
+                               0, // 0xE0
+                               KEYPAD_7, // 0xE1
+                               KEYPAD_8, // 0xE2
+                               KEYPAD_9, // 0xE3
+                               KEYPAD_MINUS, // 0xE4
+                               0, // 0xE5
+                               0, // 0xE6
+                               0, // 0xE7
+                               0, // 0xE8
+                               0, // 0xE9
+                               0, // 0xEA
+                               0, // 0xEB
+                               0, // 0xEC
+                               0, // 0xED
+                               0, // 0xEE
+                               0, // 0xEF
+                               0, // 0xF0
+                               KEY_UP, // 0xF1
+                               KEY_DOWN, // 0xF2
+                               KEY_LEFT, // 0xF3
+                               KEY_RIGHT, // 0xF4
+                               KEY_LEFT_SHIFT, // 0xF5
+                               KEY_CTRL, // 0xF6
+                               0, // 0xF7
+                               0, // 0xF8
+                               0, // 0xF9
+                               0, // 0xFA
+                               0, // 0xFB
+                               0, // 0xFC
+                               0, // 0xFD
+                               0, // 0xFE
+                               0, // 0xFF
+};
+
+static uint8_t kaypro1_ColemakMap[] = { 0,
+                               0, // 0x01
+                               0, // 0x02
+                               0, // 0x03
+                               0, // 0x04
+                               0, // 0x05
+                               0, // 0x06
+                               0, // 0x07
+                               KEY_BACKSPACE, // 0x08
+                               KEY_TAB, // 0x09
+                               0, // 0x0A
+                               0, // 0x0B
+                               0, // 0x0C
+                               KEY_ENTER, // 0x0D
+                               0, // 0x0E
+                               0, // 0x0F
+                               0, // 0x10
+                               0, // 0x11
+                               0, // 0x12
+                               0, // 0x13
+                               0, // 0x14
+                               0, // 0x15
+                               0, // 0x16
+                               0, // 0x17
+                               0, // 0x18
+                               0, // 0x19
+                               0, // 0x1A
+                               KEY_ESC, // 0x1B
+                               0, // 0x1C
+                               0, // 0x1D
+                               0, // 0x1E
+                               0, // 0x1F
+                               KEY_SPACE, // 0x20
+                               0, // 0x21
+                               0, // 0x22
+                               0, // 0x23
+                               0, // 0x24
+                               0, // 0x25
+                               0, // 0x26
+                               KEY_QUOTE, // 0x27
+                               0, // 0x28
+                               0, // 0x29
+                               0, // 0x2A
+                               0, // 0x2B
+                               KEY_COMMA, // 0x2C
+                               KEY_MINUS, // 0x2D
+                               KEY_PERIOD, // 0x2E
+                               KEY_SLASH, // 0x2F
+                               KEY_0, // 0x30
+                               KEY_1, // 0x31
+                               KEY_2, // 0x32
+                               KEY_3, // 0x33
+                               KEY_4, // 0x34
+                               KEY_5, // 0x35
+                               KEY_6, // 0x36
+                               KEY_7, // 0x37
+                               KEY_8, // 0x38
+                               KEY_9, // 0x39
+                               0, // 0x3A
+                               KEY_O, // 0x3B
+                               0, // 0x3C
+                               KEY_EQUAL, // 0x3D
+                               0, // 0x3E
+                               0, // 0x3F
+                               0, // 0x40
+                               0, // 0x41
+                               0, // 0x42
+                               0, // 0x43
+                               0, // 0x44
+                               0, // 0x45
+                               0, // 0x46
+                               0, // 0x47
+                               0, // 0x48
+                               0, // 0x49
+                               0, // 0x4A
+                               0, // 0x4B
+                               0, // 0x4C
+                               0, // 0x4D
+                               0, // 0x4E
+                               0, // 0x4F
+                               0, // 0x50
+                               0, // 0x51
+                               0, // 0x52
+                               0, // 0x53
+                               0, // 0x54
+                               0, // 0x55
+                               0, // 0x56
+                               0, // 0x57
+                               0, // 0x58
+                               0, // 0x59
+                               0, // 0x5A
+                               KEY_LEFT_BRACE, // 0x5B
+                               KEY_BACKSLASH, // 0x5C
+                               KEY_RIGHT_BRACE, // 0x5D
+                               0, // 0x5E
+                               0, // 0x5F
+                               KEY_TILDE, // 0x60
+                               KEY_A, // 0x61
+                               KEY_B, // 0x62
+                               KEY_C, // 0x63
+                               KEY_S, // 0x64
+                               KEY_F, // 0x65
+                               KEY_T, // 0x66
+                               KEY_D, // 0x67
+                               KEY_H, // 0x68
+                               KEY_U, // 0x69
+                               KEY_N, // 0x6A
+                               KEY_E, // 0x6B
+                               KEY_I, // 0x6C
+                               KEY_M, // 0x6D
+                               KEY_K, // 0x6E
+                               KEY_Y, // 0x6F
+                               KEY_SEMICOLON, // 0x70
+                               KEY_Q, // 0x71
+                               KEY_P, // 0x72
+                               KEY_R, // 0x73
+                               KEY_G, // 0x74
+                               KEY_L, // 0x75
+                               KEY_V, // 0x76
+                               KEY_W, // 0x77
+                               KEY_X, // 0x78
+                               KEY_J, // 0x79
+                               KEY_Z, // 0x7A
+                               0, // 0x7B
+                               0, // 0x7C
+                               0, // 0x7D
+                               0, // 0x7E
+                               KEY_DELETE, // 0x7F
+                               0, // 0x80
+                               0, // 0x81
+                               0, // 0x82
+                               0, // 0x83
+                               0, // 0x84
+                               0, // 0x85
+                               0, // 0x86
+                               0, // 0x87
+                               0, // 0x88
+                               0, // 0x89
+                               0, // 0x8A
+                               0, // 0x8B
+                               0, // 0x8C
+                               0, // 0x8D
+                               0, // 0x8E
+                               0, // 0x8F
+                               0, // 0x90
+                               0, // 0x91
+                               0, // 0x92
+                               0, // 0x93
+                               0, // 0x94
+                               0, // 0x95
+                               0, // 0x96
+                               0, // 0x97
+                               0, // 0x98
+                               0, // 0x99
+                               0, // 0x9A
+                               0, // 0x9B
+                               0, // 0x9C
+                               0, // 0x9D
+                               0, // 0x9E
+                               0, // 0x9F
+                               0, // 0xA0
+                               0, // 0xA1
+                               0, // 0xA2
+                               0, // 0xA3
+                               0, // 0xA4
+                               0, // 0xA5
+                               0, // 0xA6
+                               0, // 0xA7
+                               0, // 0xA8
+                               0, // 0xA9
+                               0, // 0xAA
+                               0, // 0xAB
+                               0, // 0xAC
+                               0, // 0xAD
+                               0, // 0xAE
+                               0, // 0xAF
+                               0, // 0xB0
+                               KEYPAD_0, // 0xB1
+                               KEYPAD_PERIOD, // 0xB2
+                               0, // 0xB3
+                               0, // 0xB4
+                               0, // 0xB5
+                               0, // 0xB6
+                               0, // 0xB7
+                               0, // 0xB8
+                               0, // 0xB9
+                               0, // 0xBA
+                               0, // 0xBB
+                               0, // 0xBC
+                               0, // 0xBD
+                               0, // 0xBE
+                               0, // 0xBF
+                               KEYPAD_1, // 0xC0
+                               KEYPAD_2, // 0xC1
+                               KEYPAD_3, // 0xC2
+                               KEYPAD_ENTER, // 0xC3
+                               0, // 0xC4
+                               0, // 0xC5
+                               0, // 0xC6
+                               0, // 0xC7
+                               0, // 0xC8
+                               0, // 0xC9
+                               0, // 0xCA
+                               0, // 0xCB
+                               0, // 0xCC
+                               0, // 0xCD
+                               0, // 0xCE
+                               0, // 0xCF
+                               KEYPAD_4, // 0xD0
+                               KEYPAD_5, // 0xD1
+                               KEYPAD_6, // 0xD2
+                               KEYPAD_COMMA, // 0xD3
+                               0, // 0xD4
+                               0, // 0xD5
+                               0, // 0xD6
+                               0, // 0xD7
+                               0, // 0xD8
+                               0, // 0xD9
+                               0, // 0xDA
+                               0, // 0xDB
+                               0, // 0xDC
+                               0, // 0xDD
+                               0, // 0xDE
+                               0, // 0xDF
+                               0, // 0xE0
+                               KEYPAD_7, // 0xE1
+                               KEYPAD_8, // 0xE2
+                               KEYPAD_9, // 0xE3
+                               KEYPAD_MINUS, // 0xE4
+                               0, // 0xE5
+                               0, // 0xE6
+                               0, // 0xE7
+                               0, // 0xE8
+                               0, // 0xE9
+                               0, // 0xEA
+                               0, // 0xEB
+                               0, // 0xEC
+                               0, // 0xED
+                               0, // 0xEE
+                               0, // 0xEF
+                               0, // 0xF0
+                               KEY_UP, // 0xF1
+                               KEY_DOWN, // 0xF2
+                               KEY_LEFT, // 0xF3
+                               KEY_RIGHT, // 0xF4
+                               KEY_LEFT_SHIFT, // 0xF5
+                               KEY_CTRL, // 0xF6
+                               0, // 0xF7
+                               0, // 0xF8
+                               0, // 0xF9
+                               0, // 0xFA
+                               0, // 0xFB
+                               0, // 0xFC
+                               0, // 0xFD
+                               0, // 0xFE
+                               0, // 0xFF
+};
+
+
+
+#endif
+
index 426aaf042fe45d44dc482b600eb9c46cc321ed15..75783d2cebc42c392a60232b1a20f9a88c45edd1 100644 (file)
@@ -43,6 +43,7 @@
 // See files for full layout descriptions
 #include "budkeypad.h"
 #include "heathzenith.h"
+#include "kaypro1.h"
 #include "tandy1000.h"
 
 
index 1f7b0fee94bd1cc821932ec4f9b4bce8c4fb3e76..dc4f61a45b4b536d4538c37f8aa598431175fd4b 100644 (file)
 
 // ----- Macros -----
 
+// Make sure we haven't overflowed the buffer
+#define bufferAdd(byte) \
+               if ( KeyIndex_BufferUsed < KEYBOARD_BUFFER ) \
+                       KeyIndex_Buffer[KeyIndex_BufferUsed++] = byte
+
 
 
 // ----- Variables -----
 
-uint8_t KeyIndex_Array[KEYBOARD_SIZE + 1];
+volatile uint8_t KeyIndex_Buffer[KEYBOARD_BUFFER];
+volatile uint8_t KeyIndex_BufferUsed;
 
 
 // Known signals
@@ -83,112 +89,12 @@ inline void scan_setup()
 
 
 // Main Detection Loop
+// Nothing is needed here for the Kaypro, but the function is available as part of the api to be called in a polling fashion
+// TODO
+//  - Add songs :D
 inline uint8_t scan_loop()
 {
-       /*
-       // Packet Read
-       if ( packet_index == 8 )
-       {
-               // Disable Error LED, proper key found
-               errorLED( 0 );
-
-//#ifdef MAX_DEBUG
-               // Crazy Debug (Read the Scan Code)
-               char tmpStr[3];
-               hexToStr_op( inputData, tmpStr, 2 );
-               dPrintStrsNL( "Read Data: 0x", tmpStr );
-//#endif
-               // - Map the scan code to the index array -
-               // If the 8th bit is high, remove the keypress, else, add the keypress
-               // The lower 7 bits are the array index
-               KeyIndex_Array[(inputData & 0x7F)] = (inputData & 0x80) ? 0x00 : 0x80;
-
-               // Reset Containers
-               packet_index = 0;
-               inputData = 0xFF;
-       }
-       // Bad Packet
-       else if ( packet_index > 8 )
-       {
-               // Signal Error
-               errorLED( 1 );
-
-               char tmpStr[3];
-               int8ToStr( packet_index, tmpStr );
-               erro_dPrint( "Big packet? Mismatched... ", tmpStr );
-
-               packet_index = 0;
-               inputData = 0xFF;
-       }
-       */
-       /*
-       // Disable keyboard interrupt (does nothing if already off)
-       UNSET_INTR();
-
-       // Read the clock 8 times
-       if ( READ_CLK )
-       {
-               // Mis-read packet, set back to 0
-               if ( packet_index == -1 )
-                       packet_index = 0;
-
-               // Append 1 bit of data
-               inputData &= ~(READ_DATA << packet_index);
-               packet_index++;
-
-               // 8 Bits have been read
-               if ( packet_index == 8 )
-               {
-                       // Wait till clock edge falls
-                       while ( READ_CLK );
-
-                       // Sample both lines to make sure this is not a data value
-                       //  and definitely the end of packet data blip
-                       uint16_t badDataCounter = 0;
-                       while ( !( READ_DATA ) && !( READ_CLK ) )
-                                       badDataCounter++;
-
-                       if ( badDataCounter < 25 )
-                       {
-//#ifdef MAX_DEBUG
-                               // Crazy Debug (Read the Scan Code)
-                               char tmpStr[3];
-                               hexToStr_op( inputData, tmpStr, 2 );
-                               dbug_dPrint( "Read Data: 0x", tmpStr );
-//#endif
-                               // - Map the scan code to the index array -
-                               // If the 8th bit is high, remove the keypress, else, add the keypress
-                               // The lower 7 bits are the array index
-                               KeyIndex_Array[(inputData & 0x7F)] = (inputData & 0x80) ? 0x00 : 0x80;
-                       }
-                       // Even though this is a mis-read packet, we still know what the value is
-                       else
-                       {
-                               // Signal Error
-                               errorLED( 1 );
-                               char tmpStr[3];
-                               hexToStr_op( inputData, tmpStr, 2 );
-                               erro_dPrint( "Bad packet? Mismatched... 0x", tmpStr );
-                       }
-
-                       // Reset Containers
-                       inputData = 0xFF;
-                       packet_index = 0;
-
-                       // Interrupt the keyboard, so we don't get packet pieces...
-                       SET_INTR();
-
-                       // Do not wait for next clock, let USB do it's thing (if desired)
-                       return packet_index;
-               }
-
-               // Wait till clock edge falls
-               while ( READ_CLK );
-       }
-
-       // Interrupt keyboard if there is no pending packet
-       SET_INTR();
-       */
+       // We *could* do extra offline processing here, but, it's not really needed for the Kaypro 1 keyboard
        return 0;
 }
 
@@ -197,10 +103,149 @@ ISR(USART1_RX_vect)
 {
        cli(); // Disable Interrupts
 
+       // Get key from USART
        uint8_t keyValue = UDR1;
+
+//#ifdef MAX_DEBUG
+       // Debug print key
        char tmpStr1[6];
        hexToStr( keyValue, tmpStr1 );
        dPrintStrs( tmpStr1, " " );
+//#endif
+
+       // Add key(s) to processing buffer
+       // First split out Shift and Ctrl
+       //  Reserved Codes:
+       //   Shift - 0xF5
+       //   Ctrl  - 0xF6
+       switch ( keyValue )
+       {
+       // - Ctrl Keys -
+       // Exception keys
+       case 0x08: // ^H
+       case 0x09: // ^I
+       case 0x0D: // ^M
+       case 0x1B: // ^[
+               bufferAdd( keyValue );
+               break;
+       // 0x40 Offset Keys
+       // Add Ctrl key and offset to the lower alphabet
+       case 0x00: // ^@
+       case 0x1C: // "^\"
+       case 0x1D: // ^]
+       case 0x1E: // ^^
+       case 0x1F: // ^_
+               bufferAdd( 0xF6 );
+               bufferAdd( keyValue + 0x40 );
+               break;
+
+       // - Add Shift key and offset to non-shifted key -
+       // 0x10 Offset Keys
+       case 0x21: // !
+       case 0x23: // #
+       case 0x24: // $
+       case 0x25: // %
+               bufferAdd( 0xF5 );
+               bufferAdd( keyValue + 0x10 );
+               break;
+       // 0x11 Offset Keys
+       case 0x26: // &
+       case 0x28: // (
+               bufferAdd( 0xF5 );
+               bufferAdd( keyValue + 0x11 );
+               break;
+       // 0x07 Offset Keys
+       case 0x29: // )
+               bufferAdd( 0xF5 );
+               bufferAdd( keyValue + 0x07 );
+               break;
+       // -0x0E Offset Keys
+       case 0x40: // @
+               bufferAdd( 0xF5 );
+               bufferAdd( keyValue - 0x0E );
+               break;
+       // 0x0E Offset Keys
+       case 0x2A: // *
+               bufferAdd( 0xF5 );
+               bufferAdd( keyValue + 0x0E );
+               break;
+       // 0x12 Offset Keys
+       case 0x2B: // +
+               bufferAdd( 0xF5 );
+               bufferAdd( keyValue + 0x12 );
+               break;
+       // 0x05 Offset Keys
+       case 0x22: // "
+               bufferAdd( 0xF5 );
+               bufferAdd( keyValue + 0x05 );
+               break;
+       // 0x01 Offset Keys
+       case 0x3A: // :
+               bufferAdd( 0xF5 );
+               bufferAdd( keyValue + 0x01 );
+               break;
+       // -0x10 Offset Keys
+       case 0x3C: // <
+       case 0x3E: // >
+       case 0x3F: // ?
+               bufferAdd( 0xF5 );
+               bufferAdd( keyValue - 0x10 );
+               break;
+       // -0x28 Offset Keys
+       case 0x5E: // ^
+               bufferAdd( 0xF5 );
+               bufferAdd( keyValue - 0x28 );
+               break;
+       // -0x32 Offset Keys
+       case 0x5F: // _
+               bufferAdd( 0xF5 );
+               bufferAdd( keyValue - 0x32 );
+               break;
+       // -0x20 Offset Keys
+       case 0x7B: // {
+       case 0x7C: // |
+       case 0x7D: // }
+               bufferAdd( 0xF5 );
+               bufferAdd( keyValue - 0x20 );
+               break;
+       // -0x1E Offset Keys
+       case 0x7E: // ~
+               bufferAdd( 0xF5 );
+               bufferAdd( keyValue - 0x1E );
+               break;
+       // All other keys
+       default:
+               // Ctrl Characters are from 0x00 to 0x1F, excluding:
+               //  0x08 - Backspace
+               //  0x09 - [Horizontal] Tab
+               //  0x0D - [Carriage] Return
+               //  0x1B - Escape
+               //  0x7F - Delete (^?) (Doesn't need to be split out)
+
+               // 0x60 Offset Keys
+               // Add Ctrl key and offset to the lower alphabet
+               if ( keyValue >= 0x00 && keyValue <= 0x1F )
+               {
+                       bufferAdd( 0xF6 );
+                       bufferAdd( keyValue + 0x60 );
+               }
+
+               // Shift Characters are from 0x41 to 0x59
+               //  No exceptions here :D
+               // Add Shift key and offset to the lower alphabet
+               else if ( keyValue >= 0x41 && keyValue <= 0x5A )
+               {
+                       bufferAdd( 0xF5 );
+                       bufferAdd( keyValue + 0x20 );
+               }
+
+               // Everything else
+               else
+               {
+                       bufferAdd( keyValue );
+               }
+               break;
+       }
 
        // Special keys - For communication to the keyboard
        // TODO Try to push this functionality into the macros...somehow
@@ -225,8 +270,6 @@ ISR(USART1_RX_vect)
                break;
        }
 
-       // Add key to processing buffer
-
        sei(); // Re-enable Interrupts
 }
 
index 423381b4d0e9b273983e6619b2cba16cabe6aa73..2aa4dbbf755884c1c65735bc787b02994fa3405d 100644 (file)
 // ----- Defines -----
 
 #define KEYBOARD_SIZE 0x4c // 76 - Size of the array space for the keyboardr(max index)
+#define KEYBOARD_BUFFER 24 // Max number of key signals to buffer
 
 
 
 // ----- Variables -----
 
-// NOTE: Highest Bit: Valid keypress (0x80 is valid keypress)
-//        Other Bits: Pressed state sample counter
-extern              uint8_t KeyIndex_Array [KEYBOARD_SIZE + 1];
-       static const uint8_t KeyIndex_Size = KEYBOARD_SIZE;
+extern volatile     uint8_t KeyIndex_Buffer[KEYBOARD_BUFFER];
+extern volatile     uint8_t KeyIndex_BufferUsed;
 
 
 
index cb3bf6ad3e1631298f125d0a69b3ac0df793798c..6f712895f33f8d2ad75f93582ee1c42627d03102 100644 (file)
@@ -23,7 +23,8 @@ add_definitions( -I${HEAD_DIR}/Keymap )
 
 #| Keymap Settings
 add_definitions(
-       -DMODIFIER_MASK=tandy1000_modifierMask
-       -DKEYINDEX_MASK=tandy1000_colemak
+       -DMODIFIER_MASK=kaypro1_ModifierMask
+       -DKEYINDEX_MASK=kaypro1_ColemakMap
+       #-DKEYINDEX_MASK=kaypro1_DefaultMap
 )
 
index 7bac7fc3821a7830051f61d288d5e13da6ee735d..bbf0846c0ab7ed610059f386697d572b46df5e91 100644 (file)
@@ -23,7 +23,7 @@
 set(  ScanModule  "Kaypro1" )
 
 ##| Uses the key index and potentially applies special conditions to it, mapping it to a usb key code
-set( MacroModule  "basic"  )
+set( MacroModule  "buffer"  )
 
 ##| Sends the current list of usb key codes through USB HID
 set(   USBModule  "pjrc"   )