~ruther/qmk_firmware

2721022078c30dd00c1063e4a2f8199b2b53e0d5 — tmk 12 years ago 5b42573
Add mechanical locking switch support for NumLock and ScrollLock
M README.md => README.md +5 -5
@@ 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

M common/action.c => common/action.c +48 -4
@@ 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();

M common/keycode.h => common/keycode.h +5 -2
@@ 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,

M converter/adb_usb/README.md => converter/adb_usb/README.md +2 -2
@@ 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

M converter/adb_usb/config.h => converter/adb_usb/config.h +7 -7
@@ 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


M converter/m0110_usb/config.h => converter/m0110_usb/config.h +4 -4
@@ 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 */

M keyboard/gh60/config.h => keyboard/gh60/config.h +4 -4
@@ 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() ( \