- Full support (NKRO, provided the USB module can handle it) - Full LED support (available to the macro modules per input signals) - Reset/Hold line support - Handles repeat rate issues (keyboard does not send key updates as most keyboards do...)simple
@@ -13,6 +13,10 @@ cmake_force_c_compiler ( avr-gcc AVRCCompiler ) | |||
cmake_force_cxx_compiler( avr-g++ AVRCxxCompiler ) | |||
#| Add Dependency Macro | |||
include( AddFileDependencies ) | |||
### | |||
# Project Description | |||
# | |||
@@ -38,7 +42,13 @@ cmake_minimum_required( VERSION 2.8 ) | |||
#| Instead, include the module source selector | |||
include( setup.cmake ) | |||
set( SRCS main.c ${SCAN_SRCS} ${MACRO_SRCS} ${USB_SRCS} ${DEBUG_SRCS} ) | |||
set( SRCS | |||
main.c | |||
${SCAN_SRCS} | |||
${MACRO_SRCS} | |||
${USB_SRCS} | |||
${DEBUG_SRCS} | |||
) | |||
@@ -54,7 +64,7 @@ set( SRCS main.c ${SCAN_SRCS} ${MACRO_SRCS} ${USB_SRCS} ${DEBUG_SRCS} ) | |||
#| "atmega32u4" # Teensy 2.0 | |||
#| "at90usb646" # Teensy++ 1.0 | |||
#| "at90usb1286" # Teensy++ 2.0 | |||
set( MCU "at90usb1286" ) | |||
set( MCU "atmega32u4" ) | |||
#| Compiler flag to set the C Standard level. |
@@ -44,6 +44,7 @@ | |||
#include "budkeypad.h" | |||
#include "heathzenith.h" | |||
#include "kaypro1.h" | |||
#include "microswitch8304.h" | |||
#include "tandy1000.h" | |||
@@ -0,0 +1,296 @@ | |||
/* 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 __TANDY1000_H | |||
#define __TANDY1000_H | |||
// This file contains various key layouts for the Tandy 1000 keyboard | |||
// ----- Variables ----- | |||
static uint8_t microswitch8304_ModifierMask[] = { 0x48, 0x49, 0x4C, 0x4D, 0x45, 0x14 }; | |||
static uint8_t microswitch8304_DefaultMap[] = { | |||
KEY_TILDE, // 0x00 | |||
KEY_UP, // 0x01 | |||
0, // 0x02 | |||
0, // 0x03 | |||
KEY_PRINTSCREEN, // 0x04 | |||
KEY_PAGE_DOWN, // 0x05 | |||
KEY_LEFT_BRACE, // 0x06 | |||
KEY_F11, // 0x07 | |||
KEY_BACKSPACE, // 0x08 | |||
KEY_TAB, // 0x09 | |||
KEY_ENTER, // 0x0A | |||
KEY_DOWN, // 0x0B | |||
KEY_PAGE_UP, // 0x0C | |||
KEYPAD_ENTER, // 0x0D | |||
KEY_LEFT, // 0x0E | |||
KEY_RIGHT, // 0x0F | |||
0, // 0x10 | |||
KEY_PAGE_UP, // 0x11 | |||
KEY_F12, // 0x12 | |||
KEY_PAGE_DOWN, // 0x13 | |||
KEY_GUI, // 0x14 | |||
KEY_F1, // 0x15 | |||
KEY_F2, // 0x16 | |||
KEY_F3, // 0x17 | |||
KEY_F4, // 0x18 | |||
KEY_F5, // 0x19 | |||
KEY_F6, // 0x1A | |||
KEY_ESC, // 0x1B | |||
KEY_F7, // 0x1C | |||
KEY_F8, // 0x1D | |||
KEY_F9, // 0x1E | |||
KEY_F10, // 0x1F | |||
KEY_SPACE, // 0x20 | |||
KEYPAD_9, // 0x21 | |||
0, // 0x22 | |||
0, // 0x23 | |||
0, // 0x24 | |||
0, // 0x25 | |||
0, // 0x26 | |||
KEY_QUOTE, // 0x27 | |||
0, // 0x28 | |||
0, // 0x29 | |||
0, // 0x2A | |||
KEY_EQUAL, // 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 | |||
KEYPAD_6, // 0x41 | |||
KEYPAD_MINUS, // 0x42 | |||
KEY_PAUSE, // 0x43 | |||
KEY_INSERT, // 0x44 | |||
KEY_CTRL, // 0x45 | |||
KEYPAD_2, // 0x46 | |||
KEYPAD_3, // 0x47 | |||
KEY_LEFT_SHIFT, // 0x48 | |||
KEY_RIGHT_SHIFT, // 0x49 | |||
KEYPAD_0, // 0x4A | |||
KEYPAD_PERIOD, // 0x4B | |||
KEY_LEFT_ALT, // 0x4C | |||
KEY_RIGHT_ALT, // 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_RIGHT_BRACE, // 0x5B | |||
KEYPAD_7, // 0x5C | |||
KEY_BACKSLASH, // 0x5D | |||
KEY_ESC, // 0x5E | |||
0, // 0x5F | |||
KEYPAD_1, // 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 | |||
KEYPAD_4, // 0x7B | |||
KEYPAD_8, // 0x7C | |||
KEYPAD_5, // 0x7D | |||
0, // 0x7E | |||
KEY_DELETE, // 0x7F | |||
}; | |||
static uint8_t microswitch8304_ColemakMap[] = { | |||
KEY_TILDE, // 0x00 | |||
KEY_UP, // 0x01 | |||
0, // 0x02 | |||
0, // 0x03 | |||
KEY_PRINTSCREEN, // 0x04 | |||
KEY_PAGE_DOWN, // 0x05 | |||
KEY_LEFT_BRACE, // 0x06 | |||
KEY_F11, // 0x07 | |||
KEY_BACKSPACE, // 0x08 | |||
KEY_TAB, // 0x09 | |||
KEY_ENTER, // 0x0A | |||
KEY_DOWN, // 0x0B | |||
KEY_PAGE_UP, // 0x0C | |||
KEYPAD_ENTER, // 0x0D | |||
KEY_LEFT, // 0x0E | |||
KEY_RIGHT, // 0x0F | |||
0, // 0x10 | |||
KEY_PAGE_UP, // 0x11 | |||
KEY_F12, // 0x12 | |||
KEY_PAGE_DOWN, // 0x13 | |||
KEY_GUI, // 0x14 | |||
KEY_F1, // 0x15 | |||
KEY_F2, // 0x16 | |||
KEY_F3, // 0x17 | |||
KEY_F4, // 0x18 | |||
KEY_F5, // 0x19 | |||
KEY_F6, // 0x1A | |||
KEY_ESC, // 0x1B | |||
KEY_F7, // 0x1C | |||
KEY_F8, // 0x1D | |||
KEY_F9, // 0x1E | |||
KEY_F10, // 0x1F | |||
KEY_SPACE, // 0x20 | |||
KEYPAD_9, // 0x21 | |||
0, // 0x22 | |||
0, // 0x23 | |||
0, // 0x24 | |||
0, // 0x25 | |||
0, // 0x26 | |||
KEY_QUOTE, // 0x27 | |||
0, // 0x28 | |||
0, // 0x29 | |||
0, // 0x2A | |||
KEY_EQUAL, // 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 | |||
KEYPAD_6, // 0x41 | |||
KEYPAD_MINUS, // 0x42 | |||
KEY_PAUSE, // 0x43 | |||
KEY_INSERT, // 0x44 | |||
KEY_CTRL, // 0x45 | |||
KEYPAD_2, // 0x46 | |||
KEYPAD_3, // 0x47 | |||
KEY_LEFT_SHIFT, // 0x48 | |||
KEY_RIGHT_SHIFT, // 0x49 | |||
KEYPAD_0, // 0x4A | |||
KEYPAD_PERIOD, // 0x4B | |||
KEY_LEFT_ALT, // 0x4C | |||
KEY_RIGHT_ALT, // 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_RIGHT_BRACE, // 0x5B | |||
KEYPAD_7, // 0x5C | |||
KEY_BACKSLASH, // 0x5D | |||
KEY_ESC, // 0x5E | |||
0, // 0x5F | |||
KEYPAD_1, // 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 | |||
KEYPAD_4, // 0x7B | |||
KEYPAD_8, // 0x7C | |||
KEYPAD_5, // 0x7D | |||
0, // 0x7E | |||
KEY_DELETE, // 0x7F | |||
}; | |||
#endif | |||
@@ -25,237 +25,237 @@ | |||
// ----- Defines ----- | |||
// List of Modifiers | |||
#define KEY_CTRL 0x01 | |||
#define KEY_SHIFT 0x02 | |||
#define KEY_ALT 0x04 | |||
#define KEY_GUI 0x08 | |||
#define KEY_LEFT_CTRL 0x01 | |||
#define KEY_LEFT_SHIFT 0x02 | |||
#define KEY_LEFT_ALT 0x04 | |||
#define KEY_LEFT_GUI 0x08 | |||
#define KEY_RIGHT_CTRL 0x10 | |||
#define KEY_RIGHT_SHIFT 0x20 | |||
#define KEY_RIGHT_ALT 0x40 | |||
#define KEY_RIGHT_GUI 0x80 | |||
#define KEY_CTRL 0x01 | |||
#define KEY_SHIFT 0x02 | |||
#define KEY_ALT 0x04 | |||
#define KEY_GUI 0x08 | |||
#define KEY_LEFT_CTRL 0x01 | |||
#define KEY_LEFT_SHIFT 0x02 | |||
#define KEY_LEFT_ALT 0x04 | |||
#define KEY_LEFT_GUI 0x08 | |||
#define KEY_RIGHT_CTRL 0x10 | |||
#define KEY_RIGHT_SHIFT 0x20 | |||
#define KEY_RIGHT_ALT 0x40 | |||
#define KEY_RIGHT_GUI 0x80 | |||
// List of Keycodes | |||
#define KEY_A 4 | |||
#define KEY_B 5 | |||
#define KEY_C 6 | |||
#define KEY_D 7 | |||
#define KEY_E 8 | |||
#define KEY_F 9 | |||
#define KEY_G 10 | |||
#define KEY_H 11 | |||
#define KEY_I 12 | |||
#define KEY_J 13 | |||
#define KEY_K 14 | |||
#define KEY_L 15 | |||
#define KEY_M 16 | |||
#define KEY_N 17 | |||
#define KEY_O 18 | |||
#define KEY_P 19 | |||
#define KEY_Q 20 | |||
#define KEY_R 21 | |||
#define KEY_S 22 | |||
#define KEY_T 23 | |||
#define KEY_U 24 | |||
#define KEY_V 25 | |||
#define KEY_W 26 | |||
#define KEY_X 27 | |||
#define KEY_Y 28 | |||
#define KEY_Z 29 | |||
#define KEY_1 30 | |||
#define KEY_2 31 | |||
#define KEY_3 32 | |||
#define KEY_4 33 | |||
#define KEY_5 34 | |||
#define KEY_6 35 | |||
#define KEY_7 36 | |||
#define KEY_8 37 | |||
#define KEY_9 38 | |||
#define KEY_0 39 | |||
#define KEY_ENTER 40 | |||
#define KEY_ESC 41 | |||
#define KEY_BACKSPACE 42 | |||
#define KEY_TAB 43 | |||
#define KEY_SPACE 44 | |||
#define KEY_MINUS 45 | |||
#define KEY_EQUAL 46 | |||
#define KEY_LEFT_BRACE 47 | |||
#define KEY_RIGHT_BRACE 48 | |||
#define KEY_BACKSLASH 49 | |||
#define KEY_NUMBER 50 | |||
#define KEY_SEMICOLON 51 | |||
#define KEY_QUOTE 52 | |||
#define KEY_TILDE 53 | |||
#define KEY_COMMA 54 | |||
#define KEY_PERIOD 55 | |||
#define KEY_SLASH 56 | |||
#define KEY_CAPS_LOCK 57 | |||
#define KEY_F1 58 | |||
#define KEY_F2 59 | |||
#define KEY_F3 60 | |||
#define KEY_F4 61 | |||
#define KEY_F5 62 | |||
#define KEY_F6 63 | |||
#define KEY_F7 64 | |||
#define KEY_F8 65 | |||
#define KEY_F9 66 | |||
#define KEY_F10 67 | |||
#define KEY_F11 68 | |||
#define KEY_F12 69 | |||
#define KEY_PRINTSCREEN 70 | |||
#define KEY_SCROLL_LOCK 71 | |||
#define KEY_PAUSE 72 | |||
#define KEY_INSERT 73 | |||
#define KEY_HOME 74 | |||
#define KEY_PAGE_UP 75 | |||
#define KEY_DELETE 76 | |||
#define KEY_END 77 | |||
#define KEY_PAGE_DOWN 78 | |||
#define KEY_RIGHT 79 | |||
#define KEY_LEFT 80 | |||
#define KEY_DOWN 81 | |||
#define KEY_UP 82 | |||
#define KEY_NUM_LOCK 83 | |||
#define KEYPAD_SLASH 84 | |||
#define KEYPAD_ASTERIX 85 | |||
#define KEYPAD_MINUS 86 | |||
#define KEYPAD_PLUS 87 | |||
#define KEYPAD_ENTER 88 | |||
#define KEYPAD_1 89 | |||
#define KEYPAD_2 90 | |||
#define KEYPAD_3 91 | |||
#define KEYPAD_4 92 | |||
#define KEYPAD_5 93 | |||
#define KEYPAD_6 94 | |||
#define KEYPAD_7 95 | |||
#define KEYPAD_8 96 | |||
#define KEYPAD_9 97 | |||
#define KEYPAD_0 98 | |||
#define KEYPAD_PERIOD 99 | |||
#define KEY_ISO_BACKSLASH 100 | |||
#define KEY_APP 101 | |||
#define KEYBOARD_ERROR 102 // See spec | |||
#define KEYPAD_EQUAL 103 | |||
#define KEY_F13 104 | |||
#define KEY_F14 105 | |||
#define KEY_F15 106 | |||
#define KEY_F16 107 | |||
#define KEY_F17 108 | |||
#define KEY_F18 109 | |||
#define KEY_F19 110 | |||
#define KEY_F20 111 | |||
#define KEY_F21 112 | |||
#define KEY_F22 113 | |||
#define KEY_F23 114 | |||
#define KEY_F24 115 | |||
#define KEY_EXEC 116 | |||
#define KEY_HELP 117 | |||
#define KEY_MENU 118 | |||
#define KEY_SELECT 119 | |||
#define KEY_STOP 120 | |||
#define KEY_AGAIN 121 | |||
#define KEY_UNDO 122 | |||
#define KEY_CUT 123 | |||
#define KEY_COPY 124 | |||
#define KEY_PASTE 125 | |||
#define KEY_FIND 126 | |||
#define KEY_MUTE 127 | |||
#define KEY_VOL_UP 128 | |||
#define KEY_VOL_DOWN 129 | |||
#define KEY_CAPS_LLOCK 130 // "Locking" Scroll Lock (Old keyboards with Locking Caps Lock) | |||
#define KEY_NUM_LLOCK 131 | |||
#define KEY_SCROLL_LLOCK 132 | |||
#define KEYPAD_COMMA 133 // Brazillian (See spec) | |||
#define KEYPAD_EQUAL_AS 134 // AS/400 Keyboard (See spec) | |||
#define KEY_INTER1 135 // Brazillian and Japanese "Ru" | |||
#define KEY_INTER2 136 // Japanese Katakana/Hiragana | |||
#define KEY_INTER3 137 // Japanese Yen | |||
#define KEY_INTER4 138 // Japanese Henkan | |||
#define KEY_INTER5 139 // Japanese Muhenkan | |||
#define KEY_INTER6 140 // PC98 Comma (Ka-m-ma) | |||
#define KEY_INTER7 141 // Double-Byte/Single-Byte Toggle | |||
#define KEY_INTER8 142 // Undefined | |||
#define KEY_INTER9 143 // Undefined | |||
#define KEY_LANG1 144 // Korean Hangul/English Toggle | |||
#define KEY_LANG2 145 // Korean Hanja Conversion | |||
#define KEY_LANG3 146 // Japanese Katakana Key (USB) | |||
#define KEY_LANG4 147 // Japanese Hiragana Key (USB) | |||
#define KEY_LANG5 148 // Japanese Zenkaku/Hankaku Key (USB) | |||
#define KEY_LANG6 149 // Reserved (Application Specific) | |||
#define KEY_LANG7 150 // Reserved (Application Specific) | |||
#define KEY_LANG8 151 // Reserved (Application Specific) | |||
#define KEY_LANG9 152 // Reserved (Application Specific) | |||
#define KEY_ALT_ERASE 153 // Special Erase (See Spec) | |||
#define KEY_SYSREQ_ATT 154 // Modifier Type | |||
#define KEY_CANCEL 155 | |||
#define KEY_CLEAR 156 | |||
#define KEY_PRIOR 157 | |||
#define KEY_RETURN 158 | |||
#define KEY_SEPARATOR 159 | |||
#define KEY_OUT 160 | |||
#define KEY_OPER 161 | |||
#define KEY_CLEAR_AGAIN 162 | |||
#define KEY_CRSEL_PROPS 163 | |||
#define KEY_EXSEL 164 | |||
#define KEY_A 4 | |||
#define KEY_B 5 | |||
#define KEY_C 6 | |||
#define KEY_D 7 | |||
#define KEY_E 8 | |||
#define KEY_F 9 | |||
#define KEY_G 10 | |||
#define KEY_H 11 | |||
#define KEY_I 12 | |||
#define KEY_J 13 | |||
#define KEY_K 14 | |||
#define KEY_L 15 | |||
#define KEY_M 16 | |||
#define KEY_N 17 | |||
#define KEY_O 18 | |||
#define KEY_P 19 | |||
#define KEY_Q 20 | |||
#define KEY_R 21 | |||
#define KEY_S 22 | |||
#define KEY_T 23 | |||
#define KEY_U 24 | |||
#define KEY_V 25 | |||
#define KEY_W 26 | |||
#define KEY_X 27 | |||
#define KEY_Y 28 | |||
#define KEY_Z 29 | |||
#define KEY_1 30 | |||
#define KEY_2 31 | |||
#define KEY_3 32 | |||
#define KEY_4 33 | |||
#define KEY_5 34 | |||
#define KEY_6 35 | |||
#define KEY_7 36 | |||
#define KEY_8 37 | |||
#define KEY_9 38 | |||
#define KEY_0 39 | |||
#define KEY_ENTER 40 | |||
#define KEY_ESC 41 | |||
#define KEY_BACKSPACE 42 | |||
#define KEY_TAB 43 | |||
#define KEY_SPACE 44 | |||
#define KEY_MINUS 45 | |||
#define KEY_EQUAL 46 | |||
#define KEY_LEFT_BRACE 47 | |||
#define KEY_RIGHT_BRACE 48 | |||
#define KEY_BACKSLASH 49 | |||
#define KEY_NUMBER 50 | |||
#define KEY_SEMICOLON 51 | |||
#define KEY_QUOTE 52 | |||
#define KEY_TILDE 53 | |||
#define KEY_COMMA 54 | |||
#define KEY_PERIOD 55 | |||
#define KEY_SLASH 56 | |||
#define KEY_CAPS_LOCK 57 | |||
#define KEY_F1 58 | |||
#define KEY_F2 59 | |||
#define KEY_F3 60 | |||
#define KEY_F4 61 | |||
#define KEY_F5 62 | |||
#define KEY_F6 63 | |||
#define KEY_F7 64 | |||
#define KEY_F8 65 | |||
#define KEY_F9 66 | |||
#define KEY_F10 67 | |||
#define KEY_F11 68 | |||
#define KEY_F12 69 | |||
#define KEY_PRINTSCREEN 70 | |||
#define KEY_SCROLL_LOCK 71 | |||
#define KEY_PAUSE 72 | |||
#define KEY_INSERT 73 | |||
#define KEY_HOME 74 | |||
#define KEY_PAGE_UP 75 | |||
#define KEY_DELETE 76 | |||
#define KEY_END 77 | |||
#define KEY_PAGE_DOWN 78 | |||
#define KEY_RIGHT 79 | |||
#define KEY_LEFT 80 | |||
#define KEY_DOWN 81 | |||
#define KEY_UP 82 | |||
#define KEY_NUM_LOCK 83 | |||
#define KEYPAD_SLASH 84 | |||
#define KEYPAD_ASTERIX 85 | |||
#define KEYPAD_MINUS 86 | |||
#define KEYPAD_PLUS 87 | |||
#define KEYPAD_ENTER 88 | |||
#define KEYPAD_1 89 | |||
#define KEYPAD_2 90 | |||
#define KEYPAD_3 91 | |||
#define KEYPAD_4 92 | |||
#define KEYPAD_5 93 | |||
#define KEYPAD_6 94 | |||
#define KEYPAD_7 95 | |||
#define KEYPAD_8 96 | |||
#define KEYPAD_9 97 | |||
#define KEYPAD_0 98 | |||
#define KEYPAD_PERIOD 99 | |||
#define KEY_ISO_BACKSLASH 100 | |||
#define KEY_APP 101 | |||
#define KEYBOARD_ERROR 102 // See spec | |||
#define KEYPAD_EQUAL 103 | |||
#define KEY_F13 104 | |||
#define KEY_F14 105 | |||
#define KEY_F15 106 | |||
#define KEY_F16 107 | |||
#define KEY_F17 108 | |||
#define KEY_F18 109 | |||
#define KEY_F19 110 | |||
#define KEY_F20 111 | |||
#define KEY_F21 112 | |||
#define KEY_F22 113 | |||
#define KEY_F23 114 | |||
#define KEY_F24 115 | |||
#define KEY_EXEC 116 | |||
#define KEY_HELP 117 | |||
#define KEY_MENU 118 | |||
#define KEY_SELECT 119 | |||
#define KEY_STOP 120 | |||
#define KEY_AGAIN 121 | |||
#define KEY_UNDO 122 | |||
#define KEY_CUT 123 | |||
#define KEY_COPY 124 | |||
#define KEY_PASTE 125 | |||
#define KEY_FIND 126 | |||
#define KEY_MUTE 127 | |||
#define KEY_VOL_UP 128 | |||
#define KEY_VOL_DOWN 129 | |||
#define KEY_CAPS_LLOCK 130 // "Locking" Scroll Lock (Old keyboards with Locking Caps Lock) | |||
#define KEY_NUM_LLOCK 131 | |||
#define KEY_SCROLL_LLOCK 132 | |||
#define KEYPAD_COMMA 133 // Brazillian (See spec) | |||
#define KEYPAD_EQUAL_AS 134 // AS/400 Keyboard (See spec) | |||
#define KEY_INTER1 135 // Brazillian and Japanese "Ru" | |||
#define KEY_INTER2 136 // Japanese Katakana/Hiragana | |||
#define KEY_INTER3 137 // Japanese Yen | |||
#define KEY_INTER4 138 // Japanese Henkan | |||
#define KEY_INTER5 139 // Japanese Muhenkan | |||
#define KEY_INTER6 140 // PC98 Comma (Ka-m-ma) | |||
#define KEY_INTER7 141 // Double-Byte/Single-Byte Toggle | |||
#define KEY_INTER8 142 // Undefined | |||
#define KEY_INTER9 143 // Undefined | |||
#define KEY_LANG1 144 // Korean Hangul/English Toggle | |||
#define KEY_LANG2 145 // Korean Hanja Conversion | |||
#define KEY_LANG3 146 // Japanese Katakana Key (USB) | |||
#define KEY_LANG4 147 // Japanese Hiragana Key (USB) | |||
#define KEY_LANG5 148 // Japanese Zenkaku/Hankaku Key (USB) | |||
#define KEY_LANG6 149 // Reserved (Application Specific) | |||
#define KEY_LANG7 150 // Reserved (Application Specific) | |||
#define KEY_LANG8 151 // Reserved (Application Specific) | |||
#define KEY_LANG9 152 // Reserved (Application Specific) | |||
#define KEY_ALT_ERASE 153 // Special Erase (See Spec) | |||
#define KEY_SYSREQ_ATT 154 // Modifier Type | |||
#define KEY_CANCEL 155 | |||
#define KEY_CLEAR 156 | |||
#define KEY_PRIOR 157 | |||
#define KEY_RETURN 158 | |||
#define KEY_SEPARATOR 159 | |||
#define KEY_OUT 160 | |||
#define KEY_OPER 161 | |||
#define KEY_CLEAR_AGAIN 162 | |||
#define KEY_CRSEL_PROPS 163 | |||
#define KEY_EXSEL 164 | |||
// 165 - 175 Reserved | |||
#define KEYPAD_00 176 | |||
#define KEYPAD_000 177 | |||
#define KEY_1000_SEP 178 | |||
#define KEY_DECIMAL_SEP 179 | |||
#define KEY_CURRENCY_MAIN 180 | |||
#define KEY_CURRENCY_SUB 181 | |||
#define KEYPAD_LPAREN 182 | |||
#define KEYPAD_RPAREN 183 | |||
#define KEYPAD_LBRACE 184 | |||
#define KEYPAD_RBRACE 185 | |||
#define KEYPAD_TAB 186 | |||
#define KEYPAD_BACKSPACE 187 | |||
#define KEYPAD_A 188 | |||
#define KEYPAD_B 189 | |||
#define KEYPAD_C 190 | |||
#define KEYPAD_D 191 | |||
#define KEYPAD_E 192 | |||
#define KEYPAD_F 193 | |||
#define KEYPAD_XOR 194 | |||
#define KEYPAD_CHEVRON 195 | |||
#define KEYPAD_PERCENT 196 | |||
#define KEYPAD_LTHAN 197 | |||
#define KEYPAD_GTHAN 198 | |||
#define KEYPAD_AND 199 | |||
#define KEYPAD_AND_AND 200 | |||
#define KEYPAD_OR 201 | |||
#define KEYPAD_OR_OR 202 | |||
#define KEYPAD_COLON 203 | |||
#define KEYPAD_POUND 204 | |||
#define KEYPAD_SPACE 205 | |||
#define KEYPAD_AT 206 | |||
#define KEYPAD_EXCLAIM 207 | |||
#define KEYPAD_MEM_STORE 208 | |||
#define KEYPAD_MEM_RECALL 209 | |||
#define KEYPAD_MEM_CLEAR 210 | |||
#define KEYPAD_MEM_ADD 211 | |||
#define KEYPAD_MEM_SUB 212 | |||
#define KEYPAD_MEM_MULT 213 | |||
#define KEYPAD_MEM_DIV 214 | |||
#define KEYPAD_PLUS_MINUS 215 | |||
#define KEYPAD_CLEAR 216 | |||
#define KEYPAD_00 176 | |||
#define KEYPAD_000 177 | |||
#define KEY_1000_SEP 178 | |||
#define KEY_DECIMAL_SEP 179 | |||
#define KEY_CURRENCY_MAIN 180 | |||
#define KEY_CURRENCY_SUB 181 | |||
#define KEYPAD_LPAREN 182 | |||
#define KEYPAD_RPAREN 183 | |||
#define KEYPAD_LBRACE 184 | |||
#define KEYPAD_RBRACE 185 | |||
#define KEYPAD_TAB 186 | |||
#define KEYPAD_BACKSPACE 187 | |||
#define KEYPAD_A 188 | |||
#define KEYPAD_B 189 | |||
#define KEYPAD_C 190 | |||
#define KEYPAD_D 191 | |||
#define KEYPAD_E 192 | |||
#define KEYPAD_F 193 | |||
#define KEYPAD_XOR 194 | |||
#define KEYPAD_CHEVRON 195 | |||
#define KEYPAD_PERCENT 196 | |||
#define KEYPAD_LTHAN 197 | |||
#define KEYPAD_GTHAN 198 | |||
#define KEYPAD_AND 199 | |||
#define KEYPAD_AND_AND 200 | |||
#define KEYPAD_OR 201 | |||
#define KEYPAD_OR_OR 202 | |||
#define KEYPAD_COLON 203 | |||
#define KEYPAD_POUND 204 | |||
#define KEYPAD_SPACE 205 | |||
#define KEYPAD_AT 206 | |||
#define KEYPAD_EXCLAIM 207 | |||
#define KEYPAD_MEM_STORE 208 | |||
#define KEYPAD_MEM_RECALL 209 | |||
#define KEYPAD_MEM_CLEAR 210 | |||
#define KEYPAD_MEM_ADD 211 | |||
#define KEYPAD_MEM_SUB 212 | |||
#define KEYPAD_MEM_MULT 213 | |||
#define KEYPAD_MEM_DIV 214 | |||
#define KEYPAD_PLUS_MINUS 215 | |||
#define KEYPAD_CLEAR 216 | |||
#define KEYPAD_CLEAR_ENTRY 217 | |||
#define KEYPAD_BINARY 218 | |||
#define KEYPAD_OCTAL 219 | |||
#define KEYPAD_DECIMAL 220 | |||
#define KEYPAD_HEX 221 | |||
#define KEYPAD_BINARY 218 | |||
#define KEYPAD_OCTAL 219 | |||
#define KEYPAD_DECIMAL 220 | |||
#define KEYPAD_HEX 221 | |||
// 222 - 223 Reserved | |||
#define KEYS_LCTRL 224 | |||
#define KEYS_LSHIFT 225 | |||
#define KEYS_LALT 226 | |||
#define KEYS_LGUI 227 | |||
#define KEYS_RCTRL 228 | |||
#define KEYS_RSHIFT 229 | |||
#define KEYS_RALT 230 | |||
#define KEYS_RGUI 231 | |||
#define KEYS_LCTRL 224 | |||
#define KEYS_LSHIFT 225 | |||
#define KEYS_LALT 226 | |||
#define KEYS_LGUI 227 | |||
#define KEYS_RCTRL 228 | |||
#define KEYS_RSHIFT 229 | |||
#define KEYS_RALT 230 | |||
#define KEYS_RGUI 231 | |||
// 232 - 65535 Reserved | |||
#endif |
@@ -0,0 +1,244 @@ | |||
/* 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. | |||
*/ | |||
// ----- Includes ----- | |||
// AVR Includes | |||
#include <util/delay.h> | |||
#include <avr/interrupt.h> | |||
// Project Includes | |||
#include <led.h> | |||
#include <print.h> | |||
#include <scan_loop.h> | |||
#include <usb_com.h> | |||
// Keymaps | |||
#include <keymap.h> | |||
#include <usb_keys.h> | |||
// Local Includes | |||
#include "macro.h" | |||
// ----- Variables ----- | |||
// Keeps track of the sequence used to reflash the teensy in software | |||
static uint8_t Bootloader_ConditionSequence[] = {1,16,6,11}; | |||
uint8_t Bootloader_ConditionState = 0; | |||
uint8_t Bootloader_NextPositionReady = 1; | |||
// ----- Functions ----- | |||
void jumpToBootloader(void) | |||
{ | |||
cli(); | |||
// disable watchdog, if enabled | |||
// disable all peripherals | |||
UDCON = 1; | |||
USBCON = (1<<FRZCLK); // disable USB | |||
UCSR1B = 0; | |||
_delay_ms(5); | |||
#if defined(__AVR_AT90USB162__) // Teensy 1.0 | |||
EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; | |||
TIMSK0 = 0; TIMSK1 = 0; UCSR1B = 0; | |||
DDRB = 0; DDRC = 0; DDRD = 0; | |||
PORTB = 0; PORTC = 0; PORTD = 0; | |||
asm volatile("jmp 0x3E00"); | |||
#elif defined(__AVR_ATmega32U4__) // Teensy 2.0 | |||
EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; ADCSRA = 0; | |||
TIMSK0 = 0; TIMSK1 = 0; TIMSK3 = 0; TIMSK4 = 0; UCSR1B = 0; TWCR = 0; | |||
DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0; TWCR = 0; | |||
PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0; | |||
asm volatile("jmp 0x7E00"); | |||
#elif defined(__AVR_AT90USB646__) // Teensy++ 1.0 | |||
EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; ADCSRA = 0; | |||
TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0; TIMSK3 = 0; UCSR1B = 0; TWCR = 0; | |||
DDRA = 0; DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0; | |||
PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0; | |||
asm volatile("jmp 0xFC00"); | |||
#elif defined(__AVR_AT90USB1286__) // Teensy++ 2.0 | |||
EIMSK = 0; PCICR = 0; SPCR = 0; ACSR = 0; EECR = 0; ADCSRA = 0; | |||
TIMSK0 = 0; TIMSK1 = 0; TIMSK2 = 0; TIMSK3 = 0; UCSR1B = 0; TWCR = 0; | |||
DDRA = 0; DDRB = 0; DDRC = 0; DDRD = 0; DDRE = 0; DDRF = 0; | |||
PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0; | |||
asm volatile("jmp 0x1FC00"); | |||
#endif | |||
} | |||
// Given a sampling array, and the current number of detected keypress | |||
// Add as many keypresses from the sampling array to the USB key send array as possible. | |||
/* | |||
inline void keyPressDetection( uint8_t *keys, uint8_t numberOfKeys, uint8_t *modifiers, uint8_t numberOfModifiers, uint8_t *map ) | |||
{ | |||
uint8_t Bootloader_KeyDetected = 0; | |||
uint8_t processed_keys = 0; | |||
// Parse the detection array starting from 1 (all keys are purposefully mapped from 1 -> total as per typical PCB labels) | |||
for ( uint8_t key = 0; key < numberOfKeys + 1; key++ ) | |||
{ | |||
if ( keys[key] & (1 << 7) ) | |||
{ | |||
processed_keys++; | |||
// Display the detected scancode | |||
char tmpStr[4]; | |||
int8ToStr( key, tmpStr ); | |||
dPrintStrs( tmpStr, " " ); | |||
// Is this a bootloader sequence key? | |||
if ( !Bootloader_KeyDetected | |||
&& Bootloader_NextPositionReady | |||
&& key == Bootloader_ConditionSequence[Bootloader_ConditionState] ) | |||
{ | |||
Bootloader_KeyDetected = 1; | |||
Bootloader_NextPositionReady = 0; | |||
Bootloader_ConditionState++; | |||
} | |||
else if ( Bootloader_ConditionState > 0 && key == Bootloader_ConditionSequence[Bootloader_ConditionState - 1] ) | |||
{ | |||
Bootloader_KeyDetected = 1; | |||
} | |||
// Determine if the key is a modifier | |||
uint8_t modFound = 0; | |||
for ( uint8_t mod = 0; mod < numberOfModifiers; mod++ ) { | |||
// Modifier found | |||
if ( modifiers[mod] == key ) { | |||
USBKeys_Modifiers |= map[key]; | |||
modFound = 1; | |||
break; | |||
} | |||
} | |||
// Modifier, already done this loop | |||
if ( modFound ) | |||
continue; | |||
// Too many keys | |||
if ( USBKeys_Sent >= USBKeys_MaxSize ) | |||
{ | |||
info_print("USB Key limit reached"); | |||
errorLED( 1 ); | |||
break; | |||
} | |||
// Allow ignoring keys with 0's | |||
if ( map[key] != 0 ) | |||
USBKeys_Array[USBKeys_Sent++] = map[key]; | |||
} | |||
} | |||
// Boot loader sequence state handler | |||
switch ( processed_keys ) | |||
{ | |||
// The next bootloader key can now be pressed, if there were no keys processed | |||
case 0: | |||
Bootloader_NextPositionReady = 1; | |||
break; | |||
// If keys were detected, and it wasn't in the sequence (or there was multiple keys detected), start bootloader sequence over | |||
// This case purposely falls through | |||
case 1: | |||
if ( Bootloader_KeyDetected ) | |||
break; | |||
default: | |||
Bootloader_ConditionState = 0; | |||
break; | |||
} | |||
// Add debug separator if keys sent via USB | |||
if ( USBKeys_Sent > 0 ) | |||
print("\033[1;32m|\033[0m\n"); | |||
} | |||
*/ | |||
// Given a list of keypresses, translate into the USB key codes | |||
// The buffer is cleared after running | |||
// If the buffer doesn't fit into the USB send array, the extra keys are dropped | |||
void keyPressBufferRead( uint8_t *modifiers, uint8_t numberOfModifiers, uint8_t *map ) | |||
{ | |||
// Loop through input buffer | |||
for ( uint8_t index = 0; index < KeyIndex_BufferUsed; index++ ) | |||
{ | |||
// Get the keycode from the buffer | |||
uint8_t key = KeyIndex_Buffer[index]; | |||
// Determine if the key is a modifier | |||
uint8_t modFound = 0; | |||
for ( uint8_t mod = 0; mod < numberOfModifiers; mod++ ) { | |||
// Modifier found | |||
if ( modifiers[mod] == key ) { | |||
USBKeys_Modifiers |= map[key]; | |||
modFound = 1; | |||
break; | |||
} | |||
} | |||
// Modifier, already done this loop | |||
if ( modFound ) | |||
continue; | |||
// Too many keys | |||
if ( USBKeys_Sent >= USBKeys_MaxSize ) | |||
{ | |||
info_print("USB Key limit reached"); | |||
errorLED( 1 ); | |||
break; | |||
} | |||
// Allow ignoring keys with 0's | |||
if ( map[key] != 0 ) | |||
{ | |||
USBKeys_Array[USBKeys_Sent++] = map[key]; | |||
} | |||
else | |||
{ | |||
// Key was not mapped | |||
// TODO Add dead key map | |||
char tmpStr[6]; | |||
hexToStr( key, tmpStr ); | |||
erro_dPrint( "Key not mapped... - ", tmpStr ); | |||
errorLED( 1 ); | |||
} | |||
} | |||
// Signal buffer that we've used it | |||
scan_finishedWithBuffer(); | |||
} | |||
inline void process_macros(void) | |||
{ | |||
// Online process macros once (if some were found), until the next USB send | |||
if ( USBKeys_Sent != 0 ) | |||
return; | |||
// Query the input buffer for keypresses | |||
keyPressBufferRead( MODIFIER_MASK, sizeof(MODIFIER_MASK), KEYINDEX_MASK ); | |||
// Check for bootloader condition | |||
//if ( Bootloader_ConditionState == sizeof( Bootloader_ConditionSequence ) ) | |||
// jumpToBootloader(); | |||
} | |||
@@ -0,0 +1,38 @@ | |||
/* 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 __macro_h | |||
#define __macro_h | |||
// ----- Includes ----- | |||
// Compiler Includes | |||
#include <stdint.h> | |||
// ----- Functions ----- | |||
void keyPressDetection( uint8_t *keys, uint8_t numberOfKeys, uint8_t *modifiers, uint8_t numberOfModifiers, uint8_t *map ); | |||
void process_macros(void); | |||
#endif | |||
@@ -0,0 +1,22 @@ | |||
###| CMake Kiibohd Controller Macro Module |### | |||
# | |||
# Written by Jacob Alexander in 2011 for the Kiibohd Controller | |||
# | |||
# Released into the Public Domain | |||
# | |||
### | |||
### | |||
# Module C files | |||
# | |||
set( MACRO_SRCS | |||
macro.c | |||
) | |||
### | |||
# Module Specific Options | |||
# | |||
@@ -0,0 +1,225 @@ | |||
/* 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. | |||
*/ | |||
// ----- Includes ----- | |||
// AVR Includes | |||
#include <avr/interrupt.h> | |||
#include <avr/io.h> | |||
#include <util/delay.h> | |||
// Project Includes | |||
#include <led.h> | |||
#include <print.h> | |||
// Local Includes | |||
#include "scan_loop.h" | |||
// ----- Defines ----- | |||
// Pinout Defines | |||
#define RESET_PORT PORTB | |||
#define RESET_DDR DDRD | |||
#define RESET_PIN 0 | |||
// ----- Macros ----- | |||
// Make sure we haven't overflowed the buffer | |||
#define bufferAdd(byte) \ | |||
if ( KeyIndex_BufferUsed < KEYBOARD_BUFFER ) \ | |||
KeyIndex_Buffer[KeyIndex_BufferUsed++] = byte | |||
#define UNSET_RESET() RESET_DDR &= ~(1 << RESET_PIN) | |||
#define SET_RESET() RESET_DDR |= (1 << RESET_PIN) | |||
// ----- Variables ----- | |||
// Buffer used to inform the macro processing module which keys have been detected as pressed | |||
volatile uint8_t KeyIndex_Buffer[KEYBOARD_BUFFER]; | |||
volatile uint8_t KeyIndex_BufferUsed; | |||
// Buffer Signals | |||
volatile uint8_t BufferReadyToClear; | |||
// ----- Functions ----- | |||
// Setup | |||
inline void scan_setup() | |||
{ | |||
// Setup the the USART interface for keyboard data input | |||
// NOTE: The input data signal needs to be inverted for the Teensy USART to properly work | |||
// Setup baud rate | |||
// 16 MHz / ( 16 * Baud ) = UBRR | |||
// Baud <- 0.82020 ms per bit, thus 1000 / 0.82020 = 1219.2 | |||
// Thus baud = 820 | |||
uint16_t baud = 820; // Max setting of 4095 | |||
UBRR1H = (uint8_t)(baud >> 8); | |||
UBRR1L = (uint8_t)baud; | |||
// Enable the receiver, transitter, and RX Complete Interrupt | |||
UCSR1B = 0x98; | |||
// Set frame format: 8 data, no stop bits or parity | |||
// Asynchrounous USART mode | |||
// 8304 sends encoded scancodes (for example Alphanumeric 0-9 follows their keypad encoding scheme) | |||
// Separate line is for reset | |||
UCSR1C = 0x06; | |||
// Initially buffer doesn't need to be cleared (it's empty...) | |||
BufferReadyToClear = 0; | |||
} | |||
// Main Detection Loop | |||
// Not needed for the Micro Switch 8304, this is just a busy loop | |||
inline uint8_t scan_loop() | |||
{ | |||
return 0; | |||
} | |||
void processKeyValue( uint8_t keyValue ) | |||
{ | |||
// Finalize output buffer | |||
// Mask 8th bit | |||
keyValue &= 0x7F; | |||
// Interpret scan code | |||
switch ( keyValue ) | |||
{ | |||
case 0x40: // Clear buffer command | |||
info_print("CLEAR!"); | |||
BufferReadyToClear = 1; | |||
break; | |||
case 0x7F: | |||
scan_lockKeyboard(); | |||
_delay_ms(3000); | |||
scan_unlockKeyboard(); | |||
default: | |||
// Make sure the key isn't already in the buffer | |||
for ( uint8_t c = 0; c < KeyIndex_BufferUsed + 1; c++ ) | |||
{ | |||
// Key isn't in the buffer yet | |||
if ( c == KeyIndex_BufferUsed ) | |||
{ | |||
bufferAdd( keyValue ); | |||
break; | |||
} | |||
// Key already in the buffer | |||
if ( KeyIndex_Buffer[c] == keyValue ) | |||
break; | |||
} | |||
break; | |||
} | |||
} | |||
// USART Receive Buffer Full Interrupt | |||
ISR(USART1_RX_vect) | |||
{ | |||
cli(); // Disable Interrupts | |||
uint8_t keyValue = 0x00; | |||
// The interrupt is always for the first item of the packet set, reset the buffer | |||
KeyIndex_BufferUsed = 0; | |||
// Only the first 7 bits have scancode data | |||
// The last packet of the packet set has the 8th bit high, all the others are low | |||
// | |||
// Interrupts are too slow for the rest of the packet set, poll for the rest | |||
while ( 1 ) | |||
{ | |||
// Read the raw packet from the USART | |||
keyValue = UDR1; | |||
// Debug | |||
char tmpStr[6]; | |||
hexToStr( keyValue, tmpStr ); | |||
dPrintStrs( tmpStr, " " ); | |||
// Process the scancode | |||
processKeyValue( keyValue ); | |||
// Last packet of the set | |||
if ( keyValue & 0x80 ) | |||
{ | |||
dPrintStrs( "**" ); | |||
break; | |||
} | |||
// Delay enough so we don't run into the same packet (or the previous buffered packet) | |||
_delay_us(10000); | |||
} | |||
sei(); // Re-enable Interrupts | |||
} | |||
// Send data | |||
// | |||
// Keyboard Input Guide for Micro Switch 8304 | |||
// 0xBX is for LED F1,F2,Over Type,Lock | |||
// 0xAX is for LED F3,F8,F9,F10 | |||
// 0x92 resets keyboard (LED off, echo scancode mode off) | |||
// 0x9E sets echo scancode mode from (0x81 to 0xFF; translates to 0x01 to 0x7F) | |||
// Other echos: 0x15~0x19 send 0x15~0x19, 0x40 sends 0x40 (as well as 0x44,0x45, 0x80) | |||
// 0x8C Acks the keyboard and gets 0x70 sent back (delayed) | |||
uint8_t scan_sendData( uint8_t dataPayload ) | |||
{ | |||
UDR1 = dataPayload; | |||
return 0; | |||
} | |||
// Signal KeyIndex_Buffer that it has been properly read | |||
// In the case of the Micro Switch 8304, we leave the buffer alone until more scancode data comes in | |||
void scan_finishedWithBuffer( void ) | |||
{ | |||
// We received a Clear code from the 8304, clear the buffer now that we've used it | |||
if ( BufferReadyToClear ) | |||
{ | |||
KeyIndex_BufferUsed = 0; | |||
BufferReadyToClear = 0; | |||
} | |||
} | |||
// Reset/Hold keyboard | |||
// Warning! This will cause the keyboard to not send any data, so you can't disable with a keypress | |||
// The Micro Switch 8304 has a dedicated reset line | |||
void scan_lockKeyboard( void ) | |||
{ | |||
UNSET_RESET(); | |||
} | |||
void scan_unlockKeyboard( void ) | |||
{ | |||
SET_RESET(); | |||
} | |||
@@ -0,0 +1,64 @@ | |||
/* 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 __SCAN_LOOP_H | |||
#define __SCAN_LOOP_H | |||
// ----- Includes ----- | |||
// Compiler Includes | |||
#include <stdint.h> | |||
// Local Includes | |||
// ----- Defines ----- | |||
#define KEYBOARD_SIZE 0x62 // 76 - Size of the array space for the keyboard(max index) | |||
#define KEYBOARD_BUFFER 24 // Max number of key signals to buffer | |||
// ----- Variables ----- | |||
extern volatile uint8_t KeyIndex_Buffer[KEYBOARD_BUFFER]; | |||
extern volatile uint8_t KeyIndex_BufferUsed; | |||
// ----- Functions ----- | |||
// Functions used by main.c | |||
void scan_setup( void ); | |||
uint8_t scan_loop( void ); | |||
// Functions available to macro.c | |||
uint8_t scan_sendData( uint8_t dataPayload ); | |||
void scan_finishedWithBuffer( void ); | |||
void scan_lockKeyboard( void ); | |||
void scan_unlockKeyboard( void ); | |||
#endif // __SCAN_LOOP_H | |||
@@ -0,0 +1,48 @@ | |||
###| CMake Kiibohd Controller Scan Module |### | |||
# | |||
# Written by Jacob Alexander in 2011 for the Kiibohd Controller | |||
# | |||
# Released into the Public Domain | |||
# | |||
# For the Micro Switch 8304 Keyboard (No Branding) | |||
# | |||
### | |||
### | |||
# Module C files | |||
# | |||
set( SCAN_SRCS | |||
scan_loop.c | |||
) | |||
### | |||
# Module H files | |||
# | |||
set( SCAN_HDRS | |||
scan_loop.h | |||
) | |||
### | |||
# File Dependency Setup | |||
# | |||
ADD_FILE_DEPENDENCIES( scan_loop.c ${SCAN_HDRS} ) | |||
#add_file_dependencies( scan_loop.c ${SCAN_HDRS} ) | |||
#add_file_dependencies( macro.c keymap.h microswitch8304.h ) | |||
### | |||
# Module Specific Options | |||
# | |||
add_definitions( -I${HEAD_DIR}/Keymap ) | |||
#| Keymap Settings | |||
add_definitions( | |||
-DMODIFIER_MASK=microswitch8304_ModifierMask | |||
-DKEYINDEX_MASK=microswitch8304_ColemakMap | |||
#-DKEYINDEX_MASK=microswitch8304_DefaultMap | |||
) | |||
@@ -146,6 +146,7 @@ int main(void) | |||
} | |||
} | |||
// USB Keyboard Data Send Counter Interrupt | |||
ISR( TIMER0_OVF_vect ) | |||
{ | |||
sendKeypressCounter++; |
@@ -20,7 +20,7 @@ | |||
#| Please the {Scan,Macro,USB,Debug}/module.txt for information on the modules and how to create new ones | |||
##| Deals with acquiring the keypress information and turning it into a key index | |||
set( ScanModule "Kaypro1" ) | |||
set( ScanModule "MicroSwitch8304" ) | |||
##| Uses the key index and potentially applies special conditions to it, mapping it to a usb key code | |||
set( MacroModule "buffer" ) | |||
@@ -78,6 +78,7 @@ macro( PathPrepend Output SourcesPath ) | |||
# Loop through items | |||
foreach( item ${ARGN} ) | |||
# Set the path | |||
set( tmpSource ${tmpSource} "${SourcesPath}/${item}" ) | |||
endforeach( item ) | |||