From 617dca07ddf3263d017e38034d5885a976a2b766 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Sun, 7 Jul 2019 14:00:01 -0700 Subject: [PATCH] Update linear addressing branch for firmware drift --- UPGRADING.md | 11 +- doc/plugin/LED-AlphaSquare.md | 14 +-- doc/plugin/Qukeys.md | 4 +- doc/plugin/Syster.md | 4 +- doc/plugin/TapDance.md | 2 +- examples/Features/AppSwitcher/Macros.cpp | 2 +- .../GhostInTheFirmware/GhostInTheFirmware.ino | 2 +- examples/Keystrokes/Qukeys/Qukeys.ino | 10 +- examples/Keystrokes/Syster/Syster.ino | 4 +- examples/Keystrokes/TapDance/TapDance.ino | 2 +- src/kaleidoscope/Hardware.h | 88 +++++++++++++-- src/kaleidoscope/Kaleidoscope.cpp | 6 +- src/kaleidoscope/addr.h | 44 -------- src/kaleidoscope/hardware/ATMegaKeyboard.cpp | 35 +++--- src/kaleidoscope/hardware/ATMegaKeyboard.h | 27 +++-- src/kaleidoscope/hardware/ez/ErgoDox.cpp | 32 +++--- src/kaleidoscope/hardware/ez/ErgoDox.h | 26 ++++- .../hardware/keyboardio/Model01.cpp | 56 ++++++---- .../hardware/keyboardio/Model01.h | 36 +++++-- src/kaleidoscope/hooks.h | 5 +- src/kaleidoscope/key_events.cpp | 62 ++++++----- src/kaleidoscope/key_events.h | 15 ++- src/kaleidoscope/keymaps.h | 4 +- src/kaleidoscope/layers.cpp | 42 ++++---- src/kaleidoscope/layers.h | 53 ++++++--- src/kaleidoscope/plugin/Colormap.cpp | 4 +- src/kaleidoscope/plugin/Colormap.h | 6 +- src/kaleidoscope/plugin/Cycle.cpp | 10 +- src/kaleidoscope/plugin/Cycle.h | 2 +- .../plugin/EEPROM-Keymap-Programmer.cpp | 10 +- .../plugin/EEPROM-Keymap-Programmer.h | 2 +- src/kaleidoscope/plugin/EEPROM-Keymap.cpp | 42 +++++--- src/kaleidoscope/plugin/EEPROM-Keymap.h | 13 ++- src/kaleidoscope/plugin/Escape-OneShot.cpp | 4 +- src/kaleidoscope/plugin/Escape-OneShot.h | 2 +- src/kaleidoscope/plugin/FingerPainter.cpp | 14 +-- src/kaleidoscope/plugin/FingerPainter.h | 7 +- src/kaleidoscope/plugin/GeminiPR.cpp | 2 +- src/kaleidoscope/plugin/GeminiPR.h | 3 +- .../plugin/GhostInTheFirmware.cpp | 4 +- src/kaleidoscope/plugin/HardwareTestMode.cpp | 56 +++++----- src/kaleidoscope/plugin/Heatmap.cpp | 48 ++++----- src/kaleidoscope/plugin/Heatmap.h | 6 +- src/kaleidoscope/plugin/IdleLEDs.cpp | 2 +- src/kaleidoscope/plugin/IdleLEDs.h | 2 +- .../plugin/LED-ActiveLayerColor.cpp | 4 +- .../plugin/LED-ActiveLayerColor.h | 5 +- .../plugin/LED-ActiveModColor.cpp | 41 ++++--- src/kaleidoscope/plugin/LED-ActiveModColor.h | 2 +- src/kaleidoscope/plugin/LED-AlphaSquare.cpp | 32 +++--- src/kaleidoscope/plugin/LED-AlphaSquare.h | 69 ++++++++---- .../plugin/LED-AlphaSquare/Effect.cpp | 12 +-- .../plugin/LED-AlphaSquare/Effect.h | 7 +- src/kaleidoscope/plugin/LED-Palette-Theme.cpp | 8 +- src/kaleidoscope/plugin/LED-Palette-Theme.h | 5 +- src/kaleidoscope/plugin/LED-Stalker.cpp | 24 ++--- src/kaleidoscope/plugin/LED-Stalker.h | 4 +- src/kaleidoscope/plugin/LED-Wavepool.cpp | 48 ++++----- src/kaleidoscope/plugin/LED-Wavepool.h | 4 +- src/kaleidoscope/plugin/LEDControl.cpp | 31 +++--- src/kaleidoscope/plugin/LEDControl.h | 23 ++-- .../plugin/LEDControl/LED-Off.cpp | 4 +- src/kaleidoscope/plugin/LEDControl/LED-Off.h | 5 +- .../plugin/LEDEffect-BootAnimation.cpp | 29 +++-- .../plugin/LEDEffect-BootGreeting.cpp | 35 +++--- .../plugin/LEDEffect-BootGreeting.h | 10 +- src/kaleidoscope/plugin/LEDEffect-Chase.h | 2 +- src/kaleidoscope/plugin/LEDEffect-Rainbow.cpp | 6 +- .../plugin/LEDEffect-SolidColor.cpp | 4 +- .../plugin/LEDEffect-SolidColor.h | 5 +- src/kaleidoscope/plugin/LEDMode.h | 15 ++- src/kaleidoscope/plugin/Leader.cpp | 4 +- src/kaleidoscope/plugin/Leader.h | 2 +- src/kaleidoscope/plugin/Macros.cpp | 16 ++- src/kaleidoscope/plugin/Macros.h | 4 +- src/kaleidoscope/plugin/Model01-TestMode.cpp | 22 ++-- src/kaleidoscope/plugin/Model01-TestMode.h | 2 +- src/kaleidoscope/plugin/MouseKeys.cpp | 2 +- src/kaleidoscope/plugin/MouseKeys.h | 2 +- src/kaleidoscope/plugin/NumPad.cpp | 29 +++-- src/kaleidoscope/plugin/NumPad.h | 3 +- src/kaleidoscope/plugin/OneShot.cpp | 11 +- src/kaleidoscope/plugin/OneShot.h | 2 +- src/kaleidoscope/plugin/Qukeys.cpp | 48 ++++----- src/kaleidoscope/plugin/Qukeys.h | 7 +- src/kaleidoscope/plugin/Redial.cpp | 2 +- src/kaleidoscope/plugin/Redial.h | 2 +- src/kaleidoscope/plugin/ShapeShifter.cpp | 2 +- src/kaleidoscope/plugin/ShapeShifter.h | 2 +- src/kaleidoscope/plugin/SpaceCadet.cpp | 6 +- src/kaleidoscope/plugin/SpaceCadet.h | 2 +- src/kaleidoscope/plugin/Syster.cpp | 6 +- src/kaleidoscope/plugin/Syster.h | 2 +- src/kaleidoscope/plugin/TapDance.cpp | 45 ++++---- src/kaleidoscope/plugin/TapDance.h | 15 ++- src/kaleidoscope/plugin/TopsyTurvy.cpp | 8 +- src/kaleidoscope/plugin/TopsyTurvy.h | 2 +- src/kaleidoscope/plugin/TriColor.cpp | 52 +++++---- src/kaleidoscope/plugin/TypingBreaks.cpp | 4 +- src/kaleidoscope/plugin/TypingBreaks.h | 2 +- src/kaleidoscope/plugin/WinKeyToggle.cpp | 2 +- src/kaleidoscope/plugin/WinKeyToggle.h | 2 +- test/MatrixAddr/Makefile | 2 + test/MatrixAddr/test.cpp | 102 ++++++++++++++++++ 104 files changed, 991 insertions(+), 682 deletions(-) delete mode 100644 src/kaleidoscope/addr.h create mode 100644 test/MatrixAddr/Makefile create mode 100644 test/MatrixAddr/test.cpp diff --git a/UPGRADING.md b/UPGRADING.md index 1cef8430..984afbab 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -75,7 +75,7 @@ In practice, this boils down to implementing one or more of the following hook p - `onSetup()`: Called once during device bootup, at the end of the `setup()` method. It takes no arguments, and must return `kaleidoscope::EventHandlerResult::OK`. - `beforeEachCycle()`: Called once, at the beginning of each cycle of the main loop. This is similar to the old "loop hook" with its `post_clear` argument set to false. Takes no arguments, must return `kaleidoscope::EventHandlerResult::OK`. -- `onKeyswitchEvent`: Called for every non-idle key event. This replaces the old "event handler hook". It takes a key reference, coordinates, and a key state. The key reference can be updated to change the key being processed, so that any plugin that processes it further, will see the updated key. Can return `kaleidoscope::EventHandlerResult::OK` to let other plugins process the event further, or `kaleidoscope::EventHandlerResult::EVENT_CONSUMED` to stop processing. +- `onKeyswitchEvent`: Called for every non-idle key event. This replaces the old "event handler hook". It takes a key reference, a key address, and a key state. The key reference can be updated to change the key being processed, so that any plugin that processes it further, will see the updated key. Can return `kaleidoscope::EventHandlerResult::OK` to let other plugins process the event further, or `kaleidoscope::EventHandlerResult::EVENT_CONSUMED` to stop processing. - `onFocusEvent`: Used to implement [bi-directional communication](#bidirectional-communication-for-plugins). This is called whenever the firmware receives a command from the host. The only argument is the command name. Can return `kaleidoscope::EventHandlerResult::OK` to let other plugins process the event further, or `kaleidoscope::EventHandlerResult::EVENT_CONSUMED` to stop processing. - `beforeReportingState`: Called without arguments, just before sending the keyboard and mouse reports to the host. Must return `kaleidoscope::EventHandlerResult::OK`. - `afterEachCycle`: Called without arguments at the very end of each cycle. This is the replacement for the "loop hook" with its `post_clear` argument set. @@ -435,6 +435,13 @@ Older versions of the plugin required one to set up `Key_Redial` manually, and l ## Deprecated APIs and their replacements +### Transition to linear indexing + +Row/col based indexing was replaced by linear indexing throughout the whole firmware. A compatibility layer of functions was introduced that allows +the firmware to remain backwards compatible, however, these functions are deprecated and will be removed in future versions of the firmware. + +Also a new version of the onKeyswitchEvent-handler has been introduced. The old version is deprecated. + ### Finer OneShot stickability control The [OneShot plugin](doc/plugin/OneShot.md) has much improved stickability control. Instead of only being able to control if one-shot layers should be stickable too, or disabling the sticky feature in general, it is now possible to control stickiness on a per-key basis with the new `OneShot.enableStickability()` and `OneShot.disableStickablity()` methods. The old properties are still available, but will be removed by **2019-04-30**. @@ -572,7 +579,7 @@ class Plugin { public: EventHandlerResult onSetup(); EventHandlerResult beforeEachCycle(); - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); EventHandlerResult beforeReportingState(); EventHandlerResult afterEachCycle(); }; diff --git a/doc/plugin/LED-AlphaSquare.md b/doc/plugin/LED-AlphaSquare.md index e24795d3..97ce3d87 100644 --- a/doc/plugin/LED-AlphaSquare.md +++ b/doc/plugin/LED-AlphaSquare.md @@ -34,11 +34,11 @@ methods or properties other than those provided by all LED modes. ### `.display(key)` ### `.display(key, col)` -### `.display(key, row, col)` -### `.display(key, row, col, color)` +### `.display(key, key_addr)` +### `.display(key, key_addr, color)` -> Display the symbol for `key` at the given row or column, with pixels set to -> the specified `color`. If `row` is omitted, the first row - `0` is assumed. If +> Display the symbol for `key` at the given led address, with pixels set to +> the specified `color`. If only `col` is provided, the first row - `0` is assumed. If > the column is omitted, then the third column - `2` - is used. > If the `color` is omitted, the plugin will use the global `.color` property. > @@ -50,8 +50,8 @@ methods or properties other than those provided by all LED modes. ### `.display(symbol)` ### `.display(symbol, col)` -### `.display(symbol, row, col)` -### `.display(symbol, row, col, color)` +### `.display(symbol, key_addr)` +### `.display(symbol, key_addr, color)` > As the previous function, but instead of a key, it expects a 4x4 bitmap in > the form of a 16-bit unsigned integer, where the low bit is the top-right @@ -61,7 +61,7 @@ methods or properties other than those provided by all LED modes. ### `.clear(key)`, `.clear(symbol)` ### `.clear(key, col)`, `.clear(symbol, col)` -### `.clear(key, col, row)`, `.clear(symbol, col, row)` +### `.clear(key, key_addr)`, `.clear(symbol, key_addr)` > Just like the `.display()` counterparts, except these clear the symbol, by > turning the LED pixels it is made up from off. diff --git a/doc/plugin/Qukeys.md b/doc/plugin/Qukeys.md index 0a5079e0..d1ef8794 100644 --- a/doc/plugin/Qukeys.md +++ b/doc/plugin/Qukeys.md @@ -18,8 +18,8 @@ one keycode (i.e. symbol) when tapped, and a different keycode -- most likely a KALEIDOSCOPE_INIT_PLUGINS(Qukeys); ``` -- Define some `Qukeys` of the format `Qukey(layer, row, col, alt_keycode)` - (layers, rows and columns are all zero-indexed, rows are top to bottom and +- Define some `Qukeys` of the format `Qukey(layer, key_addr, alt_keycode)` + (layers, and key addresses are all zero-indexed, in key addresses rows are top to bottom and columns are left to right): - For the Keyboardio Model 01, key coordinates refer to [this header diff --git a/doc/plugin/Syster.md b/doc/plugin/Syster.md index 6345b20a..e97afc64 100644 --- a/doc/plugin/Syster.md +++ b/doc/plugin/Syster.md @@ -28,9 +28,9 @@ void systerAction(kaleidoscope::plugin::Syster::action_t action, const char *sym Unicode.type (0x2328); break; case kaleidoscope::plugin::Syster::EndAction: - handleKeyswitchEvent (Key_Backspace, UNKNOWN_KEYSWITCH_LOCATION, IS_PRESSED | INJECTED); + handleKeyswitchEvent (Key_Backspace, UnknownKeyswitchLocation, IS_PRESSED | INJECTED); kaleidoscope::hid::sendKeyboardReport (); - handleKeyswitchEvent (Key_Backspace, UNKNOWN_KEYSWITCH_LOCATION, WAS_PRESSED | INJECTED); + handleKeyswitchEvent (Key_Backspace, UnknownKeyswitchLocation, WAS_PRESSED | INJECTED); kaleidoscope::hid::sendKeyboardReport (); break; case kaleidoscope::plugin::Syster::SymbolAction: diff --git a/doc/plugin/TapDance.md b/doc/plugin/TapDance.md index 1ee710c2..04d4c0f4 100644 --- a/doc/plugin/TapDance.md +++ b/doc/plugin/TapDance.md @@ -123,7 +123,7 @@ property only: > The `tap_count` and `tap_dance_actions` parameters should be the same as the > similarly named parameters of the `tapDanceAction` function. -### `tapDanceAction(tap_dance_index, row, col, tap_count, tap_dance_action)` +### `tapDanceAction(tap_dance_index, key_addr, tap_count, tap_dance_action)` > The heart of the tap-dance plugin is the handler method. This is called every > time any kind of tap-dance action is to be performed. See the diff --git a/examples/Features/AppSwitcher/Macros.cpp b/examples/Features/AppSwitcher/Macros.cpp index 14fa5920..93474785 100644 --- a/examples/Features/AppSwitcher/Macros.cpp +++ b/examples/Features/AppSwitcher/Macros.cpp @@ -58,6 +58,6 @@ void macroAppSwitchLoop() { // if appSwitchActive is true, we continue holding Alt. if (appSwitchActive) { - handleKeyswitchEvent(mod, UNKNOWN_KEYSWITCH_LOCATION, IS_PRESSED); + handleKeyswitchEvent(mod, UnknownKeyswitchLocation, IS_PRESSED); } } diff --git a/examples/Features/GhostInTheFirmware/GhostInTheFirmware.ino b/examples/Features/GhostInTheFirmware/GhostInTheFirmware.ino index e86e0b71..aa6b417a 100644 --- a/examples/Features/GhostInTheFirmware/GhostInTheFirmware.ino +++ b/examples/Features/GhostInTheFirmware/GhostInTheFirmware.ino @@ -45,7 +45,7 @@ class EventDropper_ : public kaleidoscope::Plugin { public: EventDropper_() {} - kaleidoscope::EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) { + kaleidoscope::EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state) { return kaleidoscope::EventHandlerResult::EVENT_CONSUMED; } }; diff --git a/examples/Keystrokes/Qukeys/Qukeys.ino b/examples/Keystrokes/Qukeys/Qukeys.ino index c16558c8..660bb943 100644 --- a/examples/Keystrokes/Qukeys/Qukeys.ino +++ b/examples/Keystrokes/Qukeys/Qukeys.ino @@ -64,11 +64,11 @@ KALEIDOSCOPE_INIT_PLUGINS(Qukeys, Macros); void setup() { QUKEYS( - kaleidoscope::plugin::Qukey(0, 2, 1, Key_LeftGui), // A/cmd - kaleidoscope::plugin::Qukey(0, 2, 2, Key_LeftAlt), // S/alt - kaleidoscope::plugin::Qukey(0, 2, 3, Key_LeftControl), // D/ctrl - kaleidoscope::plugin::Qukey(0, 2, 4, Key_LeftShift), // F/shift - kaleidoscope::plugin::Qukey(0, 3, 6, ShiftToLayer(1)) // Q/layer-shift (on `fn`) + kaleidoscope::plugin::Qukey(0, KeyAddr(2, 1), Key_LeftGui), // A/cmd + kaleidoscope::plugin::Qukey(0, KeyAddr(2, 2), Key_LeftAlt), // S/alt + kaleidoscope::plugin::Qukey(0, KeyAddr(2, 3), Key_LeftControl), // D/ctrl + kaleidoscope::plugin::Qukey(0, KeyAddr(2, 4), Key_LeftShift), // F/shift + kaleidoscope::plugin::Qukey(0, KeyAddr(3, 6), ShiftToLayer(1)) // Q/layer-shift (on `fn`) ) Qukeys.setTimeout(200); Qukeys.setReleaseDelay(20); diff --git a/examples/Keystrokes/Syster/Syster.ino b/examples/Keystrokes/Syster/Syster.ino index ef8bd3ed..00d5db62 100644 --- a/examples/Keystrokes/Syster/Syster.ino +++ b/examples/Keystrokes/Syster/Syster.ino @@ -50,9 +50,9 @@ void systerAction(kaleidoscope::plugin::Syster::action_t action, const char *sym Unicode.type(0x2328); break; case kaleidoscope::plugin::Syster::EndAction: - handleKeyswitchEvent(Key_Backspace, UNKNOWN_KEYSWITCH_LOCATION, IS_PRESSED | INJECTED); + handleKeyswitchEvent(Key_Backspace, UnknownKeyswitchLocation, IS_PRESSED | INJECTED); kaleidoscope::hid::sendKeyboardReport(); - handleKeyswitchEvent(Key_Backspace, UNKNOWN_KEYSWITCH_LOCATION, WAS_PRESSED | INJECTED); + handleKeyswitchEvent(Key_Backspace, UnknownKeyswitchLocation, WAS_PRESSED | INJECTED); kaleidoscope::hid::sendKeyboardReport(); break; case kaleidoscope::plugin::Syster::SymbolAction: diff --git a/examples/Keystrokes/TapDance/TapDance.ino b/examples/Keystrokes/TapDance/TapDance.ino index 7cd5b0fb..1e14eb94 100644 --- a/examples/Keystrokes/TapDance/TapDance.ino +++ b/examples/Keystrokes/TapDance/TapDance.ino @@ -44,7 +44,7 @@ static void tapDanceEsc(uint8_t tap_dance_index, uint8_t tap_count, kaleidoscope tapDanceActionKeys(tap_count, tap_dance_action, Key_Escape, Key_Tab); } -void tapDanceAction(uint8_t tap_dance_index, byte row, byte col, uint8_t tap_count, kaleidoscope::plugin::TapDance::ActionType tap_dance_action) { +void tapDanceAction(uint8_t tap_dance_index, KeyAddr key_addr, uint8_t tap_count, kaleidoscope::plugin::TapDance::ActionType tap_dance_action) { switch (tap_dance_index) { case 0: return tapDanceActionKeys(tap_count, tap_dance_action, Key_Tab, Key_Escape); diff --git a/src/kaleidoscope/Hardware.h b/src/kaleidoscope/Hardware.h index 00d45cb0..7c197498 100644 --- a/src/kaleidoscope/Hardware.h +++ b/src/kaleidoscope/Hardware.h @@ -22,6 +22,7 @@ #pragma once #include "kaleidoscope/MatrixAddr.h" +#include "kaleidoscope_internal/deprecations.h" #ifndef CRGB #error cRGB and CRGB *must* be defined before including this header! @@ -57,6 +58,12 @@ namespace kaleidoscope { */ class Hardware { public: + + // To satisfy the interface of those methods that allow + // for matrix addressing we define default key and led address classes. + // Those typedefs are supposed to overridden by derived hardware classes. + typedef MatrixAddr<0, 0> KeyAddr; + /** * @defgroup kaleidoscope_hardware_leds Kaleidoscope::Hardware/LEDs * @{ @@ -66,6 +73,16 @@ class Hardware { * changes made before this call are reflected on the device. */ void syncLeds(void) {} + /** + * Set the color of a per-key LED at a given row and column. + * + * Setting the color does not need to take effect immediately, it can be + * delayed until @ref syncLeds is called. + * + * @param key_addr is the matrix address of the LED. + * @param color is the color to set the LED to. + */ + void setCrgbAt(KeyAddr key_addr, cRGB color) {} /** * Set the color of a per-key LED at a given row and column. * @@ -76,7 +93,7 @@ class Hardware { * @param col is the logical column position of the key. * @param color is the color to set the LED to. */ - void setCrgbAt(byte row, byte col, cRGB color) {} + DEPRECATED(ROW_COL_FUNC) void setCrgbAt(byte row, byte col, cRGB color) {} /** * Set the color of a per-key LED at a given LED index. * @@ -100,6 +117,17 @@ class Hardware { }; return c; } + /** + * Returns the index of the LED at a given row & column. + * + * @param key_addr is the matrix address of the LED. + * + * @returns The index of the LED at the given position, or -1 if there are no + * LEDs there. + */ + int8_t getLedIndex(KeyAddr key_addr) { + return -1; + } /** * Returns the index of the LED at a given row & column. * @@ -109,7 +137,7 @@ class Hardware { * @returns The index of the LED at the given position, or -1 if there are no * LEDs there. */ - int8_t getLedIndex(uint8_t row, byte col) { + DEPRECATED(ROW_COL_FUNC) int8_t getLedIndex(uint8_t row, byte col) { return -1; } /** @} */ @@ -149,6 +177,15 @@ class Hardware { * which is all but hidden from the rest of the plugins. * @{ */ + /** + * Mask out a key. + * + * Masking a key out means that any other event than a release will be + * ignored until said release. + * + * @param key_addr is the matrix address of the key. + */ + void maskKey(KeyAddr key_addr) {} /** * Mask out a key. * @@ -158,7 +195,16 @@ class Hardware { * @param row is the row the key is located at in the matrix. * @param col is the column the key is located at in the matrix. */ - void maskKey(byte row, byte col) {} + DEPRECATED(ROW_COL_FUNC) void maskKey(byte row, byte col) {} + /** + * Unmask a key. + * + * Remove the mask - if any - for a given key. To be used when the mask + * needs to be removed without the key being released. + * + * @param key_addr is the matrix address of the key. + */ + void unMaskKey(KeyAddr key_addr) {} /** * Unmask a key. * @@ -169,6 +215,16 @@ class Hardware { * @param col is the column the key is located at in the matrix. */ void unMaskKey(byte row, byte col) {} + /** + * Check whether a key is masked or not. + * + * @param key_addr is the matrix address of the key. + * + * @returns true if the key is masked, false otherwise. + */ + bool isKeyMasked(KeyAddr key_addr) { + return false; + } /** * Check whether a key is masked or not. * @@ -177,7 +233,7 @@ class Hardware { * * @returns true if the key is masked, false otherwise. */ - bool isKeyMasked(byte row, byte col) { + DEPRECATED(ROW_COL_FUNC) bool isKeyMasked(byte row, byte col) { return false; } /** @} */ @@ -223,6 +279,16 @@ class Hardware { * * @{ */ + /** + * Check if a key is pressed at a given position. + * + * @param key_addr is the matrix address of the key. + * + * @returns true if the key is pressed, false otherwise. + */ + bool isKeyswitchPressed(KeyAddr key_addr) { + return false; + } /** * Check if a key is pressed at a given position. * @@ -231,7 +297,7 @@ class Hardware { * * @returns true if the key is pressed, false otherwise. */ - bool isKeyswitchPressed(byte row, byte col) { + DEPRECATED(ROW_COL_FUNC) bool isKeyswitchPressed(byte row, byte col) { return false; } /** @@ -263,7 +329,17 @@ class Hardware { * * @returns true if the key was pressed, false otherwise. */ - bool wasKeyswitchPressed(byte row, byte col) { + DEPRECATED(ROW_COL_FUNC) bool wasKeyswitchPressed(byte row, byte col) { + return false; + } + /** + * Check if a key was pressed at a given position on the previous scan + * + * @param key_addr is the matrix address of the key. + * + * @returns true if the key was pressed, false otherwise. + */ + bool wasKeyswitchPressed(KeyAddr key_addr) { return false; } /** diff --git a/src/kaleidoscope/Kaleidoscope.cpp b/src/kaleidoscope/Kaleidoscope.cpp index 0a81682d..ed2929bc 100644 --- a/src/kaleidoscope/Kaleidoscope.cpp +++ b/src/kaleidoscope/Kaleidoscope.cpp @@ -46,10 +46,8 @@ Kaleidoscope_::setup(void) { // Update the keymap cache, so we start with a non-empty state. Layer.updateActiveLayers(); - for (byte row = 0; row < ROWS; row++) { - for (byte col = 0; col < COLS; col++) { - Layer.updateLiveCompositeKeymap(row, col); - } + for (auto key_addr : KeyAddr::all()) { + Layer.updateLiveCompositeKeymap(key_addr); } } diff --git a/src/kaleidoscope/addr.h b/src/kaleidoscope/addr.h deleted file mode 100644 index 6b44358f..00000000 --- a/src/kaleidoscope/addr.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -*- mode: c++ -*- - * Kaleidoscope-Qukeys -- Assign two keycodes to a single key - * Copyright (C) 2017 Michael Richters - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#pragma once - -#include - -// Helper functions for converting between separate (row,col) -// coordinates and a single-byte key number (addr). This works as long -// as the keyboard has fewer than 256 keys. -namespace kaleidoscope { -namespace addr { -inline uint8_t row(uint8_t key_addr) { - return (key_addr / COLS); -} -inline uint8_t col(uint8_t key_addr) { - return (key_addr % COLS); -} -inline uint8_t addr(uint8_t row, uint8_t col) { - return ((row * COLS) + col); -} -inline void mask(uint8_t key_addr) { - KeyboardHardware.maskKey(row(key_addr), col(key_addr)); -} -inline void unmask(uint8_t key_addr) { - KeyboardHardware.unMaskKey(row(key_addr), col(key_addr)); -} -} // namespace addr { -} // namespace kaleidoscope { diff --git a/src/kaleidoscope/hardware/ATMegaKeyboard.cpp b/src/kaleidoscope/hardware/ATMegaKeyboard.cpp index b3801d2a..fe866c44 100644 --- a/src/kaleidoscope/hardware/ATMegaKeyboard.cpp +++ b/src/kaleidoscope/hardware/ATMegaKeyboard.cpp @@ -74,15 +74,13 @@ uint8_t ATMegaKeyboard::pressedKeyswitchCount() { return count; } -bool ATMegaKeyboard::isKeyswitchPressed(uint8_t row, byte col) { - return (bitRead(KeyboardHardware.keyState_[row], col) != 0); - +bool ATMegaKeyboard::isKeyswitchPressed(KeyAddr key_addr) { + return (bitRead(KeyboardHardware.keyState_[key_addr.row()], key_addr.col()) != 0); } bool ATMegaKeyboard::isKeyswitchPressed(uint8_t keyIndex) { keyIndex--; - return isKeyswitchPressed(keyIndex / KeyboardHardware.matrix_columns, - keyIndex % KeyboardHardware.matrix_columns); + return isKeyswitchPressed(KeyAddr(keyIndex)); } @@ -95,15 +93,14 @@ uint8_t ATMegaKeyboard::previousPressedKeyswitchCount() { return count; } -bool ATMegaKeyboard::wasKeyswitchPressed(uint8_t row, byte col) { - return (bitRead(KeyboardHardware.previousKeyState_[row], col) != 0); +bool ATMegaKeyboard::wasKeyswitchPressed(KeyAddr key_addr) { + return (bitRead(KeyboardHardware.previousKeyState_[key_addr.row()], key_addr.col()) != 0); } bool ATMegaKeyboard::wasKeyswitchPressed(uint8_t keyIndex) { keyIndex--; - return wasKeyswitchPressed(keyIndex / KeyboardHardware.matrix_columns, - keyIndex % KeyboardHardware.matrix_columns); + return wasKeyswitchPressed(KeyAddr(keyIndex)); } @@ -113,7 +110,7 @@ void __attribute__((optimize(3))) ATMegaKeyboard::actOnMatrixScan() { uint8_t keyState = (bitRead(KeyboardHardware.previousKeyState_[row], col) << 0) | (bitRead(KeyboardHardware.keyState_[row], col) << 1); if (keyState) { - handleKeyswitchEvent(Key_NoKey, row, col, keyState); + handleKeyswitchEvent(Key_NoKey, KeyAddr(row, col), keyState); } } KeyboardHardware.previousKeyState_[row] = KeyboardHardware.keyState_[row]; @@ -130,25 +127,25 @@ void ATMegaKeyboard::scanMatrix() { KeyboardHardware.actOnMatrixScan(); } -void ATMegaKeyboard::maskKey(byte row, byte col) { - if (row >= KeyboardHardware.matrix_rows || col >= KeyboardHardware.matrix_columns) +void ATMegaKeyboard::maskKey(KeyAddr key_addr) { + if (!key_addr.isValid()) return; - bitWrite(KeyboardHardware.masks_[row], col, 1); + bitWrite(KeyboardHardware.masks_[key_addr.row()], key_addr.col(), 1); } -void ATMegaKeyboard::unMaskKey(byte row, byte col) { - if (row >= KeyboardHardware.matrix_rows || col >= KeyboardHardware.matrix_columns) +void ATMegaKeyboard::unMaskKey(KeyAddr key_addr) { + if (!key_addr.isValid()) return; - bitWrite(KeyboardHardware.masks_[row], col, 0); + bitWrite(KeyboardHardware.masks_[key_addr.row()], key_addr.col(), 0); } -bool ATMegaKeyboard::isKeyMasked(byte row, byte col) { - if (row >= KeyboardHardware.matrix_rows || col >= KeyboardHardware.matrix_columns) +bool ATMegaKeyboard::isKeyMasked(KeyAddr key_addr) { + if (!key_addr.isValid()) return false; - return bitRead(KeyboardHardware.masks_[row], col); + return bitRead(KeyboardHardware.masks_[key_addr.row()], key_addr.col()); } /* diff --git a/src/kaleidoscope/hardware/ATMegaKeyboard.h b/src/kaleidoscope/hardware/ATMegaKeyboard.h index 079ba0c2..54cc51dd 100644 --- a/src/kaleidoscope/hardware/ATMegaKeyboard.h +++ b/src/kaleidoscope/hardware/ATMegaKeyboard.h @@ -22,9 +22,9 @@ #include #include #include "Kaleidoscope-HIDAdaptor-KeyboardioHID.h" +#include "kaleidoscope/MatrixAddr.h" #include "kaleidoscope/macro_helpers.h" -#include "kaleidoscope/key_events.h" #include "kaleidoscope/hardware/avr/pins_and_ports.h" #include @@ -84,16 +84,31 @@ class ATMegaKeyboard : public kaleidoscope::Hardware { void scanMatrix(); uint8_t pressedKeyswitchCount(); - bool isKeyswitchPressed(uint8_t row, byte col); + bool isKeyswitchPressed(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) bool isKeyswitchPressed(uint8_t row, byte col) { + return isKeyswitchPressed(KeyAddr(row, col)); + } bool isKeyswitchPressed(uint8_t keyIndex); uint8_t previousPressedKeyswitchCount(); - bool wasKeyswitchPressed(uint8_t row, byte col); + bool wasKeyswitchPressed(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) bool wasKeyswitchPressed(uint8_t row, byte col) { + return wasKeyswitchPressed(KeyAddr(row, col)); + } bool wasKeyswitchPressed(uint8_t keyIndex); - void maskKey(byte row, byte col); - void unMaskKey(byte row, byte col); - bool isKeyMasked(byte row, byte col); + void maskKey(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) void maskKey(byte row, byte col) { + maskKey(KeyAddr(row, col)); + } + void unMaskKey(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) void unMaskKey(byte row, byte col) { + unMaskKey(KeyAddr(row, col)); + } + bool isKeyMasked(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) bool isKeyMasked(byte row, byte col) { + return isKeyMasked(KeyAddr(row, col)); + } static bool do_scan_; diff --git a/src/kaleidoscope/hardware/ez/ErgoDox.cpp b/src/kaleidoscope/hardware/ez/ErgoDox.cpp index b7d87a0c..77852f36 100644 --- a/src/kaleidoscope/hardware/ez/ErgoDox.cpp +++ b/src/kaleidoscope/hardware/ez/ErgoDox.cpp @@ -113,7 +113,7 @@ void __attribute__((optimize(3))) ErgoDox::actOnMatrixScan() { uint8_t keyState = (bitRead(previousKeyState_[row], col) << 0) | (bitRead(keyState_[row], col) << 1); if (keyState) - handleKeyswitchEvent(Key_NoKey, row, col, keyState); + handleKeyswitchEvent(Key_NoKey, KeyAddr(row, col), keyState); } previousKeyState_[row] = keyState_[row]; } @@ -130,25 +130,25 @@ void ErgoDox::scanMatrix() { actOnMatrixScan(); } -void ErgoDox::maskKey(byte row, byte col) { - if (row >= ROWS || col >= COLS) +void ErgoDox::maskKey(KeyAddr key_addr) { + if (!key_addr.isValid()) return; - bitWrite(masks_[row], col, 1); + bitWrite(masks_[key_addr.row()], key_addr.col(), 1); } -void ErgoDox::unMaskKey(byte row, byte col) { - if (row >= ROWS || col >= COLS) +void ErgoDox::unMaskKey(KeyAddr key_addr) { + if (!key_addr.isValid()) return; - bitWrite(masks_[row], col, 0); + bitWrite(masks_[key_addr.row()], key_addr.col(), 0); } -bool ErgoDox::isKeyMasked(byte row, byte col) { - if (row >= ROWS || col >= COLS) +bool ErgoDox::isKeyMasked(KeyAddr key_addr) { + if (!key_addr.isValid()) return false; - return bitRead(masks_[row], col); + return bitRead(masks_[key_addr.row()], key_addr.col()); } // ErgoDox-specific stuff @@ -223,22 +223,22 @@ void ErgoDox::debounceRow(uint8_t change, uint8_t row) { } } -bool ErgoDox::isKeyswitchPressed(byte row, byte col) { - return (bitRead(keyState_[row], col) != 0); +bool ErgoDox::isKeyswitchPressed(KeyAddr key_addr) { + return (bitRead(keyState_[key_addr.row()], key_addr.col()) != 0); } bool ErgoDox::isKeyswitchPressed(uint8_t keyIndex) { keyIndex--; - return isKeyswitchPressed(keyIndex / COLS, keyIndex % COLS); + return isKeyswitchPressed(KeyAddr(keyIndex)); } -bool ErgoDox::wasKeyswitchPressed(byte row, byte col) { - return (bitRead(previousKeyState_[row], col) != 0); +bool ErgoDox::wasKeyswitchPressed(KeyAddr key_addr) { + return (bitRead(previousKeyState_[key_addr.row()], key_addr.col()) != 0); } bool ErgoDox::wasKeyswitchPressed(uint8_t keyIndex) { keyIndex--; - return wasKeyswitchPressed(keyIndex / COLS, keyIndex % COLS); + return wasKeyswitchPressed(KeyAddr(keyIndex)); } uint8_t ErgoDox::previousPressedKeyswitchCount() { diff --git a/src/kaleidoscope/hardware/ez/ErgoDox.h b/src/kaleidoscope/hardware/ez/ErgoDox.h index b534a8c2..5e315d18 100644 --- a/src/kaleidoscope/hardware/ez/ErgoDox.h +++ b/src/kaleidoscope/hardware/ez/ErgoDox.h @@ -43,6 +43,7 @@ struct cRGB { #define CRGB(r,g,b) (cRGB){b, g, r} #include "kaleidoscope/Hardware.h" +#include "kaleidoscope/MatrixAddr.h" namespace kaleidoscope { namespace hardware { @@ -66,15 +67,30 @@ class ErgoDox : public kaleidoscope::Hardware { void actOnMatrixScan(void); void setup(); - void maskKey(byte row, byte col); - void unMaskKey(byte row, byte col); - bool isKeyMasked(byte row, byte col); + void maskKey(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) void maskKey(byte row, byte col) { + maskKey(KeyAddr(row, col)); + } + void unMaskKey(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) void unMaskKey(byte row, byte col) { + unMaskKey(KeyAddr(row, col)); + } + bool isKeyMasked(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) bool isKeyMasked(byte row, byte col) { + return isKeyMasked(KeyAddr(row, col)); + } - bool isKeyswitchPressed(byte row, byte col); + bool isKeyswitchPressed(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) bool isKeyswitchPressed(byte row, byte col) { + return isKeyswitchPressed(KeyAddr(row, col)); + } bool isKeyswitchPressed(uint8_t keyIndex); uint8_t pressedKeyswitchCount(); - bool wasKeyswitchPressed(byte row, byte col); + bool wasKeyswitchPressed(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) bool wasKeyswitchPressed(byte row, byte col) { + return wasKeyswitchPressed(KeyAddr(row, col)); + } bool wasKeyswitchPressed(uint8_t keyIndex); uint8_t previousPressedKeyswitchCount(); diff --git a/src/kaleidoscope/hardware/keyboardio/Model01.cpp b/src/kaleidoscope/hardware/keyboardio/Model01.cpp index 55a697bc..5fed4f2e 100644 --- a/src/kaleidoscope/hardware/keyboardio/Model01.cpp +++ b/src/kaleidoscope/hardware/keyboardio/Model01.cpp @@ -31,11 +31,11 @@ bool Model01::isLEDChanged = true; keydata_t Model01::leftHandMask; keydata_t Model01::rightHandMask; -static constexpr int8_t key_led_map[4][16] PROGMEM = { - {3, 4, 11, 12, 19, 20, 26, 27, 36, 37, 43, 44, 51, 52, 59, 60}, - {2, 5, 10, 13, 18, 21, 25, 28, 35, 38, 42, 45, 50, 53, 58, 61}, - {1, 6, 9, 14, 17, 22, 24, 29, 34, 39, 41, 46, 49, 54, 57, 62}, - {0, 7, 8, 15, 16, 23, 31, 30, 33, 32, 40, 47, 48, 55, 56, 63}, +static constexpr int8_t key_led_map[Model01::led_count] PROGMEM = { + 3, 4, 11, 12, 19, 20, 26, 27, 36, 37, 43, 44, 51, 52, 59, 60, + 2, 5, 10, 13, 18, 21, 25, 28, 35, 38, 42, 45, 50, 53, 58, 61, + 1, 6, 9, 14, 17, 22, 24, 29, 34, 39, 41, 46, 49, 54, 57, 62, + 0, 7, 8, 15, 16, 23, 31, 30, 33, 32, 40, 47, 48, 55, 56, 63, }; Model01::Model01(void) { @@ -118,12 +118,12 @@ void Model01::setCrgbAt(int8_t i, cRGB crgb) { } } -void Model01::setCrgbAt(byte row, byte col, cRGB color) { - setCrgbAt(getLedIndex(row, col), color); +void Model01::setCrgbAt(KeyAddr key_addr, cRGB color) { + setCrgbAt(getLedIndex(key_addr), color); } -int8_t Model01::getLedIndex(byte row, byte col) { - return pgm_read_byte(&(key_led_map[row][col])); +int8_t Model01::getLedIndex(KeyAddr key_addr) { + return pgm_read_byte(&(key_led_map[key_addr.toInt()])); } cRGB Model01::getCrgbAt(int8_t i) { @@ -164,12 +164,12 @@ boolean Model01::ledPowerFault() { } } -void debugKeyswitchEvent(keydata_t state, keydata_t previousState, uint8_t keynum, uint8_t row, uint8_t col) { +void debugKeyswitchEvent(keydata_t state, keydata_t previousState, uint8_t keynum, KeyAddr key_addr) { if (bitRead(state.all, keynum) != bitRead(previousState.all, keynum)) { Serial.print("Looking at row "); - Serial.print(row); + Serial.print(key_addr.row()); Serial.print(", col "); - Serial.print(col); + Serial.print(key_addr.col()); Serial.print(" key # "); Serial.print(keynum); Serial.print(" "); @@ -202,7 +202,7 @@ void Model01::actOnHalfRow(byte row, byte colState, byte colPrevState, byte star uint8_t keyState = ((bitRead(colPrevState, 0) << 0) | (bitRead(colState, 0) << 1)); if (keyState) - handleKeyswitchEvent(Key_NoKey, row, startPos - col, keyState); + handleKeyswitchEvent(Key_NoKey, KeyAddr(row, startPos - col), keyState); // Throw away the data we've just used, so we can read the next column colState = colState >> 1; @@ -259,10 +259,12 @@ constexpr byte HAND_BIT = B00001000; constexpr byte ROW_BITS = B00110000; constexpr byte COL_BITS = B00000111; -void Model01::maskKey(byte row, byte col) { - if (row >= ROWS || col >= COLS) +void Model01::maskKey(KeyAddr key_addr) { + if (!key_addr.isValid()) return; + auto row = key_addr.row(); + auto col = key_addr.col(); if (col & HAND_BIT) { rightHandMask.rows[row] |= (HIGH_BIT >> (col & COL_BITS)); } else { @@ -270,10 +272,12 @@ void Model01::maskKey(byte row, byte col) { } } -void Model01::unMaskKey(byte row, byte col) { - if (row >= ROWS || col >= COLS) +void Model01::unMaskKey(KeyAddr key_addr) { + if (!key_addr.isValid()) return; + auto row = key_addr.row(); + auto col = key_addr.col(); if (col & HAND_BIT) { rightHandMask.rows[row] &= ~(HIGH_BIT >> (col & COL_BITS)); } else { @@ -281,10 +285,12 @@ void Model01::unMaskKey(byte row, byte col) { } } -bool Model01::isKeyMasked(byte row, byte col) { - if (row >= ROWS || col >= COLS) +bool Model01::isKeyMasked(KeyAddr key_addr) { + if (!key_addr.isValid()) return false; + auto row = key_addr.row(); + auto col = key_addr.col(); if (col & HAND_BIT) { return rightHandMask.rows[row] & (HIGH_BIT >> (col & COL_BITS)); } else { @@ -303,7 +309,9 @@ void Model01::setKeyscanInterval(uint8_t interval) { rightHand.setKeyscanInterval(interval); } -bool Model01::isKeyswitchPressed(byte row, byte col) { +bool Model01::isKeyswitchPressed(KeyAddr key_addr) { + auto row = key_addr.row(); + auto col = key_addr.col(); if (col <= 7) { return (bitRead(leftHandState.rows[row], 7 - col) != 0); } else { @@ -313,11 +321,13 @@ bool Model01::isKeyswitchPressed(byte row, byte col) { bool Model01::isKeyswitchPressed(uint8_t keyIndex) { keyIndex--; - return isKeyswitchPressed(keyIndex / COLS, keyIndex % COLS); + return isKeyswitchPressed(KeyAddr(keyIndex)); } -bool Model01::wasKeyswitchPressed(byte row, byte col) { +bool Model01::wasKeyswitchPressed(KeyAddr key_addr) { + auto row = key_addr.row(); + auto col = key_addr.col(); if (col <= 7) { return (bitRead(previousLeftHandState.rows[row], 7 - col) != 0); } else { @@ -327,7 +337,7 @@ bool Model01::wasKeyswitchPressed(byte row, byte col) { bool Model01::wasKeyswitchPressed(uint8_t keyIndex) { keyIndex--; - return wasKeyswitchPressed(keyIndex / COLS, keyIndex % COLS); + return wasKeyswitchPressed(KeyAddr(keyIndex)); } uint8_t Model01::pressedKeyswitchCount() { diff --git a/src/kaleidoscope/hardware/keyboardio/Model01.h b/src/kaleidoscope/hardware/keyboardio/Model01.h index cc089b65..6ffeb7a2 100644 --- a/src/kaleidoscope/hardware/keyboardio/Model01.h +++ b/src/kaleidoscope/hardware/keyboardio/Model01.h @@ -30,6 +30,7 @@ #define CRGB(r,g,b) (cRGB){b, g, r} #include "kaleidoscope/Hardware.h" +#include "kaleidoscope/MatrixAddr.h" namespace kaleidoscope { namespace hardware { @@ -49,10 +50,16 @@ class Model01 : public kaleidoscope::Hardware { } void syncLeds(void); - void setCrgbAt(byte row, byte col, cRGB color); + void setCrgbAt(KeyAddr key_addr, cRGB color); + DEPRECATED(ROW_COL_FUNC) void setCrgbAt(byte row, byte col, cRGB color) { + setCrgbAt(KeyAddr(row, col), color); + } void setCrgbAt(int8_t i, cRGB crgb); cRGB getCrgbAt(int8_t i); - int8_t getLedIndex(byte row, byte col); + int8_t getLedIndex(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) int8_t getLedIndex(byte row, byte col) { + return getLedIndex(KeyAddr(row, col)); + } void scanMatrix(void); void readMatrix(void); @@ -68,16 +75,31 @@ class Model01 : public kaleidoscope::Hardware { void setKeyscanInterval(uint8_t interval); boolean ledPowerFault(void); - void maskKey(byte row, byte col); - void unMaskKey(byte row, byte col); - bool isKeyMasked(byte row, byte col); + void maskKey(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) void maskKey(byte row, byte col) { + maskKey(KeyAddr(row, col)); + } + void unMaskKey(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) void unMaskKey(byte row, byte col) { + unMaskKey(KeyAddr(row, col)); + } + bool isKeyMasked(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) bool isKeyMasked(byte row, byte col) { + return isKeyMasked(KeyAddr(row, col)); + } void maskHeldKeys(void); - bool isKeyswitchPressed(byte row, byte col); + bool isKeyswitchPressed(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) bool isKeyswitchPressed(byte row, byte col) { + return isKeyswitchPressed(KeyAddr(row, col)); + } bool isKeyswitchPressed(uint8_t keyIndex); uint8_t pressedKeyswitchCount(); - bool wasKeyswitchPressed(byte row, byte col); + bool wasKeyswitchPressed(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) bool wasKeyswitchPressed(byte row, byte col) { + return wasKeyswitchPressed(KeyAddr(row, col)); + } bool wasKeyswitchPressed(uint8_t keyIndex); uint8_t previousPressedKeyswitchCount(); diff --git a/src/kaleidoscope/hooks.h b/src/kaleidoscope/hooks.h index 076a8fba..43646f12 100644 --- a/src/kaleidoscope/hooks.h +++ b/src/kaleidoscope/hooks.h @@ -29,7 +29,8 @@ union Key; // Forward declaration required to enable friend declarations // in class Hooks. class kaleidoscope_; -extern void handleKeyswitchEvent(kaleidoscope::Key mappedKey, byte row, byte col, uint8_t keyState); +extern void handleKeyswitchEvent(kaleidoscope::Key mappedKey, KeyAddr key_addr, uint8_t keyState); +DEPRECATED(ROW_COL_FUNC) extern void handleKeyswitchEvent(kaleidoscope::Key mappedKey, byte row, byte col, uint8_t keyState); namespace kaleidoscope { @@ -57,7 +58,7 @@ class Hooks { // ::handleKeyswitchEvent(...) calls Hooks::onKeyswitchEvent. friend void ::handleKeyswitchEvent(kaleidoscope::Key mappedKey, - byte row, byte col, uint8_t keyState); + KeyAddr key_addr, uint8_t keyState); private: diff --git a/src/kaleidoscope/key_events.cpp b/src/kaleidoscope/key_events.cpp index dd02be13..008be924 100644 --- a/src/kaleidoscope/key_events.cpp +++ b/src/kaleidoscope/key_events.cpp @@ -43,7 +43,7 @@ static bool handleSyntheticKeyswitchEvent(Key mappedKey, uint8_t keyState) { return true; } -static bool handleKeyswitchEventDefault(Key mappedKey, byte row, byte col, uint8_t keyState) { +static bool handleKeyswitchEventDefault(Key mappedKey, KeyAddr key_addr, 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 @@ -59,33 +59,33 @@ static bool handleKeyswitchEventDefault(Key mappedKey, byte row, byte col, uint8 return true; } -void handleKeyswitchEvent(Key mappedKey, byte row, byte col, uint8_t keyState) { - /* These first steps are only done for keypresses that have a real (row,col). - * In particular, doing them for keypresses with out-of-bounds (row,col) +void handleKeyswitchEvent(Key mappedKey, KeyAddr key_addr, uint8_t keyState) { + /* These first steps are only done for keypresses that have a valid key_addr. + * In particular, doing them for keypresses with out-of-bounds key_addr * would cause out-of-bounds array accesses in Layer.lookup(), * Layer.updateLiveCompositeKeymap(), etc. - * Note that many INJECTED keypresses use the UNKNOWN_KEYSWITCH_LOCATION macro - * which gives us row==255, col==255 here. Therefore, it's legitimate that - * we may have keypresses with out-of-bounds (row, col). - * However, some INJECTED keypresses do have valid (row, col) if they are + * Note that many INJECTED keypresses use UnknownKeyswitchLocation + * which gives us an invalid key_addr here. Therefore, it's legitimate that + * we may have keypresses with out-of-bounds key_addr. + * However, some INJECTED keypresses do have valid key_addr if they are * injecting an event tied to a physical keyswitch - and we want them to go * through this lookup. - * So we can't just test for INJECTED here, we need to test the row and col + * So we can't just test for INJECTED here, we need to test the key_addr * directly. - * Note also that this (row, col) test avoids out-of-bounds accesses in *core*, + * Note also that this key_addr test avoids out-of-bounds accesses in *core*, * but doesn't guarantee anything about event handlers - event handlers may - * still receive out-of-bounds (row, col), and handling that properly is on + * still receive out-of-bounds key_addr, and handling that properly is on * them. */ - if (row < ROWS && col < COLS) { + if (key_addr.isValid()) { /* If a key had an on event, we update the live composite keymap. See * layers.h for an explanation about the different caches we have. */ if (keyToggledOn(keyState)) { if (mappedKey.raw == Key_NoKey.raw || keyState & EPHEMERAL) { - Layer.updateLiveCompositeKeymap(row, col); + Layer.updateLiveCompositeKeymap(key_addr); } else { - Layer.updateLiveCompositeKeymap(row, col, mappedKey); + Layer.updateLiveCompositeKeymap(key_addr, mappedKey); } } @@ -96,32 +96,44 @@ void handleKeyswitchEvent(Key mappedKey, byte row, byte col, uint8_t keyState) { * See layers.cpp for an example that masks keys, and the reason why it does * so. */ - if (KeyboardHardware.isKeyMasked(row, col)) { + if (KeyboardHardware.isKeyMasked(key_addr)) { if (keyToggledOff(keyState)) { - KeyboardHardware.unMaskKey(row, col); + KeyboardHardware.unMaskKey(key_addr); } else { return; } } - /* Convert (row, col) to the correct mappedKey - * The condition here means that if mappedKey and (row, col) are both valid, + /* Convert key_addr to the correct mappedKey + * The condition here means that if mappedKey and key_addr are both valid, * the mappedKey wins - we don't re-look-up the mappedKey */ if (mappedKey.raw == Key_NoKey.raw) { - mappedKey = Layer.lookup(row, col); + mappedKey = Layer.lookup(key_addr); } - } // row < ROWS && col < COLS + } // key_addr valid - // Keypresses with out-of-bounds (row,col) start here in the processing chain + // Keypresses with out-of-bounds key_addr start here in the processing chain - // New event handler interface - if (kaleidoscope::Hooks::onKeyswitchEvent(mappedKey, row, col, keyState) != kaleidoscope::EventHandlerResult::OK) + // We call both versions of onKeyswitchEvent. This assumes that a plugin + // implements either the old or the new version of the hook. + // The call to that version that is not implemented is optimized out + // by the caller. This is possible as the call would fall back to + // the version of the hook that is implemented in the base class of the + // plugin. This fallback version is an empty inline noop method that + // is simple for the compiler to optimize out. + + // New event handler interface version 2 (key address version) + if (kaleidoscope::Hooks::onKeyswitchEvent(mappedKey, key_addr, keyState) != kaleidoscope::EventHandlerResult::OK) + return; + + // New event handler interface (deprecated version) + if (kaleidoscope::Hooks::onKeyswitchEvent(mappedKey, key_addr.row(), key_addr.col(), keyState) != kaleidoscope::EventHandlerResult::OK) return; - mappedKey = Layer.eventHandler(mappedKey, row, col, keyState); + mappedKey = Layer.eventHandler(mappedKey, key_addr, keyState); if (mappedKey.raw == Key_NoKey.raw) return; - handleKeyswitchEventDefault(mappedKey, row, col, keyState); + handleKeyswitchEventDefault(mappedKey, key_addr, keyState); } diff --git a/src/kaleidoscope/key_events.h b/src/kaleidoscope/key_events.h index 0c124e05..41e2accf 100644 --- a/src/kaleidoscope/key_events.h +++ b/src/kaleidoscope/key_events.h @@ -24,6 +24,10 @@ // Code can use this macro on injected key events to signal that // the event isn't tied to a specific physical keyswitch +// +// TODO DEPRECATED(ROW_COL_FUNC): Once row/col based key/LED access +// is deprecated, deprecate UNKNOWN_KEYSWITCH_LOCATION as well. +// #define UNKNOWN_KEYSWITCH_LOCATION 255,255 // UnknownKeyswitchLocation represents an invalid (as default constructed) @@ -35,7 +39,7 @@ // Conversely, if an injected event *is* tied to a physical keyswitch and should // be resolved by the current keymap, code can use Key_NoKey on the injected event -// with a real (row, col) location +// with a real key address // sending events to the computer /* The event handling starts with the Scanner calling handleKeyswitchEvent() for @@ -62,10 +66,13 @@ * too. * * For this reason, the handleKeyswitchEvent 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 + * (or Key_NoKey if we do not want to override what is in the keymap), the matrix + * address 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. 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 handleKeyswitchEvent(Key mappedKey, byte row, byte col, uint8_t keyState); +void handleKeyswitchEvent(Key mappedKey, KeyAddr key_addr, uint8_t keyState); +DEPRECATED(ROW_COL_FUNC) inline void handleKeyswitchEvent(Key mappedKey, byte row, byte col, uint8_t keyState) { + handleKeyswitchEvent(mappedKey, KeyAddr(row, col), keyState); +} diff --git a/src/kaleidoscope/keymaps.h b/src/kaleidoscope/keymaps.h index 9e49222c..d3cd0148 100644 --- a/src/kaleidoscope/keymaps.h +++ b/src/kaleidoscope/keymaps.h @@ -23,8 +23,8 @@ extern const Key keymaps_linear[][ROWS * COLS]; namespace kaleidoscope { inline -Key keyFromKeymap(uint8_t layer, uint8_t row, uint8_t col) { - return pgm_read_word(&keymaps_linear[layer][row * COLS + col]); +Key keyFromKeymap(uint8_t layer, KeyAddr key_addr) { + return pgm_read_word(&keymaps_linear[layer][key_addr.toInt()]); } namespace internal { diff --git a/src/kaleidoscope/layers.cpp b/src/kaleidoscope/layers.cpp index 5a8e755f..102ffdce 100644 --- a/src/kaleidoscope/layers.cpp +++ b/src/kaleidoscope/layers.cpp @@ -38,9 +38,9 @@ extern const Key keymaps_linear[][ROWS * COLS] = {}; namespace kaleidoscope { uint32_t Layer_::layer_state_; uint8_t Layer_::top_active_layer_; -Key Layer_::live_composite_keymap_[ROWS][COLS]; -uint8_t Layer_::active_layers_[ROWS][COLS]; -Key(*Layer_::getKey)(uint8_t layer, byte row, byte col) = Layer.getKeyFromPROGMEM; +Key Layer_::live_composite_keymap_[KeyboardHardware.numKeys()]; +uint8_t Layer_::active_layers_[KeyboardHardware.numKeys()]; +Key(*Layer_::getKey)(uint8_t layer, KeyAddr key_addr) = Layer.getKeyFromPROGMEM; void Layer_::handleKeymapKeyswitchEvent(Key keymapEntry, uint8_t keyState) { if (keymapEntry.keyCode >= LAYER_SHIFT_OFFSET) { @@ -93,7 +93,7 @@ void Layer_::handleKeymapKeyswitchEvent(Key keymapEntry, uint8_t keyState) { } } -Key Layer_::eventHandler(Key mappedKey, byte row, byte col, uint8_t keyState) { +Key Layer_::eventHandler(Key mappedKey, KeyAddr key_addr, uint8_t keyState) { if (mappedKey.flags != (SYNTHETIC | SWITCH_TO_KEYMAP)) return mappedKey; @@ -101,32 +101,30 @@ Key Layer_::eventHandler(Key mappedKey, byte row, byte col, uint8_t keyState) { return Key_NoKey; } -Key Layer_::getKeyFromPROGMEM(uint8_t layer, byte row, byte col) { - return keyFromKeymap(layer, row, col); +Key Layer_::getKeyFromPROGMEM(uint8_t layer, KeyAddr key_addr) { + return keyFromKeymap(layer, key_addr); } -void Layer_::updateLiveCompositeKeymap(byte row, byte col) { - int8_t layer = active_layers_[row][col]; - live_composite_keymap_[row][col] = (*getKey)(layer, row, col); +void Layer_::updateLiveCompositeKeymap(KeyAddr key_addr) { + int8_t layer = active_layers_[key_addr.toInt()]; + live_composite_keymap_[key_addr.toInt()] = (*getKey)(layer, key_addr); } void Layer_::updateActiveLayers(void) { memset(active_layers_, 0, KeyboardHardware.numKeys()); - for (byte row = 0; row < ROWS; row++) { - for (byte col = 0; col < COLS; col++) { - int8_t layer = top_active_layer_; - - while (layer > 0) { - if (Layer.isActive(layer)) { - Key mappedKey = (*getKey)(layer, row, col); - - if (mappedKey != Key_Transparent) { - active_layers_[row][col] = layer; - break; - } + for (auto key_addr : KeyAddr::all()) { + int8_t layer = top_active_layer_; + + while (layer > 0) { + if (Layer.isActive(layer)) { + Key mappedKey = (*getKey)(layer, key_addr); + + if (mappedKey != Key_Transparent) { + active_layers_[key_addr.toInt()] = layer; + break; } - layer--; } + layer--; } } } diff --git a/src/kaleidoscope/layers.h b/src/kaleidoscope/layers.h index 490b5a2b..14b25dfb 100644 --- a/src/kaleidoscope/layers.h +++ b/src/kaleidoscope/layers.h @@ -70,15 +70,26 @@ class Layer_ { * are curious what the active layer state describes the key as, use * `lookupOnActiveLayer`. */ - static Key lookup(byte row, byte col) { - return live_composite_keymap_[row][col]; + static Key lookup(KeyAddr key_addr) { + return live_composite_keymap_[key_addr.toInt()]; } - static Key lookupOnActiveLayer(byte row, byte col) { - uint8_t layer = active_layers_[row][col]; - return (*getKey)(layer, row, col); + DEPRECATED(ROW_COL_FUNC) static Key lookup(byte row, byte col) { + return live_composite_keymap_[KeyAddr(row, col).toInt()]; } - static uint8_t lookupActiveLayer(byte row, byte col) { - return active_layers_[row][col]; + static Key lookupOnActiveLayer(KeyAddr key_addr) { + uint8_t layer = active_layers_[key_addr.toInt()]; + return (*getKey)(layer, key_addr); + } + DEPRECATED(ROW_COL_FUNC) static Key lookupOnActiveLayer(byte row, byte col) { + KeyAddr key_addr(row, col); + uint8_t layer = active_layers_[key_addr.toInt()]; + return (*getKey)(layer, key_addr); + } + static uint8_t lookupActiveLayer(KeyAddr key_addr) { + return active_layers_[key_addr.toInt()]; + } + DEPRECATED(ROW_COL_FUNC) static uint8_t lookupActiveLayer(byte row, byte col) { + return active_layers_[KeyAddr(row, col).toInt()]; } static void activate(uint8_t layer); @@ -96,23 +107,35 @@ class Layer_ { return layer_state_; } - static Key eventHandler(Key mappedKey, byte row, byte col, uint8_t keyState); + static Key eventHandler(Key mappedKey, KeyAddr key_addr, uint8_t keyState); + DEPRECATED(ROW_COL_FUNC) static Key eventHandler(Key mappedKey, byte row, byte col, uint8_t keyState) { + return eventHandler(mappedKey, KeyAddr(row, col), keyState); + } - static Key(*getKey)(uint8_t layer, byte row, byte col); + static Key(*getKey)(uint8_t layer, KeyAddr key_addr); - static Key getKeyFromPROGMEM(uint8_t layer, byte row, byte col); + static Key getKeyFromPROGMEM(uint8_t layer, KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) static Key getKeyFromPROGMEM(uint8_t layer, byte row, byte col) { + return getKeyFromPROGMEM(layer, KeyAddr(row, col)); + } - static void updateLiveCompositeKeymap(byte row, byte col); - static void updateLiveCompositeKeymap(byte row, byte col, Key mappedKey) { - live_composite_keymap_[row][col] = mappedKey; + static void updateLiveCompositeKeymap(KeyAddr key_addr, Key mappedKey) { + live_composite_keymap_[key_addr.toInt()] = mappedKey; + } + DEPRECATED(ROW_COL_FUNC) static void updateLiveCompositeKeymap(byte row, byte col, Key mappedKey) { + updateLiveCompositeKeymap(KeyAddr(row, col), mappedKey); + } + static void updateLiveCompositeKeymap(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) static void updateLiveCompositeKeymap(byte row, byte col) { + updateLiveCompositeKeymap(KeyAddr(row, col)); } static void updateActiveLayers(void); private: static uint32_t layer_state_; static uint8_t top_active_layer_; - static Key live_composite_keymap_[ROWS][COLS]; - static uint8_t active_layers_[ROWS][COLS]; + static Key live_composite_keymap_[KeyboardHardware.numKeys()]; + static uint8_t active_layers_[KeyboardHardware.numKeys()]; static void handleKeymapKeyswitchEvent(Key keymapEntry, uint8_t keyState); static void updateTopActiveLayer(void); diff --git a/src/kaleidoscope/plugin/Colormap.cpp b/src/kaleidoscope/plugin/Colormap.cpp index c1db2e85..d24707d8 100644 --- a/src/kaleidoscope/plugin/Colormap.cpp +++ b/src/kaleidoscope/plugin/Colormap.cpp @@ -44,9 +44,9 @@ void ColormapEffect::TransientLEDMode::onActivate(void) { ::LEDPaletteTheme.updateHandler(parent_->map_base_, parent_->top_layer_); } -void ColormapEffect::TransientLEDMode::refreshAt(byte row, byte col) { +void ColormapEffect::TransientLEDMode::refreshAt(KeyAddr key_addr) { if (parent_->top_layer_ <= parent_->max_layers_) - ::LEDPaletteTheme.refreshAt(parent_->map_base_, parent_->top_layer_, row, col); + ::LEDPaletteTheme.refreshAt(parent_->map_base_, parent_->top_layer_, key_addr); } EventHandlerResult ColormapEffect::onLayerChange() { diff --git a/src/kaleidoscope/plugin/Colormap.h b/src/kaleidoscope/plugin/Colormap.h index eedc2db0..4259c31d 100644 --- a/src/kaleidoscope/plugin/Colormap.h +++ b/src/kaleidoscope/plugin/Colormap.h @@ -49,8 +49,10 @@ class ColormapEffect : public Plugin, friend class ColormapEffect; virtual void onActivate(void) final; - virtual void refreshAt(byte row, byte col) final; - + virtual void refreshAt(KeyAddr key_addr) final; + DEPRECATED(ROW_COL_FUNC) void refreshAt(byte row, byte col) final { + refreshAt(KeyAddr(row, col)); + } private: const ColormapEffect *parent_; diff --git a/src/kaleidoscope/plugin/Cycle.cpp b/src/kaleidoscope/plugin/Cycle.cpp index 00361a83..9b0f5d80 100644 --- a/src/kaleidoscope/plugin/Cycle.cpp +++ b/src/kaleidoscope/plugin/Cycle.cpp @@ -33,14 +33,14 @@ uint8_t Cycle::cycle_count_; // --- api --- void Cycle::replace(Key key) { - handleKeyswitchEvent(Key_Backspace, UNKNOWN_KEYSWITCH_LOCATION, IS_PRESSED | INJECTED); + handleKeyswitchEvent(Key_Backspace, UnknownKeyswitchLocation, IS_PRESSED | INJECTED); hid::sendKeyboardReport(); - handleKeyswitchEvent(Key_Backspace, UNKNOWN_KEYSWITCH_LOCATION, WAS_PRESSED | INJECTED); + handleKeyswitchEvent(Key_Backspace, UnknownKeyswitchLocation, WAS_PRESSED | INJECTED); hid::sendKeyboardReport(); - handleKeyswitchEvent(key, UNKNOWN_KEYSWITCH_LOCATION, IS_PRESSED | INJECTED); + handleKeyswitchEvent(key, UnknownKeyswitchLocation, IS_PRESSED | INJECTED); hid::sendKeyboardReport(); - handleKeyswitchEvent(key, UNKNOWN_KEYSWITCH_LOCATION, WAS_PRESSED | INJECTED); + handleKeyswitchEvent(key, UnknownKeyswitchLocation, WAS_PRESSED | INJECTED); hid::sendKeyboardReport(); } @@ -54,7 +54,7 @@ void Cycle::replace(uint8_t cycle_size, const Key cycle_steps[]) { // --- hooks --- -EventHandlerResult Cycle::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) { +EventHandlerResult Cycle::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state) { if (key_state & INJECTED) return EventHandlerResult::OK; diff --git a/src/kaleidoscope/plugin/Cycle.h b/src/kaleidoscope/plugin/Cycle.h index 0a7a1d83..e467d99c 100644 --- a/src/kaleidoscope/plugin/Cycle.h +++ b/src/kaleidoscope/plugin/Cycle.h @@ -36,7 +36,7 @@ class Cycle : public kaleidoscope::Plugin { static void replace(Key key); static void replace(uint8_t cycle_size, const Key cycle_steps[]); - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); private: static uint8_t toModFlag(uint8_t keyCode); diff --git a/src/kaleidoscope/plugin/EEPROM-Keymap-Programmer.cpp b/src/kaleidoscope/plugin/EEPROM-Keymap-Programmer.cpp index 7540aa7f..0c4874b8 100644 --- a/src/kaleidoscope/plugin/EEPROM-Keymap-Programmer.cpp +++ b/src/kaleidoscope/plugin/EEPROM-Keymap-Programmer.cpp @@ -50,16 +50,16 @@ void EEPROMKeymapProgrammer::cancel(void) { state_ = INACTIVE; } -EventHandlerResult EEPROMKeymapProgrammer::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) { +EventHandlerResult EEPROMKeymapProgrammer::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state) { if (state_ == INACTIVE) return EventHandlerResult::OK; if (state_ == WAIT_FOR_KEY) { if (keyToggledOn(key_state)) { - update_position_ = Layer.top() * KeyboardHardware.numKeys() + row * COLS + col; + update_position_ = Layer.top() * KeyboardHardware.numKeys() + key_addr.toInt(); } if (keyToggledOff(key_state)) { - if ((uint16_t)(Layer.top() * KeyboardHardware.numKeys() + row * COLS + col) == update_position_) + if ((uint16_t)(Layer.top() * KeyboardHardware.numKeys() + key_addr.toInt()) == update_position_) nextState(); } return EventHandlerResult::EVENT_CONSUMED; @@ -67,10 +67,10 @@ EventHandlerResult EEPROMKeymapProgrammer::onKeyswitchEvent(Key &mapped_key, byt if (state_ == WAIT_FOR_SOURCE_KEY) { if (keyToggledOn(key_state)) { - new_key_ = Layer.getKeyFromPROGMEM(Layer.top(), row, col); + new_key_ = Layer.getKeyFromPROGMEM(Layer.top(), key_addr); } if (keyToggledOff(key_state)) { - if (new_key_ == Layer.getKeyFromPROGMEM(Layer.top(), row, col)) + if (new_key_ == Layer.getKeyFromPROGMEM(Layer.top(), key_addr)) nextState(); } return EventHandlerResult::EVENT_CONSUMED; diff --git a/src/kaleidoscope/plugin/EEPROM-Keymap-Programmer.h b/src/kaleidoscope/plugin/EEPROM-Keymap-Programmer.h index 14ba6c57..dd45b148 100644 --- a/src/kaleidoscope/plugin/EEPROM-Keymap-Programmer.h +++ b/src/kaleidoscope/plugin/EEPROM-Keymap-Programmer.h @@ -38,7 +38,7 @@ class EEPROMKeymapProgrammer : public kaleidoscope::Plugin { static void nextState(void); static void cancel(void); - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); EventHandlerResult onFocusEvent(const char *command); private: diff --git a/src/kaleidoscope/plugin/EEPROM-Keymap.cpp b/src/kaleidoscope/plugin/EEPROM-Keymap.cpp index de3205ed..acc2d88d 100644 --- a/src/kaleidoscope/plugin/EEPROM-Keymap.cpp +++ b/src/kaleidoscope/plugin/EEPROM-Keymap.cpp @@ -47,13 +47,13 @@ void EEPROMKeymap::max_layers(uint8_t max) { keymap_base_ = ::EEPROMSettings.requestSlice(max_layers_ * KeyboardHardware.numKeys() * 2); } -Key EEPROMKeymap::getKey(uint8_t layer, byte row, byte col) { +Key EEPROMKeymap::getKey(uint8_t layer, KeyAddr key_addr) { Key key; if (layer >= max_layers_) return Key_NoKey; - uint16_t pos = ((layer * KeyboardHardware.numKeys()) + (row * COLS) + col) * 2; + uint16_t pos = ((layer * KeyboardHardware.numKeys()) + key_addr.toInt()) * 2; key.flags = EEPROM.read(keymap_base_ + pos); key.keyCode = EEPROM.read(keymap_base_ + pos + 1); @@ -61,16 +61,15 @@ Key EEPROMKeymap::getKey(uint8_t layer, byte row, byte col) { return key; } -Key EEPROMKeymap::getKeyExtended(uint8_t layer, byte row, byte col) { - Key key; +Key EEPROMKeymap::getKeyExtended(uint8_t layer, KeyAddr key_addr) { // If the layer is within PROGMEM bounds, look it up from there if (layer < progmem_layers_) { - return Layer.getKeyFromPROGMEM(layer, row, col); + return Layer.getKeyFromPROGMEM(layer, key_addr); } // If the layer is outside of PROGMEM, look up from EEPROM - return getKey(layer - progmem_layers_, row, col); + return getKey(layer - progmem_layers_, key_addr); } uint16_t EEPROMKeymap::keymap_base(void) { @@ -82,14 +81,22 @@ void EEPROMKeymap::updateKey(uint16_t base_pos, Key key) { EEPROM.update(keymap_base_ + base_pos * 2 + 1, key.keyCode); } +void EEPROMKeymap::dumpKeymap(uint8_t layers, Key(*getkey)(uint8_t, KeyAddr)) { + for (uint8_t layer = 0; layer < layers; layer++) { + for (auto key_addr : KeyAddr::all()) { + Key k = (*getkey)(layer, key_addr); + + ::Focus.send(k); + } + } +} + void EEPROMKeymap::dumpKeymap(uint8_t layers, Key(*getkey)(uint8_t, byte, byte)) { for (uint8_t layer = 0; layer < layers; layer++) { - for (uint8_t row = 0; row < ROWS; row++) { - for (uint8_t col = 0; col < COLS; col++) { - Key k = (*getkey)(layer, row, col); + for (auto key_addr : KeyAddr::all()) { + Key k = (*getkey)(layer, key_addr.row(), key_addr.col()); - ::Focus.send(k); - } + ::Focus.send(k); } } } @@ -122,7 +129,12 @@ EventHandlerResult EEPROMKeymap::onFocusEvent(const char *command) { } if (strcmp_P(command + 7, PSTR("default")) == 0) { - dumpKeymap(progmem_layers_, Layer.getKeyFromPROGMEM); + // By using a cast to the appropriate function type, + // tell the compiler which overload of getKeyFromPROGMEM + // we actully want. + // + dumpKeymap(progmem_layers_, + static_cast(Layer.getKeyFromPROGMEM)); return EventHandlerResult::EVENT_CONSUMED; } @@ -130,7 +142,11 @@ EventHandlerResult EEPROMKeymap::onFocusEvent(const char *command) { return EventHandlerResult::OK; if (::Focus.isEOL()) { - dumpKeymap(max_layers_, getKey); + // By using a cast to the appropriate function type, + // tell the compiler which overload of getKey + // we actually want. + // + dumpKeymap(max_layers_, static_cast(getKey)); } else { uint16_t i = 0; diff --git a/src/kaleidoscope/plugin/EEPROM-Keymap.h b/src/kaleidoscope/plugin/EEPROM-Keymap.h index 0aee9cbb..af7d4398 100644 --- a/src/kaleidoscope/plugin/EEPROM-Keymap.h +++ b/src/kaleidoscope/plugin/EEPROM-Keymap.h @@ -47,8 +47,14 @@ class EEPROMKeymap : public kaleidoscope::Plugin { static uint16_t keymap_base(void); - static Key getKey(uint8_t layer, byte row, byte col); - static Key getKeyExtended(uint8_t layer, byte row, byte col); + static Key getKey(uint8_t layer, KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) static Key getKey(uint8_t layer, byte row, byte col) { + return getKey(layer, KeyAddr(row, col)); + } + static Key getKeyExtended(uint8_t layer, KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) static Key getKeyExtended(uint8_t layer, byte row, byte col) { + return getKeyExtended(layer, KeyAddr(row, col)); + } static void updateKey(uint16_t base_pos, Key key); @@ -59,7 +65,8 @@ class EEPROMKeymap : public kaleidoscope::Plugin { static Key parseKey(void); static void printKey(Key key); - static void dumpKeymap(uint8_t layers, Key(*getkey)(uint8_t, byte, byte)); + static void dumpKeymap(uint8_t layers, Key(*getkey)(uint8_t, KeyAddr)); + DEPRECATED(ROW_COL_FUNC) static void dumpKeymap(uint8_t layers, Key(*getkey)(uint8_t, byte, byte)); }; } } diff --git a/src/kaleidoscope/plugin/Escape-OneShot.cpp b/src/kaleidoscope/plugin/Escape-OneShot.cpp index 3beb5adc..7f110307 100644 --- a/src/kaleidoscope/plugin/Escape-OneShot.cpp +++ b/src/kaleidoscope/plugin/Escape-OneShot.cpp @@ -22,7 +22,7 @@ namespace kaleidoscope { namespace plugin { -EventHandlerResult EscapeOneShot::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t keyState) { +EventHandlerResult EscapeOneShot::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t keyState) { if (mapped_key.raw != Key_Escape.raw || (keyState & INJECTED) || !keyToggledOn(keyState)) @@ -32,7 +32,7 @@ EventHandlerResult EscapeOneShot::onKeyswitchEvent(Key &mapped_key, byte row, by return EventHandlerResult::OK; } - KeyboardHardware.maskKey(row, col); + KeyboardHardware.maskKey(key_addr); ::OneShot.cancel(true); return EventHandlerResult::EVENT_CONSUMED; diff --git a/src/kaleidoscope/plugin/Escape-OneShot.h b/src/kaleidoscope/plugin/Escape-OneShot.h index 558d707f..47592228 100644 --- a/src/kaleidoscope/plugin/Escape-OneShot.h +++ b/src/kaleidoscope/plugin/Escape-OneShot.h @@ -25,7 +25,7 @@ class EscapeOneShot : public kaleidoscope::Plugin { public: EscapeOneShot(void) {} - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t keyState); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t keyState); }; } } diff --git a/src/kaleidoscope/plugin/FingerPainter.cpp b/src/kaleidoscope/plugin/FingerPainter.cpp index bc83014e..5d9f29df 100644 --- a/src/kaleidoscope/plugin/FingerPainter.cpp +++ b/src/kaleidoscope/plugin/FingerPainter.cpp @@ -37,15 +37,15 @@ void FingerPainter::update(void) { ::LEDPaletteTheme.updateHandler(color_base_, 0); } -void FingerPainter::refreshAt(byte row, byte col) { - ::LEDPaletteTheme.refreshAt(color_base_, 0, row, col); +void FingerPainter::refreshAt(KeyAddr key_addr) { + ::LEDPaletteTheme.refreshAt(color_base_, 0, key_addr); } void FingerPainter::toggle(void) { edit_mode_ = !edit_mode_; } -EventHandlerResult FingerPainter::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) { +EventHandlerResult FingerPainter::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state) { if (!Kaleidoscope.has_leds || !edit_mode_) return EventHandlerResult::OK; @@ -53,10 +53,12 @@ EventHandlerResult FingerPainter::onKeyswitchEvent(Key &mapped_key, byte row, by return EventHandlerResult::EVENT_CONSUMED; } - if (row >= ROWS || col >= COLS) + if (!key_addr.isValid()) return EventHandlerResult::EVENT_CONSUMED; - uint8_t color_index = ::LEDPaletteTheme.lookupColorIndexAtPosition(color_base_, KeyboardHardware.getLedIndex(row, col)); + // TODO: The following works only for keyboards with LEDs for each key. + + uint8_t color_index = ::LEDPaletteTheme.lookupColorIndexAtPosition(color_base_, KeyboardHardware.getLedIndex(key_addr)); // Find the next color in the palette that is different. // But do not loop forever! @@ -73,7 +75,7 @@ EventHandlerResult FingerPainter::onKeyswitchEvent(Key &mapped_key, byte row, by new_color = ::LEDPaletteTheme.lookupPaletteColor(color_index); } - ::LEDPaletteTheme.updateColorIndexAtPosition(color_base_, KeyboardHardware.getLedIndex(row, col), color_index); + ::LEDPaletteTheme.updateColorIndexAtPosition(color_base_, KeyboardHardware.getLedIndex(key_addr), color_index); return EventHandlerResult::EVENT_CONSUMED; } diff --git a/src/kaleidoscope/plugin/FingerPainter.h b/src/kaleidoscope/plugin/FingerPainter.h index add9f175..1caf4d03 100644 --- a/src/kaleidoscope/plugin/FingerPainter.h +++ b/src/kaleidoscope/plugin/FingerPainter.h @@ -32,13 +32,16 @@ class FingerPainter : public LEDMode { static void toggle(void); - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); EventHandlerResult onFocusEvent(const char *command); EventHandlerResult onSetup(); protected: void update(void) final; - void refreshAt(byte row, byte col) final; + void refreshAt(KeyAddr key_addr) final; + DEPRECATED(ROW_COL_FUNC) void refreshAt(byte row, byte col) final { + refreshAt(KeyAddr(row, col)); + } private: static uint16_t color_base_; diff --git a/src/kaleidoscope/plugin/GeminiPR.cpp b/src/kaleidoscope/plugin/GeminiPR.cpp index 39331f72..659684ca 100644 --- a/src/kaleidoscope/plugin/GeminiPR.cpp +++ b/src/kaleidoscope/plugin/GeminiPR.cpp @@ -24,7 +24,7 @@ namespace steno { uint8_t GeminiPR::keys_held_; uint8_t GeminiPR::state_[6]; -EventHandlerResult GeminiPR::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t keyState) { +EventHandlerResult GeminiPR::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t keyState) { if (mapped_key < geminipr::START || mapped_key > geminipr::END) return EventHandlerResult::OK; diff --git a/src/kaleidoscope/plugin/GeminiPR.h b/src/kaleidoscope/plugin/GeminiPR.h index e6696c55..193c08e1 100644 --- a/src/kaleidoscope/plugin/GeminiPR.h +++ b/src/kaleidoscope/plugin/GeminiPR.h @@ -29,8 +29,7 @@ class GeminiPR : public kaleidoscope::Plugin { public: GeminiPR(void) {} - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t keyState); - + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t keyState); private: static uint8_t keys_held_; static uint8_t state_[6]; diff --git a/src/kaleidoscope/plugin/GhostInTheFirmware.cpp b/src/kaleidoscope/plugin/GhostInTheFirmware.cpp index 8e5edf7e..d582b86c 100644 --- a/src/kaleidoscope/plugin/GhostInTheFirmware.cpp +++ b/src/kaleidoscope/plugin/GhostInTheFirmware.cpp @@ -55,12 +55,12 @@ EventHandlerResult GhostInTheFirmware::beforeReportingState() { byte row = pgm_read_byte(&(ghost_keys[current_pos_].row)); byte col = pgm_read_byte(&(ghost_keys[current_pos_].col)); - handleKeyswitchEvent(Key_NoKey, row, col, WAS_PRESSED); + handleKeyswitchEvent(Key_NoKey, KeyAddr(row, col), WAS_PRESSED); } else if (is_pressed_) { byte row = pgm_read_byte(&(ghost_keys[current_pos_].row)); byte col = pgm_read_byte(&(ghost_keys[current_pos_].col)); - handleKeyswitchEvent(Key_NoKey, row, col, IS_PRESSED); + handleKeyswitchEvent(Key_NoKey, KeyAddr(row, col), IS_PRESSED); } else if (Kaleidoscope.hasTimeExpired(start_time_, delay_timeout_)) { current_pos_++; press_timeout_ = 0; diff --git a/src/kaleidoscope/plugin/HardwareTestMode.cpp b/src/kaleidoscope/plugin/HardwareTestMode.cpp index d36f0f9b..8b7e9f26 100644 --- a/src/kaleidoscope/plugin/HardwareTestMode.cpp +++ b/src/kaleidoscope/plugin/HardwareTestMode.cpp @@ -76,7 +76,7 @@ void HardwareTestMode::testLeds(void) { void HardwareTestMode::testMatrix() { // Reset bad keys from previous tests. - chatter_data state[KeyboardHardware.matrix_columns * KeyboardHardware.matrix_rows] = {0, 0, 0}; + chatter_data state[KeyboardHardware.numKeys()] = {0, 0, 0}; constexpr cRGB red = CRGB(201, 0, 0); constexpr cRGB blue = CRGB(0, 0, 201); @@ -85,36 +85,34 @@ void HardwareTestMode::testMatrix() { while (1) { KeyboardHardware.readMatrix(); - for (byte row = 0; row < KeyboardHardware.matrix_rows; row++) { - for (byte col = 0; col < KeyboardHardware.matrix_columns; col++) { - uint8_t keynum = (row * KeyboardHardware.matrix_columns) + (col); - - // If the key is toggled on - if (KeyboardHardware.isKeyswitchPressed(row, col) && ! KeyboardHardware.wasKeyswitchPressed(row, col)) { - // And it's too soon (in terms of cycles between changes) - state[keynum].tested = 1; - if (state[keynum].cyclesSinceStateChange < CHATTER_CYCLE_LIMIT) { - state[keynum].bad = 1; - } - state[keynum].cyclesSinceStateChange = 0; - } else if (state[keynum].cyclesSinceStateChange < CHATTER_CYCLE_LIMIT) { - state[keynum].cyclesSinceStateChange++; - } - // If the key is held down - if (KeyboardHardware.isKeyswitchPressed(row, col) && KeyboardHardware.wasKeyswitchPressed(row, col)) { - KeyboardHardware.setCrgbAt(row, col, green); + for (auto key_addr : KeyAddr::all()) { + uint8_t keynum = key_addr.toInt(); + + // If the key is toggled on + if (KeyboardHardware.isKeyswitchPressed(key_addr) && ! KeyboardHardware.wasKeyswitchPressed(key_addr)) { + // And it's too soon (in terms of cycles between changes) + state[keynum].tested = 1; + if (state[keynum].cyclesSinceStateChange < CHATTER_CYCLE_LIMIT) { + state[keynum].bad = 1; } + state[keynum].cyclesSinceStateChange = 0; + } else if (state[keynum].cyclesSinceStateChange < CHATTER_CYCLE_LIMIT) { + state[keynum].cyclesSinceStateChange++; + } + // If the key is held down + if (KeyboardHardware.isKeyswitchPressed(key_addr) && KeyboardHardware.wasKeyswitchPressed(key_addr)) { + KeyboardHardware.setCrgbAt(key_addr, green); + } - // If we triggered chatter detection ever on this key - else if (state[keynum].bad == 1) { - KeyboardHardware.setCrgbAt(row, col, red); - } else if (state[keynum].tested == 0) { - KeyboardHardware.setCrgbAt(row, col, yellow); - } - // If the key is not currently pressed and was not just released and is not marked bad - else if (! KeyboardHardware.isKeyswitchPressed(row, col)) { - KeyboardHardware.setCrgbAt(row, col, blue); - } + // If we triggered chatter detection ever on this key + else if (state[keynum].bad == 1) { + KeyboardHardware.setCrgbAt(key_addr, red); + } else if (state[keynum].tested == 0) { + KeyboardHardware.setCrgbAt(key_addr, yellow); + } + // If the key is not currently pressed and was not just released and is not marked bad + else if (! KeyboardHardware.isKeyswitchPressed(key_addr)) { + KeyboardHardware.setCrgbAt(key_addr, blue); } } ::LEDControl.syncLeds(); diff --git a/src/kaleidoscope/plugin/Heatmap.cpp b/src/kaleidoscope/plugin/Heatmap.cpp index fe8108a7..755c44bf 100644 --- a/src/kaleidoscope/plugin/Heatmap.cpp +++ b/src/kaleidoscope/plugin/Heatmap.cpp @@ -106,10 +106,8 @@ void Heatmap::TransientLEDMode::shiftStats(void) { // 2. highest_ reach heat_colors_length*512 (see Heatmap::loopHook) // we divide every heatmap element by 2 - for (uint8_t r = 0; r < ROWS; r++) { - for (uint8_t c = 0; c < COLS; c++) { - heatmap_[r][c] = heatmap_[r][c] >> 1; - } + for (auto key_addr : KeyAddr::all()) { + heatmap_[key_addr.toInt()] = heatmap_[key_addr.toInt()] >> 1; } // and also divide highest_ accordingly @@ -128,16 +126,14 @@ void Heatmap::TransientLEDMode::resetMap() { // this method can be used as a way to work around an existing bug with a single key // getting special attention or if the user just wants a button to reset the map - for (uint8_t r = 0; r < ROWS; r++) { - for (uint8_t c = 0; c < COLS; c++) { - heatmap_[r][c] = 0; - } + for (auto key_addr : KeyAddr::all()) { + heatmap_[key_addr.toInt()] = 0; } highest_ = 1; } -EventHandlerResult Heatmap::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) { +EventHandlerResult Heatmap::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state) { if (!Kaleidoscope.has_leds) return EventHandlerResult::OK; @@ -157,16 +153,16 @@ EventHandlerResult Heatmap::onKeyswitchEvent(Key &mapped_key, byte row, byte col return EventHandlerResult::OK; return ::LEDControl.get_mode() - ->onKeyswitchEvent(mapped_key, row, col, key_state); + ->onKeyswitchEvent(mapped_key, key_addr, key_state); } -EventHandlerResult Heatmap::TransientLEDMode::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) { +EventHandlerResult Heatmap::TransientLEDMode::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state) { // increment the heatmap_ value related to the key - heatmap_[row][col]++; + heatmap_[key_addr.toInt()]++; // check highest_ - if (highest_ < heatmap_[row][col]) { - highest_ = heatmap_[row][col]; + if (highest_ < heatmap_[key_addr.toInt()]) { + highest_ = heatmap_[key_addr.toInt()]; // if highest_ (and so heatmap_ value related to the key) // is close to overflow: call shiftStats @@ -221,19 +217,17 @@ void Heatmap::TransientLEDMode::update(void) { last_heatmap_comp_time_ = Kaleidoscope.millisAtCycleStart(); // for each key - for (uint8_t r = 0; r < ROWS; r++) { - for (uint8_t c = 0; c < COLS; c++) { - // how much the key was pressed compared to the others (between 0 and 1) - // (total_keys_ can't be equal to 0) - float v = static_cast(heatmap_[r][c]) / highest_; - // we could have used an interger instead of a float, but then we would - // have had to change some multiplication in division. - // / on uint is slower than * on float, so I stay with the float - // https://forum.arduino.cc/index.php?topic=92684.msg2733723#msg2733723 - - // set the LED color accordingly - ::LEDControl.setCrgbAt(r, c, computeColor(v)); - } + for (auto key_addr : KeyAddr::all()) { + // how much the key was pressed compared to the others (between 0 and 1) + // (total_keys_ can't be equal to 0) + float v = static_cast(heatmap_[key_addr.toInt()]) / highest_; + // we could have used an interger instead of a float, but then we would + // have had to change some multiplication in division. + // / on uint is slower than * on float, so I stay with the float + // https://forum.arduino.cc/index.php?topic=92684.msg2733723#msg2733723 + + // set the LED color accordingly + ::LEDControl.setCrgbAt(KeyAddr(key_addr), computeColor(v)); } } diff --git a/src/kaleidoscope/plugin/Heatmap.h b/src/kaleidoscope/plugin/Heatmap.h index 391485b0..efba28ac 100644 --- a/src/kaleidoscope/plugin/Heatmap.h +++ b/src/kaleidoscope/plugin/Heatmap.h @@ -33,7 +33,7 @@ class Heatmap : public Plugin, static uint8_t heat_colors_length; void resetMap(void); - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); EventHandlerResult beforeEachCycle(); // This class' instance has dynamic lifetime @@ -48,7 +48,7 @@ class Heatmap : public Plugin, TransientLEDMode(const Heatmap *parent); void resetMap(); - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); EventHandlerResult beforeEachCycle(); protected: @@ -59,7 +59,7 @@ class Heatmap : public Plugin, const Heatmap *parent_; - uint16_t heatmap_[ROWS][COLS]; + uint16_t heatmap_[KeyboardHardware.numKeys()]; uint16_t highest_; uint16_t last_heatmap_comp_time_; diff --git a/src/kaleidoscope/plugin/IdleLEDs.cpp b/src/kaleidoscope/plugin/IdleLEDs.cpp index 449db057..34f75dff 100644 --- a/src/kaleidoscope/plugin/IdleLEDs.cpp +++ b/src/kaleidoscope/plugin/IdleLEDs.cpp @@ -36,7 +36,7 @@ EventHandlerResult IdleLEDs::beforeEachCycle() { return EventHandlerResult::OK; } -EventHandlerResult IdleLEDs::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) { +EventHandlerResult IdleLEDs::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state) { if (::LEDControl.paused) { ::LEDControl.paused = false; diff --git a/src/kaleidoscope/plugin/IdleLEDs.h b/src/kaleidoscope/plugin/IdleLEDs.h index 19d27a51..801eafa9 100644 --- a/src/kaleidoscope/plugin/IdleLEDs.h +++ b/src/kaleidoscope/plugin/IdleLEDs.h @@ -29,7 +29,7 @@ class IdleLEDs: public kaleidoscope::Plugin { static uint16_t idle_time_limit; EventHandlerResult beforeEachCycle(); - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); private: static uint32_t start_time_; diff --git a/src/kaleidoscope/plugin/LED-ActiveLayerColor.cpp b/src/kaleidoscope/plugin/LED-ActiveLayerColor.cpp index cc424987..12eb2bf8 100644 --- a/src/kaleidoscope/plugin/LED-ActiveLayerColor.cpp +++ b/src/kaleidoscope/plugin/LED-ActiveLayerColor.cpp @@ -52,8 +52,8 @@ void LEDActiveLayerColorEffect::TransientLEDMode::onActivate(void) { ::LEDControl.set_all_leds_to(active_color_); } -void LEDActiveLayerColorEffect::TransientLEDMode::refreshAt(byte row, byte col) { - ::LEDControl.setCrgbAt(row, col, active_color_); +void LEDActiveLayerColorEffect::TransientLEDMode::refreshAt(KeyAddr key_addr) { + ::LEDControl.setCrgbAt(key_addr, active_color_); } EventHandlerResult LEDActiveLayerColorEffect::onLayerChange() { diff --git a/src/kaleidoscope/plugin/LED-ActiveLayerColor.h b/src/kaleidoscope/plugin/LED-ActiveLayerColor.h index 2030e0ed..0ee80de9 100644 --- a/src/kaleidoscope/plugin/LED-ActiveLayerColor.h +++ b/src/kaleidoscope/plugin/LED-ActiveLayerColor.h @@ -44,7 +44,10 @@ class LEDActiveLayerColorEffect : public Plugin, protected: virtual void onActivate(void) final; - virtual void refreshAt(byte row, byte col) final; + virtual void refreshAt(KeyAddr key_addr) final; + DEPRECATED(ROW_COL_FUNC) void refreshAt(byte row, byte col) final { + refreshAt(KeyAddr(row, col)); + } private: diff --git a/src/kaleidoscope/plugin/LED-ActiveModColor.cpp b/src/kaleidoscope/plugin/LED-ActiveModColor.cpp index 88b21baa..6636b6fa 100644 --- a/src/kaleidoscope/plugin/LED-ActiveModColor.cpp +++ b/src/kaleidoscope/plugin/LED-ActiveModColor.cpp @@ -22,7 +22,7 @@ namespace kaleidoscope { namespace plugin { -uint8_t ActiveModColorEffect::mod_keys_[MAX_MODS_PER_LAYER]; +KeyAddr ActiveModColorEffect::mod_keys_[MAX_MODS_PER_LAYER]; uint8_t ActiveModColorEffect::mod_key_count_; bool ActiveModColorEffect::highlight_normal_modifiers_ = true; @@ -38,17 +38,14 @@ EventHandlerResult ActiveModColorEffect::onLayerChange() { mod_key_count_ = 0; - for (byte r = 0; r < ROWS; r++) { - for (byte c = 0; c < COLS; c++) { - Key k = Layer.lookupOnActiveLayer(r, c); - - if (::OneShot.isOneShotKey(k) || - (highlight_normal_modifiers_ && ( - (k.raw >= Key_LeftControl.raw && k.raw <= Key_RightGui.raw) || - (k.flags == (SYNTHETIC | SWITCH_TO_KEYMAP))))) { - uint8_t coords = r * COLS + c; - mod_keys_[mod_key_count_++] = coords; - } + for (auto key_addr : KeyAddr::all()) { + Key k = Layer.lookupOnActiveLayer(key_addr); + + if (::OneShot.isOneShotKey(k) || + (highlight_normal_modifiers_ && ( + (k.raw >= Key_LeftControl.raw && k.raw <= Key_RightGui.raw) || + (k.flags == (SYNTHETIC | SWITCH_TO_KEYMAP))))) { + mod_keys_[mod_key_count_++] = key_addr; } } @@ -61,33 +58,31 @@ EventHandlerResult ActiveModColorEffect::beforeReportingState() { } for (uint8_t i = 0; i < mod_key_count_; i++) { - uint8_t coords = mod_keys_[i]; - byte c = coords % COLS; - byte r = (coords - c) / COLS; + const KeyAddr &key_addr = mod_keys_[i]; - Key k = Layer.lookupOnActiveLayer(r, c); + Key k = Layer.lookupOnActiveLayer(key_addr); if (::OneShot.isOneShotKey(k)) { if (::OneShot.isSticky(k)) - ::LEDControl.setCrgbAt(r, c, sticky_color); + ::LEDControl.setCrgbAt(key_addr, sticky_color); else if (::OneShot.isActive(k)) - ::LEDControl.setCrgbAt(r, c, highlight_color); + ::LEDControl.setCrgbAt(key_addr, highlight_color); else - ::LEDControl.refreshAt(r, c); + ::LEDControl.refreshAt(key_addr); } else if (k.raw >= Key_LeftControl.raw && k.raw <= Key_RightGui.raw) { if (hid::isModifierKeyActive(k)) - ::LEDControl.setCrgbAt(r, c, highlight_color); + ::LEDControl.setCrgbAt(key_addr, highlight_color); else - ::LEDControl.refreshAt(r, c); + ::LEDControl.refreshAt(key_addr); } else if (k.flags == (SYNTHETIC | SWITCH_TO_KEYMAP)) { uint8_t layer = k.keyCode; if (layer >= LAYER_SHIFT_OFFSET) layer -= LAYER_SHIFT_OFFSET; if (Layer.isActive(layer)) - ::LEDControl.setCrgbAt(r, c, highlight_color); + ::LEDControl.setCrgbAt(key_addr, highlight_color); else - ::LEDControl.refreshAt(r, c); + ::LEDControl.refreshAt(key_addr); } } diff --git a/src/kaleidoscope/plugin/LED-ActiveModColor.h b/src/kaleidoscope/plugin/LED-ActiveModColor.h index 1ea1d729..a75e4a0f 100644 --- a/src/kaleidoscope/plugin/LED-ActiveModColor.h +++ b/src/kaleidoscope/plugin/LED-ActiveModColor.h @@ -40,7 +40,7 @@ class ActiveModColorEffect : public kaleidoscope::Plugin { private: static bool highlight_normal_modifiers_; - static uint8_t mod_keys_[MAX_MODS_PER_LAYER]; + static KeyAddr mod_keys_[MAX_MODS_PER_LAYER]; static uint8_t mod_key_count_; }; } diff --git a/src/kaleidoscope/plugin/LED-AlphaSquare.cpp b/src/kaleidoscope/plugin/LED-AlphaSquare.cpp index 30ee3249..459acd93 100644 --- a/src/kaleidoscope/plugin/LED-AlphaSquare.cpp +++ b/src/kaleidoscope/plugin/LED-AlphaSquare.cpp @@ -63,7 +63,7 @@ static const uint16_t alphabet[] PROGMEM = { cRGB AlphaSquare::color = {0x80, 0x80, 0x80}; -void AlphaSquare::display(Key key, uint8_t row, uint8_t col, cRGB key_color) { +void AlphaSquare::display(Key key, KeyAddr key_addr, cRGB key_color) { if (!Kaleidoscope.has_leds) return; @@ -73,14 +73,14 @@ void AlphaSquare::display(Key key, uint8_t row, uint8_t col, cRGB key_color) { uint8_t index = key.keyCode - Key_A.keyCode; uint16_t symbol = pgm_read_word(&alphabet[index]); - display(symbol, row, col, key_color); + display(symbol, key_addr, key_color); } -void AlphaSquare::display(Key key, uint8_t row, uint8_t col) { - display(key, row, col, color); +void AlphaSquare::display(Key key, KeyAddr key_addr) { + display(key, key_addr, color); } -void AlphaSquare::display(uint16_t symbol, uint8_t row, uint8_t col, cRGB key_color) { +void AlphaSquare::display(uint16_t symbol, KeyAddr key_addr, cRGB key_color) { if (!Kaleidoscope.has_leds) return; @@ -90,20 +90,22 @@ void AlphaSquare::display(uint16_t symbol, uint8_t row, uint8_t col, cRGB key_co if (!pixel) continue; - ::LEDControl.setCrgbAt(row + r, col + c, key_color); + KeyAddr shifted_addr = key_addr.shifted(r, c); + + ::LEDControl.setCrgbAt(shifted_addr, key_color); } } ::LEDControl.syncLeds(); } -void AlphaSquare::display(uint16_t symbol, uint8_t row, uint8_t col) { - display(symbol, row, col, color); +void AlphaSquare::display(uint16_t symbol, KeyAddr key_addr) { + display(symbol, key_addr, color); } bool AlphaSquare::isSymbolPart(Key key, - uint8_t display_row, uint8_t display_col, - uint8_t row, uint8_t col) { + KeyAddr displayLedAddr, + KeyAddr key_addr) { if (!Kaleidoscope.has_leds) return false; @@ -113,12 +115,12 @@ bool AlphaSquare::isSymbolPart(Key key, uint8_t index = key.keyCode - Key_A.keyCode; uint16_t symbol = pgm_read_word(&alphabet[index]); - return isSymbolPart(symbol, display_row, display_col, row, col); + return isSymbolPart(symbol, displayLedAddr, key_addr); } bool AlphaSquare::isSymbolPart(uint16_t symbol, - uint8_t display_row, uint8_t display_col, - uint8_t row, uint8_t col) { + KeyAddr displayLedAddr, + KeyAddr key_addr) { if (!Kaleidoscope.has_leds) return false; @@ -126,8 +128,8 @@ bool AlphaSquare::isSymbolPart(uint16_t symbol, for (uint8_t c = 0; c < 4; c++) { uint8_t pixel = bitRead(symbol, r * 4 + c); - if (display_row + r == row && - display_col + c == col) + KeyAddr addr_shifted = displayLedAddr.shifted(r, c); + if (addr_shifted == key_addr) return !!pixel; } } diff --git a/src/kaleidoscope/plugin/LED-AlphaSquare.h b/src/kaleidoscope/plugin/LED-AlphaSquare.h index 2c8525af..5dd38d80 100644 --- a/src/kaleidoscope/plugin/LED-AlphaSquare.h +++ b/src/kaleidoscope/plugin/LED-AlphaSquare.h @@ -35,52 +35,81 @@ namespace kaleidoscope { namespace plugin { class AlphaSquare : public kaleidoscope::Plugin { public: + AlphaSquare(void) {} - static void display(Key key, uint8_t row, uint8_t col, cRGB key_color); - static void display(Key key, uint8_t row, uint8_t col); + static void display(Key key, KeyAddr key_addr, cRGB key_color); + DEPRECATED(ROW_COL_FUNC) static void display(Key key, uint8_t row, uint8_t col, cRGB key_color) { + display(key, KeyAddr(row, col), key_color); + } + static void display(Key key, KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) static void display(Key key, uint8_t row, uint8_t col) { + display(key, KeyAddr(row, col)); + } static void display(Key key) { - display(key, 0, 2); + display(key, KeyAddr(0, 2)); } static void display(Key key, uint8_t col) { - display(key, 0, col); + display(key, KeyAddr(0, col)); } - static void display(uint16_t symbol, uint8_t row, uint8_t col, cRGB key_color); - static void display(uint16_t symbol, uint8_t row, uint8_t col); + static void display(uint16_t symbol, KeyAddr key_addr, cRGB key_color); + DEPRECATED(ROW_COL_FUNC) static void display(uint16_t symbol, uint8_t row, uint8_t col, cRGB key_color) { + display(symbol, KeyAddr(row, col), key_color); + } + static void display(uint16_t symbol, KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) static void display(uint16_t symbol, uint8_t row, uint8_t col) { + display(symbol, KeyAddr(row, col)); + } static void display(uint16_t symbol) { - display(symbol, 0, 2); + display(symbol, KeyAddr(0, 2)); } static void display(uint16_t symbol, uint8_t col) { - display(symbol, 0, col); + display(symbol, KeyAddr(0, col)); } - static void clear(Key key, uint8_t row, uint8_t col) { - display(key, row, col, {0, 0, 0}); + static void clear(Key key, KeyAddr key_addr) { + display(key, key_addr, {0, 0, 0}); + } + DEPRECATED(ROW_COL_FUNC) static void clear(Key key, uint8_t row, uint8_t col) { + clear(key, KeyAddr(row, col)); } static void clear(Key key, uint8_t col) { - clear(key, 0, col); + clear(key, KeyAddr(0, col)); } static void clear(Key key) { - clear(key, 0, 2); + clear(key, KeyAddr(0, 2)); } - static void clear(uint16_t symbol, uint8_t row, uint8_t col) { - display(symbol, row, col, {0, 0, 0}); + static void clear(uint16_t symbol, KeyAddr key_addr) { + display(symbol, key_addr, {0, 0, 0}); + } + DEPRECATED(ROW_COL_FUNC) static void clear(uint16_t symbol, uint8_t row, uint8_t col) { + clear(symbol, KeyAddr(row, col)); } static void clear(uint16_t symbol, uint8_t col) { - clear(symbol, 0, col); + clear(symbol, KeyAddr(0, col)); } static void clear(uint16_t symbol) { - clear(symbol, 0, 2); + clear(symbol, KeyAddr(0, 2)); } static bool isSymbolPart(Key key, - uint8_t display_row, uint8_t display_col, - uint8_t row, uint8_t col); + KeyAddr displayLedAddr, + KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) static bool isSymbolPart(Key key, + uint8_t display_row, uint8_t display_col, + uint8_t row, uint8_t col) { + return isSymbolPart(key, KeyAddr(display_row, display_col), KeyAddr(row, col)); + } static bool isSymbolPart(uint16_t symbol, - uint8_t display_row, uint8_t display_col, - uint8_t row, uint8_t col); + KeyAddr displayLedAddr, + KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) static bool isSymbolPart(uint16_t symbol, + uint8_t display_row, uint8_t display_col, + uint8_t row, uint8_t col) { + return isSymbolPart(symbol, KeyAddr(display_row, display_col), KeyAddr(row, col)); + } static cRGB color; }; diff --git a/src/kaleidoscope/plugin/LED-AlphaSquare/Effect.cpp b/src/kaleidoscope/plugin/LED-AlphaSquare/Effect.cpp index e37d03cb..e17a9f99 100644 --- a/src/kaleidoscope/plugin/LED-AlphaSquare/Effect.cpp +++ b/src/kaleidoscope/plugin/LED-AlphaSquare/Effect.cpp @@ -43,12 +43,12 @@ void AlphaSquareEffect::TransientLEDMode::update(void) { } } -void AlphaSquareEffect::TransientLEDMode::refreshAt(byte row, byte col) { +void AlphaSquareEffect::TransientLEDMode::refreshAt(KeyAddr key_addr) { bool timed_out; uint8_t display_col = 2; Key key = last_key_left_; - if (col < COLS / 2) { + if (key_addr.col() < COLS / 2) { timed_out = Kaleidoscope.hasTimeExpired(start_time_left_, length); } else { key = last_key_right_; @@ -56,11 +56,11 @@ void AlphaSquareEffect::TransientLEDMode::refreshAt(byte row, byte col) { timed_out = Kaleidoscope.hasTimeExpired(start_time_right_, length); } - if (!::AlphaSquare.isSymbolPart(key, 0, display_col, row, col) || timed_out) - ::LEDControl.setCrgbAt(row, col, CRGB(0, 0, 0)); + if (!::AlphaSquare.isSymbolPart(key, KeyAddr(0, display_col), key_addr) || timed_out) + ::LEDControl.setCrgbAt(key_addr, CRGB(0, 0, 0)); } -EventHandlerResult AlphaSquareEffect::onKeyswitchEvent(Key &mappedKey, byte row, byte col, uint8_t keyState) { +EventHandlerResult AlphaSquareEffect::onKeyswitchEvent(Key &mappedKey, KeyAddr key_addr, uint8_t keyState) { if (!Kaleidoscope.has_leds) return EventHandlerResult::OK; @@ -81,7 +81,7 @@ EventHandlerResult AlphaSquareEffect::onKeyswitchEvent(Key &mappedKey, byte row, Key prev_key = this_led_mode->last_key_left_; - if (col < COLS / 2) { + if (key_addr.col() < COLS / 2) { this_led_mode->last_key_left_ = mappedKey; this_led_mode->start_time_left_ = Kaleidoscope.millisAtCycleStart(); } else { diff --git a/src/kaleidoscope/plugin/LED-AlphaSquare/Effect.h b/src/kaleidoscope/plugin/LED-AlphaSquare/Effect.h index 6bf228d0..a7a9788a 100644 --- a/src/kaleidoscope/plugin/LED-AlphaSquare/Effect.h +++ b/src/kaleidoscope/plugin/LED-AlphaSquare/Effect.h @@ -30,7 +30,7 @@ class AlphaSquareEffect : public Plugin, static uint16_t length; - EventHandlerResult onKeyswitchEvent(Key &mappedKey, byte row, byte col, uint8_t keyState); + EventHandlerResult onKeyswitchEvent(Key &mappedKey, KeyAddr key_addr, uint8_t keyState); // This class' instance has dynamic lifetime // @@ -40,7 +40,10 @@ class AlphaSquareEffect : public Plugin, protected: void update(void) final; - void refreshAt(byte row, byte col) final; + void refreshAt(KeyAddr key_addr) final; + DEPRECATED(ROW_COL_FUNC) void refreshAt(byte row, byte col) final { + refreshAt(KeyAddr(row, col)); + } private: uint16_t start_time_left_, start_time_right_; diff --git a/src/kaleidoscope/plugin/LED-Palette-Theme.cpp b/src/kaleidoscope/plugin/LED-Palette-Theme.cpp index 34c08d93..4611125f 100644 --- a/src/kaleidoscope/plugin/LED-Palette-Theme.cpp +++ b/src/kaleidoscope/plugin/LED-Palette-Theme.cpp @@ -37,21 +37,21 @@ void LEDPaletteTheme::updateHandler(uint16_t theme_base, uint8_t theme) { uint16_t map_base = theme_base + (theme * KeyboardHardware.numKeys() / 2); - for (uint16_t pos = 0; pos < KeyboardHardware.numKeys(); pos++) { + for (uint8_t pos = 0; pos < KeyboardHardware.numKeys(); pos++) { cRGB color = lookupColorAtPosition(map_base, pos); ::LEDControl.setCrgbAt(pos, color); } } -void LEDPaletteTheme::refreshAt(uint16_t theme_base, uint8_t theme, byte row, byte col) { +void LEDPaletteTheme::refreshAt(uint16_t theme_base, uint8_t theme, KeyAddr key_addr) { if (!Kaleidoscope.has_leds) return; uint16_t map_base = theme_base + (theme * KeyboardHardware.numKeys() / 2); - uint16_t pos = KeyboardHardware.getLedIndex(row, col); + uint8_t pos = KeyboardHardware.getLedIndex(key_addr); cRGB color = lookupColorAtPosition(map_base, pos); - ::LEDControl.setCrgbAt(pos, color); + ::LEDControl.setCrgbAt(KeyAddr(pos), color); } diff --git a/src/kaleidoscope/plugin/LED-Palette-Theme.h b/src/kaleidoscope/plugin/LED-Palette-Theme.h index fe8d382f..08c96d63 100644 --- a/src/kaleidoscope/plugin/LED-Palette-Theme.h +++ b/src/kaleidoscope/plugin/LED-Palette-Theme.h @@ -29,7 +29,10 @@ class LEDPaletteTheme : public kaleidoscope::Plugin { static uint16_t reserveThemes(uint8_t max_themes); static void updateHandler(uint16_t theme_base, uint8_t theme); - static void refreshAt(uint16_t theme_base, uint8_t theme, byte row, byte col); + static void refreshAt(uint16_t theme_base, uint8_t theme, KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) static void refreshAt(uint16_t theme_base, uint8_t theme, byte row, byte col) { + refreshAt(theme_base, theme, KeyAddr(row, col)); + } static const uint8_t lookupColorIndexAtPosition(uint16_t theme_base, uint16_t position); static const cRGB lookupColorAtPosition(uint16_t theme_base, uint16_t position); diff --git a/src/kaleidoscope/plugin/LED-Stalker.cpp b/src/kaleidoscope/plugin/LED-Stalker.cpp index c225d423..e2301d5e 100644 --- a/src/kaleidoscope/plugin/LED-Stalker.cpp +++ b/src/kaleidoscope/plugin/LED-Stalker.cpp @@ -33,18 +33,18 @@ StalkerEffect::TransientLEDMode::TransientLEDMode(const StalkerEffect *parent) map_{} {} -EventHandlerResult StalkerEffect::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t keyState) { +EventHandlerResult StalkerEffect::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t keyState) { if (!Kaleidoscope.has_leds) return EventHandlerResult::OK; - if (row >= ROWS || col >= COLS) + if (!key_addr.isValid()) return EventHandlerResult::OK; if (::LEDControl.get_mode_index() != led_mode_id_) return EventHandlerResult::OK; if (keyIsPressed(keyState)) { - ::LEDControl.get_mode()->map_[row][col] = 0xff; + ::LEDControl.get_mode()->map_[key_addr.toInt()] = 0xff; } return EventHandlerResult::OK; @@ -60,18 +60,16 @@ void StalkerEffect::TransientLEDMode::update(void) { if (!Kaleidoscope.hasTimeExpired(step_start_time_, parent_->step_length)) return; - for (byte r = 0; r < ROWS; r++) { - for (byte c = 0; c < COLS; c++) { - uint8_t step = map_[r][c]; - if (step) { - ::LEDControl.setCrgbAt(r, c, parent_->variant->compute(&step)); - } + for (auto key_addr : KeyAddr::all()) { + uint8_t step = map_[key_addr.toInt()]; + if (step) { + ::LEDControl.setCrgbAt(key_addr, parent_->variant->compute(&step)); + } - map_[r][c] = step; + map_[key_addr.toInt()] = step; - if (!map_[r][c]) - ::LEDControl.setCrgbAt(r, c, parent_->inactive_color); - } + if (!map_[key_addr.toInt()]) + ::LEDControl.setCrgbAt(key_addr, parent_->inactive_color); } step_start_time_ = Kaleidoscope.millisAtCycleStart(); diff --git a/src/kaleidoscope/plugin/LED-Stalker.h b/src/kaleidoscope/plugin/LED-Stalker.h index dc7ca1a3..47ad0263 100644 --- a/src/kaleidoscope/plugin/LED-Stalker.h +++ b/src/kaleidoscope/plugin/LED-Stalker.h @@ -39,7 +39,7 @@ class StalkerEffect : public Plugin, static uint16_t step_length; static cRGB inactive_color; - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t keyState); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t keyState); // This class' instance has dynamic lifetime // @@ -61,7 +61,7 @@ class StalkerEffect : public Plugin, const StalkerEffect *parent_; uint16_t step_start_time_; - uint8_t map_[ROWS][COLS]; + uint8_t map_[KeyboardHardware.numKeys()]; friend class StalkerEffect; }; diff --git a/src/kaleidoscope/plugin/LED-Wavepool.cpp b/src/kaleidoscope/plugin/LED-Wavepool.cpp index 099b175f..9112e513 100644 --- a/src/kaleidoscope/plugin/LED-Wavepool.cpp +++ b/src/kaleidoscope/plugin/LED-Wavepool.cpp @@ -45,21 +45,20 @@ WavepoolEffect::TransientLEDMode::TransientLEDMode(const WavepoolEffect *parent) page_(0) {} -EventHandlerResult WavepoolEffect::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) { - if (row >= ROWS || col >= COLS) +EventHandlerResult WavepoolEffect::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state) { + if (!key_addr.isValid()) return EventHandlerResult::OK; if (::LEDControl.get_mode_index() != led_mode_id_) return EventHandlerResult::OK; return ::LEDControl.get_mode() - ->onKeyswitchEvent(mapped_key, row, col, key_state); + ->onKeyswitchEvent(mapped_key, key_addr, key_state); } -EventHandlerResult WavepoolEffect::TransientLEDMode::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) { +EventHandlerResult WavepoolEffect::TransientLEDMode::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state) { if (keyIsPressed(key_state)) { - uint8_t offset = (row * COLS) + col; - surface_[page_][pgm_read_byte(rc2pos + offset)] = 0x7f; + surface_[page_][pgm_read_byte(rc2pos + key_addr.toInt())] = 0x7f; frames_since_event_ = 0; } @@ -191,32 +190,29 @@ void WavepoolEffect::TransientLEDMode::update(void) { #endif // draw the water on the keys - for (byte r = 0; r < ROWS; r++) { - for (byte c = 0; c < COLS; c++) { - uint8_t offset = (r * COLS) + c; - int8_t height = oldpg[pgm_read_byte(rc2pos + offset)]; + for (auto key_addr : KeyAddr::all()) { + int8_t height = oldpg[pgm_read_byte(rc2pos + key_addr.toInt())]; #ifdef INTERPOLATE - if (now & 1) { // odd frames only - // average height with other frame - height = ((int16_t)height + newpg[pgm_read_byte(rc2pos + offset)]) >> 1; - } + if (now & 1) { // odd frames only + // average height with other frame + height = ((int16_t)height + newpg[pgm_read_byte(rc2pos + key_addr.toInt())]) >> 1; + } #endif - uint8_t intensity = abs(height) * 2; - uint8_t saturation = 0xff - intensity; - uint8_t value = (intensity >= 128) ? 255 : intensity << 1; - int16_t hue = ripple_hue; + uint8_t intensity = abs(height) * 2; + uint8_t saturation = 0xff - intensity; + uint8_t value = (intensity >= 128) ? 255 : intensity << 1; + int16_t hue = ripple_hue; - if (ripple_hue == WavepoolEffect::rainbow_hue) { - // color starts white but gets dimmer and more saturated as it fades, - // with hue wobbling according to height map - hue = (current_hue + height + (height >> 1)) & 0xff; - } + if (ripple_hue == WavepoolEffect::rainbow_hue) { + // color starts white but gets dimmer and more saturated as it fades, + // with hue wobbling according to height map + hue = (current_hue + height + (height >> 1)) & 0xff; + } - cRGB color = hsvToRgb(hue, saturation, value); + cRGB color = hsvToRgb(hue, saturation, value); - ::LEDControl.setCrgbAt(r, c, color); - } + ::LEDControl.setCrgbAt(key_addr, color); } #ifdef INTERPOLATE diff --git a/src/kaleidoscope/plugin/LED-Wavepool.h b/src/kaleidoscope/plugin/LED-Wavepool.h index e5877171..c715e048 100644 --- a/src/kaleidoscope/plugin/LED-Wavepool.h +++ b/src/kaleidoscope/plugin/LED-Wavepool.h @@ -34,7 +34,7 @@ class WavepoolEffect : public Plugin, public: WavepoolEffect(void) {} - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); // ms before idle animation starts after last keypress static uint16_t idle_timeout; @@ -53,7 +53,7 @@ class WavepoolEffect : public Plugin, // TransientLEDMode(const WavepoolEffect *parent); - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); protected: diff --git a/src/kaleidoscope/plugin/LEDControl.cpp b/src/kaleidoscope/plugin/LEDControl.cpp index aac66d20..4cf49bf3 100644 --- a/src/kaleidoscope/plugin/LEDControl.cpp +++ b/src/kaleidoscope/plugin/LEDControl.cpp @@ -101,16 +101,19 @@ void LEDControl::set_all_leds_to(cRGB color) { } } -void LEDControl::setCrgbAt(int8_t i, cRGB crgb) { - KeyboardHardware.setCrgbAt(i, crgb); +void LEDControl::setCrgbAt(int8_t led_index, cRGB crgb) { + KeyboardHardware.setCrgbAt(led_index, crgb); } -void LEDControl::setCrgbAt(byte row, byte col, cRGB color) { - KeyboardHardware.setCrgbAt(row, col, color); +void LEDControl::setCrgbAt(KeyAddr key_addr, cRGB color) { + KeyboardHardware.setCrgbAt(key_addr, color); } -cRGB LEDControl::getCrgbAt(int8_t i) { - return KeyboardHardware.getCrgbAt(i); +cRGB LEDControl::getCrgbAt(int8_t led_index) { + return KeyboardHardware.getCrgbAt(led_index); +} +cRGB LEDControl::getCrgbAt(KeyAddr key_addr) { + return KeyboardHardware.getCrgbAt(KeyboardHardware.getLedIndex(key_addr)); } void LEDControl::syncLeds(void) { @@ -132,7 +135,7 @@ kaleidoscope::EventHandlerResult LEDControl::onSetup() { return EventHandlerResult::OK; } -kaleidoscope::EventHandlerResult LEDControl::onKeyswitchEvent(Key &mappedKey, byte row, byte col, uint8_t keyState) { +kaleidoscope::EventHandlerResult LEDControl::onKeyswitchEvent(Key &mappedKey, KeyAddr key_addr, uint8_t keyState) { if (mappedKey.flags != (SYNTHETIC | IS_INTERNAL | LED_TOGGLE)) return kaleidoscope::EventHandlerResult::OK; @@ -236,22 +239,24 @@ EventHandlerResult FocusLEDCommand::onFocusEvent(const char *command) { } case THEME: { if (::Focus.isEOL()) { - for (int8_t idx = 0; idx < LED_COUNT; idx++) { - cRGB c = ::LEDControl.getCrgbAt(idx); + for (auto key_addr : KeyAddr::all()) { + cRGB c = ::LEDControl.getCrgbAt(key_addr); ::Focus.send(c); } break; } - int8_t idx = 0; - while (idx < LED_COUNT && !::Focus.isEOL()) { + for (auto key_addr : KeyAddr::all()) { + if (::Focus.isEOL()) { + break; + } + cRGB color; ::Focus.read(color); - ::LEDControl.setCrgbAt(idx, color); - idx++; + ::LEDControl.setCrgbAt(key_addr, color); } break; } diff --git a/src/kaleidoscope/plugin/LEDControl.h b/src/kaleidoscope/plugin/LEDControl.h index 4b4e2eb6..8001bacf 100644 --- a/src/kaleidoscope/plugin/LEDControl.h +++ b/src/kaleidoscope/plugin/LEDControl.h @@ -46,11 +46,11 @@ class LEDControl : public kaleidoscope::Plugin { cur_led_mode_->update(); } - static void refreshAt(byte row, byte col) { + static void refreshAt(KeyAddr key_addr) { if (!Kaleidoscope.has_leds) return; - cur_led_mode_->refreshAt(row, col); + cur_led_mode_->refreshAt(key_addr); } static void set_mode(uint8_t mode_id); static uint8_t get_mode_index() { @@ -62,6 +62,10 @@ class LEDControl : public kaleidoscope::Plugin { template static LEDMode__ *get_mode() { return static_cast(cur_led_mode_); + + } + DEPRECATED(ROW_COL_FUNC) static void refreshAt(byte row, byte col) { + refreshAt(KeyAddr(row, col)); } static void refreshAll() { @@ -81,9 +85,16 @@ class LEDControl : public kaleidoscope::Plugin { return 0; } - static void setCrgbAt(int8_t i, cRGB crgb); - static void setCrgbAt(byte row, byte col, cRGB color); - static cRGB getCrgbAt(int8_t i); + static void setCrgbAt(int8_t led_index, cRGB crgb); + static void setCrgbAt(KeyAddr key_addr, cRGB color); + DEPRECATED(ROW_COL_FUNC) static void setCrgbAt(byte row, byte col, cRGB color) { + setCrgbAt(KeyAddr(row, col), color); + } + static cRGB getCrgbAt(int8_t led_index); + static cRGB getCrgbAt(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) static cRGB getCrgbAt(byte row, byte col) { + return getCrgbAt(KeyAddr(row, col)); + } static void syncLeds(void); static void set_all_leds_to(uint8_t r, uint8_t g, uint8_t b); @@ -99,7 +110,7 @@ class LEDControl : public kaleidoscope::Plugin { static bool paused; kaleidoscope::EventHandlerResult onSetup(); - kaleidoscope::EventHandlerResult onKeyswitchEvent(Key &mappedKey, byte row, byte col, uint8_t keyState); + kaleidoscope::EventHandlerResult onKeyswitchEvent(Key &mappedKey, KeyAddr key_addr, uint8_t keyState); kaleidoscope::EventHandlerResult beforeReportingState(); private: diff --git a/src/kaleidoscope/plugin/LEDControl/LED-Off.cpp b/src/kaleidoscope/plugin/LEDControl/LED-Off.cpp index 175ccab1..e6792160 100644 --- a/src/kaleidoscope/plugin/LEDControl/LED-Off.cpp +++ b/src/kaleidoscope/plugin/LEDControl/LED-Off.cpp @@ -22,8 +22,8 @@ void LEDOff::onActivate(void) { ::LEDControl.set_all_leds_to({0, 0, 0}); } -void LEDOff::refreshAt(byte row, byte col) { - ::LEDControl.setCrgbAt(row, col, {0, 0, 0}); +void LEDOff::refreshAt(KeyAddr key_addr) { + ::LEDControl.setCrgbAt(key_addr, {0, 0, 0}); } } } diff --git a/src/kaleidoscope/plugin/LEDControl/LED-Off.h b/src/kaleidoscope/plugin/LEDControl/LED-Off.h index a13bec5a..fae240bd 100644 --- a/src/kaleidoscope/plugin/LEDControl/LED-Off.h +++ b/src/kaleidoscope/plugin/LEDControl/LED-Off.h @@ -30,7 +30,10 @@ class LEDOff : public LEDMode { protected: void onActivate(void) final; - void refreshAt(byte row, byte col) final; + void refreshAt(KeyAddr key_addr) final; + DEPRECATED(ROW_COL_FUNC) void refreshAt(byte row, byte col) final { + refreshAt(KeyAddr(row, col)); + } }; } } diff --git a/src/kaleidoscope/plugin/LEDEffect-BootAnimation.cpp b/src/kaleidoscope/plugin/LEDEffect-BootAnimation.cpp index a44f4d9c..ac52d933 100644 --- a/src/kaleidoscope/plugin/LEDEffect-BootAnimation.cpp +++ b/src/kaleidoscope/plugin/LEDEffect-BootAnimation.cpp @@ -52,20 +52,17 @@ EventHandlerResult BootAnimationEffect::afterEachCycle() { return EventHandlerResult::OK; } - byte row = 255, col = 255; + KeyAddr key_addr_found; - for (uint8_t r = 0; r < ROWS; r++) { - for (uint8_t c = 0; c < COLS; c++) { - Key k = Layer.lookupOnActiveLayer(r, c); - Key g; - g.flags = 0; - g.keyCode = pgm_read_byte(&greeting_[current_index_]); + for (auto key_addr : KeyAddr::all()) { + Key k = Layer.lookupOnActiveLayer(key_addr); + Key g; + g.flags = 0; + g.keyCode = pgm_read_byte(&greeting_[current_index_]); - if (k.raw == g.raw) { - row = r; - col = c; - break; - } + if (k.raw == g.raw) { + key_addr_found = key_addr; + break; } } @@ -75,13 +72,13 @@ EventHandlerResult BootAnimationEffect::afterEachCycle() { done_ = true; start_time_ += timeout; - if (row != 255 && col != 255) - ::LEDControl.refreshAt(row, col); + if (key_addr_found.isValid()) + ::LEDControl.refreshAt(KeyAddr(key_addr_found)); return EventHandlerResult::OK; } - if (row != 255 && col != 255) { - ::LEDControl.setCrgbAt(row, col, color); + if (key_addr_found.isValid()) { + ::LEDControl.setCrgbAt(KeyAddr(key_addr_found), color); } return EventHandlerResult::OK; diff --git a/src/kaleidoscope/plugin/LEDEffect-BootGreeting.cpp b/src/kaleidoscope/plugin/LEDEffect-BootGreeting.cpp index a1e744c8..36f598d5 100644 --- a/src/kaleidoscope/plugin/LEDEffect-BootGreeting.cpp +++ b/src/kaleidoscope/plugin/LEDEffect-BootGreeting.cpp @@ -21,38 +21,31 @@ namespace kaleidoscope { namespace plugin { bool BootGreetingEffect::done_ = false; -byte BootGreetingEffect::row_; -byte BootGreetingEffect::col_; -byte BootGreetingEffect::key_row = 255; -byte BootGreetingEffect::key_col = 255; +KeyAddr BootGreetingEffect::key_addr_; +KeyAddr BootGreetingEffect::user_key_addr; Key BootGreetingEffect::search_key = Key_LEDEffectNext; uint8_t BootGreetingEffect::hue = 170; uint16_t BootGreetingEffect::start_time = 0; uint16_t BootGreetingEffect::timeout = 9200; -BootGreetingEffect::BootGreetingEffect(byte pos_row, byte pos_col) { - key_row = pos_row; - key_col = pos_col; +BootGreetingEffect::BootGreetingEffect(KeyAddr key_addr) { + user_key_addr = key_addr; } void BootGreetingEffect::findLed(void) { - if (key_col != 255 && key_row != 255) { - row_ = key_row; - col_ = key_col; + if (user_key_addr.isValid()) { + key_addr_ = user_key_addr; done_ = true; return; } // Find the LED key. - for (uint8_t r = 0; r < ROWS; r++) { - for (uint8_t c = 0; c < COLS; c++) { - Key k = Layer.lookupOnActiveLayer(r, c); - - if (k.raw == search_key.raw) { - row_ = r; - col_ = c; - return; - } + for (auto key_addr : KeyAddr::all()) { + Key k = Layer.lookupOnActiveLayer(key_addr); + + if (k.raw == search_key.raw) { + key_addr_ = key_addr; + return; } } @@ -77,12 +70,12 @@ EventHandlerResult BootGreetingEffect::afterEachCycle() { //Only run for 'timeout' milliseconds if (Kaleidoscope.hasTimeExpired(start_time, timeout)) { done_ = true; - ::LEDControl.refreshAt(row_, col_); + ::LEDControl.refreshAt(key_addr_); return EventHandlerResult::OK; } cRGB color = breath_compute(hue); - ::LEDControl.setCrgbAt(row_, col_, color); + ::LEDControl.setCrgbAt(key_addr_, color); return EventHandlerResult::OK; } diff --git a/src/kaleidoscope/plugin/LEDEffect-BootGreeting.h b/src/kaleidoscope/plugin/LEDEffect-BootGreeting.h index 7dcbbf86..562a941c 100644 --- a/src/kaleidoscope/plugin/LEDEffect-BootGreeting.h +++ b/src/kaleidoscope/plugin/LEDEffect-BootGreeting.h @@ -24,10 +24,11 @@ namespace plugin { class BootGreetingEffect : public kaleidoscope::Plugin { public: BootGreetingEffect(void) {} - BootGreetingEffect(byte, byte); + BootGreetingEffect(KeyAddr key_addr); + DEPRECATED(ROW_COL_FUNC) BootGreetingEffect(byte row, byte col) + : BootGreetingEffect(KeyAddr(row, col)) {} - static byte key_row; - static byte key_col; + static KeyAddr user_key_addr; static Key search_key; static uint8_t hue; static uint16_t timeout; @@ -38,8 +39,7 @@ class BootGreetingEffect : public kaleidoscope::Plugin { private: static void findLed(void); static bool done_; - static byte row_; - static byte col_; + static KeyAddr key_addr_; static uint16_t start_time; }; } diff --git a/src/kaleidoscope/plugin/LEDEffect-Chase.h b/src/kaleidoscope/plugin/LEDEffect-Chase.h index 2a027b2d..31a93764 100644 --- a/src/kaleidoscope/plugin/LEDEffect-Chase.h +++ b/src/kaleidoscope/plugin/LEDEffect-Chase.h @@ -58,7 +58,7 @@ class LEDChaseEffect : public Plugin, const LEDChaseEffect *parent_; - int8_t pos_ = 0; + int8_t pos_ = uint8_t(0); int8_t direction_ = 1; uint16_t last_update_; }; diff --git a/src/kaleidoscope/plugin/LEDEffect-Rainbow.cpp b/src/kaleidoscope/plugin/LEDEffect-Rainbow.cpp index cacf6caf..598bf8fb 100644 --- a/src/kaleidoscope/plugin/LEDEffect-Rainbow.cpp +++ b/src/kaleidoscope/plugin/LEDEffect-Rainbow.cpp @@ -61,13 +61,13 @@ void LEDRainbowWaveEffect::TransientLEDMode::update(void) { rainbow_last_update += parent_->rainbow_update_delay; } - for (int8_t i = 0; i < LED_COUNT; i++) { - uint16_t key_hue = rainbow_hue + 16 * (i / 4); + for (auto key_addr : KeyAddr::all()) { + uint16_t key_hue = rainbow_hue + 16 * (key_addr.toInt() / 4); if (key_hue >= 255) { key_hue -= 255; } cRGB rainbow = hsvToRgb(key_hue, rainbow_saturation, parent_->rainbow_value); - ::LEDControl.setCrgbAt(i, rainbow); + ::LEDControl.setCrgbAt(key_addr.toInt(), rainbow); } rainbow_hue += rainbow_wave_steps; if (rainbow_hue >= 255) { diff --git a/src/kaleidoscope/plugin/LEDEffect-SolidColor.cpp b/src/kaleidoscope/plugin/LEDEffect-SolidColor.cpp index ad929256..1a089792 100644 --- a/src/kaleidoscope/plugin/LEDEffect-SolidColor.cpp +++ b/src/kaleidoscope/plugin/LEDEffect-SolidColor.cpp @@ -25,8 +25,8 @@ void LEDSolidColor::TransientLEDMode::onActivate(void) { parent_->b_); } -void LEDSolidColor::TransientLEDMode::refreshAt(byte row, byte col) { - ::LEDControl.setCrgbAt(row, col, +void LEDSolidColor::TransientLEDMode::refreshAt(KeyAddr key_addr) { + ::LEDControl.setCrgbAt(key_addr, CRGB(parent_->r_, parent_->g_, parent_->b_)); diff --git a/src/kaleidoscope/plugin/LEDEffect-SolidColor.h b/src/kaleidoscope/plugin/LEDEffect-SolidColor.h index d66971f9..0cfaf374 100644 --- a/src/kaleidoscope/plugin/LEDEffect-SolidColor.h +++ b/src/kaleidoscope/plugin/LEDEffect-SolidColor.h @@ -42,7 +42,10 @@ class LEDSolidColor : public Plugin, protected: virtual void onActivate(void) final; - virtual void refreshAt(byte row, byte col) final; + virtual void refreshAt(KeyAddr key_addr) final; + DEPRECATED(ROW_COL_FUNC) virtual void refreshAt(byte row, byte col) final { + refreshAt(KeyAddr(row, col)); + } private: diff --git a/src/kaleidoscope/plugin/LEDMode.h b/src/kaleidoscope/plugin/LEDMode.h index 2f63e690..6a412fb4 100644 --- a/src/kaleidoscope/plugin/LEDMode.h +++ b/src/kaleidoscope/plugin/LEDMode.h @@ -81,6 +81,17 @@ class LEDMode : public kaleidoscope::Plugin, */ virtual void update(void) {} + /** Refresh the color of a given key. + * + * If we have another plugin that overrides colors set by the active LED mode + * (either at @onActivate time, or via @ref update), if that plugin wants to + * restore whatever color the mode would set the key color to, this is the + * method it will call. + * + * @param key_addr is the matrix coordinate of the key to refresh the color of. + */ + virtual void refreshAt(KeyAddr key_addr) {} + /** Refresh the color of a given key. * * If we have another plugin that overrides colors set by the active LED mode @@ -91,7 +102,9 @@ class LEDMode : public kaleidoscope::Plugin, * @param row is the row coordinate of the key to refresh the color of. * @param col is the column coordinate of the key to refresh the color of. */ - virtual void refreshAt(byte row, byte col) {} + DEPRECATED(ROW_COL_FUNC) virtual void refreshAt(byte row, byte col) { + refreshAt(KeyAddr(row, col)); + } public: diff --git a/src/kaleidoscope/plugin/Leader.cpp b/src/kaleidoscope/plugin/Leader.cpp index 8c1d9069..4aefd15f 100644 --- a/src/kaleidoscope/plugin/Leader.cpp +++ b/src/kaleidoscope/plugin/Leader.cpp @@ -77,11 +77,11 @@ void Leader::reset(void) { } void Leader::inject(Key key, uint8_t key_state) { - onKeyswitchEvent(key, UNKNOWN_KEYSWITCH_LOCATION, key_state); + onKeyswitchEvent(key, UnknownKeyswitchLocation, key_state); } // --- hooks --- -EventHandlerResult Leader::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t keyState) { +EventHandlerResult Leader::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t keyState) { if (keyState & INJECTED) return EventHandlerResult::OK; diff --git a/src/kaleidoscope/plugin/Leader.h b/src/kaleidoscope/plugin/Leader.h index d52db1bd..2fe289a6 100644 --- a/src/kaleidoscope/plugin/Leader.h +++ b/src/kaleidoscope/plugin/Leader.h @@ -46,7 +46,7 @@ class Leader : public kaleidoscope::Plugin { void inject(Key key, uint8_t key_state); - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t keyState); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t keyState); EventHandlerResult afterEachCycle(); private: diff --git a/src/kaleidoscope/plugin/Macros.cpp b/src/kaleidoscope/plugin/Macros.cpp index 52b398cc..70040b5d 100644 --- a/src/kaleidoscope/plugin/Macros.cpp +++ b/src/kaleidoscope/plugin/Macros.cpp @@ -27,10 +27,10 @@ namespace plugin { MacroKeyEvent Macros_::active_macros[]; byte Macros_::active_macro_count; -byte Macros_::row, Macros_::col; +KeyAddr Macros_::key_addr; void playMacroKeyswitchEvent(Key key, uint8_t keyswitch_state, bool explicit_report) { - handleKeyswitchEvent(key, UNKNOWN_KEYSWITCH_LOCATION, keyswitch_state | INJECTED); + handleKeyswitchEvent(key, UnknownKeyswitchLocation, keyswitch_state | INJECTED); if (explicit_report) return; @@ -219,12 +219,11 @@ const macro_t *Macros_::type(const char *string) { return MACRO_NONE; } -EventHandlerResult Macros_::onKeyswitchEvent(Key &mappedKey, byte row, byte col, uint8_t keyState) { +EventHandlerResult Macros_::onKeyswitchEvent(Key &mappedKey, KeyAddr key_addr, uint8_t keyState) { if (mappedKey.flags != (SYNTHETIC | IS_MACRO)) return EventHandlerResult::OK; - byte key_id = (row * COLS) + col; - addActiveMacroKey(mappedKey.keyCode, key_id, keyState); + addActiveMacroKey(mappedKey.keyCode, key_addr.toInt(), keyState); return EventHandlerResult::EVENT_CONSUMED; } @@ -238,12 +237,9 @@ EventHandlerResult Macros_::afterEachCycle() { EventHandlerResult Macros_::beforeReportingState() { for (byte i = 0; i < active_macro_count; ++i) { if (active_macros[i].key_id == 0xFF) { - // i.e. UNKNOWN_KEYSWITCH_LOCATION - row = 0xFF; - col = 0xFF; + key_addr = UnknownKeyswitchLocation; } else { - row = active_macros[i].key_id / COLS; - col = active_macros[i].key_id % COLS; + key_addr = KeyAddr(active_macros[i].key_id); } const macro_t *m = macroAction(active_macros[i].key_code, active_macros[i].key_state); diff --git a/src/kaleidoscope/plugin/Macros.h b/src/kaleidoscope/plugin/Macros.h index e0dc9e13..2d398dd9 100644 --- a/src/kaleidoscope/plugin/Macros.h +++ b/src/kaleidoscope/plugin/Macros.h @@ -53,7 +53,7 @@ class Macros_ : public kaleidoscope::Plugin { ++active_macro_count; } - EventHandlerResult onKeyswitchEvent(Key &mappedKey, byte row, byte col, uint8_t keyState); + EventHandlerResult onKeyswitchEvent(Key &mappedKey, KeyAddr key_addr, uint8_t keyState); EventHandlerResult beforeReportingState(); EventHandlerResult afterEachCycle(); @@ -74,7 +74,7 @@ class Macros_ : public kaleidoscope::Plugin { return type(strings...); } - static byte row, col; + static KeyAddr key_addr; private: Key lookupAsciiCode(uint8_t ascii_code); diff --git a/src/kaleidoscope/plugin/Model01-TestMode.cpp b/src/kaleidoscope/plugin/Model01-TestMode.cpp index 5789a314..af858c9e 100644 --- a/src/kaleidoscope/plugin/Model01-TestMode.cpp +++ b/src/kaleidoscope/plugin/Model01-TestMode.cpp @@ -92,13 +92,13 @@ void TestMode::test_leds(void) { -void TestMode::handleKeyEvent(side_data_t *side, keydata_t *oldState, keydata_t *newState, uint8_t row, uint8_t col, uint8_t col_offset) { +void TestMode::handleKeyEvent(side_data_t *side, keydata_t *oldState, keydata_t *newState, KeyAddr key_addr, uint8_t col_offset) { constexpr cRGB red = CRGB(201, 0, 0); constexpr cRGB blue = CRGB(0, 0, 201); constexpr cRGB green = CRGB(0, 201, 0); - const uint8_t keynum = (row * 8) + (col); + auto keynum = key_addr.toInt(); const uint8_t keyState = ((bitRead(oldState->all, keynum) << 1) | (bitRead(newState->all, keynum) << 0)); @@ -111,17 +111,17 @@ void TestMode::handleKeyEvent(side_data_t *side, keydata_t *oldState, keydata_t side->cyclesSinceStateChange[keynum]++; } - + auto key_addr_col_shifted = KeyAddr(key_addr.row(), col_offset - key_addr.col()); // If the key is held down if (keyState == HELD) { - KeyboardHardware.setCrgbAt(row, col_offset - col, green); - } else if (bitRead(side->badKeys, keynum) == 1) { + KeyboardHardware.setCrgbAt(key_addr_col_shifted, green); + } else if (bitRead(side->badKeys, key_addr_col_shifted.toInt()) == 1) { // If we triggered chatter detection ever on this key - KeyboardHardware.setCrgbAt(row, col_offset - col, red); + KeyboardHardware.setCrgbAt(key_addr_col_shifted, red); } else if (keyState == TOGGLED_OFF) { // If the key was just released - KeyboardHardware.setCrgbAt(row, col_offset - col, blue); + KeyboardHardware.setCrgbAt(key_addr_col_shifted, blue); } } @@ -143,11 +143,9 @@ void TestMode::testMatrix() { KeyboardHardware.pressedKeyswitchCount() == 3) { break; } - for (byte row = 0; row < 4; row++) { - for (byte col = 0; col < 8; col++) { - handleKeyEvent(&left, &(KeyboardHardware.previousLeftHandState), &(KeyboardHardware.leftHandState), row, col, 7); - handleKeyEvent(&right, &(KeyboardHardware.previousRightHandState), &(KeyboardHardware.rightHandState), row, col, 15); - } + for (auto key_addr : KeyAddr::all()) { + handleKeyEvent(&left, &(KeyboardHardware.previousLeftHandState), &(KeyboardHardware.leftHandState), key_addr, 7); + handleKeyEvent(&right, &(KeyboardHardware.previousRightHandState), &(KeyboardHardware.rightHandState), key_addr, 15); } ::LEDControl.syncLeds(); } diff --git a/src/kaleidoscope/plugin/Model01-TestMode.h b/src/kaleidoscope/plugin/Model01-TestMode.h index 4fc7ba51..5bf59825 100644 --- a/src/kaleidoscope/plugin/Model01-TestMode.h +++ b/src/kaleidoscope/plugin/Model01-TestMode.h @@ -41,7 +41,7 @@ class TestMode : public kaleidoscope::Plugin { static void test_leds(); static void testMatrix(); static void toggle_programming_leds_on(); - static void handleKeyEvent(side_data_t *side, keydata_t *oldState, keydata_t *newState, uint8_t row, uint8_t col, uint8_t col_offset); + static void handleKeyEvent(side_data_t *side, keydata_t *oldState, keydata_t *newState, KeyAddr key_addr, uint8_t col_offset); static void waitForKeypress(); static void set_leds(cRGB color); }; diff --git a/src/kaleidoscope/plugin/MouseKeys.cpp b/src/kaleidoscope/plugin/MouseKeys.cpp index b6b4e13a..24e79879 100644 --- a/src/kaleidoscope/plugin/MouseKeys.cpp +++ b/src/kaleidoscope/plugin/MouseKeys.cpp @@ -104,7 +104,7 @@ EventHandlerResult MouseKeys_::beforeReportingState() { return EventHandlerResult::OK; } -EventHandlerResult MouseKeys_::onKeyswitchEvent(Key &mappedKey, byte row, byte col, uint8_t keyState) { +EventHandlerResult MouseKeys_::onKeyswitchEvent(Key &mappedKey, KeyAddr key_addr, uint8_t keyState) { if (mappedKey.flags != (SYNTHETIC | IS_MOUSE_KEY)) return EventHandlerResult::OK; diff --git a/src/kaleidoscope/plugin/MouseKeys.h b/src/kaleidoscope/plugin/MouseKeys.h index 7a723db3..c6cbfc0b 100644 --- a/src/kaleidoscope/plugin/MouseKeys.h +++ b/src/kaleidoscope/plugin/MouseKeys.h @@ -40,7 +40,7 @@ class MouseKeys_ : public kaleidoscope::Plugin { EventHandlerResult onSetup(); EventHandlerResult beforeReportingState(); EventHandlerResult afterEachCycle(); - EventHandlerResult onKeyswitchEvent(Key &mappedKey, byte row, byte col, uint8_t keyState); + EventHandlerResult onKeyswitchEvent(Key &mappedKey, KeyAddr key_addr, uint8_t keyState); private: static uint8_t mouseMoveIntent; diff --git a/src/kaleidoscope/plugin/NumPad.cpp b/src/kaleidoscope/plugin/NumPad.cpp index 61900bdb..105576ab 100644 --- a/src/kaleidoscope/plugin/NumPad.cpp +++ b/src/kaleidoscope/plugin/NumPad.cpp @@ -25,7 +25,7 @@ cRGB NumPad::color = CRGB(160, 0, 0); uint8_t NumPad::lock_hue = 170; // private: -byte NumPad::numpadLayerToggleKeyRow = 255, NumPad::numpadLayerToggleKeyCol = 255; +KeyAddr NumPad::numpadLayerToggleKeyAddr; bool NumPad::numpadActive = false; EventHandlerResult NumPad::onSetup(void) { @@ -35,27 +35,24 @@ EventHandlerResult NumPad::onSetup(void) { void NumPad::setKeyboardLEDColors(void) { ::LEDControl.set_mode(::LEDControl.get_mode_index()); - for (uint8_t r = 0; r < ROWS; r++) { - for (uint8_t c = 0; c < COLS; c++) { - Key k = Layer.lookupOnActiveLayer(r, c); - Key layer_key = Layer.getKey(numPadLayer, r, c); + for (auto key_addr : KeyAddr::all()) { + Key k = Layer.lookupOnActiveLayer(key_addr); + Key layer_key = Layer.getKey(numPadLayer, key_addr); - if (k == LockLayer(numPadLayer)) { - numpadLayerToggleKeyRow = r; - numpadLayerToggleKeyCol = c; - } + if (k == LockLayer(numPadLayer)) { + numpadLayerToggleKeyAddr = key_addr; + } - if ((k != layer_key) || (k == Key_NoKey) || (k.flags != KEY_FLAGS)) { - ::LEDControl.refreshAt(r, c); - } else { - ::LEDControl.setCrgbAt(r, c, color); - } + if ((k != layer_key) || (k == Key_NoKey) || (k.flags != KEY_FLAGS)) { + ::LEDControl.refreshAt(KeyAddr(key_addr)); + } else { + ::LEDControl.setCrgbAt(KeyAddr(key_addr), color); } } - if ((numpadLayerToggleKeyRow <= ROWS) && (numpadLayerToggleKeyCol <= COLS)) { + if (numpadLayerToggleKeyAddr.isValid()) { cRGB lock_color = breath_compute(lock_hue); - ::LEDControl.setCrgbAt(numpadLayerToggleKeyRow, numpadLayerToggleKeyCol, lock_color); + ::LEDControl.setCrgbAt(KeyAddr(numpadLayerToggleKeyAddr), lock_color); } } diff --git a/src/kaleidoscope/plugin/NumPad.h b/src/kaleidoscope/plugin/NumPad.h index 0a5b8643..2f276419 100644 --- a/src/kaleidoscope/plugin/NumPad.h +++ b/src/kaleidoscope/plugin/NumPad.h @@ -36,8 +36,7 @@ class NumPad : public kaleidoscope::Plugin { void setKeyboardLEDColors(void); - static uint8_t numpadLayerToggleKeyRow; - static uint8_t numpadLayerToggleKeyCol; + static KeyAddr numpadLayerToggleKeyAddr; static bool numpadActive; }; } diff --git a/src/kaleidoscope/plugin/OneShot.cpp b/src/kaleidoscope/plugin/OneShot.cpp index 7c4c05e4..6b05765c 100644 --- a/src/kaleidoscope/plugin/OneShot.cpp +++ b/src/kaleidoscope/plugin/OneShot.cpp @@ -54,7 +54,6 @@ bool OneShot::isStickable(Key key) { // ---- OneShot stuff ---- void OneShot::injectNormalKey(uint8_t idx, uint8_t key_state) { Key key; - byte row, col; if (idx < 8) { key.flags = Key_LeftControl.flags; @@ -64,7 +63,7 @@ void OneShot::injectNormalKey(uint8_t idx, uint8_t key_state) { key.keyCode = LAYER_SHIFT_OFFSET + idx - 8; } - handleKeyswitchEvent(key, UNKNOWN_KEYSWITCH_LOCATION, key_state | INJECTED); + handleKeyswitchEvent(key, UnknownKeyswitchLocation, key_state | INJECTED); } void OneShot::activateOneShot(uint8_t idx) { @@ -76,7 +75,7 @@ void OneShot::cancelOneShot(uint8_t idx) { injectNormalKey(idx, WAS_PRESSED); } -EventHandlerResult OneShot::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t keyState) { +EventHandlerResult OneShot::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t keyState) { uint8_t idx = mapped_key.raw - ranges::OS_FIRST; if (keyState & INJECTED) @@ -91,7 +90,7 @@ EventHandlerResult OneShot::onKeyswitchEvent(Key &mapped_key, byte row, byte col state_[idx].pressed = false; } else if (keyToggledOn(keyState)) { start_time_ = Kaleidoscope.millisAtCycleStart(); - state_[idx].position = row * COLS + col; + state_[idx].position = key_addr.toInt(); state_[idx].pressed = true; state_[idx].active = true; prev_key_ = mapped_key; @@ -131,7 +130,7 @@ EventHandlerResult OneShot::onKeyswitchEvent(Key &mapped_key, byte row, byte col } else { start_time_ = Kaleidoscope.millisAtCycleStart(); - state_[idx].position = row * COLS + col; + state_[idx].position = key_addr.toInt(); state_[idx].active = true; prev_key_ = mapped_key; @@ -204,7 +203,7 @@ EventHandlerResult OneShot::afterEachCycle() { } void OneShot::inject(Key mapped_key, uint8_t key_state) { - onKeyswitchEvent(mapped_key, UNKNOWN_KEYSWITCH_LOCATION, key_state); + onKeyswitchEvent(mapped_key, UnknownKeyswitchLocation, key_state); } // --- glue code --- diff --git a/src/kaleidoscope/plugin/OneShot.h b/src/kaleidoscope/plugin/OneShot.h index 1ffeb0c7..3142eb29 100644 --- a/src/kaleidoscope/plugin/OneShot.h +++ b/src/kaleidoscope/plugin/OneShot.h @@ -74,7 +74,7 @@ class OneShot : public kaleidoscope::Plugin { EventHandlerResult beforeReportingState(); EventHandlerResult afterEachCycle(); - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t keyState); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t keyState); void inject(Key mapped_key, uint8_t key_state); diff --git a/src/kaleidoscope/plugin/Qukeys.cpp b/src/kaleidoscope/plugin/Qukeys.cpp index 43469f7d..34694d1d 100644 --- a/src/kaleidoscope/plugin/Qukeys.cpp +++ b/src/kaleidoscope/plugin/Qukeys.cpp @@ -40,10 +40,9 @@ bool isDualUse(Key k) { } inline -bool isDualUse(byte key_addr) { - byte row = addr::row(key_addr); - byte col = addr::col(key_addr); - Key k = Layer.lookup(row, col); +bool isDualUse(byte key_addr_offset) { + KeyAddr key_addr(key_addr_offset); + Key k = Layer.lookup(key_addr); return isDualUse(k); } @@ -74,9 +73,9 @@ Key getDualUseAlternateKey(Key k) { } -Qukey::Qukey(int8_t layer, byte row, byte col, Key alt_keycode) { +Qukey::Qukey(int8_t layer, KeyAddr key_addr, Key alt_keycode) { this->layer = layer; - this->addr = addr::addr(row, col); + this->addr = key_addr.toInt(); this->alt_keycode = alt_keycode; } @@ -97,16 +96,15 @@ constexpr uint16_t QUKEYS_RELEASE_DELAY_OFFSET = 4096; // Empty constructor; nothing is stored at the instance level Qukeys::Qukeys(void) {} -int8_t Qukeys::lookupQukey(uint8_t key_addr) { - if (key_addr == QUKEY_UNKNOWN_ADDR) { +int8_t Qukeys::lookupQukey(uint8_t key_addr_offset) { + if (key_addr_offset == QUKEY_UNKNOWN_ADDR) { return QUKEY_NOT_FOUND; } for (int8_t i = 0; i < qukeys_count; i++) { - if (qukeys[i].addr == key_addr) { - byte row = addr::row(key_addr); - byte col = addr::col(key_addr); + if (qukeys[i].addr == key_addr_offset) { + KeyAddr key_addr(key_addr_offset); if ((qukeys[i].layer == QUKEY_ALL_LAYERS) || - (qukeys[i].layer == Layer.lookupActiveLayer(row, col))) { + (qukeys[i].layer == Layer.lookupActiveLayer(key_addr))) { return i; } } @@ -138,9 +136,8 @@ int8_t Qukeys::searchQueue(uint8_t key_addr) { bool Qukeys::flushKey(bool qukey_state, uint8_t keyswitch_state) { int8_t qukey_index = lookupQukey(key_queue_[0].addr); bool is_qukey = (qukey_index != QUKEY_NOT_FOUND); - byte row = addr::row(key_queue_[0].addr); - byte col = addr::col(key_queue_[0].addr); - Key keycode = Layer.lookupOnActiveLayer(row, col); + KeyAddr key_addr(key_queue_[0].addr); + Key keycode = Layer.lookupOnActiveLayer(key_addr); bool is_dual_use = isDualUse(keycode); if (is_qukey || is_dual_use) { if (qukey_state == QUKEY_STATE_PRIMARY) { @@ -184,7 +181,7 @@ bool Qukeys::flushKey(bool qukey_state, uint8_t keyswitch_state) { // we can ignore it and don't start an infinite loop. It would be // nice if we could use key_state to also indicate which plugin // injected the key. - handleKeyswitchEvent(keycode, row, col, IS_PRESSED); + handleKeyswitchEvent(keycode, key_addr, IS_PRESSED); // Now we send the report (if there were any changes) hid::sendKeyboardReport(); @@ -193,10 +190,10 @@ bool Qukeys::flushKey(bool qukey_state, uint8_t keyswitch_state) { // Last, if the key is still down, add its code back in if (keyswitch_state & IS_PRESSED) { - handleKeyswitchEvent(keycode, row, col, IS_PRESSED | WAS_PRESSED); + handleKeyswitchEvent(keycode, key_addr, IS_PRESSED | WAS_PRESSED); } else { // If this is the key that was released, send that release event now - handleKeyswitchEvent(Key_NoKey, row, col, WAS_PRESSED); + handleKeyswitchEvent(Key_NoKey, key_addr, WAS_PRESSED); // ...and if there's another key in the queue that's about to also be // flushed, we need to do something to clear this one's modifier flags (if // any) from the previous report @@ -256,10 +253,10 @@ bool Qukeys::isQukey(uint8_t addr) { return (isDualUse(addr) || lookupQukey(addr) != QUKEY_NOT_FOUND); } -EventHandlerResult Qukeys::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) { +EventHandlerResult Qukeys::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state) { // If key_addr is not a physical key, ignore it; some other plugin injected it - if (row >= ROWS || col >= COLS || (key_state & INJECTED) != 0) + if (!key_addr.isValid() || (key_state & INJECTED) != 0) return EventHandlerResult::OK; // If Qukeys is turned off, continue to next plugin @@ -269,8 +266,7 @@ EventHandlerResult Qukeys::onKeyswitchEvent(Key &mapped_key, byte row, byte col, } // get key addr & qukey (if any) - uint8_t key_addr = addr::addr(row, col); - int8_t qukey_index = lookupQukey(key_addr); + int8_t qukey_index = lookupQukey(key_addr.toInt()); // If the key was injected (from the queue being flushed) if (flushing_queue_) { @@ -287,13 +283,13 @@ EventHandlerResult Qukeys::onKeyswitchEvent(Key &mapped_key, byte row, byte col, } // Otherwise, queue the key and stop processing: - enqueue(key_addr); + enqueue(key_addr.toInt()); // flushQueue() has already handled this key release return EventHandlerResult::EVENT_CONSUMED; } // In all other cases, we need to know if the key is queued already - int8_t queue_index = searchQueue(key_addr); + int8_t queue_index = searchQueue(key_addr.toInt()); // If the key was just released: if (keyToggledOff(key_state)) { @@ -305,12 +301,10 @@ EventHandlerResult Qukeys::onKeyswitchEvent(Key &mapped_key, byte row, byte col, // order to send a toggle off of a `ShiftToLayer()` key; otherwise, that layer gets // stuck on if there's a release delay and a rollover. if (delayed_qukey_addr_ != QUKEY_UNKNOWN_ADDR) { - int8_t r = addr::row(delayed_qukey_addr_); - int8_t c = addr::col(delayed_qukey_addr_); flushQueue(queue_index); flushQueue(); flushing_queue_ = true; - handleKeyswitchEvent(Key_NoKey, r, c, WAS_PRESSED); + handleKeyswitchEvent(Key_NoKey, KeyAddr(delayed_qukey_addr_), WAS_PRESSED); flushing_queue_ = false; delayed_qukey_addr_ = QUKEY_UNKNOWN_ADDR; } else { diff --git a/src/kaleidoscope/plugin/Qukeys.h b/src/kaleidoscope/plugin/Qukeys.h index e60e6b52..1485551f 100644 --- a/src/kaleidoscope/plugin/Qukeys.h +++ b/src/kaleidoscope/plugin/Qukeys.h @@ -19,7 +19,6 @@ #pragma once #include -#include #include // Maximum length of the pending queue @@ -59,7 +58,9 @@ namespace plugin { struct Qukey { public: Qukey(void) {} - Qukey(int8_t layer, byte row, byte col, Key alt_keycode); + Qukey(int8_t layer, KeyAddr key_addr, Key alt_keycode); + DEPRECATED(ROW_COL_FUNC) Qukey(int8_t layer, byte row, byte col, Key alt_keycode) + : Qukey(layer, KeyAddr(row, col), alt_keycode) {} int8_t layer; uint8_t addr; @@ -102,7 +103,7 @@ class Qukeys : public kaleidoscope::Plugin { static uint8_t qukeys_count; EventHandlerResult onSetup(); - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); EventHandlerResult beforeReportingState(); private: diff --git a/src/kaleidoscope/plugin/Redial.cpp b/src/kaleidoscope/plugin/Redial.cpp index eecd340d..20c951cb 100644 --- a/src/kaleidoscope/plugin/Redial.cpp +++ b/src/kaleidoscope/plugin/Redial.cpp @@ -24,7 +24,7 @@ Key Redial::key_to_redial_; Key Redial::last_key_; bool Redial::redial_held_ = false; -EventHandlerResult Redial::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) { +EventHandlerResult Redial::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state) { if (mapped_key == Key_Redial) { if (keyToggledOff(key_state)) key_to_redial_ = last_key_; diff --git a/src/kaleidoscope/plugin/Redial.h b/src/kaleidoscope/plugin/Redial.h index 57aff116..09c9d567 100644 --- a/src/kaleidoscope/plugin/Redial.h +++ b/src/kaleidoscope/plugin/Redial.h @@ -31,7 +31,7 @@ class Redial : public kaleidoscope::Plugin { static bool shouldRemember(Key mappedKey); - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); private: static Key key_to_redial_; diff --git a/src/kaleidoscope/plugin/ShapeShifter.cpp b/src/kaleidoscope/plugin/ShapeShifter.cpp index f97cefbf..f81541ae 100644 --- a/src/kaleidoscope/plugin/ShapeShifter.cpp +++ b/src/kaleidoscope/plugin/ShapeShifter.cpp @@ -30,7 +30,7 @@ EventHandlerResult ShapeShifter::beforeReportingState() { return EventHandlerResult::OK; } -EventHandlerResult ShapeShifter::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) { +EventHandlerResult ShapeShifter::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state) { if (!dictionary) return EventHandlerResult::OK; diff --git a/src/kaleidoscope/plugin/ShapeShifter.h b/src/kaleidoscope/plugin/ShapeShifter.h index 116cd3fe..c1d8bcdd 100644 --- a/src/kaleidoscope/plugin/ShapeShifter.h +++ b/src/kaleidoscope/plugin/ShapeShifter.h @@ -32,7 +32,7 @@ class ShapeShifter : public kaleidoscope::Plugin { static const dictionary_t *dictionary; - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); EventHandlerResult beforeReportingState(); private: diff --git a/src/kaleidoscope/plugin/SpaceCadet.cpp b/src/kaleidoscope/plugin/SpaceCadet.cpp index 6b1b02e7..8e544649 100644 --- a/src/kaleidoscope/plugin/SpaceCadet.cpp +++ b/src/kaleidoscope/plugin/SpaceCadet.cpp @@ -70,7 +70,7 @@ bool SpaceCadet::active() { return !disabled; } -EventHandlerResult SpaceCadet::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) { +EventHandlerResult SpaceCadet::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state) { //Handle our synthetic keys for enabling and disabling functionality if (mapped_key.raw >= kaleidoscope::ranges::SC_FIRST && mapped_key.raw <= kaleidoscope::ranges::SC_LAST) { @@ -130,7 +130,7 @@ EventHandlerResult SpaceCadet::onKeyswitchEvent(Key &mapped_key, byte row, byte //hit another key after this -- if it's a modifier, we want the modifier //key to be added to the report, for things like ctrl, alt, shift, etc) if (map[i].flagged) { - handleKeyswitchEvent(map[i].input, UNKNOWN_KEYSWITCH_LOCATION, IS_PRESSED | INJECTED); + handleKeyswitchEvent(map[i].input, UnknownKeyswitchLocation, IS_PRESSED | INJECTED); } //The keypress wasn't a match, so we need to mark it as not flagged and @@ -225,7 +225,7 @@ EventHandlerResult SpaceCadet::onKeyswitchEvent(Key &mapped_key, byte row, byte //only need to send that key and not the original key. //inject our new key - handleKeyswitchEvent(alternate_key, row, col, IS_PRESSED | INJECTED); + handleKeyswitchEvent(alternate_key, key_addr, IS_PRESSED | INJECTED); //Unflag the key so we don't try this again. map[index].flagged = false; diff --git a/src/kaleidoscope/plugin/SpaceCadet.h b/src/kaleidoscope/plugin/SpaceCadet.h index 9938800a..22a4f078 100644 --- a/src/kaleidoscope/plugin/SpaceCadet.h +++ b/src/kaleidoscope/plugin/SpaceCadet.h @@ -66,7 +66,7 @@ class SpaceCadet : public kaleidoscope::Plugin { static uint16_t time_out; // The global timeout in milliseconds static SpaceCadet::KeyBinding * map; // The map of key bindings - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); private: static bool disabled; diff --git a/src/kaleidoscope/plugin/Syster.cpp b/src/kaleidoscope/plugin/Syster.cpp index e3cecc68..b2247176 100644 --- a/src/kaleidoscope/plugin/Syster.cpp +++ b/src/kaleidoscope/plugin/Syster.cpp @@ -43,7 +43,7 @@ bool Syster::is_active(void) { } // --- hooks --- -EventHandlerResult Syster::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t keyState) { +EventHandlerResult Syster::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t keyState) { if (!is_active_) { if (!isSyster(mapped_key)) return EventHandlerResult::OK; @@ -69,9 +69,9 @@ EventHandlerResult Syster::onKeyswitchEvent(Key &mapped_key, byte row, byte col, if (keyToggledOff(keyState)) { if (mapped_key == Key_Spacebar) { for (uint8_t i = 0; i <= symbol_pos_; i++) { - handleKeyswitchEvent(Key_Backspace, UNKNOWN_KEYSWITCH_LOCATION, IS_PRESSED | INJECTED); + handleKeyswitchEvent(Key_Backspace, UnknownKeyswitchLocation, IS_PRESSED | INJECTED); hid::sendKeyboardReport(); - handleKeyswitchEvent(Key_Backspace, UNKNOWN_KEYSWITCH_LOCATION, WAS_PRESSED | INJECTED); + handleKeyswitchEvent(Key_Backspace, UnknownKeyswitchLocation, WAS_PRESSED | INJECTED); hid::sendKeyboardReport(); } diff --git a/src/kaleidoscope/plugin/Syster.h b/src/kaleidoscope/plugin/Syster.h index 31d38083..1433b7eb 100644 --- a/src/kaleidoscope/plugin/Syster.h +++ b/src/kaleidoscope/plugin/Syster.h @@ -41,7 +41,7 @@ class Syster : public kaleidoscope::Plugin { bool is_active(void); - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t keyState); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t keyState); private: static char symbol_[SYSTER_MAX_SYMBOL_LENGTH + 1]; diff --git a/src/kaleidoscope/plugin/TapDance.cpp b/src/kaleidoscope/plugin/TapDance.cpp index 60f18990..30e7acbe 100644 --- a/src/kaleidoscope/plugin/TapDance.cpp +++ b/src/kaleidoscope/plugin/TapDance.cpp @@ -26,20 +26,19 @@ uint16_t TapDance::start_time_; uint16_t TapDance::time_out = 200; TapDance::TapDanceState TapDance::state_[TapDance::TAPDANCE_KEY_COUNT]; Key TapDance::last_tap_dance_key_ = Key_NoKey; -byte TapDance::last_tap_dance_row_; -byte TapDance::last_tap_dance_col_; +KeyAddr TapDance::last_tap_dance_addr_; // --- actions --- -void TapDance::interrupt(byte row, byte col) { +void TapDance::interrupt(KeyAddr key_addr) { uint8_t idx = last_tap_dance_key_.raw - ranges::TD_FIRST; - tapDanceAction(idx, last_tap_dance_row_, last_tap_dance_col_, state_[idx].count, Interrupt); + tapDanceAction(idx, last_tap_dance_addr_, state_[idx].count, Interrupt); state_[idx].triggered = true; last_tap_dance_key_ = Key_NoKey; - KeyboardHardware.maskKey(row, col); + KeyboardHardware.maskKey(key_addr); kaleidoscope::hid::sendKeyboardReport(); kaleidoscope::hid::releaseAllKeys(); @@ -52,7 +51,7 @@ void TapDance::interrupt(byte row, byte col) { void TapDance::timeout(void) { uint8_t idx = last_tap_dance_key_.raw - ranges::TD_FIRST; - tapDanceAction(idx, last_tap_dance_row_, last_tap_dance_col_, state_[idx].count, Timeout); + tapDanceAction(idx, last_tap_dance_addr_, state_[idx].count, Timeout); state_[idx].triggered = true; if (state_[idx].pressed) @@ -77,7 +76,7 @@ void TapDance::tap(void) { state_[idx].count++; start_time_ = Kaleidoscope.millisAtCycleStart(); - tapDanceAction(idx, last_tap_dance_row_, last_tap_dance_col_, state_[idx].count, Tap); + tapDanceAction(idx, last_tap_dance_addr_, state_[idx].count, Tap); } // --- api --- @@ -94,21 +93,21 @@ void TapDance::actionKeys(uint8_t tap_count, ActionType tap_dance_action, uint8_ break; case Interrupt: case Timeout: - handleKeyswitchEvent(key, last_tap_dance_row_, last_tap_dance_col_, IS_PRESSED | INJECTED); + handleKeyswitchEvent(key, last_tap_dance_addr_, IS_PRESSED | INJECTED); break; case Hold: - handleKeyswitchEvent(key, last_tap_dance_row_, last_tap_dance_col_, IS_PRESSED | WAS_PRESSED | INJECTED); + handleKeyswitchEvent(key, last_tap_dance_addr_, IS_PRESSED | WAS_PRESSED | INJECTED); break; case Release: hid::sendKeyboardReport(); - handleKeyswitchEvent(key, last_tap_dance_row_, last_tap_dance_col_, WAS_PRESSED | INJECTED); + handleKeyswitchEvent(key, last_tap_dance_addr_, WAS_PRESSED | INJECTED); break; } } // --- hooks --- -EventHandlerResult TapDance::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t keyState) { +EventHandlerResult TapDance::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t keyState) { if (keyState & INJECTED) return EventHandlerResult::OK; @@ -117,10 +116,10 @@ EventHandlerResult TapDance::onKeyswitchEvent(Key &mapped_key, byte row, byte co return EventHandlerResult::OK; if (keyToggledOn(keyState)) - interrupt(row, col); + interrupt(key_addr); - if (KeyboardHardware.isKeyMasked(row, col)) { - KeyboardHardware.unMaskKey(row, col); + if (KeyboardHardware.isKeyMasked(key_addr)) { + KeyboardHardware.unMaskKey(key_addr); return EventHandlerResult::EVENT_CONSUMED; } return EventHandlerResult::OK; @@ -142,8 +141,7 @@ EventHandlerResult TapDance::onKeyswitchEvent(Key &mapped_key, byte row, byte co } last_tap_dance_key_.raw = mapped_key.raw; - last_tap_dance_row_ = row; - last_tap_dance_col_ = col; + last_tap_dance_addr_ = key_addr; tap(); @@ -158,7 +156,7 @@ EventHandlerResult TapDance::onKeyswitchEvent(Key &mapped_key, byte row, byte co return EventHandlerResult::EVENT_CONSUMED; } - interrupt(row, col); + interrupt(key_addr); } } @@ -169,8 +167,7 @@ EventHandlerResult TapDance::onKeyswitchEvent(Key &mapped_key, byte row, byte co } last_tap_dance_key_.raw = mapped_key.raw; - last_tap_dance_row_ = row; - last_tap_dance_col_ = col; + last_tap_dance_addr_ = key_addr; state_[tap_dance_index].pressed = true; if (keyToggledOn(keyState)) { @@ -179,7 +176,7 @@ EventHandlerResult TapDance::onKeyswitchEvent(Key &mapped_key, byte row, byte co } if (state_[tap_dance_index].triggered) - tapDanceAction(tap_dance_index, row, col, state_[tap_dance_index].count, Hold); + tapDanceAction(tap_dance_index, key_addr, state_[tap_dance_index].count, Hold); return EventHandlerResult::EVENT_CONSUMED; } @@ -189,7 +186,7 @@ EventHandlerResult TapDance::afterEachCycle() { if (!state_[i].release_next) continue; - tapDanceAction(i, last_tap_dance_row_, last_tap_dance_col_, state_[i].count, Release); + tapDanceAction(i, last_tap_dance_addr_, state_[i].count, Release); state_[i].count = 0; state_[i].release_next = false; } @@ -210,4 +207,10 @@ __attribute__((weak)) void tapDanceAction(uint8_t tap_dance_index, byte row, byt kaleidoscope::plugin::TapDance::ActionType tap_dance_action) { } +// Let the future version be the wrapper to enable backward compatibility. +__attribute__((weak)) void tapDanceAction(uint8_t tap_dance_index, KeyAddr key_addr, uint8_t tap_count, + kaleidoscope::plugin::TapDance::ActionType tap_dance_action) { + tapDanceAction(tap_dance_index, key_addr.row(), key_addr.col(), tap_count, tap_dance_action); +} + kaleidoscope::plugin::TapDance TapDance; diff --git a/src/kaleidoscope/plugin/TapDance.h b/src/kaleidoscope/plugin/TapDance.h index ce6ced53..9e60bc34 100644 --- a/src/kaleidoscope/plugin/TapDance.h +++ b/src/kaleidoscope/plugin/TapDance.h @@ -46,7 +46,7 @@ class TapDance : public kaleidoscope::Plugin { void actionKeys(uint8_t tap_count, ActionType tap_dance_action, uint8_t max_keys, const Key tap_keys[]); - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t keyState); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t keyState); EventHandlerResult afterEachCycle(); private: @@ -61,11 +61,10 @@ class TapDance : public kaleidoscope::Plugin { static uint16_t start_time_; static Key last_tap_dance_key_; - static byte last_tap_dance_row_; - static byte last_tap_dance_col_; + static KeyAddr last_tap_dance_addr_; static void tap(void); - static void interrupt(byte row, byte col); + static void interrupt(KeyAddr key_addr); static void timeout(void); static void release(uint8_t tap_dance_index); }; @@ -73,6 +72,14 @@ class TapDance : public kaleidoscope::Plugin { } +void tapDanceAction(uint8_t tap_dance_index, KeyAddr key_addr, uint8_t tap_count, + kaleidoscope::plugin::TapDance::ActionType tap_dance_action); + +// The old version of te tapdance action is DEPRECATED(ROW_COL_FUNC) although this +// cannot be flagged to the user. The weak function is called by the tap dance +// plugin's implementation. That's why the deprecation warning would always +// fire. +// void tapDanceAction(uint8_t tap_dance_index, byte row, byte col, uint8_t tap_count, kaleidoscope::plugin::TapDance::ActionType tap_dance_action); diff --git a/src/kaleidoscope/plugin/TopsyTurvy.cpp b/src/kaleidoscope/plugin/TopsyTurvy.cpp index 07ee12fa..c0df461a 100644 --- a/src/kaleidoscope/plugin/TopsyTurvy.cpp +++ b/src/kaleidoscope/plugin/TopsyTurvy.cpp @@ -25,7 +25,7 @@ uint8_t TopsyTurvy::last_pressed_position_; bool TopsyTurvy::is_shifted_; bool TopsyTurvy::is_active_; -EventHandlerResult TopsyTurvy::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) { +EventHandlerResult TopsyTurvy::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state) { if (mapped_key == Key_LeftShift || mapped_key == Key_RightShift) { @@ -36,7 +36,7 @@ EventHandlerResult TopsyTurvy::onKeyswitchEvent(Key &mapped_key, byte row, byte if (mapped_key < ranges::TT_FIRST || mapped_key > ranges::TT_LAST) { if (keyToggledOn(key_state) && (mapped_key < Key_LeftControl || mapped_key > Key_RightGui)) { - last_pressed_position_ = row * COLS + col; + last_pressed_position_ = key_addr.toInt(); } return EventHandlerResult::OK; @@ -45,9 +45,9 @@ EventHandlerResult TopsyTurvy::onKeyswitchEvent(Key &mapped_key, byte row, byte is_active_ = keyIsPressed(key_state); if (keyToggledOn(key_state)) { - last_pressed_position_ = row * COLS + col; + last_pressed_position_ = key_addr.toInt(); } else { - if (last_pressed_position_ != row * COLS + col) { + if (last_pressed_position_ != key_addr.toInt()) { return EventHandlerResult::EVENT_CONSUMED; } } diff --git a/src/kaleidoscope/plugin/TopsyTurvy.h b/src/kaleidoscope/plugin/TopsyTurvy.h index 4dadf556..2462357b 100644 --- a/src/kaleidoscope/plugin/TopsyTurvy.h +++ b/src/kaleidoscope/plugin/TopsyTurvy.h @@ -29,7 +29,7 @@ class TopsyTurvy: public kaleidoscope::Plugin { public: TopsyTurvy(void) {} - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); private: static uint8_t last_pressed_position_; diff --git a/src/kaleidoscope/plugin/TriColor.cpp b/src/kaleidoscope/plugin/TriColor.cpp index cb457ec5..965e6adc 100644 --- a/src/kaleidoscope/plugin/TriColor.cpp +++ b/src/kaleidoscope/plugin/TriColor.cpp @@ -27,34 +27,32 @@ TriColor::TriColor(cRGB base_color, cRGB mod_color, cRGB esc_color) { } void TriColor::TransientLEDMode::update(void) { - for (uint8_t r = 0; r < ROWS; r++) { - for (uint8_t c = 0; c < COLS; c++) { - Key k = Layer.lookup(r, c); - - // Special keys are always mod_color - if (k.flags != 0) { - ::LEDControl.setCrgbAt(r, c, parent_->mod_color_); - continue; - } - - cRGB color = parent_->mod_color_; - - switch (k.keyCode) { - case Key_A.keyCode ... Key_0.keyCode: - case Key_Spacebar.keyCode: - case Key_KeypadDivide.keyCode ... Key_KeypadSubtract.keyCode: - case Key_Keypad1.keyCode ... Key_KeypadDot.keyCode: - case Key_F1.keyCode ... Key_F4.keyCode: - case Key_F9.keyCode ... Key_F12.keyCode: - color = parent_->base_color_; - break; - case Key_Escape.keyCode: - color = parent_->esc_color_; - break; - } - - ::LEDControl.setCrgbAt(r, c, color); + for (auto key_addr : KeyAddr::all()) { + Key k = Layer.lookup(key_addr); + + // Special keys are always mod_color + if (k.flags != 0) { + ::LEDControl.setCrgbAt(KeyAddr(key_addr), parent_->mod_color_); + continue; + } + + cRGB color = parent_->mod_color_; + + switch (k.keyCode) { + case Key_A.keyCode ... Key_0.keyCode: + case Key_Spacebar.keyCode: + case Key_KeypadDivide.keyCode ... Key_KeypadSubtract.keyCode: + case Key_Keypad1.keyCode ... Key_KeypadDot.keyCode: + case Key_F1.keyCode ... Key_F4.keyCode: + case Key_F9.keyCode ... Key_F12.keyCode: + color = parent_->base_color_; + break; + case Key_Escape.keyCode: + color = parent_->esc_color_; + break; } + + ::LEDControl.setCrgbAt(KeyAddr(key_addr), color); } } diff --git a/src/kaleidoscope/plugin/TypingBreaks.cpp b/src/kaleidoscope/plugin/TypingBreaks.cpp index 24e27536..38faeb58 100644 --- a/src/kaleidoscope/plugin/TypingBreaks.cpp +++ b/src/kaleidoscope/plugin/TypingBreaks.cpp @@ -38,7 +38,7 @@ uint16_t TypingBreaks::left_hand_keys_; uint16_t TypingBreaks::right_hand_keys_; uint16_t TypingBreaks::settings_base_; -EventHandlerResult TypingBreaks::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state) { +EventHandlerResult TypingBreaks::onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state) { uint32_t lock_length = settings.lock_length * 1000; uint32_t idle_time_limit = settings.idle_time_limit * 1000; uint32_t lock_time_out = settings.lock_time_out * 1000; @@ -91,7 +91,7 @@ EventHandlerResult TypingBreaks::onKeyswitchEvent(Key &mapped_key, byte row, byt // counters if need be. if (keyToggledOn(key_state)) { - if (col <= COLS / 2) + if (key_addr.col() <= COLS / 2) left_hand_keys_++; else right_hand_keys_++; diff --git a/src/kaleidoscope/plugin/TypingBreaks.h b/src/kaleidoscope/plugin/TypingBreaks.h index 33166ecd..4bbc0379 100644 --- a/src/kaleidoscope/plugin/TypingBreaks.h +++ b/src/kaleidoscope/plugin/TypingBreaks.h @@ -36,7 +36,7 @@ class TypingBreaks : public kaleidoscope::Plugin { static settings_t settings; - EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t key_state); + EventHandlerResult onKeyswitchEvent(Key &mapped_key, KeyAddr key_addr, uint8_t key_state); EventHandlerResult onFocusEvent(const char *command); EventHandlerResult onSetup(); diff --git a/src/kaleidoscope/plugin/WinKeyToggle.cpp b/src/kaleidoscope/plugin/WinKeyToggle.cpp index 74c8861e..c4273269 100644 --- a/src/kaleidoscope/plugin/WinKeyToggle.cpp +++ b/src/kaleidoscope/plugin/WinKeyToggle.cpp @@ -23,7 +23,7 @@ namespace plugin { bool WinKeyToggle::enabled_; -EventHandlerResult WinKeyToggle::onKeyswitchEvent(Key &key, byte row, byte col, uint8_t key_state) { +EventHandlerResult WinKeyToggle::onKeyswitchEvent(Key &key, KeyAddr key_addr, uint8_t key_state) { if (!enabled_) return EventHandlerResult::OK; diff --git a/src/kaleidoscope/plugin/WinKeyToggle.h b/src/kaleidoscope/plugin/WinKeyToggle.h index 1ee0922e..08380713 100644 --- a/src/kaleidoscope/plugin/WinKeyToggle.h +++ b/src/kaleidoscope/plugin/WinKeyToggle.h @@ -25,7 +25,7 @@ class WinKeyToggle: public kaleidoscope::Plugin { public: WinKeyToggle() {} - EventHandlerResult onKeyswitchEvent(Key &key, byte row, byte col, uint8_t key_state); + EventHandlerResult onKeyswitchEvent(Key &key, KeyAddr key_addr, uint8_t key_state); void toggle() { enabled_ = !enabled_; } diff --git a/test/MatrixAddr/Makefile b/test/MatrixAddr/Makefile new file mode 100644 index 00000000..503de5e0 --- /dev/null +++ b/test/MatrixAddr/Makefile @@ -0,0 +1,2 @@ +test: test.cpp ../../src/kaleidoscope/MatrixAddr.h + g++ -std=c++11 -o test test.cpp diff --git a/test/MatrixAddr/test.cpp b/test/MatrixAddr/test.cpp new file mode 100644 index 00000000..1681c644 --- /dev/null +++ b/test/MatrixAddr/test.cpp @@ -0,0 +1,102 @@ +#define MATRIX_ADDR_TESTING + +#include "../../src/kaleidoscope/MatrixAddr.h" + +#include +#include +#include +#include + +template +void logType() { + std::cout << " rows:" << (int)MA__::rows << std::endl; + std::cout << " cols:" << (int)MA__::cols << std::endl; + std::cout << " rowSize:" << (int)MA__::rowSize << std::endl; +} + +template +void testIndexedAccess() { + MA__ ma2; + + ma2.setRow(1); + ma2.setCol(3); + assert(ma2 == MA__(1, 3)); + + ma2.setRow(7); + assert(ma2 == MA__(7, 3)); + + ma2.setCol(5); + assert(ma2 == MA__(7, 5)); + + MA__ ma3(3, 5); + + assert(ma3.row() == 3); + assert(ma3.col() == 5); +} + +template +std::string typenameString() { + std::string nameString; + char * name = 0; + int status; + name = abi::__cxa_demangle(typeid(MA__).name(), 0, 0, &status); + if (name != 0) { + nameString = name; + } + free(name); + return nameString; +} + +template +void testRelation() { + + std::cout << "***************************************" << std::endl; + std::cout << "MA1:" << typenameString() << std::endl; + logType(); + + std::cout << "MA2:" << typenameString() << std::endl; + logType(); + + MA1__ mAddr1(3, 5); + MA2__ mAddr2(2, 5); + MA1__ mAddr3; + + assert(mAddr1.isValid()); + assert(!mAddr3.isValid()); + + assert(mAddr1 != mAddr2); + + MA2__ mAddr1Copy = mAddr1; + assert(mAddr1Copy == mAddr1); + + MA2__ mAddr1Assigned; + mAddr1Assigned = mAddr1; + assert(mAddr1Assigned == mAddr1); + + assert(mAddr2 < mAddr1); + assert(mAddr1 > mAddr2); + + assert(mAddr2 <= mAddr1); + assert(mAddr1 >= mAddr2); + + assert(mAddr1 <= mAddr1); + assert(mAddr2 >= mAddr2); +} + +int main(int argc, char **argv) { + typedef kaleidoscope::MatrixAddr<7, 14> MA1; + typedef kaleidoscope::MatrixAddrCompressed<7, 14> MA2; + typedef kaleidoscope::MatrixAddrCompressed<7, 8> MA3; + + testIndexedAccess(); + testIndexedAccess(); + + testRelation(); + testRelation(); + testRelation(); + testRelation(); + + testRelation(); + testRelation(); + testRelation(); +}