diff --git a/libraries/Keyboardio-MouseKeys/src/Keyboardio-MouseKeys.cpp b/libraries/Keyboardio-MouseKeys/src/Keyboardio-MouseKeys.cpp index 6efb958f..c0098279 100644 --- a/libraries/Keyboardio-MouseKeys/src/Keyboardio-MouseKeys.cpp +++ b/libraries/Keyboardio-MouseKeys/src/Keyboardio-MouseKeys.cpp @@ -4,8 +4,8 @@ #include "MouseWrapper.h" #include "KeyboardioFirmware.h" -static void handle_mouse_key_event(Key mappedKey, uint8_t currentState, uint8_t previousState) { - if (!key_is_pressed(currentState,previousState)) +static void handle_mouse_key_event(Key mappedKey, uint8_t keyState) { + if (!key_is_pressed(keyState)) return; if (mappedKey.rawKey & KEY_MOUSE_UP) { @@ -22,14 +22,14 @@ static void handle_mouse_key_event(Key mappedKey, uint8_t currentState, uint8_t } } -static bool handleMouseKeys(Key mappedKey, byte row, byte col, uint8_t currentState, uint8_t previousState) { +static bool handleMouseKeys(Key mappedKey, byte row, byte col, uint8_t keyState) { if (! (mappedKey.flags & IS_INTERNAL) && (mappedKey.rawKey == KEY_MOUSE_BTN_L || mappedKey.rawKey == KEY_MOUSE_BTN_M || mappedKey.rawKey == KEY_MOUSE_BTN_R)) { - if (key_toggled_on(currentState, previousState)) { + if (key_toggled_on(keyState)) { MouseWrapper.press_button(mappedKey.rawKey); - } else if (key_toggled_off(currentState, previousState)) { + } else if (key_toggled_off(keyState)) { MouseWrapper.release_button(mappedKey.rawKey); } return true; @@ -39,8 +39,8 @@ static bool handleMouseKeys(Key mappedKey, byte row, byte col, uint8_t currentSt return false; if (!(mappedKey.rawKey & KEY_MOUSE_WARP)) { - handle_mouse_key_event(mappedKey, currentState, previousState); - } else if (key_toggled_on(currentState,previousState)) { + handle_mouse_key_event(mappedKey, keyState); + } else if (key_toggled_on(keyState)) { if (mappedKey.rawKey & KEY_MOUSE_WARP && mappedKey.flags & IS_MOUSE_KEY) { // we don't pass in the left and up values because those are the // default, "no-op" conditionals diff --git a/src/Model01.cpp b/src/Model01.cpp index 4418d32a..f4301dce 100644 --- a/src/Model01.cpp +++ b/src/Model01.cpp @@ -130,15 +130,14 @@ void Model01::act_on_matrix_scan() { uint8_t keynum = (row*8)+(col); - handle_key_event(Key_NoKey, row, 7-col, - bitRead(leftHandState.all, keynum), - bitRead(previousLeftHandState.all, keynum) - ); - - handle_key_event(Key_NoKey, row, (15- col), - bitRead(rightHandState.all, keynum), - bitRead(previousRightHandState.all, keynum) - ); + uint8_t keyState = (bitRead(previousLeftHandState.all, keynum) << 0) | + (bitRead(leftHandState.all, keynum) << 1); + handle_key_event(Key_NoKey, row, 7-col, keyState); + + keyState = (bitRead(previousRightHandState.all, keynum) << 0) | + (bitRead(rightHandState.all, keynum) << 1); + + handle_key_event(Key_NoKey, row, (15- col), keyState); } } } diff --git a/src/TestMode.cpp b/src/TestMode.cpp index 94bdeb7f..1d1c34ad 100644 --- a/src/TestMode.cpp +++ b/src/TestMode.cpp @@ -64,7 +64,7 @@ void TestMode_::TestMatrix () { void TestMode_::setup() { eventHandlers[0] = handle_key_event_test; } -bool handle_key_event_test(Key mappedKey, byte row, byte col, uint8_t currentState, uint8_t previousState) { +bool handle_key_event_test(Key mappedKey, byte row, byte col, uint8_t keyState) { Serial.write(row); return false; } diff --git a/src/TestMode.h b/src/TestMode.h index 4dcf8cf8..c25f6f3e 100644 --- a/src/TestMode.h +++ b/src/TestMode.h @@ -15,4 +15,4 @@ class TestMode_ { extern TestMode_ TestMode; -bool handle_key_event_test(Key mappedKey, byte row, byte col, uint8_t currentState, uint8_t previousState); +bool handle_key_event_test(Key mappedKey, byte row, byte col, uint8_t keyState); diff --git a/src/hooks.h b/src/hooks.h index 133d91f2..2499174b 100644 --- a/src/hooks.h +++ b/src/hooks.h @@ -5,7 +5,7 @@ #define HOOK_MAX 64 -typedef bool (*custom_handler_t)(Key mappedKey, byte row, byte col, uint8_t currentState, uint8_t previousState); +typedef bool (*custom_handler_t)(Key mappedKey, byte row, byte col, uint8_t keyState); extern custom_handler_t eventHandlers[HOOK_MAX]; void event_handler_hook_add (custom_handler_t hook); diff --git a/src/key_events.cpp b/src/key_events.cpp index 8f2cfe0d..ba345d1d 100644 --- a/src/key_events.cpp +++ b/src/key_events.cpp @@ -1,7 +1,7 @@ #include "key_events.h" -void handle_synthetic_key_event(Key mappedKey, uint8_t currentState, uint8_t previousState) { - if (key_toggled_on(currentState,previousState)) { +void handle_synthetic_key_event(Key mappedKey, uint8_t keyState) { + if (key_toggled_on(keyState)) { if (mappedKey.flags & IS_CONSUMER) { ConsumerControl.press(mappedKey.rawKey); } else if (mappedKey.flags & IS_INTERNAL) { @@ -29,32 +29,32 @@ Key lookup_key(byte keymap, byte row, byte col) { return mappedKey; } -void handle_key_event(Key mappedKey, byte row, byte col, uint8_t currentState, uint8_t previousState) { - if (mappedKey.raw == Key_NoKey.raw) { +void handle_key_event(Key mappedKey, byte row, byte col, uint8_t keyState) { + if (!(keyState & INJECTED)) { mappedKey = lookup_key(temporary_keymap, row, col); } for (byte i = 0; eventHandlers[i] != NULL && i < HOOK_MAX; i++) { custom_handler_t handler = eventHandlers[i]; - if ((*handler)(mappedKey, row, col, currentState, previousState)) + if ((*handler)(mappedKey, row, col, keyState)) return; } } -bool handle_key_event_default(Key mappedKey, byte row, byte col, uint8_t currentState, uint8_t previousState) { +bool handle_key_event_default(Key mappedKey, byte row, byte col, uint8_t keyState) { //for every newly pressed button, figure out what logical key it is and send a key down event // for every newly released button, figure out what logical key it is and send a key up event Key baseKey = Key_NoKey; - if (mappedKey.raw == Key_NoKey.raw) { + if (!(keyState & INJECTED)) { baseKey = lookup_key(primary_keymap, row, col); } if ((baseKey.flags & SWITCH_TO_KEYMAP || baseKey.flags & SWITCH_TO_KEYMAP_MOMENTARY)) { - handle_keymap_key_event(baseKey, currentState, previousState); + handle_keymap_key_event(baseKey, keyState); } else if (mappedKey.flags & SYNTHETIC) { - handle_synthetic_key_event( mappedKey, currentState, previousState); - } else if (key_is_pressed(currentState, previousState)) { + handle_synthetic_key_event( mappedKey, keyState); + } else if (key_is_pressed(keyState)) { press_key(mappedKey); } return true; @@ -80,9 +80,9 @@ void press_key(Key mappedKey) { } -void handle_keymap_key_event(Key keymapEntry, uint8_t currentState, uint8_t previousState) { +void handle_keymap_key_event(Key keymapEntry, uint8_t keyState) { if (keymapEntry.flags & SWITCH_TO_KEYMAP_MOMENTARY ) { - if (key_toggled_on(currentState, previousState)) { + if (key_toggled_on(keyState)) { if ( keymapEntry.rawKey == KEYMAP_NEXT) { temporary_keymap++; } else if ( keymapEntry.rawKey == KEYMAP_PREVIOUS) { @@ -91,12 +91,12 @@ void handle_keymap_key_event(Key keymapEntry, uint8_t currentState, uint8_t prev temporary_keymap = keymapEntry.rawKey; } } - if (key_toggled_off(currentState, previousState)) { + if (key_toggled_off(keyState)) { temporary_keymap = primary_keymap; } // switch keymap and stay there - } else if (key_toggled_on(currentState, previousState)) { + } else if (key_toggled_on(keyState)) { temporary_keymap = primary_keymap = keymapEntry.rawKey; Storage.save_primary_keymap(primary_keymap); } diff --git a/src/key_events.h b/src/key_events.h index 9efe45af..d7128a1b 100644 --- a/src/key_events.h +++ b/src/key_events.h @@ -39,14 +39,16 @@ extern const Key keymaps[][ROWS][COLS]; * For this reason, the handle_key_event receives four arguments: the mapped key * (or Key_NoKey if we do not want to override what is in the keymap), the row * and column of the key, so we can look up the code for it, and the current and - * previous state of the key, so we can determine what the event is. + * previous state of the key, so we can determine what the event is. The + * currentState may be flagged INJECTED, which signals that the event was + * injected, and is not a direct result of a keypress, coming from the scanner. */ -void handle_key_event(Key mappedKey, byte row, byte col, uint8_t currentState, uint8_t previousState); +void handle_key_event(Key mappedKey, byte row, byte col, uint8_t keyState); // Internal use -void handle_synthetic_key_event( Key mappedKey, uint8_t currentState, uint8_t previousState); +void handle_synthetic_key_event( Key mappedKey, uint8_t keyState); void press_key(Key mappedKey); -void handle_keymap_key_event(Key keymapEntry, uint8_t currentState, uint8_t previousState); -bool handle_key_event_default(Key mappedKey, byte row, byte col, uint8_t currentState, uint8_t previousState); +void handle_keymap_key_event(Key keymapEntry, uint8_t keyState); +bool handle_key_event_default(Key mappedKey, byte row, byte col, uint8_t keyState); Key lookup_key(byte keymap, byte row, byte col); diff --git a/src/keyswitch_state.cpp b/src/keyswitch_state.cpp deleted file mode 100644 index 90ea9cbb..00000000 --- a/src/keyswitch_state.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include "keyswitch_state.h" -// switch debouncing and status - - -boolean key_was_pressed (byte keyState) { - if ( keyState & B00001000 || keyState & B00000100) { - return true; - } else { - return false; - } -} - -boolean key_was_pressed (uint8_t currentState, uint8_t previousState) { - if (previousState) { - return true; - } else { - return false; - } -} - -boolean key_is_pressed (byte keyState) { - if ( keyState & B00000001 && keyState & B00000010 ) { - return true; - } else { - return false; - } -} - -boolean key_is_pressed (uint8_t currentState, uint8_t previousState) { - if (currentState) { - return true; - } else { - return false; - } -} - -boolean key_toggled_on(byte keyState) { - if (key_is_pressed(keyState) && ! key_was_pressed(keyState)) { - return true; - } else { - return false; - } -} - -boolean key_toggled_on (uint8_t currentState, uint8_t previousState) { - if (currentState && ! previousState ) { - return true; - } else { - return false; - } -} - - -boolean key_toggled_off(byte keyState) { - if (key_was_pressed(keyState) && ! key_is_pressed(keyState)) { - return true; - } else { - return false; - } -} - -boolean key_toggled_off (uint8_t currentState, uint8_t previousState) { - if (previousState && ! currentState ) { - return true; - } else { - return false; - } -} diff --git a/src/keyswitch_state.h b/src/keyswitch_state.h index 13aa82d9..2e13714f 100644 --- a/src/keyswitch_state.h +++ b/src/keyswitch_state.h @@ -3,13 +3,11 @@ #include - -boolean key_was_pressed (byte keyState); -boolean key_is_pressed (byte keyState); -boolean key_toggled_on(byte keyState); -boolean key_toggled_off(byte keyState); - -boolean key_was_pressed (uint8_t currentState, uint8_t previousState); -boolean key_is_pressed (uint8_t currentState, uint8_t previousState); -boolean key_toggled_on(uint8_t currentState, uint8_t previousState); -boolean key_toggled_off(uint8_t currentState, uint8_t previousState); +#define INJECTED B10000000 +#define IS_PRESSED B00000010 +#define WAS_PRESSED B00000001 + +#define key_was_pressed(keyState) (keyState & WAS_PRESSED) +#define key_is_pressed(keyState) (keyState & IS_PRESSED) +#define key_toggled_on(keyState) (key_is_pressed(keyState) && ! key_was_pressed(keyState)) +#define key_toggled_off(keyState) (key_was_pressed(keyState) && ! key_is_pressed(keyState))