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 );