**TBD** | **TBD** | ||||
Mechanical Locking support for CapsLock | |||||
--------------------------------------- | |||||
To enable this feature define these two macros in `config.h` and use `KC_LCAP` for locking CapsLock in keymap instead of normal `KC_CAPS`. Resync option tries to keep lock switch state consistent with keyboard LED state. | |||||
Mechanical Locking support | |||||
-------------------------- | |||||
This feature makes it possible for you to use mechanical switch for `CapsLock`, `NumLock` or `ScrollLock`. To enable this feature define these macros in `config.h` and use `KC_LCAP`, `KC_LNUM` or `KC_LSCR` in keymap for locking key instead of normal `KC_CAPS`, `KC_NLCK` or `KC_SLCK`. Resync option tries to keep lock switch state consistent with keyboard LED state. | |||||
#define CAPSLOCK_LOCKING_ENABLE | |||||
#define CAPSLOCK_LOCKING_RESYNC_ENABLE | |||||
#define LOCKING_SUPPORT_ENABLE | |||||
#define LOCKING_RESYNC_ENABLE | |||||
Start Your Own Project | Start Your Own Project |
if (code == KC_NO) { | if (code == KC_NO) { | ||||
return; | return; | ||||
} | } | ||||
#ifdef CAPSLOCK_LOCKING_ENABLE | |||||
#ifdef LOCKING_SUPPORT_ENABLE | |||||
else if (KC_LOCKING_CAPS == code) { | else if (KC_LOCKING_CAPS == code) { | ||||
#ifdef CAPSLOCK_LOCKING_RESYNC_ENABLE | |||||
#ifdef LOCKING_RESYNC_ENABLE | |||||
// Resync: ignore if caps lock already is on | // Resync: ignore if caps lock already is on | ||||
if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) return; | if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) return; | ||||
#endif | #endif | ||||
host_del_key(KC_CAPSLOCK); | host_del_key(KC_CAPSLOCK); | ||||
host_send_keyboard_report(); | host_send_keyboard_report(); | ||||
} | } | ||||
else if (KC_LOCKING_NUM == code) { | |||||
#ifdef LOCKING_RESYNC_ENABLE | |||||
if (host_keyboard_leds() & (1<<USB_LED_NUM_LOCK)) return; | |||||
#endif | |||||
host_add_key(KC_NUMLOCK); | |||||
host_send_keyboard_report(); | |||||
host_del_key(KC_NUMLOCK); | |||||
host_send_keyboard_report(); | |||||
} | |||||
else if (KC_LOCKING_SCROLL == code) { | |||||
#ifdef LOCKING_RESYNC_ENABLE | |||||
if (host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK)) return; | |||||
#endif | |||||
host_add_key(KC_SCROLLLOCK); | |||||
host_send_keyboard_report(); | |||||
host_del_key(KC_SCROLLLOCK); | |||||
host_send_keyboard_report(); | |||||
} | |||||
#endif | #endif | ||||
else if IS_KEY(code) { | else if IS_KEY(code) { | ||||
// TODO: should push command_proc out of this block? | // TODO: should push command_proc out of this block? | ||||
if (command_proc(code)) return; | if (command_proc(code)) return; | ||||
if (code == KC_NO) { | if (code == KC_NO) { | ||||
return; | return; | ||||
} | } | ||||
#ifdef CAPSLOCK_LOCKING_ENABLE | |||||
#ifdef LOCKING_SUPPORT_ENABLE | |||||
else if (KC_LOCKING_CAPS == code) { | else if (KC_LOCKING_CAPS == code) { | ||||
#ifdef CAPSLOCK_LOCKING_RESYNC_ENABLE | |||||
#ifdef LOCKING_RESYNC_ENABLE | |||||
// Resync: ignore if caps lock already is off | // Resync: ignore if caps lock already is off | ||||
if (!(host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) return; | if (!(host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) return; | ||||
#endif | #endif | ||||
host_del_key(KC_CAPSLOCK); | host_del_key(KC_CAPSLOCK); | ||||
host_send_keyboard_report(); | host_send_keyboard_report(); | ||||
} | } | ||||
else if (KC_LOCKING_NUM == code) { | |||||
#ifdef LOCKING_RESYNC_ENABLE | |||||
if (!(host_keyboard_leds() & (1<<USB_LED_NUM_LOCK))) return; | |||||
#endif | |||||
host_add_key(KC_NUMLOCK); | |||||
host_send_keyboard_report(); | |||||
host_del_key(KC_NUMLOCK); | |||||
host_send_keyboard_report(); | |||||
} | |||||
else if (KC_LOCKING_SCROLL == code) { | |||||
#ifdef LOCKING_RESYNC_ENABLE | |||||
if (!(host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK))) return; | |||||
#endif | |||||
host_add_key(KC_SCROLLLOCK); | |||||
host_send_keyboard_report(); | |||||
host_del_key(KC_SCROLLLOCK); | |||||
host_send_keyboard_report(); | |||||
} | |||||
#endif | #endif | ||||
else if IS_KEY(code) { | else if IS_KEY(code) { | ||||
host_del_key(code); | host_del_key(code); | ||||
host_send_keyboard_report(); | host_send_keyboard_report(); |
#define KC_DEL KC_DELETE | #define KC_DEL KC_DELETE | ||||
#define KC_INS KC_INSERT | #define KC_INS KC_INSERT | ||||
#define KC_CAPS KC_CAPSLOCK | #define KC_CAPS KC_CAPSLOCK | ||||
#define KC_CLCK KC_CAPSLOCK | |||||
#define KC_RGHT KC_RIGHT | #define KC_RGHT KC_RIGHT | ||||
#define KC_PGDN KC_PGDOWN | #define KC_PGDN KC_PGDOWN | ||||
#define KC_PSCR KC_PSCREEN | #define KC_PSCR KC_PSCREEN | ||||
#define KC_SLCK KC_SCKLOCK | |||||
#define KC_SLCK KC_SCROLLLOCK | |||||
#define KC_PAUS KC_PAUSE | #define KC_PAUS KC_PAUSE | ||||
#define KC_BRK KC_PAUSE | #define KC_BRK KC_PAUSE | ||||
#define KC_NLCK KC_NUMLOCK | #define KC_NLCK KC_NUMLOCK | ||||
#define KC_NUHS KC_NONUS_HASH | #define KC_NUHS KC_NONUS_HASH | ||||
#define KC_NUBS KC_NONUS_BSLASH | #define KC_NUBS KC_NONUS_BSLASH | ||||
#define KC_LCAP KC_LOCKING_CAPS | #define KC_LCAP KC_LOCKING_CAPS | ||||
#define KC_LNUM KC_LOCKING_NUM | |||||
#define KC_LSCR KC_LOCKING_SCROLL | |||||
#define KC_ERAS KC_ALT_ERASE, | #define KC_ERAS KC_ALT_ERASE, | ||||
#define KC_CLR KC_CLEAR | #define KC_CLR KC_CLEAR | ||||
/* Japanese specific */ | /* Japanese specific */ | ||||
KC_F11, | KC_F11, | ||||
KC_F12, | KC_F12, | ||||
KC_PSCREEN, | KC_PSCREEN, | ||||
KC_SCKLOCK, | |||||
KC_SCROLLLOCK, | |||||
KC_PAUSE, | KC_PAUSE, | ||||
KC_INSERT, | KC_INSERT, | ||||
KC_HOME, | KC_HOME, |
Build | Build | ||||
----- | ----- | ||||
0. Connect ADB keyboard to Teensy by 3 lines(Vcc, GND, Data). By default Data line uses port F0. | |||||
0. Connect ADB keyboard to Teensy by 3 lines(Vcc, GND, Data). By default Data line uses port D0. | |||||
This converter uses AVR's internal pull-up, but it seems to be too weak, in particular when you want to use a long or coiled cable. | This converter uses AVR's internal pull-up, but it seems to be too weak, in particular when you want to use a long or coiled cable. | ||||
The external pull-up resistor(1K-10K Ohm) on Data is strongly recommended. | The external pull-up resistor(1K-10K Ohm) on Data is strongly recommended. | ||||
1. Define following macros for ADB connection in config.h if you use other than port F0. | |||||
1. Define following macros for ADB connection in config.h if you use other than port D0. | |||||
ADB_PORT, ADB_PIN, ADB_DDR, ADB_DATA_BIT | ADB_PORT, ADB_PIN, ADB_DDR, ADB_DATA_BIT | ||||
2. make | 2. make | ||||
3. program Teensy | 3. program Teensy |
#define MATRIX_COL(code) ((code)&0x07) | #define MATRIX_COL(code) ((code)&0x07) | ||||
/* Mechanical locking CapsLock support. Use KC_LCAP instead of KC_CAPS in keymap */ | |||||
#define CAPSLOCK_LOCKING_ENABLE | |||||
/* Locking CapsLock resynchronize hack */ | |||||
#define CAPSLOCK_LOCKING_RESYNC_ENABLE | |||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ | |||||
#define LOCKING_SUPPORT_ENABLE | |||||
/* Locking resynchronize hack */ | |||||
#define LOCKING_RESYNC_ENABLE | |||||
/* legacy keymap support */ | /* legacy keymap support */ | ||||
/* ADB port setting */ | /* ADB port setting */ | ||||
#define ADB_PORT PORTF | |||||
#define ADB_PIN PINF | |||||
#define ADB_DDR DDRF | |||||
#define ADB_PORT PORTD | |||||
#define ADB_PIN PIND | |||||
#define ADB_DDR DDRD | |||||
#define ADB_DATA_BIT 0 | #define ADB_DATA_BIT 0 | ||||
//#define ADB_PSW_BIT 1 // optional | //#define ADB_PSW_BIT 1 // optional | ||||
#define USE_LEGACY_KEYMAP | #define USE_LEGACY_KEYMAP | ||||
/* Mechanical locking CapsLock support. Use KC_LCAP instead of KC_CAPS in keymap */ | |||||
#define CAPSLOCK_LOCKING_ENABLE | |||||
/* Locking CapsLock resynchronize hack */ | |||||
#define CAPSLOCK_LOCKING_RESYNC_ENABLE | |||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ | |||||
#define LOCKING_SUPPORT_ENABLE | |||||
/* Locking resynchronize hack */ | |||||
#define LOCKING_RESYNC_ENABLE | |||||
/* magic key */ | /* magic key */ |
/* Set 0 if debouncing isn't needed */ | /* Set 0 if debouncing isn't needed */ | ||||
#define DEBOUNCE 5 | #define DEBOUNCE 5 | ||||
/* Mechanical locking CapsLock support. Use KC_LCAP instead of KC_CAPS in keymap */ | |||||
#define CAPSLOCK_LOCKING_ENABLE | |||||
/* Locking CapsLock resynchronize hack */ | |||||
#define CAPSLOCK_LOCKING_RESYNC_ENABLE | |||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ | |||||
#define LOCKING_SUPPORT_ENABLE | |||||
/* Locking resynchronize hack */ | |||||
#define LOCKING_RESYNC_ENABLE | |||||
/* key combination for command */ | /* key combination for command */ | ||||
#define IS_COMMAND() ( \ | #define IS_COMMAND() ( \ |