From 068a3546f66006c5ca616fe821ca9efe4d0b489e Mon Sep 17 00:00:00 2001 From: Ben Blazak Date: Fri, 15 Jun 2012 14:36:50 -0700 Subject: [PATCH] bug fixes, mostly; and other things - addition to references.md - keymap modification - now using 2 shifts => capslock - the previous capslock key -> tab - the previous tab key -> left bracket - bug and omission fixes; notably: - _is_pressed() no longer changes the value of `keyboard_modifier_keys`, lol - kbfun_2_keys_capslock_press_release() now works. (capslock doesn't register if left or right shift is pressed, so the shift state has to be stored, cleared, capslock pressed, and shift state restored) - main() no longer locally overwrites the value of `current_layer` before sending it to the kbfun. (i didn't realize i was using the same variable name for two different things) - improvements - kbfun_layer_inc() and ...dec() are now variable --- references.md | 11 +++ src/keyboard/ergodox/layout/qwerty.c | 19 +++-- src/lib/key-functions--private.h | 3 +- src/lib/key-functions.c | 116 +++++++++++++++++++++------ src/lib/key-functions.h | 10 ++- src/main.c | 16 ++-- 6 files changed, 128 insertions(+), 47 deletions(-) diff --git a/references.md b/references.md index c6b899c..c8c3bdb 100644 --- a/references.md +++ b/references.md @@ -377,6 +377,17 @@ ## Miscellaneous +### Keyboard Testing Tools + +* [Understanding Rollover] + (http://gadzikowski.com/nkeyrollover.html) + Includes 3 different tests (2 of which are web based) to see which keys are + actually registering as pressed. + + * mentioned on the [Default:NKey Rollover] + (http://geekhack.org/showwiki.php?title=NKey+Rollover+-+Overview+Testing+Methodology+and+Results) + page (on ) + ### Typical Keyboard Information * [Keyboard Scan Rates] diff --git a/src/keyboard/ergodox/layout/qwerty.c b/src/keyboard/ergodox/layout/qwerty.c index ea8a8ac..8169a27 100644 --- a/src/keyboard/ergodox/layout/qwerty.c +++ b/src/keyboard/ergodox/layout/qwerty.c @@ -19,11 +19,14 @@ #include "../layout.h" +#include "../../../lib/key-functions.h" // aliases #define f_press &kbfun_press #define f_relea &kbfun_release +#define f_l_set &kbfun_layer_set #define f_l_inc &kbfun_layer_inc #define f_l_dec &kbfun_layer_dec +#define f_2kcap &kbfun_2_keys_capslock_press_release uint8_t PROGMEM _kb_layout[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { @@ -33,9 +36,9 @@ uint8_t PROGMEM _kb_layout[KB_LAYERS][KB_ROWS][KB_COLUMNS] = { 0, // left hand _grave, _1, _2, _3, _4, _5, _equal, -_tab, _Q, _W, _E, _R, _T, _esc, -_capsLock, _A, _S, _D, _F, _G, -_shiftL, _Z, _X, _C, _V, _B, 0, +_bracketL, _Q, _W, _E, _R, _T, _esc, +_tab, _A, _S, _D, _F, _G, +_shiftL, _Z, _X, _C, _V, _B, 1, _guiL, _arrowL, _arrowU, _arrowD, _arrowR, _bs, _del, _ctrlL, @@ -44,7 +47,7 @@ _guiL, _arrowL, _arrowU, _arrowD, _arrowR, _backslash, _6, _7, _8, _9, _0, _dash, _bracketL, _Y, _U, _I, _O, _P, _bracketR, _H, _J, _K, _L, _semicolon, _quote, - 0, _N, _M, _comma, _period, _slash, _shiftR, + 1, _N, _M, _comma, _period, _slash, _shiftR, _arrowL, _arrowD, _arrowU, _arrowR, _guiR, _space, _ctrlR, _enter, @@ -84,7 +87,7 @@ NULL, f_press,f_press,f_press,f_press,f_press,f_press,f_press, f_press,f_press,f_press,f_press,f_press,f_press,f_press, f_press,f_press,f_press,f_press,f_press,f_press, -f_press,f_press,f_press,f_press,f_press,f_press,f_l_inc, +f_2kcap,f_press,f_press,f_press,f_press,f_press,f_l_inc, f_press,f_press,f_press,f_press,f_press, f_press, f_press, f_press, @@ -93,7 +96,7 @@ f_press,f_press,f_press,f_press,f_press, f_press,f_press,f_press,f_press,f_press,f_press,f_press, f_press,f_press,f_press,f_press,f_press,f_press,f_press, f_press,f_press,f_press,f_press,f_press,f_press, - f_l_inc,f_press,f_press,f_press,f_press,f_press,f_press, + f_l_inc,f_press,f_press,f_press,f_press,f_press,f_2kcap, f_press,f_press,f_press,f_press,f_press, f_press, f_press, f_press, @@ -133,7 +136,7 @@ NULL, f_relea,f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, f_relea,f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, -f_relea,f_relea,f_relea,f_relea,f_relea,f_relea,f_l_dec, +f_2kcap,f_relea,f_relea,f_relea,f_relea,f_relea,f_l_dec, f_relea,f_relea,f_relea,f_relea,f_relea, f_relea, f_relea, f_relea, @@ -142,7 +145,7 @@ f_relea,f_relea,f_relea,f_relea,f_relea, f_relea,f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, f_relea,f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, - f_l_dec,f_relea,f_relea,f_relea,f_relea,f_relea,f_relea, + f_l_dec,f_relea,f_relea,f_relea,f_relea,f_relea,f_2kcap, f_relea,f_relea,f_relea,f_relea,f_relea, f_relea, f_relea, f_relea, diff --git a/src/lib/key-functions--private.h b/src/lib/key-functions--private.h index d1988e5..9d14aaa 100644 --- a/src/lib/key-functions--private.h +++ b/src/lib/key-functions--private.h @@ -17,7 +17,8 @@ void _layer_set_current( uint8_t value, uint8_t * current_layer, - uint8_t * current_layers_[KB_ROWS][KB_COLUMNS] ); + uint8_t (*current_layers_)[KB_ROWS][KB_COLUMNS] ); + bool _is_pressed(uint8_t keycode); #endif diff --git a/src/lib/key-functions.c b/src/lib/key-functions.c index 2210948..dd8e88a 100644 --- a/src/lib/key-functions.c +++ b/src/lib/key-functions.c @@ -101,7 +101,7 @@ void _press_release(uint8_t keycode, bool pressed) { * Arguments * - value: the new layer value * - current_layer: (a pointer to) the overall current layer (see main.c) - * - current_layers_: (a pointer to a matrix of) the current layer for each key + * - current_layers: (a pointer to a matrix of) the current layer for each key * (see main.c and lib/key-functions.h) * * Note @@ -112,87 +112,151 @@ void _press_release(uint8_t keycode, bool pressed) { void _layer_set_current( uint8_t value, uint8_t * current_layer, - uint8_t * current_layers_[KB_ROWS][KB_COLUMNS] ) { + uint8_t (*current_layers)[KB_ROWS][KB_COLUMNS] ) { // don't switch to out-of-bounds layers - if (!( (0 <= *current_layer) && (*current_layer < KB_LAYERS) )) + if ( value < 0 || value >= KB_LAYERS ) return; for (uint8_t row=0; row capslock - * - when assigned to two keys (e.g. the physical left and right shift keys), - * pressing and holding down one of them makes the second toggle capslock + * Two keys => capslock + * - When assigned to two keys (e.g. the physical left and right shift keys) + * (in both the press and release matrices), pressing and holding down one of + * the keys will make the second toggle capslock + * + * Note + * - If either of the shifts are pressed when the second key is pressed, they + * wil be released so that capslock will register properly when pressed. + * Capslock will then be pressed and released, and the original state of the + * shifts will be restored */ +#include "../lib/usb/usage-page/keyboard.h" void kbfun_2_keys_capslock_press_release( KBFUN_FUNCTION_ARGS ) { - static uint8_t keys_pressed = 0; + static uint8_t keys_pressed; + static bool lshift_pressed; + static bool rshift_pressed; if (!pressed_) keys_pressed--; + // take care of the key that was actually pressed _press_release(keycode_, pressed_); - if (keys_pressed == 1) - _press_release(KEY_CapsLock, pressed_); + + // take care of capslock (only on the press of the 2nd key) + if (keys_pressed == 1 && pressed_) { + // save the state of left and right shift + lshift_pressed = _is_pressed(KEY_LeftShift); + rshift_pressed = _is_pressed(KEY_RightShift); + // disable both + _press_release(KEY_LeftShift, false); + _press_release(KEY_RightShift, false); + + // press capslock, then release it + _press_release(KEY_CapsLock, true); + usb_keyboard_send(); + _press_release(KEY_CapsLock, false); + usb_keyboard_send(); + + // restore the state of left and right shift + if (lshift_pressed) + _press_release(KEY_LeftShift, true); + if (rshift_pressed) + _press_release(KEY_RightShift, true); + } if (pressed_) keys_pressed++; } diff --git a/src/lib/key-functions.h b/src/lib/key-functions.h index db6e548..14ef916 100644 --- a/src/lib/key-functions.h +++ b/src/lib/key-functions.h @@ -45,10 +45,12 @@ typedef void (*kbfun_funptr_t)( KBFUN_FUNCTION_ARGS ); - void kbfun_press ( KBFUN_FUNCTION_ARGS ); - void kbfun_release ( KBFUN_FUNCTION_ARGS ); - void kbfun_layer_inc ( KBFUN_FUNCTION_ARGS ); - void kbfun_layer_dec ( KBFUN_FUNCTION_ARGS ); + void kbfun_press ( KBFUN_FUNCTION_ARGS ); + void kbfun_release ( KBFUN_FUNCTION_ARGS ); + void kbfun_layer_set ( KBFUN_FUNCTION_ARGS ); + void kbfun_layer_inc ( KBFUN_FUNCTION_ARGS ); + void kbfun_layer_dec ( KBFUN_FUNCTION_ARGS ); + void kbfun_2_keys_capslock_press_release ( KBFUN_FUNCTION_ARGS ); #endif diff --git a/src/main.c b/src/main.c index 8fcb09f..052ba29 100644 --- a/src/main.c +++ b/src/main.c @@ -28,7 +28,7 @@ int main(void) { for (;;) { // the overall current layer - static uint8_t current layer; + static uint8_t current_layer; // the current layer for each key static uint8_t current_layers[KB_ROWS][KB_COLUMNS]; // the layer each key was on when it was last pressed @@ -59,25 +59,25 @@ int main(void) { if (is_pressed != was_pressed) { if (is_pressed) { - uint8_t current_layer = current_layers[row][col]; - pressed_layers[row][col] = current_layer; + uint8_t layer = current_layers[row][col]; + pressed_layers[row][col] = layer; kbfun_funptr_t press_function = - kb_layout_press_get(current_layer, row, col); + kb_layout_press_get(layer, row, col); if (press_function) { (*press_function)( - kb_layout_get(current_layer, row, col), + kb_layout_get(layer, row, col), true, ¤t_layer, ¤t_layers, &pressed_layers, &row, &col ); } } else { - uint8_t pressed_layer = pressed_layers[row][col]; + uint8_t layer = pressed_layers[row][col]; kbfun_funptr_t release_function = - kb_layout_release_get(pressed_layer, row, col); + kb_layout_release_get(layer, row, col); if (release_function) { (*release_function)( - kb_layout_get(pressed_layer, row, col), + kb_layout_get(layer, row, col), false, ¤t_layer, ¤t_layers, &pressed_layers, &row, &col );