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 <algernon@madhouse-project.org>
pull/51/head
Gergely Nagy 8 years ago
parent 8425071a76
commit 1dc9cc47de

@ -4,8 +4,8 @@
#include "MouseWrapper.h" #include "MouseWrapper.h"
#include "KeyboardioFirmware.h" #include "KeyboardioFirmware.h"
static void handle_mouse_key_event(Key mappedKey, uint8_t currentState, uint8_t previousState) { static void handle_mouse_key_event(Key mappedKey, uint8_t state) {
if (!key_is_pressed(currentState,previousState)) if (!key_is_pressed(state))
return; return;
if (mappedKey.rawKey & KEY_MOUSE_UP) { 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) if (! (mappedKey.flags & IS_INTERNAL)
&& (mappedKey.rawKey == KEY_MOUSE_BTN_L && (mappedKey.rawKey == KEY_MOUSE_BTN_L
|| mappedKey.rawKey == KEY_MOUSE_BTN_M || mappedKey.rawKey == KEY_MOUSE_BTN_M
|| mappedKey.rawKey == KEY_MOUSE_BTN_R)) { || mappedKey.rawKey == KEY_MOUSE_BTN_R)) {
if (key_toggled_on(currentState, previousState)) { if (key_toggled_on(state)) {
MouseWrapper.press_button(mappedKey.rawKey); MouseWrapper.press_button(mappedKey.rawKey);
} else if (key_toggled_off(currentState, previousState)) { } else if (key_toggled_off(state)) {
MouseWrapper.release_button(mappedKey.rawKey); MouseWrapper.release_button(mappedKey.rawKey);
} }
return true; return true;
@ -39,8 +39,8 @@ static bool handleMouseKeys(Key mappedKey, byte row, byte col, uint8_t currentSt
return false; return false;
if (!(mappedKey.rawKey & KEY_MOUSE_WARP)) { if (!(mappedKey.rawKey & KEY_MOUSE_WARP)) {
handle_mouse_key_event(mappedKey, currentState, previousState); handle_mouse_key_event(mappedKey, state);
} else if (key_toggled_on(currentState,previousState)) { } else if (key_toggled_on(state)) {
if (mappedKey.rawKey & KEY_MOUSE_WARP && mappedKey.flags & IS_MOUSE_KEY) { 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 // we don't pass in the left and up values because those are the
// default, "no-op" conditionals // default, "no-op" conditionals

@ -130,15 +130,14 @@ void Model01::act_on_matrix_scan() {
uint8_t keynum = (row*8)+(col); uint8_t keynum = (row*8)+(col);
handle_key_event(Key_NoKey, row, 7-col, uint8_t state = (bitRead(previousLeftHandState.all, keynum) << 0) |
bitRead(leftHandState.all, keynum), (bitRead(leftHandState.all, keynum) << 1);
bitRead(previousLeftHandState.all, keynum) handle_key_event(Key_NoKey, row, 7-col, state);
);
state = (bitRead(previousRightHandState.all, keynum) << 0) |
handle_key_event(Key_NoKey, row, (15- col), (bitRead(rightHandState.all, keynum) << 1);
bitRead(rightHandState.all, keynum),
bitRead(previousRightHandState.all, keynum) handle_key_event(Key_NoKey, row, (15- col), state);
);
} }
} }
} }

@ -64,7 +64,7 @@ void TestMode_::TestMatrix () {
void TestMode_::setup() { void TestMode_::setup() {
eventHandlers[0] = handle_key_event_test; 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); Serial.write(row);
return false; return false;
} }

@ -15,4 +15,4 @@ class TestMode_ {
extern TestMode_ 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);

@ -5,7 +5,7 @@
#define HOOK_MAX 64 #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]; extern custom_handler_t eventHandlers[HOOK_MAX];
void event_handler_hook_add (custom_handler_t hook); void event_handler_hook_add (custom_handler_t hook);

@ -1,7 +1,7 @@
#include "key_events.h" #include "key_events.h"
void handle_synthetic_key_event(Key mappedKey, uint8_t currentState, uint8_t previousState) { void handle_synthetic_key_event(Key mappedKey, uint8_t state) {
if (key_toggled_on(currentState,previousState)) { if (key_toggled_on(state)) {
if (mappedKey.flags & IS_CONSUMER) { if (mappedKey.flags & IS_CONSUMER) {
ConsumerControl.press(mappedKey.rawKey); ConsumerControl.press(mappedKey.rawKey);
} else if (mappedKey.flags & IS_INTERNAL) { } else if (mappedKey.flags & IS_INTERNAL) {
@ -29,32 +29,32 @@ Key lookup_key(byte keymap, byte row, byte col) {
return mappedKey; return mappedKey;
} }
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) {
if (!(currentState & INJECTED)) { if (!(state & INJECTED)) {
mappedKey = lookup_key(temporary_keymap, row, col); mappedKey = lookup_key(temporary_keymap, row, col);
} }
for (byte i = 0; eventHandlers[i] != NULL && i < HOOK_MAX; i++) { for (byte i = 0; eventHandlers[i] != NULL && i < HOOK_MAX; i++) {
custom_handler_t handler = eventHandlers[i]; custom_handler_t handler = eventHandlers[i];
if ((*handler)(mappedKey, row, col, currentState, previousState)) if ((*handler)(mappedKey, row, col, state))
return; 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 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 // for every newly released button, figure out what logical key it is and send a key up event
Key baseKey = Key_NoKey; Key baseKey = Key_NoKey;
if (!(currentState & INJECTED)) { if (!(state & INJECTED)) {
baseKey = lookup_key(primary_keymap, row, col); baseKey = lookup_key(primary_keymap, row, col);
} }
if ((baseKey.flags & SWITCH_TO_KEYMAP if ((baseKey.flags & SWITCH_TO_KEYMAP
|| baseKey.flags & SWITCH_TO_KEYMAP_MOMENTARY)) { || baseKey.flags & SWITCH_TO_KEYMAP_MOMENTARY)) {
handle_keymap_key_event(baseKey, currentState, previousState); handle_keymap_key_event(baseKey, state);
} else if (mappedKey.flags & SYNTHETIC) { } else if (mappedKey.flags & SYNTHETIC) {
handle_synthetic_key_event( mappedKey, currentState, previousState); handle_synthetic_key_event( mappedKey, state);
} else if (key_is_pressed(currentState, previousState)) { } else if (key_is_pressed(state)) {
press_key(mappedKey); press_key(mappedKey);
} }
return true; 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 (keymapEntry.flags & SWITCH_TO_KEYMAP_MOMENTARY ) {
if (key_toggled_on(currentState, previousState)) { if (key_toggled_on(state)) {
if ( keymapEntry.rawKey == KEYMAP_NEXT) { if ( keymapEntry.rawKey == KEYMAP_NEXT) {
temporary_keymap++; temporary_keymap++;
} else if ( keymapEntry.rawKey == KEYMAP_PREVIOUS) { } 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; temporary_keymap = keymapEntry.rawKey;
} }
} }
if (key_toggled_off(currentState, previousState)) { if (key_toggled_off(state)) {
temporary_keymap = primary_keymap; temporary_keymap = primary_keymap;
} }
// switch keymap and stay there // switch keymap and stay there
} else if (key_toggled_on(currentState, previousState)) { } else if (key_toggled_on(state)) {
temporary_keymap = primary_keymap = keymapEntry.rawKey; temporary_keymap = primary_keymap = keymapEntry.rawKey;
Storage.save_primary_keymap(primary_keymap); Storage.save_primary_keymap(primary_keymap);
} }

@ -43,12 +43,12 @@ extern const Key keymaps[][ROWS][COLS];
* currentState may be flagged INJECTED, which signals that the event was * 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. * 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 // 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 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);
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);
Key lookup_key(byte keymap, byte row, byte col); Key lookup_key(byte keymap, byte row, byte col);

@ -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;
}
}

@ -4,8 +4,10 @@
#include <Arduino.h> #include <Arduino.h>
#define INJECTED B10000000 #define INJECTED B10000000
#define IS_PRESSED B00000010
#define WAS_PRESSED B00000001
boolean key_was_pressed (uint8_t currentState, uint8_t previousState); #define key_was_pressed(state) (state & WAS_PRESSED)
boolean key_is_pressed (uint8_t currentState, uint8_t previousState); #define key_is_pressed(state) (state & IS_PRESSED)
boolean key_toggled_on(uint8_t currentState, uint8_t previousState); #define key_toggled_on(state) (key_is_pressed(state) && ! key_was_pressed(state))
boolean key_toggled_off(uint8_t currentState, uint8_t previousState); #define key_toggled_off(state) (key_was_pressed(state) && ! key_is_pressed(state))

Loading…
Cancel
Save