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 "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

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

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

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

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

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

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

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

@ -3,9 +3,11 @@
#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);
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))

Loading…
Cancel
Save