diff options
Diffstat (limited to 'quantum')
-rw-r--r-- | quantum/keymap_common.c | 69 | ||||
-rw-r--r-- | quantum/keymap_common.h | 10 | ||||
-rw-r--r-- | quantum/keymap_unicode.c | 78 | ||||
-rw-r--r-- | quantum/quantum.mk | 7 | ||||
-rw-r--r-- | quantum/template/keymaps/keymap_default.c | 2 |
5 files changed, 107 insertions, 59 deletions
diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 5c00c0afa2..22e0948626 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -27,11 +27,22 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. static action_t keycode_to_action(uint16_t keycode); +#ifdef UNICODE_ENABLE +uint16_t hextokeycode(int hex) { + if (hex == 0x0) { + return KC_0; + } else if (hex < 0xA) { + return KC_1 + (hex - 0x1); + } else { + return KC_A + (hex - 0xA); + } +} +#endif + /* converts key to action */ -action_t action_for_key(uint8_t layer, keypos_t key) +action_t action_for_key(keyrecord_t *record, uint8_t layer, keypos_t key) { - // 16bit keycodes - important - uint16_t keycode = keymap_key_to_keycode(layer, key); + KEYCODE_TYPE keycode = keymap_key_to_keycode(layer, key); if (keycode >= 0x0100 && keycode < 0x2000) { // Has a modifier @@ -49,7 +60,7 @@ action_t action_for_key(uint8_t layer, keypos_t key) action.code = ACTION_MACRO(keycode & 0xFF); return action; #ifdef BACKLIGHT_ENABLE - } else if (keycode >= BL_0 & keycode <= BL_15) { + } else if (keycode >= BL_0 && keycode <= BL_15) { action_t action; action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F); return action; @@ -71,13 +82,14 @@ action_t action_for_key(uint8_t layer, keypos_t key) return action; #endif } else if (keycode == RESET) { // RESET is 0x5000, which is why this is here + clear_keyboard(); bootloader_jump(); - return; + return keycode_to_action(ACTION_NO); } else if (keycode == DEBUG) { // DEBUG is 0x5001 // TODO: Does this actually work? print("\nDEBUG: enabled.\n"); debug_enable = true; - return; + return keycode_to_action(ACTION_NO); } else if (keycode >= 0x5000 && keycode < 0x6000) { // Layer movement shortcuts // See .h to see constraints/usage @@ -109,11 +121,40 @@ action_t action_for_key(uint8_t layer, keypos_t key) return action; #endif #ifdef UNICODE_ENABLE - } else if (keycode >= 0x8000) { - action_t action; - uint16_t unicode = keycode & ~(0x8000); - action.code = ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8); - return action; + } else if (keycode >= 0x8000 && record != NULL) { + if (record->event.pressed) { + uint32_t unicode = (keycode & 0xFFFFFFF); + // register_code(KC_LALT); + + register_code(hextokeycode((unicode & 0xF000000) >> 24)); + unregister_code(hextokeycode((unicode & 0xF000000) >> 24)); + register_code(hextokeycode((unicode & 0xF00000) >> 20)); + unregister_code(hextokeycode((unicode & 0xF00000) >> 20)); + register_code(hextokeycode((unicode & 0xF0000) >> 16)); + unregister_code(hextokeycode((unicode & 0xF0000) >> 16)); + register_code(hextokeycode((unicode & 0xF000) >> 12)); + unregister_code(hextokeycode((unicode & 0xF000) >> 12)); + register_code(hextokeycode((unicode & 0xF00) >> 8)); + unregister_code(hextokeycode((unicode & 0xF00) >> 8)); + register_code(hextokeycode((unicode & 0xF0) >> 4)); + unregister_code(hextokeycode((unicode & 0xF0) >> 4)); + register_code(hextokeycode((unicode & 0xF))); + unregister_code(hextokeycode((unicode & 0xF))); + + /* Test 'a' */ + // register_code(hextokeycode(0x0)); + // unregister_code(hextokeycode(0x0)); + // register_code(hextokeycode(0x0)); + // unregister_code(hextokeycode(0x0)); + // register_code(hextokeycode(0x6)); + // unregister_code(hextokeycode(0x6)); + // register_code(hextokeycode(0x1)); + // unregister_code(hextokeycode(0x1)); + + // unregister_code(KC_LALT); + // send_keyboard_report(); + } + return keycode_to_action(ACTION_NO); #endif } else { @@ -236,10 +277,10 @@ static action_t keycode_to_action(uint16_t keycode) /* translates key to keycode */ -uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) +KEYCODE_TYPE keymap_key_to_keycode(uint8_t layer, keypos_t key) { - // Read entire word (16bits) - return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]); + // Read entire word (16bits? hopefully 32) + return (pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]) | (pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]-1) << 16)); } /* translates Fn keycode to action */ diff --git a/quantum/keymap_common.h b/quantum/keymap_common.h index b1df4eb0f6..bf4d147119 100644 --- a/quantum/keymap_common.h +++ b/quantum/keymap_common.h @@ -48,9 +48,11 @@ typedef union { keymap_config_t keymap_config; #endif +// 32 bit keycodes!! +typedef uint32_t KEYCODE_TYPE; /* translates key to keycode */ -uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); +KEYCODE_TYPE keymap_key_to_keycode(uint8_t layer, keypos_t key); /* translates Fn keycode to action */ action_t keymap_fn_to_action(uint16_t keycode); @@ -58,7 +60,7 @@ action_t keymap_fn_to_action(uint16_t keycode); /* translates Fn keycode to action */ action_t keymap_func_to_action(uint16_t keycode); -extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +extern const KEYCODE_TYPE keymaps[][MATRIX_ROWS][MATRIX_COLS]; extern const uint16_t fn_actions[]; // Ability to use mods in layouts @@ -175,9 +177,7 @@ extern const uint16_t fn_actions[]; #define MIDI(n) (n | 0x6000) // For sending unicode codes. -// You may not send codes over 1FFF -- this supports most of UTF8. -// To have a key that sends out Œ, go UC(0x0152) -#define UNICODE(n) (n | 0x8000) +#define UNICODE(n) (n | 0x80000000) #define UC(n) UNICODE(n) diff --git a/quantum/keymap_unicode.c b/quantum/keymap_unicode.c index a9357edec7..7b0bd70416 100644 --- a/quantum/keymap_unicode.c +++ b/quantum/keymap_unicode.c @@ -17,43 +17,43 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "keymap_common.h" -uint16_t hextokeycode(int hex) { - if (hex == 0x0) { - return KC_0; - } else if (hex < 0xA) { - return KC_1 + (hex - 0x1); - } else { - return KC_A + (hex - 0xA); - } -} - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - - if (record->event.pressed) { - uint16_t unicode = (opt << 8) | id; - register_code(KC_LALT); - - register_code(hextokeycode((unicode & 0xF000) >> 12)); - unregister_code(hextokeycode((unicode & 0xF000) >> 12)); - register_code(hextokeycode((unicode & 0x0F00) >> 8)); - unregister_code(hextokeycode((unicode & 0x0F00) >> 8)); - register_code(hextokeycode((unicode & 0x00F0) >> 4)); - unregister_code(hextokeycode((unicode & 0x00F0) >> 4)); - register_code(hextokeycode((unicode & 0x000F))); - unregister_code(hextokeycode((unicode & 0x000F))); +// uint16_t hextokeycode(int hex) { +// if (hex == 0x0) { +// return KC_0; +// } else if (hex < 0xA) { +// return KC_1 + (hex - 0x1); +// } else { +// return KC_A + (hex - 0xA); +// } +// } + +// void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) +// { + +// if (record->event.pressed) { +// uint16_t unicode = (opt << 8) | id; +// register_code(KC_LALT); + +// register_code(hextokeycode((unicode & 0xF000) >> 12)); +// unregister_code(hextokeycode((unicode & 0xF000) >> 12)); +// register_code(hextokeycode((unicode & 0x0F00) >> 8)); +// unregister_code(hextokeycode((unicode & 0x0F00) >> 8)); +// register_code(hextokeycode((unicode & 0x00F0) >> 4)); +// unregister_code(hextokeycode((unicode & 0x00F0) >> 4)); +// register_code(hextokeycode((unicode & 0x000F))); +// unregister_code(hextokeycode((unicode & 0x000F))); - /* Test 'a' */ - // register_code(hextokeycode(0x0)); - // unregister_code(hextokeycode(0x0)); - // register_code(hextokeycode(0x0)); - // unregister_code(hextokeycode(0x0)); - // register_code(hextokeycode(0x6)); - // unregister_code(hextokeycode(0x6)); - // register_code(hextokeycode(0x1)); - // unregister_code(hextokeycode(0x1)); - - unregister_code(KC_LALT); - } - return; -}
\ No newline at end of file +// /* Test 'a' */ +// // register_code(hextokeycode(0x0)); +// // unregister_code(hextokeycode(0x0)); +// // register_code(hextokeycode(0x0)); +// // unregister_code(hextokeycode(0x0)); +// // register_code(hextokeycode(0x6)); +// // unregister_code(hextokeycode(0x6)); +// // register_code(hextokeycode(0x1)); +// // unregister_code(hextokeycode(0x1)); + +// unregister_code(KC_LALT); +// } +// return; +// }
\ No newline at end of file diff --git a/quantum/quantum.mk b/quantum/quantum.mk index c82e478725..691e17efde 100644 --- a/quantum/quantum.mk +++ b/quantum/quantum.mk @@ -11,10 +11,17 @@ endif ifdef MIDI_ENABLE SRC += $(QUANTUM_DIR)/keymap_midi.c \ $(QUANTUM_DIR)/beeps.c + + OPT_DEFS += -DMIDI_ENABLE endif ifdef UNICODE_ENABLE SRC += $(QUANTUM_DIR)/keymap_unicode.c + OPT_DEFS += -DUNICODE_ENABLE +endif + +ifdef BLUETOOTH_ENABLE + OPT_DEFS += -DBLUETOOTH_ENABLE endif # Optimize size but this may cause error "relocation truncated to fit" diff --git a/quantum/template/keymaps/keymap_default.c b/quantum/template/keymaps/keymap_default.c index 1e6684da7b..8ebaac8c48 100644 --- a/quantum/template/keymaps/keymap_default.c +++ b/quantum/template/keymaps/keymap_default.c @@ -13,7 +13,7 @@ #define _LW 3 #define _RS 4 -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const KEYCODE_TYPE PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QW] = { /* Qwerty */ {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, |