From 0de09ffc978e82f057100cec6dc8f0e83dfb6a96 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Thu, 24 Nov 2016 10:46:23 +0100 Subject: [PATCH] Use a single byte for keyswitch state Instead of having a previousState and a currentState, of which at most two bits are used, use a single byte. This saves us a lot of code space, and makes a number of things easier, too. The helpers were redone as macros, since they are just bit checks now. Signed-off-by: Gergely Nagy --- .../src/Keyboardio-MouseKeys.cpp | 14 ++++---- src/Model01.cpp | 17 +++++---- src/TestMode.cpp | 2 +- src/TestMode.h | 2 +- src/hooks.h | 2 +- src/key_events.cpp | 28 +++++++-------- src/key_events.h | 8 ++--- src/keyswitch_state.cpp | 36 ------------------- src/keyswitch_state.h | 12 ++++--- 9 files changed, 43 insertions(+), 78 deletions(-) delete mode 100644 src/keyswitch_state.cpp diff --git a/libraries/Keyboardio-MouseKeys/src/Keyboardio-MouseKeys.cpp b/libraries/Keyboardio-MouseKeys/src/Keyboardio-MouseKeys.cpp index 6efb958f..50ef17a9 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 state) { + if (!key_is_pressed(state)) 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 state) { 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(state)) { MouseWrapper.press_button(mappedKey.rawKey); - } else if (key_toggled_off(currentState, previousState)) { + } else if (key_toggled_off(state)) { 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, state); + } else if (key_toggled_on(state)) { 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..446dd31c 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 state = (bitRead(previousLeftHandState.all, keynum) << 0) | + (bitRead(leftHandState.all, keynum) << 1); + handle_key_event(Key_NoKey, row, 7-col, state); + + state = (bitRead(previousRightHandState.all, keynum) << 0) | + (bitRead(rightHandState.all, keynum) << 1); + + handle_key_event(Key_NoKey, row, (15- col), state); } } } diff --git a/src/TestMode.cpp b/src/TestMode.cpp index 94bdeb7f..2a13170a 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 state) { Serial.write(row); return false; } diff --git a/src/TestMode.h b/src/TestMode.h index 4dcf8cf8..9189b723 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 state); diff --git a/src/hooks.h b/src/hooks.h index 133d91f2..57b65568 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 state); 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 8e8b0ff1..72e14485 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 state) { + if (key_toggled_on(state)) { 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 (!(currentState & INJECTED)) { +void handle_key_event(Key mappedKey, byte row, byte col, uint8_t state) { + if (!(state & 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, state)) 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 state) { //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 (!(currentState & INJECTED)) { + if (!(state & 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, state); } else if (mappedKey.flags & SYNTHETIC) { - handle_synthetic_key_event( mappedKey, currentState, previousState); - } else if (key_is_pressed(currentState, previousState)) { + handle_synthetic_key_event( mappedKey, state); + } else if (key_is_pressed(state)) { 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 state) { if (keymapEntry.flags & SWITCH_TO_KEYMAP_MOMENTARY ) { - if (key_toggled_on(currentState, previousState)) { + if (key_toggled_on(state)) { 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(state)) { temporary_keymap = primary_keymap; } // switch keymap and stay there - } else if (key_toggled_on(currentState, previousState)) { + } else if (key_toggled_on(state)) { 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 c59b9afa..b46d6382 100644 --- a/src/key_events.h +++ b/src/key_events.h @@ -43,12 +43,12 @@ extern const Key keymaps[][ROWS][COLS]; * 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 state); // Internal use -void handle_synthetic_key_event( Key mappedKey, uint8_t currentState, uint8_t previousState); +void handle_synthetic_key_event( Key mappedKey, uint8_t state); 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 state); +bool handle_key_event_default(Key mappedKey, byte row, byte col, uint8_t state); 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 760d4f41..00000000 --- a/src/keyswitch_state.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "keyswitch_state.h" -// switch debouncing and status - -#define PRESSED B00000001 - -boolean key_was_pressed (uint8_t currentState, uint8_t previousState) { - if (previousState & PRESSED) { - return true; - } else { - return false; - } -} - -boolean key_is_pressed (uint8_t currentState, uint8_t previousState) { - if (currentState & PRESSED) { - return true; - } else { - return false; - } -} - -boolean key_toggled_on (uint8_t currentState, uint8_t previousState) { - if ((currentState & PRESSED) && ! (previousState & PRESSED) ) { - return true; - } else { - return false; - } -} - -boolean key_toggled_off (uint8_t currentState, uint8_t previousState) { - if ((previousState & PRESSED) && ! (currentState & PRESSED) ) { - return true; - } else { - return false; - } -} diff --git a/src/keyswitch_state.h b/src/keyswitch_state.h index ae672736..80eab13a 100644 --- a/src/keyswitch_state.h +++ b/src/keyswitch_state.h @@ -3,9 +3,11 @@ #include -#define INJECTED B10000000 +#define INJECTED B10000000 +#define IS_PRESSED B00000010 +#define WAS_PRESSED B00000001 -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 key_was_pressed(state) (state & WAS_PRESSED) +#define key_is_pressed(state) (state & IS_PRESSED) +#define key_toggled_on(state) (key_is_pressed(state) && ! key_was_pressed(state)) +#define key_toggled_off(state) (key_was_pressed(state) && ! key_is_pressed(state))