
e5f9940 Merge commit '1bc3dd200b023cecf063a0cb3ba347f77f6d759d' into core_update da03c50 Add note for L/R side bit being ignored e80f3c1 Add in basic documentation for Macro system 35e8a76 core: Swap position of PEQL and PENT in unimap 00751f1 Merge pull request #406 from 39aldo39/patch-1 e50d7de V-USB remote wakeup 4340997 core: Fix typo in definition AC_g 958144d core: Debug print for system and consumer keys e7e1030 core: Fix sleep_led 0866323 core: Change matrix_init and matrix_print 0dbf73d core: Add matrix_clear() and default impl. 3202ca3 core: Add suspend mode options 4cda3aa core: Fix suspend/wake for converters #386 4e15247 core: LUFA_DEBUG_SUART for serial debug b9cf8e7 core: Fix mechanical locking supoort #390 12aa0fd Merge branch 'nemith-master' fccb3fa core: Fix OPT_DEFS for mbed build 2e2d2c8 Merge branch 'master' of github.com:leizzer/tmk_keyboard f1d3634 Change .gitignore for ChibiOS 3aab802 core: Fix build config in protocol.mk 5e43da0 core: Add short names in unimap 7a56998 core: Fix dfu wait in rules.mk 6d9c500 Merge branch 'mediakey-fix' 08382ac core: Fix 'make dfu' message 78cb04e Fix OS X Recognizing keyboard as Mouse/Tablet a114714 core: 'make dfu' waits for bootloader to start d0a8f13 core: Fix unimap UNIMAP_NO case e17abef core: Change lufa NKRO report size 16 to 32 bytes 375b20f core: Fix common.mk for build options 394fdff core: Fix unimap layout comment 912326c core: Add unimap support 00f4011 core: Fix doc/keymap.md for new keymap framework ddbd7b4 core: Add default implemenation of keymap read 671cacc core: action codes are action_t struct now b4fdb27 core: Change chibios repo directory names 7daed10 core: Fix keycode.txt 90399d7 core: Fix USB remote wakeup on ATmega32U2 #361 3677e84 usb_usb: Add multiple keyboard support 54d5b26 core: Fix Logical Maximum in report descriptor bd0d372 core: Fix LUFA report descriptor 95327b5 Merge pull request #355 from papodaca/XT 62bf548 core: change API of adb.c to accept device address 3097c9e Fix function name in host.h 836e209 Merge branch 'core_split_160522' 3918ea2 Merge commit '20b787fc1284176834cbe7ca2134e4b36bec5828' 7f87b11 core: Add comment of register 3 of ADB ef6478a core: Add adb_host_talk() 5c665b4 update macro names in bluefruit 4f2c5bf Merge commit '71381457fa1311dfa0b58ba882a96db740640871' 53a9c08 Merge pull request #321 from njbair/master f08a656 core: Fix media/consumer keys d526de8 Clean up wording in keymap example 0bb3dbb Clarify layer precedence d915c75 clarify layer documentation 72070d4 ps2_usb: Fix for VUSB configuration 170e2dc Mostly working. Is unstable, will emit bad codes after a while. c8e45b5 core: Actionmap support aabaa24 Codes appear to be detected correctly, the break codes are broken. git-subtree-dir: tmk_core git-subtree-split: e5f994033cbc8700745ac0c6d12772820492eed0
143 lines
4.8 KiB
C
143 lines
4.8 KiB
C
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include "wait.h"
|
|
#include "matrix.h"
|
|
#include "bootloader.h"
|
|
#include "debug.h"
|
|
#include "keymap.h"
|
|
#include "actionmap.h"
|
|
#include "host.h"
|
|
#include "action_layer.h"
|
|
#include "eeconfig.h"
|
|
#include "bootmagic.h"
|
|
#include "hook.h"
|
|
|
|
keymap_config_t keymap_config;
|
|
|
|
void bootmagic(void)
|
|
{
|
|
/* check signature */
|
|
if (!eeconfig_is_enabled()) {
|
|
eeconfig_init();
|
|
}
|
|
|
|
/* do scans in case of bounce */
|
|
print("bootmagic scan: ... ");
|
|
uint8_t scan = 100;
|
|
while (scan--) { matrix_scan(); wait_ms(10); }
|
|
print("done.\n");
|
|
|
|
/* bootmagic skip */
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_SKIP)) {
|
|
return;
|
|
}
|
|
|
|
/* eeconfig clear */
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_EEPROM_CLEAR)) {
|
|
eeconfig_init();
|
|
}
|
|
|
|
/* bootloader */
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_BOOTLOADER)) {
|
|
bootloader_jump();
|
|
}
|
|
|
|
/* user-defined checks */
|
|
hook_bootmagic();
|
|
|
|
/* debug enable */
|
|
debug_config.raw = eeconfig_read_debug();
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_DEBUG_ENABLE)) {
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_DEBUG_MATRIX)) {
|
|
debug_config.matrix = !debug_config.matrix;
|
|
} else if (bootmagic_scan_key(BOOTMAGIC_KEY_DEBUG_KEYBOARD)) {
|
|
debug_config.keyboard = !debug_config.keyboard;
|
|
} else if (bootmagic_scan_key(BOOTMAGIC_KEY_DEBUG_MOUSE)) {
|
|
debug_config.mouse = !debug_config.mouse;
|
|
} else {
|
|
debug_config.enable = !debug_config.enable;
|
|
}
|
|
}
|
|
eeconfig_write_debug(debug_config.raw);
|
|
|
|
/* keymap config */
|
|
keymap_config.raw = eeconfig_read_keymap();
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_CONTROL_CAPSLOCK)) {
|
|
keymap_config.swap_control_capslock = !keymap_config.swap_control_capslock;
|
|
}
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL)) {
|
|
keymap_config.capslock_to_control = !keymap_config.capslock_to_control;
|
|
}
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_LALT_LGUI)) {
|
|
keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui;
|
|
}
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_RALT_RGUI)) {
|
|
keymap_config.swap_ralt_rgui = !keymap_config.swap_ralt_rgui;
|
|
}
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_NO_GUI)) {
|
|
keymap_config.no_gui = !keymap_config.no_gui;
|
|
}
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_GRAVE_ESC)) {
|
|
keymap_config.swap_grave_esc = !keymap_config.swap_grave_esc;
|
|
}
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE)) {
|
|
keymap_config.swap_backslash_backspace = !keymap_config.swap_backslash_backspace;
|
|
}
|
|
if (bootmagic_scan_key(BOOTMAGIC_HOST_NKRO)) {
|
|
keymap_config.nkro = !keymap_config.nkro;
|
|
}
|
|
eeconfig_write_keymap(keymap_config.raw);
|
|
|
|
#ifdef NKRO_ENABLE
|
|
keyboard_nkro = keymap_config.nkro;
|
|
#endif
|
|
|
|
/* default layer */
|
|
uint8_t default_layer = 0;
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_DEFAULT_LAYER_0)) { default_layer |= (1<<0); }
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_DEFAULT_LAYER_1)) { default_layer |= (1<<1); }
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_DEFAULT_LAYER_2)) { default_layer |= (1<<2); }
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_DEFAULT_LAYER_3)) { default_layer |= (1<<3); }
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_DEFAULT_LAYER_4)) { default_layer |= (1<<4); }
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_DEFAULT_LAYER_5)) { default_layer |= (1<<5); }
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_DEFAULT_LAYER_6)) { default_layer |= (1<<6); }
|
|
if (bootmagic_scan_key(BOOTMAGIC_KEY_DEFAULT_LAYER_7)) { default_layer |= (1<<7); }
|
|
if (default_layer) {
|
|
eeconfig_write_default_layer(default_layer);
|
|
default_layer_set((uint32_t)default_layer);
|
|
} else {
|
|
default_layer = eeconfig_read_default_layer();
|
|
default_layer_set((uint32_t)default_layer);
|
|
}
|
|
}
|
|
|
|
static bool scan_key(uint16_t code)
|
|
{
|
|
for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
|
|
matrix_row_t matrix_row = matrix_get_row(r);
|
|
for (uint8_t c = 0; c < MATRIX_COLS; c++) {
|
|
if (matrix_row & ((matrix_row_t)1<<c)) {
|
|
// read key from Layer 0
|
|
action_t action = action_for_key(0, (keypos_t){ .row = r, .col = c });
|
|
if (action.code == code ||
|
|
((action.kind.id == ACT_LMODS ||
|
|
action.kind.id == ACT_RMODS ||
|
|
action.kind.id == ACT_LMODS_TAP ||
|
|
action.kind.id == ACT_RMODS_TAP ||
|
|
action.kind.id == ACT_LAYER_TAP ||
|
|
action.kind.id == ACT_LAYER_TAP_EXT) &&
|
|
action.key.code == code)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool bootmagic_scan_key(uint16_t code)
|
|
{
|
|
if (!scan_key(BOOTMAGIC_KEY_SALT)) return false;
|
|
|
|
return scan_key(code);
|
|
}
|