From 6a502924d2b158c521636788161ddb9fcde66c47 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Mon, 12 Dec 2016 21:57:17 +0100 Subject: [PATCH 1/4] Simplify the layer handling There can only be one layer active at any one time, simplify the code accordingly. Signed-off-by: Gergely Nagy --- right/src/keyboard_layout.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/right/src/keyboard_layout.c b/right/src/keyboard_layout.c index caf05f6..0504ae9 100644 --- a/right/src/keyboard_layout.c +++ b/right/src/keyboard_layout.c @@ -2,20 +2,20 @@ #include "led_driver.h" static uint8_t keyMasks[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; -static uint8_t modifierState = 0; +static uint8_t activeLayer = LAYER_ID_BASE; uint8_t prevKeyStates[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; static inline __attribute__((always_inline)) uhk_key_t getKeycode(uint8_t slotId, uint8_t keyId) { if (keyId < MAX_KEY_COUNT_PER_MODULE) { - if (keyMasks[slotId][keyId]!=0 && keyMasks[slotId][keyId]!=modifierState) { + if (keyMasks[slotId][keyId]!=0 && keyMasks[slotId][keyId]!=activeLayer) { // Mask out key presses after releasing modifier keys return (uhk_key_t){.type = UHK_KEY_NONE}; } - uhk_key_t k = CurrentKeymap[modifierState][slotId][keyId]; - keyMasks[slotId][keyId] = modifierState; + uhk_key_t k = CurrentKeymap[activeLayer][slotId][keyId]; + keyMasks[slotId][keyId] = activeLayer; return k; } else { @@ -56,12 +56,12 @@ bool pressKey(uhk_key_t key, int scancodeIdx, usb_keyboard_report_t *report) { } bool layerOn(uhk_key_t key) { - modifierState |= (1 << (key.layer.target - 1)); + activeLayer = key.layer.target; return false; } bool layerOff(uhk_key_t key) { - modifierState &= ~(1 << (key.layer.target - 1)); + activeLayer = LAYER_ID_BASE; return false; } From 04eb1bab7422ea9448bb2499cb55eebef35ae0e1 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Mon, 12 Dec 2016 22:12:59 +0100 Subject: [PATCH 2/4] Move layer handling to a separate file Signed-off-by: Gergely Nagy --- right/src/keyboard_layout.c | 23 +++++++---------------- right/src/layer.c | 11 +++++++++++ right/src/layer.h | 7 +++++++ 3 files changed, 25 insertions(+), 16 deletions(-) create mode 100644 right/src/layer.c diff --git a/right/src/keyboard_layout.c b/right/src/keyboard_layout.c index 0504ae9..2658061 100644 --- a/right/src/keyboard_layout.c +++ b/right/src/keyboard_layout.c @@ -1,21 +1,21 @@ #include "keyboard_layout.h" #include "led_driver.h" +#include "layer.h" static uint8_t keyMasks[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; -static uint8_t activeLayer = LAYER_ID_BASE; uint8_t prevKeyStates[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; static inline __attribute__((always_inline)) uhk_key_t getKeycode(uint8_t slotId, uint8_t keyId) { if (keyId < MAX_KEY_COUNT_PER_MODULE) { - if (keyMasks[slotId][keyId]!=0 && keyMasks[slotId][keyId]!=activeLayer) { + if (keyMasks[slotId][keyId]!=0 && keyMasks[slotId][keyId]!=ActiveLayer) { // Mask out key presses after releasing modifier keys return (uhk_key_t){.type = UHK_KEY_NONE}; } - uhk_key_t k = CurrentKeymap[activeLayer][slotId][keyId]; - keyMasks[slotId][keyId] = activeLayer; + uhk_key_t k = CurrentKeymap[ActiveLayer][slotId][keyId]; + keyMasks[slotId][keyId] = ActiveLayer; return k; } else { @@ -55,16 +55,6 @@ bool pressKey(uhk_key_t key, int scancodeIdx, usb_keyboard_report_t *report) { return true; } -bool layerOn(uhk_key_t key) { - activeLayer = key.layer.target; - return false; -} - -bool layerOff(uhk_key_t key) { - activeLayer = LAYER_ID_BASE; - return false; -} - bool key_toggled_on(const uint8_t *prevKeyStates, const uint8_t *currKeyStates, uint8_t keyId) { return (!prevKeyStates[keyId]) && currKeyStates[keyId]; } @@ -86,11 +76,12 @@ bool handleKey(uhk_key_t key, int scancodeIdx, usb_keyboard_report_t *report, co break; case UHK_KEY_LAYER: if (key_toggled_on(prevKeyStates, currKeyStates, keyId)) { - return layerOn(key); + Layer_MoveTo(key.layer.target); } if (key_toggled_off(prevKeyStates, currKeyStates, keyId)) { - return layerOff(key); + Layer_MoveToBase(); } + return false; break; default: break; diff --git a/right/src/layer.c b/right/src/layer.c new file mode 100644 index 0000000..dbb3cad --- /dev/null +++ b/right/src/layer.c @@ -0,0 +1,11 @@ +#include "layer.h" + +uint8_t ActiveLayer = LAYER_ID_BASE; + +void Layer_MoveTo(uint8_t layer) { + ActiveLayer = layer; +} + +void Layer_MoveToBase() { + Layer_MoveTo(LAYER_ID_BASE); +} diff --git a/right/src/layer.h b/right/src/layer.h index 34b9099..73848ae 100644 --- a/right/src/layer.h +++ b/right/src/layer.h @@ -1,6 +1,8 @@ #ifndef __LAYER_H__ #define __LAYER_H__ + #include + // Macros: #define LAYER_ID_BASE 0 @@ -10,4 +12,9 @@ #define LAYER_COUNT 4 + extern uint8_t ActiveLayer; + + void Layer_MoveTo(uint8_t layer); + void Layer_MoveToBase(); + #endif From c77027992b98eb0228f3900690b9cba0b356248a Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Tue, 13 Dec 2016 19:54:34 +0100 Subject: [PATCH 3/4] Move layer handling back to keyboard_layout.c And while there, also drop the helper functions, and just do the activation in the handler function. This simplifies the code a bit, as there is little point in lifting out an assignment into a function at this time. Signed-off-by: Gergely Nagy --- right/src/keyboard_layout.c | 5 +++-- right/src/layer.c | 11 ----------- right/src/layer.h | 3 --- 3 files changed, 3 insertions(+), 16 deletions(-) delete mode 100644 right/src/layer.c diff --git a/right/src/keyboard_layout.c b/right/src/keyboard_layout.c index 2658061..9941b28 100644 --- a/right/src/keyboard_layout.c +++ b/right/src/keyboard_layout.c @@ -4,6 +4,7 @@ static uint8_t keyMasks[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; +uint8_t ActiveLayer = LAYER_ID_BASE; uint8_t prevKeyStates[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; static inline __attribute__((always_inline)) uhk_key_t getKeycode(uint8_t slotId, uint8_t keyId) @@ -76,10 +77,10 @@ bool handleKey(uhk_key_t key, int scancodeIdx, usb_keyboard_report_t *report, co break; case UHK_KEY_LAYER: if (key_toggled_on(prevKeyStates, currKeyStates, keyId)) { - Layer_MoveTo(key.layer.target); + ActiveLayer = layer; } if (key_toggled_off(prevKeyStates, currKeyStates, keyId)) { - Layer_MoveToBase(); + ActiveLayer = LAYER_ID_BASE; } return false; break; diff --git a/right/src/layer.c b/right/src/layer.c deleted file mode 100644 index dbb3cad..0000000 --- a/right/src/layer.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "layer.h" - -uint8_t ActiveLayer = LAYER_ID_BASE; - -void Layer_MoveTo(uint8_t layer) { - ActiveLayer = layer; -} - -void Layer_MoveToBase() { - Layer_MoveTo(LAYER_ID_BASE); -} diff --git a/right/src/layer.h b/right/src/layer.h index 73848ae..2f35890 100644 --- a/right/src/layer.h +++ b/right/src/layer.h @@ -14,7 +14,4 @@ extern uint8_t ActiveLayer; - void Layer_MoveTo(uint8_t layer); - void Layer_MoveToBase(); - #endif From d98955a947e93a8d8423695fad1797d8084eb6e8 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Tue, 13 Dec 2016 19:59:06 +0100 Subject: [PATCH 4/4] Move ActiveLayer back to keyboard_layout.c too That is the only place we use it from, no need to expose it outside of that. Signed-off-by: Gergely Nagy --- right/src/keyboard_layout.c | 4 ++-- right/src/layer.h | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/right/src/keyboard_layout.c b/right/src/keyboard_layout.c index 9941b28..5a459a9 100644 --- a/right/src/keyboard_layout.c +++ b/right/src/keyboard_layout.c @@ -4,7 +4,7 @@ static uint8_t keyMasks[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; -uint8_t ActiveLayer = LAYER_ID_BASE; +static uint8_t ActiveLayer = LAYER_ID_BASE; uint8_t prevKeyStates[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE]; static inline __attribute__((always_inline)) uhk_key_t getKeycode(uint8_t slotId, uint8_t keyId) @@ -77,7 +77,7 @@ bool handleKey(uhk_key_t key, int scancodeIdx, usb_keyboard_report_t *report, co break; case UHK_KEY_LAYER: if (key_toggled_on(prevKeyStates, currKeyStates, keyId)) { - ActiveLayer = layer; + ActiveLayer = key.layer.target; } if (key_toggled_off(prevKeyStates, currKeyStates, keyId)) { ActiveLayer = LAYER_ID_BASE; diff --git a/right/src/layer.h b/right/src/layer.h index 2f35890..34b9099 100644 --- a/right/src/layer.h +++ b/right/src/layer.h @@ -1,8 +1,6 @@ #ifndef __LAYER_H__ #define __LAYER_H__ - #include - // Macros: #define LAYER_ID_BASE 0 @@ -12,6 +10,4 @@ #define LAYER_COUNT 4 - extern uint8_t ActiveLayer; - #endif