Add mechanical locking switch support for NumLock and ScrollLock
This commit is contained in:
		
							parent
							
								
									5b425731c5
								
							
						
					
					
						commit
						2721022078
					
				
					 7 changed files with 75 additions and 28 deletions
				
			
		
							
								
								
									
										10
									
								
								README.md
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								README.md
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -164,12 +164,12 @@ TODO: Magic key combination to avoid unintentional press during plug in
 | 
			
		|||
**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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -336,9 +336,10 @@ void register_code(uint8_t code)
 | 
			
		|||
    if (code == KC_NO) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
#ifdef CAPSLOCK_LOCKING_ENABLE
 | 
			
		||||
 | 
			
		||||
#ifdef LOCKING_SUPPORT_ENABLE
 | 
			
		||||
    else if (KC_LOCKING_CAPS == code) {
 | 
			
		||||
#ifdef CAPSLOCK_LOCKING_RESYNC_ENABLE
 | 
			
		||||
#ifdef LOCKING_RESYNC_ENABLE
 | 
			
		||||
        // Resync: ignore if caps lock already is on
 | 
			
		||||
        if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) return;
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -347,7 +348,28 @@ void register_code(uint8_t code)
 | 
			
		|||
        host_del_key(KC_CAPSLOCK);
 | 
			
		||||
        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
 | 
			
		||||
 | 
			
		||||
    else if IS_KEY(code) {
 | 
			
		||||
        // TODO: should push command_proc out of this block?
 | 
			
		||||
        if (command_proc(code)) return;
 | 
			
		||||
| 
						 | 
				
			
			@ -386,9 +408,10 @@ void unregister_code(uint8_t code)
 | 
			
		|||
    if (code == KC_NO) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
#ifdef CAPSLOCK_LOCKING_ENABLE
 | 
			
		||||
 | 
			
		||||
#ifdef LOCKING_SUPPORT_ENABLE
 | 
			
		||||
    else if (KC_LOCKING_CAPS == code) {
 | 
			
		||||
#ifdef CAPSLOCK_LOCKING_RESYNC_ENABLE
 | 
			
		||||
#ifdef LOCKING_RESYNC_ENABLE
 | 
			
		||||
        // Resync: ignore if caps lock already is off
 | 
			
		||||
        if (!(host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) return;
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -397,7 +420,28 @@ void unregister_code(uint8_t code)
 | 
			
		|||
        host_del_key(KC_CAPSLOCK);
 | 
			
		||||
        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
 | 
			
		||||
 | 
			
		||||
    else if IS_KEY(code) {
 | 
			
		||||
        host_del_key(code);
 | 
			
		||||
        host_send_keyboard_report();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,10 +60,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		|||
#define KC_DEL  KC_DELETE
 | 
			
		||||
#define KC_INS  KC_INSERT
 | 
			
		||||
#define KC_CAPS KC_CAPSLOCK
 | 
			
		||||
#define KC_CLCK KC_CAPSLOCK
 | 
			
		||||
#define KC_RGHT KC_RIGHT
 | 
			
		||||
#define KC_PGDN KC_PGDOWN
 | 
			
		||||
#define KC_PSCR KC_PSCREEN
 | 
			
		||||
#define KC_SLCK KC_SCKLOCK
 | 
			
		||||
#define KC_SLCK KC_SCROLLLOCK
 | 
			
		||||
#define KC_PAUS KC_PAUSE
 | 
			
		||||
#define KC_BRK  KC_PAUSE
 | 
			
		||||
#define KC_NLCK KC_NUMLOCK
 | 
			
		||||
| 
						 | 
				
			
			@ -82,6 +83,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		|||
#define KC_NUHS KC_NONUS_HASH
 | 
			
		||||
#define KC_NUBS KC_NONUS_BSLASH
 | 
			
		||||
#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_CLR  KC_CLEAR
 | 
			
		||||
/* Japanese specific */
 | 
			
		||||
| 
						 | 
				
			
			@ -230,7 +233,7 @@ enum hid_keyboard_keypad_usage {
 | 
			
		|||
    KC_F11,
 | 
			
		||||
    KC_F12,
 | 
			
		||||
    KC_PSCREEN,
 | 
			
		||||
    KC_SCKLOCK,
 | 
			
		||||
    KC_SCROLLLOCK,
 | 
			
		||||
    KC_PAUSE,
 | 
			
		||||
    KC_INSERT,
 | 
			
		||||
    KC_HOME,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,10 +9,10 @@ Discuss: http://geekhack.org/showwiki.php?title=Island:14290
 | 
			
		|||
 | 
			
		||||
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.
 | 
			
		||||
   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
 | 
			
		||||
2. make
 | 
			
		||||
3. program Teensy
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,10 +34,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		|||
#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 */
 | 
			
		||||
| 
						 | 
				
			
			@ -51,9 +51,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
/* 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_PSW_BIT     1       // optional
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,10 +36,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		|||
#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 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,10 +37,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		|||
/* Set 0 if debouncing isn't needed */
 | 
			
		||||
#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 */
 | 
			
		||||
#define IS_COMMAND() ( \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue