From 8e98e30f62832ccc4f0695e3764983758fe86fda Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Sun, 6 Aug 2017 08:12:00 +0200 Subject: [PATCH] masking: use 4 8-bit uints instead of one 32bit one Dealing with 32-bit numbers on Atmega32u4 is very costy, so lets try to avoid that, and use four 8-bit uints instead. This save us about a hundred bytes of progmem. Signed-off-by: Gergely Nagy --- src/Kaleidoscope-Hardware-Model01.cpp | 26 ++++++++++++++++---------- src/Kaleidoscope-Hardware-Model01.h | 4 ++-- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/Kaleidoscope-Hardware-Model01.cpp b/src/Kaleidoscope-Hardware-Model01.cpp index 1f2e8c7f..682a0480 100644 --- a/src/Kaleidoscope-Hardware-Model01.cpp +++ b/src/Kaleidoscope-Hardware-Model01.cpp @@ -5,8 +5,8 @@ KeyboardioScanner Model01::leftHand(0); KeyboardioScanner Model01::rightHand(3); bool Model01::isLEDChanged = true; -uint32_t Model01::leftHandMask; -uint32_t Model01::rightHandMask; +uint8_t Model01::leftHandMask[4]; +uint8_t Model01::rightHandMask[4]; static constexpr uint8_t key_led_map[4][16] = { {3, 4, 11, 12, 19, 20, 26, 27, 36, 37, 43, 44, 51, 52, 59, 60}, @@ -209,9 +209,9 @@ void Model01::maskKey(byte row, byte col) { return; if (col >= 8) { - rightHandMask |= SCANBIT(row, col - 8); + rightHandMask[row] |= 1 << (col - 8); } else { - leftHandMask |= SCANBIT(row, col); + leftHandMask[row] |= 1 << (col); } } @@ -220,9 +220,9 @@ void Model01::unMaskKey(byte row, byte col) { return; if (col >= 8) { - rightHandMask &= ~(SCANBIT(row, col - 8)); + rightHandMask[row] &= ~(1 << (col - 8)); } else { - leftHandMask &= ~(SCANBIT(row, col)); + leftHandMask[row] &= ~(1 << col); } } @@ -231,15 +231,21 @@ bool Model01::isKeyMasked(byte row, byte col) { return false; if (col >= 8) { - return rightHandMask & SCANBIT(row, col - 8); + return rightHandMask[row] & (1 << (col - 8)); } else { - return leftHandMask & SCANBIT(row, col); + return leftHandMask[row] & (1 << col); } } void Model01::maskHeldKeys(void) { - rightHandMask = rightHandState.all; - leftHandMask = leftHandState.all; + for (byte row = 0; row < ROWS; row++) { + for (byte col = 0; col < COLS / 2; col++) { + if (leftHandState.all & SCANBIT(row, col)) + leftHandMask[row] |= 1 << col; + if (rightHandState.all & SCANBIT(row, col)) + rightHandMask[row] |= 1 << col; + } + } } HARDWARE_IMPLEMENTATION KeyboardHardware; diff --git a/src/Kaleidoscope-Hardware-Model01.h b/src/Kaleidoscope-Hardware-Model01.h index e2fe552d..04b41eb4 100644 --- a/src/Kaleidoscope-Hardware-Model01.h +++ b/src/Kaleidoscope-Hardware-Model01.h @@ -54,8 +54,8 @@ class Model01 { static KeyboardioScanner leftHand; static KeyboardioScanner rightHand; - static uint32_t leftHandMask; - static uint32_t rightHandMask; + static uint8_t leftHandMask[4]; + static uint8_t rightHandMask[4]; }; #define SCANBIT(row,col) ((uint32_t)1 << ((row) * 8 + (7 - (col))))