From a06424198799b156c451f2e2e5d423675e6cb555 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Thu, 27 Jan 2022 04:20:33 +1100 Subject: [PATCH 01/10] Enable encoder test suite, fix encoder test suite, enable asymmetric encoder support. --- build_test.mk | 2 + keyboards/draculad/config.h | 3 +- keyboards/sofle/keyhive/config.h | 11 +- keyboards/viktus/sp_mini/config.h | 4 +- quantum/encoder.c | 102 ++++++++----- quantum/encoder/tests/config_mock.h | 22 +++ .../tests/config_mock_split_left_eq_right.h | 26 ++++ .../tests/config_mock_split_left_gt_right.h | 26 ++++ .../tests/config_mock_split_left_lt_right.h | 26 ++++ quantum/encoder/tests/encoder_tests.cpp | 36 ++--- ... => encoder_tests_split_left_eq_right.cpp} | 82 +++++------ .../encoder_tests_split_left_gt_right.cpp | 139 ++++++++++++++++++ .../encoder_tests_split_left_lt_right.cpp | 139 ++++++++++++++++++ quantum/encoder/tests/mock.h | 6 - quantum/encoder/tests/mock_split.h | 16 +- quantum/encoder/tests/rules.mk | 29 +++- quantum/encoder/tests/testlist.mk | 4 +- quantum/keymap.h | 22 +++ quantum/split_common/transactions.c | 4 +- quantum/split_common/transport.h | 4 +- quantum/util.h | 8 + testlist.mk | 1 + 22 files changed, 578 insertions(+), 134 deletions(-) create mode 100644 quantum/encoder/tests/config_mock.h create mode 100644 quantum/encoder/tests/config_mock_split_left_eq_right.h create mode 100644 quantum/encoder/tests/config_mock_split_left_gt_right.h create mode 100644 quantum/encoder/tests/config_mock_split_left_lt_right.h rename quantum/encoder/tests/{encoder_tests_split.cpp => encoder_tests_split_left_eq_right.cpp} (61%) create mode 100644 quantum/encoder/tests/encoder_tests_split_left_gt_right.cpp create mode 100644 quantum/encoder/tests/encoder_tests_split_left_lt_right.cpp diff --git a/build_test.mk b/build_test.mk index ec6699b4ea6e..f30268f7e9ed 100644 --- a/build_test.mk +++ b/build_test.mk @@ -4,6 +4,8 @@ endif .DEFAULT_GOAL := all +OPT = g + include paths.mk include $(BUILDDEFS_PATH)/message.mk diff --git a/keyboards/draculad/config.h b/keyboards/draculad/config.h index abcdc76b4b45..3060f801c6e2 100644 --- a/keyboards/draculad/config.h +++ b/keyboards/draculad/config.h @@ -61,7 +61,8 @@ along with this program. If not, see . #define ENCODERS_PAD_A {B2 , B4} #define ENCODERS_PAD_B {B6 , B5} -#define ENCODER_RESOLUTIONS { 4, 4, 4, 1} +#define ENCODER_RESOLUTIONS { 4, 4 } +#define ENCODER_RESOLUTIONS_RIGHT { 4, 1 } #define UNUSED_PINS #define EE_HANDS diff --git a/keyboards/sofle/keyhive/config.h b/keyboards/sofle/keyhive/config.h index c934754e6593..93048f3cd113 100755 --- a/keyboards/sofle/keyhive/config.h +++ b/keyboards/sofle/keyhive/config.h @@ -42,11 +42,12 @@ #define DEBOUNCE 5 // Encoder support -#define ENCODERS_PAD_A { F5 } -#define ENCODERS_PAD_B { F4 } -#define ENCODERS_PAD_A_RIGHT { F4 } -#define ENCODERS_PAD_B_RIGHT { F5 } -#define ENCODER_RESOLUTIONS { 4, 2 } // Left encoder seems to have double-output issue but right does not. +#define ENCODERS_PAD_A { F5 } +#define ENCODERS_PAD_B { F4 } +#define ENCODERS_PAD_A_RIGHT { F4 } +#define ENCODERS_PAD_B_RIGHT { F5 } +#define ENCODER_RESOLUTIONS { 4 } +#define ENCODER_RESOLUTIONS_RIGHT { 2 } // Left encoder seems to have double-output issue but right does not. #define TAP_CODE_DELAY 10 diff --git a/keyboards/viktus/sp_mini/config.h b/keyboards/viktus/sp_mini/config.h index 06b8c2f51a82..ec13a240c295 100644 --- a/keyboards/viktus/sp_mini/config.h +++ b/keyboards/viktus/sp_mini/config.h @@ -35,7 +35,7 @@ along with this program. If not, see . // wiring of each half #define MATRIX_ROW_PINS { F0, B5, B4, D7, D6 } -#define MATRIX_COL_PINS { B6, C6, C7, D4, D2, D3, D5 } // no B7 on left hand +#define MATRIX_COL_PINS { B6, C6, C7, D4, D2, D3, D5, NO_PIN } // no B7 on left hand #define MATRIX_ROW_PINS_RIGHT { F0, B5, B4, D7, D6 } #define MATRIX_COL_PINS_RIGHT { B6, C6, C7, D4, D2, D3, D5, B7 } @@ -78,7 +78,7 @@ along with this program. If not, see . //#define ENCODERS_PAD_A_RIGHT {F4} //#define ENCODERS_PAD_B_RIGHT {F1} -#define ENCODER_RESOLUTIONS { 8, 8 } +#define ENCODER_RESOLUTIONS { 8 } /* * Feature disable options diff --git a/quantum/encoder.c b/quantum/encoder.c index 8fb87281c2b1..6730e3009e1c 100644 --- a/quantum/encoder.c +++ b/quantum/encoder.c @@ -19,6 +19,7 @@ #ifdef SPLIT_KEYBOARD # include "split_util.h" #endif +#include "keymap.h" // for memcpy #include @@ -31,11 +32,13 @@ # error "No encoder pads defined by ENCODERS_PAD_A and ENCODERS_PAD_B" #endif -#define NUMBER_OF_ENCODERS (sizeof(encoders_pad_a) / sizeof(pin_t)) -static pin_t encoders_pad_a[] = ENCODERS_PAD_A; -static pin_t encoders_pad_b[] = ENCODERS_PAD_B; +extern volatile bool isLeftHand; + +static pin_t encoders_pad_a[NUM_ENCODERS_MAX_PER_SIDE] = ENCODERS_PAD_A; +static pin_t encoders_pad_b[NUM_ENCODERS_MAX_PER_SIDE] = ENCODERS_PAD_B; + #ifdef ENCODER_RESOLUTIONS -static uint8_t encoder_resolutions[] = ENCODER_RESOLUTIONS; +static uint8_t encoder_resolutions[NUM_ENCODERS] = ENCODER_RESOLUTIONS; #endif #ifndef ENCODER_DIRECTION_FLIP @@ -47,51 +50,80 @@ static uint8_t encoder_resolutions[] = ENCODER_RESOLUTIONS; #endif static int8_t encoder_LUT[] = {0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0}; -static uint8_t encoder_state[NUMBER_OF_ENCODERS] = {0}; -static int8_t encoder_pulses[NUMBER_OF_ENCODERS] = {0}; +static uint8_t encoder_state[NUM_ENCODERS] = {0}; +static int8_t encoder_pulses[NUM_ENCODERS] = {0}; +// encoder counts +static uint8_t thisCount; #ifdef SPLIT_KEYBOARD -// right half encoders come over as second set of encoders -static uint8_t encoder_value[NUMBER_OF_ENCODERS * 2] = {0}; -// row offsets for each hand +// encoder offsets for each hand static uint8_t thisHand, thatHand; -#else -static uint8_t encoder_value[NUMBER_OF_ENCODERS] = {0}; +// encoder counts for each hand +static uint8_t thatCount; #endif +static uint8_t encoder_value[NUM_ENCODERS] = {0}; + __attribute__((weak)) bool encoder_update_user(uint8_t index, bool clockwise) { return true; } __attribute__((weak)) bool encoder_update_kb(uint8_t index, bool clockwise) { return encoder_update_user(index, clockwise); } void encoder_init(void) { +#ifdef SPLIT_KEYBOARD + thisHand = isLeftHand ? 0 : NUM_ENCODERS_LEFT; + thatHand = NUM_ENCODERS_LEFT - thisHand; + thisCount = isLeftHand ? NUM_ENCODERS_LEFT : NUM_ENCODERS_RIGHT; + thatCount = isLeftHand ? NUM_ENCODERS_RIGHT : NUM_ENCODERS_LEFT; +#else // SPLIT_KEYBOARD + thisCount = NUM_ENCODERS; +#endif + +#ifdef ENCODER_TESTS + // Annoying that we have to clear out values during initialisation here, but + // because all the arrays are static locals, rerunning tests in the same + // executable doesn't reset any of these. Kinda crappy having test-only code + // here, but it's the simplest solution. + memset(encoder_value, 0, sizeof(encoder_value)); + memset(encoder_state, 0, sizeof(encoder_state)); + memset(encoder_pulses, 0, sizeof(encoder_pulses)); + static const pin_t encoders_pad_a_left[] = ENCODERS_PAD_A; + static const pin_t encoders_pad_b_left[] = ENCODERS_PAD_B; + for (uint8_t i = 0; i < thisCount; i++) { + encoders_pad_a[i] = encoders_pad_a_left[i]; + encoders_pad_b[i] = encoders_pad_b_left[i]; + } +#endif + #if defined(SPLIT_KEYBOARD) && defined(ENCODERS_PAD_A_RIGHT) && defined(ENCODERS_PAD_B_RIGHT) + // Re-initialise the pads if it's the right-hand side if (!isLeftHand) { - const pin_t encoders_pad_a_right[] = ENCODERS_PAD_A_RIGHT; - const pin_t encoders_pad_b_right[] = ENCODERS_PAD_B_RIGHT; -# if defined(ENCODER_RESOLUTIONS_RIGHT) - const uint8_t encoder_resolutions_right[] = ENCODER_RESOLUTIONS_RIGHT; -# endif - for (uint8_t i = 0; i < NUMBER_OF_ENCODERS; i++) { + static const pin_t encoders_pad_a_right[] = ENCODERS_PAD_A_RIGHT; + static const pin_t encoders_pad_b_right[] = ENCODERS_PAD_B_RIGHT; + for (uint8_t i = 0; i < thisCount; i++) { encoders_pad_a[i] = encoders_pad_a_right[i]; encoders_pad_b[i] = encoders_pad_b_right[i]; -# if defined(ENCODER_RESOLUTIONS_RIGHT) - encoder_resolutions[i] = encoder_resolutions_right[i]; -# endif } } -#endif +#endif // defined(SPLIT_KEYBOARD) && defined(ENCODERS_PAD_A_RIGHT) && defined(ENCODERS_PAD_B_RIGHT) - for (int i = 0; i < NUMBER_OF_ENCODERS; i++) { + // Encoder resolutions is handled purely master-side, so concatenate the two arrays +#if defined(SPLIT_KEYBOARD) && defined(ENCODER_RESOLUTIONS) +# if defined(ENCODER_RESOLUTIONS_RIGHT) + static const uint8_t encoder_resolutions_right[NUM_ENCODERS_RIGHT] = ENCODER_RESOLUTIONS_RIGHT; +# else // defined(ENCODER_RESOLUTIONS_RIGHT) + static const uint8_t encoder_resolutions_right[NUM_ENCODERS_RIGHT] = ENCODER_RESOLUTIONS; +# endif // defined(ENCODER_RESOLUTIONS_RIGHT) + for (uint8_t i = 0; i < NUM_ENCODERS_RIGHT; i++) { + encoder_resolutions[NUM_ENCODERS_LEFT + i] = encoder_resolutions_right[i]; + } +#endif // defined(SPLIT_KEYBOARD) && defined(ENCODER_RESOLUTIONS) + + for (uint8_t i = 0; i < thisCount; i++) { setPinInputHigh(encoders_pad_a[i]); setPinInputHigh(encoders_pad_b[i]); encoder_state[i] = (readPin(encoders_pad_a[i]) << 0) | (readPin(encoders_pad_b[i]) << 1); } - -#ifdef SPLIT_KEYBOARD - thisHand = isLeftHand ? 0 : NUMBER_OF_ENCODERS; - thatHand = NUMBER_OF_ENCODERS - thisHand; -#endif } static bool encoder_update(uint8_t index, uint8_t state) { @@ -99,9 +131,9 @@ static bool encoder_update(uint8_t index, uint8_t state) { uint8_t i = index; #ifdef ENCODER_RESOLUTIONS - uint8_t resolution = encoder_resolutions[i]; + const uint8_t resolution = encoder_resolutions[i]; #else - uint8_t resolution = ENCODER_RESOLUTION; + const uint8_t resolution = ENCODER_RESOLUTION; #endif #ifdef SPLIT_KEYBOARD @@ -129,7 +161,7 @@ static bool encoder_update(uint8_t index, uint8_t state) { bool encoder_read(void) { bool changed = false; - for (uint8_t i = 0; i < NUMBER_OF_ENCODERS; i++) { + for (uint8_t i = 0; i < thisCount; i++) { encoder_state[i] <<= 2; encoder_state[i] |= (readPin(encoders_pad_a[i]) << 0) | (readPin(encoders_pad_b[i]) << 1); changed |= encoder_update(i, encoder_state[i]); @@ -140,13 +172,13 @@ bool encoder_read(void) { #ifdef SPLIT_KEYBOARD void last_encoder_activity_trigger(void); -void encoder_state_raw(uint8_t* slave_state) { memcpy(slave_state, &encoder_value[thisHand], sizeof(uint8_t) * NUMBER_OF_ENCODERS); } +void encoder_state_raw(uint8_t *slave_state) { memcpy(slave_state, &encoder_value[thisHand], sizeof(uint8_t) * thatCount); } -void encoder_update_raw(uint8_t* slave_state) { +void encoder_update_raw(uint8_t *slave_state) { bool changed = false; - for (uint8_t i = 0; i < NUMBER_OF_ENCODERS; i++) { - uint8_t index = i + thatHand; - int8_t delta = slave_state[i] - encoder_value[index]; + for (uint8_t i = 0; i < thatCount; i++) { // Note inverted logic -- we want the opposite side + const uint8_t index = i + thatHand; + int8_t delta = slave_state[i] - encoder_value[index]; while (delta > 0) { delta--; encoder_value[index]++; diff --git a/quantum/encoder/tests/config_mock.h b/quantum/encoder/tests/config_mock.h new file mode 100644 index 000000000000..703dcaf10361 --- /dev/null +++ b/quantum/encoder/tests/config_mock.h @@ -0,0 +1,22 @@ +// Copyright 2022 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define MATRIX_ROWS 1 +#define MATRIX_COLS 1 + +/* Here, "pins" from 0 to 31 are allowed. */ +#define ENCODERS_PAD_A \ + { 0 } +#define ENCODERS_PAD_B \ + { 1 } + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mock.h" + +#ifdef __cplusplus +}; +#endif diff --git a/quantum/encoder/tests/config_mock_split_left_eq_right.h b/quantum/encoder/tests/config_mock_split_left_eq_right.h new file mode 100644 index 000000000000..c80ac4d51988 --- /dev/null +++ b/quantum/encoder/tests/config_mock_split_left_eq_right.h @@ -0,0 +1,26 @@ +// Copyright 2022 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define MATRIX_ROWS 1 +#define MATRIX_COLS 1 + +/* Here, "pins" from 0 to 31 are allowed. */ +#define ENCODERS_PAD_A \ + { 0, 2 } +#define ENCODERS_PAD_B \ + { 1, 3 } +#define ENCODERS_PAD_A_RIGHT \ + { 4, 6 } +#define ENCODERS_PAD_B_RIGHT \ + { 5, 7 } + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mock_split.h" + +#ifdef __cplusplus +}; +#endif diff --git a/quantum/encoder/tests/config_mock_split_left_gt_right.h b/quantum/encoder/tests/config_mock_split_left_gt_right.h new file mode 100644 index 000000000000..91d5f3d6058c --- /dev/null +++ b/quantum/encoder/tests/config_mock_split_left_gt_right.h @@ -0,0 +1,26 @@ +// Copyright 2022 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define MATRIX_ROWS 1 +#define MATRIX_COLS 1 + +/* Here, "pins" from 0 to 31 are allowed. */ +#define ENCODERS_PAD_A \ + { 0, 2, 4 } +#define ENCODERS_PAD_B \ + { 1, 3, 5 } +#define ENCODERS_PAD_A_RIGHT \ + { 6, 8 } +#define ENCODERS_PAD_B_RIGHT \ + { 7, 9 } + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mock_split.h" + +#ifdef __cplusplus +}; +#endif diff --git a/quantum/encoder/tests/config_mock_split_left_lt_right.h b/quantum/encoder/tests/config_mock_split_left_lt_right.h new file mode 100644 index 000000000000..4108a184a68c --- /dev/null +++ b/quantum/encoder/tests/config_mock_split_left_lt_right.h @@ -0,0 +1,26 @@ +// Copyright 2022 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define MATRIX_ROWS 1 +#define MATRIX_COLS 1 + +/* Here, "pins" from 0 to 31 are allowed. */ +#define ENCODERS_PAD_A \ + { 0, 2 } +#define ENCODERS_PAD_B \ + { 1, 3 } +#define ENCODERS_PAD_A_RIGHT \ + { 4, 6, 8 } +#define ENCODERS_PAD_B_RIGHT \ + { 5, 7, 9 } + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mock_split.h" + +#ifdef __cplusplus +}; +#endif diff --git a/quantum/encoder/tests/encoder_tests.cpp b/quantum/encoder/tests/encoder_tests.cpp index 1888fdab8d08..b7c18aeec008 100644 --- a/quantum/encoder/tests/encoder_tests.cpp +++ b/quantum/encoder/tests/encoder_tests.cpp @@ -30,12 +30,12 @@ struct update { bool clockwise; }; -uint8_t uidx = 0; +uint8_t updates_array_idx = 0; update updates[32]; bool encoder_update_kb(uint8_t index, bool clockwise) { - updates[uidx % 32] = {index, clockwise}; - uidx++; + updates[updates_array_idx % 32] = {index, clockwise}; + updates_array_idx++; return true; } @@ -47,15 +47,15 @@ bool setAndRead(pin_t pin, bool val) { class EncoderTest : public ::testing::Test {}; TEST_F(EncoderTest, TestInit) { - uidx = 0; + updates_array_idx = 0; encoder_init(); EXPECT_EQ(pinIsInputHigh[0], true); EXPECT_EQ(pinIsInputHigh[1], true); - EXPECT_EQ(uidx, 0); + EXPECT_EQ(updates_array_idx, 0); } TEST_F(EncoderTest, TestOneClockwise) { - uidx = 0; + updates_array_idx = 0; encoder_init(); // send 4 pulses. with resolution 4, that's one step and we should get 1 update. setAndRead(0, false); @@ -63,26 +63,26 @@ TEST_F(EncoderTest, TestOneClockwise) { setAndRead(0, true); setAndRead(1, true); - EXPECT_EQ(uidx, 1); + EXPECT_EQ(updates_array_idx, 1); EXPECT_EQ(updates[0].index, 0); EXPECT_EQ(updates[0].clockwise, true); } TEST_F(EncoderTest, TestOneCounterClockwise) { - uidx = 0; + updates_array_idx = 0; encoder_init(); setAndRead(1, false); setAndRead(0, false); setAndRead(1, true); setAndRead(0, true); - EXPECT_EQ(uidx, 1); + EXPECT_EQ(updates_array_idx, 1); EXPECT_EQ(updates[0].index, 0); EXPECT_EQ(updates[0].clockwise, false); } TEST_F(EncoderTest, TestTwoClockwiseOneCC) { - uidx = 0; + updates_array_idx = 0; encoder_init(); setAndRead(0, false); setAndRead(1, false); @@ -97,7 +97,7 @@ TEST_F(EncoderTest, TestTwoClockwiseOneCC) { setAndRead(1, true); setAndRead(0, true); - EXPECT_EQ(uidx, 3); + EXPECT_EQ(updates_array_idx, 3); EXPECT_EQ(updates[0].index, 0); EXPECT_EQ(updates[0].clockwise, true); EXPECT_EQ(updates[1].index, 0); @@ -107,38 +107,38 @@ TEST_F(EncoderTest, TestTwoClockwiseOneCC) { } TEST_F(EncoderTest, TestNoEarly) { - uidx = 0; + updates_array_idx = 0; encoder_init(); // send 3 pulses. with resolution 4, that's not enough for a step. setAndRead(0, false); setAndRead(1, false); setAndRead(0, true); - EXPECT_EQ(uidx, 0); + EXPECT_EQ(updates_array_idx, 0); // now send last pulse setAndRead(1, true); - EXPECT_EQ(uidx, 1); + EXPECT_EQ(updates_array_idx, 1); EXPECT_EQ(updates[0].index, 0); EXPECT_EQ(updates[0].clockwise, true); } TEST_F(EncoderTest, TestHalfway) { - uidx = 0; + updates_array_idx = 0; encoder_init(); // go halfway setAndRead(0, false); setAndRead(1, false); - EXPECT_EQ(uidx, 0); + EXPECT_EQ(updates_array_idx, 0); // back off setAndRead(1, true); setAndRead(0, true); - EXPECT_EQ(uidx, 0); + EXPECT_EQ(updates_array_idx, 0); // go all the way setAndRead(0, false); setAndRead(1, false); setAndRead(0, true); setAndRead(1, true); // should result in 1 update - EXPECT_EQ(uidx, 1); + EXPECT_EQ(updates_array_idx, 1); EXPECT_EQ(updates[0].index, 0); EXPECT_EQ(updates[0].clockwise, true); } diff --git a/quantum/encoder/tests/encoder_tests_split.cpp b/quantum/encoder/tests/encoder_tests_split_left_eq_right.cpp similarity index 61% rename from quantum/encoder/tests/encoder_tests_split.cpp rename to quantum/encoder/tests/encoder_tests_split_left_eq_right.cpp index 25e52c83f9d6..20b3b9205dba 100644 --- a/quantum/encoder/tests/encoder_tests_split.cpp +++ b/quantum/encoder/tests/encoder_tests_split_left_eq_right.cpp @@ -30,7 +30,7 @@ struct update { bool clockwise; }; -uint8_t uidx = 0; +uint8_t updates_array_idx = 0; update updates[32]; bool isLeftHand; @@ -41,8 +41,8 @@ bool encoder_update_kb(uint8_t index, bool clockwise) { printf("ignoring update on right hand (%d,%s)\n", index, clockwise ? "CW" : "CC"); return true; } - updates[uidx % 32] = {index, clockwise}; - uidx++; + updates[updates_array_idx % 32] = {index, clockwise}; + updates_array_idx++; return true; } @@ -51,10 +51,10 @@ bool setAndRead(pin_t pin, bool val) { return encoder_read(); } -class EncoderTest : public ::testing::Test { +class EncoderSplitTestLeftEqRight : public ::testing::Test { protected: void SetUp() override { - uidx = 0; + updates_array_idx = 0; for (int i = 0; i < 32; i++) { pinIsInputHigh[i] = 0; pins[i] = 0; @@ -62,27 +62,35 @@ class EncoderTest : public ::testing::Test { } }; -TEST_F(EncoderTest, TestInitLeft) { +TEST_F(EncoderSplitTestLeftEqRight, TestInitLeft) { isLeftHand = true; encoder_init(); EXPECT_EQ(pinIsInputHigh[0], true); EXPECT_EQ(pinIsInputHigh[1], true); - EXPECT_EQ(pinIsInputHigh[2], false); - EXPECT_EQ(pinIsInputHigh[3], false); - EXPECT_EQ(uidx, 0); + EXPECT_EQ(pinIsInputHigh[2], true); + EXPECT_EQ(pinIsInputHigh[3], true); + EXPECT_EQ(pinIsInputHigh[4], false); + EXPECT_EQ(pinIsInputHigh[5], false); + EXPECT_EQ(pinIsInputHigh[6], false); + EXPECT_EQ(pinIsInputHigh[7], false); + EXPECT_EQ(updates_array_idx, 0); // no updates received } -TEST_F(EncoderTest, TestInitRight) { +TEST_F(EncoderSplitTestLeftEqRight, TestInitRight) { isLeftHand = false; encoder_init(); EXPECT_EQ(pinIsInputHigh[0], false); EXPECT_EQ(pinIsInputHigh[1], false); - EXPECT_EQ(pinIsInputHigh[2], true); - EXPECT_EQ(pinIsInputHigh[3], true); - EXPECT_EQ(uidx, 0); + EXPECT_EQ(pinIsInputHigh[2], false); + EXPECT_EQ(pinIsInputHigh[3], false); + EXPECT_EQ(pinIsInputHigh[4], true); + EXPECT_EQ(pinIsInputHigh[5], true); + EXPECT_EQ(pinIsInputHigh[6], true); + EXPECT_EQ(pinIsInputHigh[7], true); + EXPECT_EQ(updates_array_idx, 0); // no updates received } -TEST_F(EncoderTest, TestOneClockwiseLeft) { +TEST_F(EncoderSplitTestLeftEqRight, TestOneClockwiseLeft) { isLeftHand = true; encoder_init(); // send 4 pulses. with resolution 4, that's one step and we should get 1 update. @@ -91,53 +99,37 @@ TEST_F(EncoderTest, TestOneClockwiseLeft) { setAndRead(0, true); setAndRead(1, true); - EXPECT_EQ(uidx, 1); + EXPECT_EQ(updates_array_idx, 1); // one update received EXPECT_EQ(updates[0].index, 0); EXPECT_EQ(updates[0].clockwise, true); } -TEST_F(EncoderTest, TestOneClockwiseRightSent) { +TEST_F(EncoderSplitTestLeftEqRight, TestOneClockwiseRightSent) { isLeftHand = false; encoder_init(); // send 4 pulses. with resolution 4, that's one step and we should get 1 update. - setAndRead(2, false); - setAndRead(3, false); - setAndRead(2, true); - setAndRead(3, true); + setAndRead(6, false); + setAndRead(7, false); + setAndRead(6, true); + setAndRead(7, true); - uint8_t slave_state[2] = {0}; + uint8_t slave_state[NUM_ENCODERS_RIGHT] = {0}; encoder_state_raw(slave_state); - EXPECT_EQ((int8_t)slave_state[0], -1); + EXPECT_EQ(slave_state[0], 0); + EXPECT_EQ(slave_state[1], 0xFF); } -/* this test will not work after the previous test. - * this is due to encoder_value[1] already being set to -1 when simulating the right half. - * When we now receive this update acting as the left half, there is no change. - * This is hard to mock, as the static values inside encoder.c normally exist twice, once on each half, - * but here, they only exist once. - */ - -// TEST_F(EncoderTest, TestOneClockwiseRightReceived) { -// isLeftHand = true; -// encoder_init(); - -// uint8_t slave_state[2] = {255, 0}; -// encoder_update_raw(slave_state); - -// EXPECT_EQ(uidx, 1); -// EXPECT_EQ(updates[0].index, 1); -// EXPECT_EQ(updates[0].clockwise, true); -// } - -TEST_F(EncoderTest, TestOneCounterClockwiseRightReceived) { +TEST_F(EncoderSplitTestLeftEqRight, TestMultipleEncodersRightReceived) { isLeftHand = true; encoder_init(); - uint8_t slave_state[2] = {0, 0}; + uint8_t slave_state[NUM_ENCODERS_RIGHT] = {1, 0xFF}; // First right encoder is CCW, Second right encoder CW encoder_update_raw(slave_state); - EXPECT_EQ(uidx, 1); - EXPECT_EQ(updates[0].index, 1); + EXPECT_EQ(updates_array_idx, 2); // two updates received, one for each changed item on the right side + EXPECT_EQ(updates[0].index, 2); EXPECT_EQ(updates[0].clockwise, false); + EXPECT_EQ(updates[1].index, 3); + EXPECT_EQ(updates[1].clockwise, true); } diff --git a/quantum/encoder/tests/encoder_tests_split_left_gt_right.cpp b/quantum/encoder/tests/encoder_tests_split_left_gt_right.cpp new file mode 100644 index 000000000000..05059f75eac7 --- /dev/null +++ b/quantum/encoder/tests/encoder_tests_split_left_gt_right.cpp @@ -0,0 +1,139 @@ +/* Copyright 2021 Balz Guenat + * + * 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 2 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 . + */ + +#include "gtest/gtest.h" +#include "gmock/gmock.h" +#include +#include +#include + +extern "C" { +#include "encoder.h" +#include "encoder/tests/mock_split.h" +} + +struct update { + int8_t index; + bool clockwise; +}; + +uint8_t updates_array_idx = 0; +update updates[32]; + +bool isLeftHand; + +bool encoder_update_kb(uint8_t index, bool clockwise) { + if (!isLeftHand) { + // this method has no effect on slave half + printf("ignoring update on right hand (%d,%s)\n", index, clockwise ? "CW" : "CC"); + return true; + } + updates[updates_array_idx % 32] = {index, clockwise}; + updates_array_idx++; + return true; +} + +bool setAndRead(pin_t pin, bool val) { + setPin(pin, val); + return encoder_read(); +} + +class EncoderSplitTestLeftGreaterThanRight : public ::testing::Test { + protected: + void SetUp() override { + updates_array_idx = 0; + for (int i = 0; i < 32; i++) { + pinIsInputHigh[i] = 0; + pins[i] = 0; + } + } +}; + +TEST_F(EncoderSplitTestLeftGreaterThanRight, TestInitLeft) { + isLeftHand = true; + encoder_init(); + EXPECT_EQ(pinIsInputHigh[0], true); + EXPECT_EQ(pinIsInputHigh[1], true); + EXPECT_EQ(pinIsInputHigh[2], true); + EXPECT_EQ(pinIsInputHigh[3], true); + EXPECT_EQ(pinIsInputHigh[4], true); + EXPECT_EQ(pinIsInputHigh[5], true); + EXPECT_EQ(pinIsInputHigh[6], false); + EXPECT_EQ(pinIsInputHigh[7], false); + EXPECT_EQ(pinIsInputHigh[8], false); + EXPECT_EQ(pinIsInputHigh[9], false); + EXPECT_EQ(updates_array_idx, 0); // no updates received +} + +TEST_F(EncoderSplitTestLeftGreaterThanRight, TestInitRight) { + isLeftHand = false; + encoder_init(); + EXPECT_EQ(pinIsInputHigh[0], false); + EXPECT_EQ(pinIsInputHigh[1], false); + EXPECT_EQ(pinIsInputHigh[2], false); + EXPECT_EQ(pinIsInputHigh[3], false); + EXPECT_EQ(pinIsInputHigh[4], false); + EXPECT_EQ(pinIsInputHigh[5], false); + EXPECT_EQ(pinIsInputHigh[6], true); + EXPECT_EQ(pinIsInputHigh[7], true); + EXPECT_EQ(pinIsInputHigh[8], true); + EXPECT_EQ(pinIsInputHigh[9], true); + EXPECT_EQ(updates_array_idx, 0); // no updates received +} + +TEST_F(EncoderSplitTestLeftGreaterThanRight, TestOneClockwiseLeft) { + isLeftHand = true; + encoder_init(); + // send 4 pulses. with resolution 4, that's one step and we should get 1 update. + setAndRead(0, false); + setAndRead(1, false); + setAndRead(0, true); + setAndRead(1, true); + + EXPECT_EQ(updates_array_idx, 1); // one update received + EXPECT_EQ(updates[0].index, 0); + EXPECT_EQ(updates[0].clockwise, true); +} + +TEST_F(EncoderSplitTestLeftGreaterThanRight, TestOneClockwiseRightSent) { + isLeftHand = false; + encoder_init(); + // send 4 pulses. with resolution 4, that's one step and we should get 1 update. + setAndRead(6, false); + setAndRead(7, false); + setAndRead(6, true); + setAndRead(7, true); + + uint8_t slave_state[NUM_ENCODERS_RIGHT] = {0}; + encoder_state_raw(slave_state); + + EXPECT_EQ(slave_state[0], 0xFF); + EXPECT_EQ(slave_state[1], 0); +} + +TEST_F(EncoderSplitTestLeftGreaterThanRight, TestMultipleEncodersRightReceived) { + isLeftHand = true; + encoder_init(); + + uint8_t slave_state[NUM_ENCODERS_RIGHT] = {1, 0xFF}; // First right encoder is CCW, Second right encoder no change, third right encoder CW + encoder_update_raw(slave_state); + + EXPECT_EQ(updates_array_idx, 2); // two updates received, one for each changed item on the right side + EXPECT_EQ(updates[0].index, 3); + EXPECT_EQ(updates[0].clockwise, false); + EXPECT_EQ(updates[1].index, 4); + EXPECT_EQ(updates[1].clockwise, true); +} diff --git a/quantum/encoder/tests/encoder_tests_split_left_lt_right.cpp b/quantum/encoder/tests/encoder_tests_split_left_lt_right.cpp new file mode 100644 index 000000000000..156ede80e1c4 --- /dev/null +++ b/quantum/encoder/tests/encoder_tests_split_left_lt_right.cpp @@ -0,0 +1,139 @@ +/* Copyright 2021 Balz Guenat + * + * 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 2 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 . + */ + +#include "gtest/gtest.h" +#include "gmock/gmock.h" +#include +#include +#include + +extern "C" { +#include "encoder.h" +#include "encoder/tests/mock_split.h" +} + +struct update { + int8_t index; + bool clockwise; +}; + +uint8_t updates_array_idx = 0; +update updates[32]; + +bool isLeftHand; + +bool encoder_update_kb(uint8_t index, bool clockwise) { + if (!isLeftHand) { + // this method has no effect on slave half + printf("ignoring update on right hand (%d,%s)\n", index, clockwise ? "CW" : "CC"); + return true; + } + updates[updates_array_idx % 32] = {index, clockwise}; + updates_array_idx++; + return true; +} + +bool setAndRead(pin_t pin, bool val) { + setPin(pin, val); + return encoder_read(); +} + +class EncoderSplitTestLeftLessThanRight : public ::testing::Test { + protected: + void SetUp() override { + updates_array_idx = 0; + for (int i = 0; i < 32; i++) { + pinIsInputHigh[i] = 0; + pins[i] = 0; + } + } +}; + +TEST_F(EncoderSplitTestLeftLessThanRight, TestInitLeft) { + isLeftHand = true; + encoder_init(); + EXPECT_EQ(pinIsInputHigh[0], true); + EXPECT_EQ(pinIsInputHigh[1], true); + EXPECT_EQ(pinIsInputHigh[2], true); + EXPECT_EQ(pinIsInputHigh[3], true); + EXPECT_EQ(pinIsInputHigh[4], false); + EXPECT_EQ(pinIsInputHigh[5], false); + EXPECT_EQ(pinIsInputHigh[6], false); + EXPECT_EQ(pinIsInputHigh[7], false); + EXPECT_EQ(pinIsInputHigh[8], false); + EXPECT_EQ(pinIsInputHigh[9], false); + EXPECT_EQ(updates_array_idx, 0); // no updates received +} + +TEST_F(EncoderSplitTestLeftLessThanRight, TestInitRight) { + isLeftHand = false; + encoder_init(); + EXPECT_EQ(pinIsInputHigh[0], false); + EXPECT_EQ(pinIsInputHigh[1], false); + EXPECT_EQ(pinIsInputHigh[2], false); + EXPECT_EQ(pinIsInputHigh[3], false); + EXPECT_EQ(pinIsInputHigh[4], true); + EXPECT_EQ(pinIsInputHigh[5], true); + EXPECT_EQ(pinIsInputHigh[6], true); + EXPECT_EQ(pinIsInputHigh[7], true); + EXPECT_EQ(pinIsInputHigh[8], true); + EXPECT_EQ(pinIsInputHigh[9], true); + EXPECT_EQ(updates_array_idx, 0); // no updates received +} + +TEST_F(EncoderSplitTestLeftLessThanRight, TestOneClockwiseLeft) { + isLeftHand = true; + encoder_init(); + // send 4 pulses. with resolution 4, that's one step and we should get 1 update. + setAndRead(0, false); + setAndRead(1, false); + setAndRead(0, true); + setAndRead(1, true); + + EXPECT_EQ(updates_array_idx, 1); // one update received + EXPECT_EQ(updates[0].index, 0); + EXPECT_EQ(updates[0].clockwise, true); +} + +TEST_F(EncoderSplitTestLeftLessThanRight, TestOneClockwiseRightSent) { + isLeftHand = false; + encoder_init(); + // send 4 pulses. with resolution 4, that's one step and we should get 1 update. + setAndRead(6, false); + setAndRead(7, false); + setAndRead(6, true); + setAndRead(7, true); + + uint8_t slave_state[NUM_ENCODERS_RIGHT] = {0}; + encoder_state_raw(slave_state); + + EXPECT_EQ(slave_state[0], 0); + EXPECT_EQ(slave_state[1], 0xFF); +} + +TEST_F(EncoderSplitTestLeftLessThanRight, TestMultipleEncodersRightReceived) { + isLeftHand = true; + encoder_init(); + + uint8_t slave_state[NUM_ENCODERS_RIGHT] = {1, 0, 0xFF}; // First right encoder is CCW, Second right encoder no change, third right encoder CW + encoder_update_raw(slave_state); + + EXPECT_EQ(updates_array_idx, 2); // two updates received, one for each changed item on the right side + EXPECT_EQ(updates[0].index, 2); + EXPECT_EQ(updates[0].clockwise, false); + EXPECT_EQ(updates[1].index, 4); + EXPECT_EQ(updates[1].clockwise, true); +} diff --git a/quantum/encoder/tests/mock.h b/quantum/encoder/tests/mock.h index dbc25a084618..80c336b5ef61 100644 --- a/quantum/encoder/tests/mock.h +++ b/quantum/encoder/tests/mock.h @@ -19,12 +19,6 @@ #include #include -/* Here, "pins" from 0 to 31 are allowed. */ -#define ENCODERS_PAD_A \ - { 0 } -#define ENCODERS_PAD_B \ - { 1 } - typedef uint8_t pin_t; extern bool pins[]; diff --git a/quantum/encoder/tests/mock_split.h b/quantum/encoder/tests/mock_split.h index 0ae62652f97f..2fc12f18306f 100644 --- a/quantum/encoder/tests/mock_split.h +++ b/quantum/encoder/tests/mock_split.h @@ -20,20 +20,10 @@ #include #define SPLIT_KEYBOARD -/* Here, "pins" from 0 to 31 are allowed. */ -#define ENCODERS_PAD_A \ - { 0 } -#define ENCODERS_PAD_B \ - { 1 } -#define ENCODERS_PAD_A_RIGHT \ - { 2 } -#define ENCODERS_PAD_B_RIGHT \ - { 3 } - typedef uint8_t pin_t; -extern bool isLeftHand; -void encoder_state_raw(uint8_t* slave_state); -void encoder_update_raw(uint8_t* slave_state); + +void encoder_state_raw(uint8_t* slave_state); +void encoder_update_raw(uint8_t* slave_state); extern bool pins[]; extern bool pinIsInputHigh[]; diff --git a/quantum/encoder/tests/rules.mk b/quantum/encoder/tests/rules.mk index b826ce3aedec..487e6568629c 100644 --- a/quantum/encoder/tests/rules.mk +++ b/quantum/encoder/tests/rules.mk @@ -1,13 +1,34 @@ -encoder_DEFS := -DENCODER_MOCK_SINGLE +encoder_DEFS := -DENCODER_TESTS -DENCODER_ENABLE -DENCODER_MOCK_SINGLE +encoder_CONFIG := $(QUANTUM_PATH)/encoder/tests/config_mock.h encoder_SRC := \ $(QUANTUM_PATH)/encoder/tests/mock.c \ $(QUANTUM_PATH)/encoder/tests/encoder_tests.cpp \ $(QUANTUM_PATH)/encoder.c -encoder_split_DEFS := -DENCODER_MOCK_SPLIT +encoder_split_left_eq_right_DEFS := -DENCODER_TESTS -DENCODER_ENABLE -DENCODER_MOCK_SPLIT +encoder_split_left_eq_right_INC := $(QUANTUM_PATH)/split_common +encoder_split_left_eq_right_CONFIG := $(QUANTUM_PATH)/encoder/tests/config_mock_split_left_eq_right.h -encoder_split_SRC := \ +encoder_split_left_eq_right_SRC := \ $(QUANTUM_PATH)/encoder/tests/mock_split.c \ - $(QUANTUM_PATH)/encoder/tests/encoder_tests_split.cpp \ + $(QUANTUM_PATH)/encoder/tests/encoder_tests_split_left_eq_right.cpp \ + $(QUANTUM_PATH)/encoder.c + +encoder_split_left_gt_right_DEFS := -DENCODER_TESTS -DENCODER_ENABLE -DENCODER_MOCK_SPLIT +encoder_split_left_gt_right_INC := $(QUANTUM_PATH)/split_common +encoder_split_left_gt_right_CONFIG := $(QUANTUM_PATH)/encoder/tests/config_mock_split_left_gt_right.h + +encoder_split_left_gt_right_SRC := \ + $(QUANTUM_PATH)/encoder/tests/mock_split.c \ + $(QUANTUM_PATH)/encoder/tests/encoder_tests_split_left_gt_right.cpp \ + $(QUANTUM_PATH)/encoder.c + +encoder_split_left_lt_right_DEFS := -DENCODER_TESTS -DENCODER_ENABLE -DENCODER_MOCK_SPLIT +encoder_split_left_lt_right_INC := $(QUANTUM_PATH)/split_common +encoder_split_left_lt_right_CONFIG := $(QUANTUM_PATH)/encoder/tests/config_mock_split_left_lt_right.h + +encoder_split_left_lt_right_SRC := \ + $(QUANTUM_PATH)/encoder/tests/mock_split.c \ + $(QUANTUM_PATH)/encoder/tests/encoder_tests_split_left_lt_right.cpp \ $(QUANTUM_PATH)/encoder.c diff --git a/quantum/encoder/tests/testlist.mk b/quantum/encoder/tests/testlist.mk index 1be9f4a0548e..7ef6864baccc 100644 --- a/quantum/encoder/tests/testlist.mk +++ b/quantum/encoder/tests/testlist.mk @@ -1,3 +1,5 @@ TEST_LIST += \ encoder \ - encoder_split + encoder_split_left_eq_right \ + encoder_split_left_gt_right \ + encoder_split_left_lt_right diff --git a/quantum/keymap.h b/quantum/keymap.h index 2ee2e1b57625..e87349a1d7fe 100644 --- a/quantum/keymap.h +++ b/quantum/keymap.h @@ -31,6 +31,7 @@ along with this program. If not, see . #include "host.h" // #include "print.h" #include "debug.h" +#include "util.h" #include "keycode_config.h" // ChibiOS uses RESET in its FlagStatus enumeration @@ -49,3 +50,24 @@ along with this program. If not, see . uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; + +#if defined(ENCODER_ENABLE) +# ifdef SPLIT_KEYBOARD +# if defined(ENCODERS_PAD_A_RIGHT) +# define NUM_ENCODERS_LEFT (sizeof(((pin_t[])ENCODERS_PAD_A)) / sizeof(pin_t)) +# define NUM_ENCODERS_RIGHT (sizeof(((pin_t[])ENCODERS_PAD_A_RIGHT)) / sizeof(pin_t)) +# else +# define NUM_ENCODERS_LEFT (sizeof(((pin_t[])ENCODERS_PAD_A)) / sizeof(pin_t)) +# define NUM_ENCODERS_RIGHT NUM_ENCODERS_LEFT +# endif +# define NUM_ENCODERS (NUM_ENCODERS_LEFT + NUM_ENCODERS_RIGHT) +# else // SPLIT_KEYBOARD +# define NUM_ENCODERS (sizeof(((pin_t[])ENCODERS_PAD_A)) / sizeof(pin_t)) +# define NUM_ENCODERS_LEFT NUM_ENCODERS +# define NUM_ENCODERS_RIGHT 0 +# endif // SPLIT_KEYBOARD +# define NUM_ENCODERS_MAX_PER_SIDE MAX(NUM_ENCODERS_LEFT, NUM_ENCODERS_RIGHT) +#else // defined(ENCODER_ENABLE) +# define NUM_ENCODERS 0 +# define NUM_ENCODERS_MAX_PER_SIDE NUM_ENCODERS +#endif // defined(ENCODER_ENABLE) diff --git a/quantum/split_common/transactions.c b/quantum/split_common/transactions.c index 4b059a2b8a8b..79c25ec2b928 100644 --- a/quantum/split_common/transactions.c +++ b/quantum/split_common/transactions.c @@ -176,7 +176,7 @@ static void master_matrix_handlers_slave(matrix_row_t master_matrix[], matrix_ro static bool encoder_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { static uint32_t last_update = 0; - uint8_t temp_state[NUMBER_OF_ENCODERS]; + uint8_t temp_state[NUM_ENCODERS_MAX_PER_SIDE]; bool okay = read_if_checksum_mismatch(GET_ENCODERS_CHECKSUM, GET_ENCODERS_DATA, &last_update, temp_state, split_shmem->encoders.state, sizeof(temp_state)); if (okay) encoder_update_raw(temp_state); @@ -184,7 +184,7 @@ static bool encoder_handlers_master(matrix_row_t master_matrix[], matrix_row_t s } static void encoder_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { - uint8_t encoder_state[NUMBER_OF_ENCODERS]; + uint8_t encoder_state[NUM_ENCODERS_MAX_PER_SIDE]; encoder_state_raw(encoder_state); // Always prepare the encoder state for read. memcpy(split_shmem->encoders.state, encoder_state, sizeof(encoder_state)); diff --git a/quantum/split_common/transport.h b/quantum/split_common/transport.h index 31b804908b94..537458eab199 100644 --- a/quantum/split_common/transport.h +++ b/quantum/split_common/transport.h @@ -42,7 +42,7 @@ bool transport_execute_transaction(int8_t id, const void *initiator2target_buf, #ifdef ENCODER_ENABLE # include "encoder.h" -# define NUMBER_OF_ENCODERS (sizeof((pin_t[])ENCODERS_PAD_A) / sizeof(pin_t)) +# include "keymap.h" #endif // ENCODER_ENABLE #ifdef BACKLIGHT_ENABLE @@ -67,7 +67,7 @@ typedef struct _split_master_matrix_sync_t { #ifdef ENCODER_ENABLE typedef struct _split_slave_encoder_sync_t { uint8_t checksum; - uint8_t state[NUMBER_OF_ENCODERS]; + uint8_t state[NUM_ENCODERS_MAX_PER_SIDE]; } split_slave_encoder_sync_t; #endif // ENCODER_ENABLE diff --git a/quantum/util.h b/quantum/util.h index bef3b9abe360..ab96ce4bdeb0 100644 --- a/quantum/util.h +++ b/quantum/util.h @@ -24,3 +24,11 @@ along with this program. If not, see . // convert to string #define STR(s) XSTR(s) #define XSTR(s) #s + +#if !defined(MIN) +# define MIN(x, y) (((x) < (y)) ? (x) : (y)) +#endif + +#if !defined(MAX) +# define MAX(x, y) (((x) > (y)) ? (x) : (y)) +#endif diff --git a/testlist.mk b/testlist.mk index 904485c15ced..d2bb571be64f 100644 --- a/testlist.mk +++ b/testlist.mk @@ -2,6 +2,7 @@ TEST_LIST = $(sort $(patsubst %/test.mk,%, $(shell find $(ROOT_DIR)tests -type f FULL_TESTS := $(notdir $(TEST_LIST)) include $(QUANTUM_PATH)/debounce/tests/testlist.mk +include $(QUANTUM_PATH)/encoder/tests/testlist.mk include $(QUANTUM_PATH)/sequencer/tests/testlist.mk include $(PLATFORM_PATH)/test/testlist.mk From d8041335b7fa9d02a40aa41e4c2f376958f62809 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Fri, 28 Jan 2022 08:09:09 +1100 Subject: [PATCH 02/10] Start working out no-encoder testcases. --- .../encoder/tests/config_mock_split_no_left.h | 26 ++++ .../tests/config_mock_split_no_right.h | 26 ++++ .../encoder_tests_split_left_eq_right.cpp | 4 +- .../encoder_tests_split_left_gt_right.cpp | 4 +- .../encoder_tests_split_left_lt_right.cpp | 4 +- .../tests/encoder_tests_split_no_left.cpp | 125 ++++++++++++++++++ .../tests/encoder_tests_split_no_right.cpp | 116 ++++++++++++++++ quantum/encoder/tests/rules.mk | 18 +++ quantum/encoder/tests/testlist.mk | 4 +- 9 files changed, 320 insertions(+), 7 deletions(-) create mode 100644 quantum/encoder/tests/config_mock_split_no_left.h create mode 100644 quantum/encoder/tests/config_mock_split_no_right.h create mode 100644 quantum/encoder/tests/encoder_tests_split_no_left.cpp create mode 100644 quantum/encoder/tests/encoder_tests_split_no_right.cpp diff --git a/quantum/encoder/tests/config_mock_split_no_left.h b/quantum/encoder/tests/config_mock_split_no_left.h new file mode 100644 index 000000000000..813db0e4604b --- /dev/null +++ b/quantum/encoder/tests/config_mock_split_no_left.h @@ -0,0 +1,26 @@ +// Copyright 2022 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define MATRIX_ROWS 1 +#define MATRIX_COLS 1 + +/* Here, "pins" from 0 to 31 are allowed. */ +#define ENCODERS_PAD_A \ + { } +#define ENCODERS_PAD_B \ + { } +#define ENCODERS_PAD_A_RIGHT \ + { 0, 2 } +#define ENCODERS_PAD_B_RIGHT \ + { 1, 3 } + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mock_split.h" + +#ifdef __cplusplus +}; +#endif diff --git a/quantum/encoder/tests/config_mock_split_no_right.h b/quantum/encoder/tests/config_mock_split_no_right.h new file mode 100644 index 000000000000..187375302c22 --- /dev/null +++ b/quantum/encoder/tests/config_mock_split_no_right.h @@ -0,0 +1,26 @@ +// Copyright 2022 Nick Brassel (@tzarc) +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define MATRIX_ROWS 1 +#define MATRIX_COLS 1 + +/* Here, "pins" from 0 to 31 are allowed. */ +#define ENCODERS_PAD_A \ + { 0, 2 } +#define ENCODERS_PAD_B \ + { 1, 3 } +#define ENCODERS_PAD_A_RIGHT \ + { } +#define ENCODERS_PAD_B_RIGHT \ + { } + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mock_split.h" + +#ifdef __cplusplus +}; +#endif diff --git a/quantum/encoder/tests/encoder_tests_split_left_eq_right.cpp b/quantum/encoder/tests/encoder_tests_split_left_eq_right.cpp index 20b3b9205dba..3cae432663f5 100644 --- a/quantum/encoder/tests/encoder_tests_split_left_eq_right.cpp +++ b/quantum/encoder/tests/encoder_tests_split_left_eq_right.cpp @@ -113,7 +113,7 @@ TEST_F(EncoderSplitTestLeftEqRight, TestOneClockwiseRightSent) { setAndRead(6, true); setAndRead(7, true); - uint8_t slave_state[NUM_ENCODERS_RIGHT] = {0}; + uint8_t slave_state[32] = {0}; encoder_state_raw(slave_state); EXPECT_EQ(slave_state[0], 0); @@ -124,7 +124,7 @@ TEST_F(EncoderSplitTestLeftEqRight, TestMultipleEncodersRightReceived) { isLeftHand = true; encoder_init(); - uint8_t slave_state[NUM_ENCODERS_RIGHT] = {1, 0xFF}; // First right encoder is CCW, Second right encoder CW + uint8_t slave_state[32] = {1, 0xFF}; // First right encoder is CCW, Second right encoder CW encoder_update_raw(slave_state); EXPECT_EQ(updates_array_idx, 2); // two updates received, one for each changed item on the right side diff --git a/quantum/encoder/tests/encoder_tests_split_left_gt_right.cpp b/quantum/encoder/tests/encoder_tests_split_left_gt_right.cpp index 05059f75eac7..952491e7cf79 100644 --- a/quantum/encoder/tests/encoder_tests_split_left_gt_right.cpp +++ b/quantum/encoder/tests/encoder_tests_split_left_gt_right.cpp @@ -117,7 +117,7 @@ TEST_F(EncoderSplitTestLeftGreaterThanRight, TestOneClockwiseRightSent) { setAndRead(6, true); setAndRead(7, true); - uint8_t slave_state[NUM_ENCODERS_RIGHT] = {0}; + uint8_t slave_state[32] = {0}; encoder_state_raw(slave_state); EXPECT_EQ(slave_state[0], 0xFF); @@ -128,7 +128,7 @@ TEST_F(EncoderSplitTestLeftGreaterThanRight, TestMultipleEncodersRightReceived) isLeftHand = true; encoder_init(); - uint8_t slave_state[NUM_ENCODERS_RIGHT] = {1, 0xFF}; // First right encoder is CCW, Second right encoder no change, third right encoder CW + uint8_t slave_state[32] = {1, 0xFF}; // First right encoder is CCW, Second right encoder no change, third right encoder CW encoder_update_raw(slave_state); EXPECT_EQ(updates_array_idx, 2); // two updates received, one for each changed item on the right side diff --git a/quantum/encoder/tests/encoder_tests_split_left_lt_right.cpp b/quantum/encoder/tests/encoder_tests_split_left_lt_right.cpp index 156ede80e1c4..43ce3d1cab8b 100644 --- a/quantum/encoder/tests/encoder_tests_split_left_lt_right.cpp +++ b/quantum/encoder/tests/encoder_tests_split_left_lt_right.cpp @@ -117,7 +117,7 @@ TEST_F(EncoderSplitTestLeftLessThanRight, TestOneClockwiseRightSent) { setAndRead(6, true); setAndRead(7, true); - uint8_t slave_state[NUM_ENCODERS_RIGHT] = {0}; + uint8_t slave_state[32] = {0}; encoder_state_raw(slave_state); EXPECT_EQ(slave_state[0], 0); @@ -128,7 +128,7 @@ TEST_F(EncoderSplitTestLeftLessThanRight, TestMultipleEncodersRightReceived) { isLeftHand = true; encoder_init(); - uint8_t slave_state[NUM_ENCODERS_RIGHT] = {1, 0, 0xFF}; // First right encoder is CCW, Second right encoder no change, third right encoder CW + uint8_t slave_state[32] = {1, 0, 0xFF}; // First right encoder is CCW, Second right encoder no change, third right encoder CW encoder_update_raw(slave_state); EXPECT_EQ(updates_array_idx, 2); // two updates received, one for each changed item on the right side diff --git a/quantum/encoder/tests/encoder_tests_split_no_left.cpp b/quantum/encoder/tests/encoder_tests_split_no_left.cpp new file mode 100644 index 000000000000..befd24a4d776 --- /dev/null +++ b/quantum/encoder/tests/encoder_tests_split_no_left.cpp @@ -0,0 +1,125 @@ +/* Copyright 2021 Balz Guenat + * + * 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 2 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 . + */ + +#include "gtest/gtest.h" +#include "gmock/gmock.h" +#include +#include +#include + +extern "C" { +#include "encoder.h" +#include "encoder/tests/mock_split.h" +} + +struct update { + int8_t index; + bool clockwise; +}; + +uint8_t updates_array_idx = 0; +update updates[32]; + +bool isLeftHand; + +bool encoder_update_kb(uint8_t index, bool clockwise) { + if (!isLeftHand) { + // this method has no effect on slave half + printf("ignoring update on right hand (%d,%s)\n", index, clockwise ? "CW" : "CC"); + return true; + } + updates[updates_array_idx % 32] = {index, clockwise}; + updates_array_idx++; + return true; +} + +bool setAndRead(pin_t pin, bool val) { + setPin(pin, val); + return encoder_read(); +} + +class EncoderSplitTestNoLeft : public ::testing::Test { + protected: + void SetUp() override { + updates_array_idx = 0; + for (int i = 0; i < 32; i++) { + pinIsInputHigh[i] = 0; + pins[i] = 0; + } + } +}; + +TEST_F(EncoderSplitTestNoLeft, TestInitLeft) { + isLeftHand = true; + encoder_init(); + EXPECT_EQ(pinIsInputHigh[0], false); + EXPECT_EQ(pinIsInputHigh[1], false); + EXPECT_EQ(pinIsInputHigh[2], false); + EXPECT_EQ(pinIsInputHigh[3], false); + EXPECT_EQ(updates_array_idx, 0); // no updates received +} + +TEST_F(EncoderSplitTestNoLeft, TestInitRight) { + isLeftHand = false; + encoder_init(); + EXPECT_EQ(pinIsInputHigh[0], true); + EXPECT_EQ(pinIsInputHigh[1], true); + EXPECT_EQ(pinIsInputHigh[2], true); + EXPECT_EQ(pinIsInputHigh[3], true); + EXPECT_EQ(updates_array_idx, 0); // no updates received +} + +TEST_F(EncoderSplitTestNoLeft, TestOneClockwiseLeft) { + isLeftHand = true; + encoder_init(); + // send 4 pulses. with resolution 4, that's one step and we should get 1 update. + setAndRead(0, false); + setAndRead(1, false); + setAndRead(0, true); + setAndRead(1, true); + + EXPECT_EQ(updates_array_idx, 0); // no updates received +} + +TEST_F(EncoderSplitTestNoLeft, TestOneClockwiseRightSent) { + isLeftHand = false; + encoder_init(); + // send 4 pulses. with resolution 4, that's one step and we should get 1 update. + setAndRead(2, false); + setAndRead(3, false); + setAndRead(2, true); + setAndRead(3, true); + + uint8_t slave_state[32] = {0}; + encoder_state_raw(slave_state); + + EXPECT_EQ(slave_state[0], 0xFF); + EXPECT_EQ(slave_state[1], 0); +} + +TEST_F(EncoderSplitTestNoLeft, TestMultipleEncodersRightReceived) { + isLeftHand = true; + encoder_init(); + + uint8_t slave_state[32] = {1, 0xFF}; // First right encoder is CCW, Second right encoder no change, third right encoder CW + encoder_update_raw(slave_state); + + EXPECT_EQ(updates_array_idx, 2); // two updates received, one for each changed item on the right side + EXPECT_EQ(updates[0].index, 3); + EXPECT_EQ(updates[0].clockwise, false); + EXPECT_EQ(updates[1].index, 4); + EXPECT_EQ(updates[1].clockwise, true); +} diff --git a/quantum/encoder/tests/encoder_tests_split_no_right.cpp b/quantum/encoder/tests/encoder_tests_split_no_right.cpp new file mode 100644 index 000000000000..c1ff58cd921e --- /dev/null +++ b/quantum/encoder/tests/encoder_tests_split_no_right.cpp @@ -0,0 +1,116 @@ +/* Copyright 2021 Balz Guenat + * + * 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 2 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 . + */ + +#include "gtest/gtest.h" +#include "gmock/gmock.h" +#include +#include +#include + +extern "C" { +#include "encoder.h" +#include "encoder/tests/mock_split.h" +} + +struct update { + int8_t index; + bool clockwise; +}; + +uint8_t updates_array_idx = 0; +update updates[32]; + +bool isLeftHand; + +bool encoder_update_kb(uint8_t index, bool clockwise) { + if (!isLeftHand) { + // this method has no effect on slave half + printf("ignoring update on right hand (%d,%s)\n", index, clockwise ? "CW" : "CC"); + return true; + } + updates[updates_array_idx % 32] = {index, clockwise}; + updates_array_idx++; + return true; +} + +bool setAndRead(pin_t pin, bool val) { + setPin(pin, val); + return encoder_read(); +} + +class EncoderSplitTestNoRight : public ::testing::Test { + protected: + void SetUp() override { + updates_array_idx = 0; + for (int i = 0; i < 32; i++) { + pinIsInputHigh[i] = 0; + pins[i] = 0; + } + } +}; + +TEST_F(EncoderSplitTestNoRight, TestInitLeft) { + isLeftHand = true; + encoder_init(); + EXPECT_EQ(pinIsInputHigh[0], true); + EXPECT_EQ(pinIsInputHigh[1], true); + EXPECT_EQ(pinIsInputHigh[2], true); + EXPECT_EQ(pinIsInputHigh[3], true); + EXPECT_EQ(updates_array_idx, 0); // no updates received +} + +TEST_F(EncoderSplitTestNoRight, TestInitRight) { + isLeftHand = false; + encoder_init(); + EXPECT_EQ(pinIsInputHigh[0], false); + EXPECT_EQ(pinIsInputHigh[1], false); + EXPECT_EQ(pinIsInputHigh[2], false); + EXPECT_EQ(pinIsInputHigh[3], false); + EXPECT_EQ(updates_array_idx, 0); // no updates received +} + +TEST_F(EncoderSplitTestNoRight, TestOneClockwiseLeft) { + isLeftHand = true; + encoder_init(); + // send 4 pulses. with resolution 4, that's one step and we should get 1 update. + setAndRead(0, false); + setAndRead(1, false); + setAndRead(0, true); + setAndRead(1, true); + + EXPECT_EQ(updates_array_idx, 0); // no updates received +} + +TEST_F(EncoderSplitTestNoRight, TestOneClockwiseRightSent) { + isLeftHand = false; + encoder_init(); + + uint8_t slave_state[32] = {0xAA}; + encoder_state_raw(slave_state); + + EXPECT_EQ(slave_state[0], 0xAA); + EXPECT_EQ(slave_state[1], 0xAA); +} + +TEST_F(EncoderSplitTestNoRight, TestMultipleEncodersRightReceived) { + isLeftHand = true; + encoder_init(); + + uint8_t slave_state[32] = {1, 0xFF}; // First right encoder is CCW, Second right encoder no change, third right encoder CW + encoder_update_raw(slave_state); + + EXPECT_EQ(updates_array_idx, 0); // no updates received -- no right-hand encoders +} diff --git a/quantum/encoder/tests/rules.mk b/quantum/encoder/tests/rules.mk index 487e6568629c..62817690e7a7 100644 --- a/quantum/encoder/tests/rules.mk +++ b/quantum/encoder/tests/rules.mk @@ -32,3 +32,21 @@ encoder_split_left_lt_right_SRC := \ $(QUANTUM_PATH)/encoder/tests/mock_split.c \ $(QUANTUM_PATH)/encoder/tests/encoder_tests_split_left_lt_right.cpp \ $(QUANTUM_PATH)/encoder.c + +encoder_split_no_left_DEFS := -DENCODER_TESTS -DENCODER_ENABLE -DENCODER_MOCK_SPLIT +encoder_split_no_left_INC := $(QUANTUM_PATH)/split_common +encoder_split_no_left_CONFIG := $(QUANTUM_PATH)/encoder/tests/config_mock_split_no_left.h + +encoder_split_no_left_SRC := \ + $(QUANTUM_PATH)/encoder/tests/mock_split.c \ + $(QUANTUM_PATH)/encoder/tests/encoder_tests_split_no_left.cpp \ + $(QUANTUM_PATH)/encoder.c + +encoder_split_no_right_DEFS := -DENCODER_TESTS -DENCODER_ENABLE -DENCODER_MOCK_SPLIT +encoder_split_no_right_INC := $(QUANTUM_PATH)/split_common +encoder_split_no_right_CONFIG := $(QUANTUM_PATH)/encoder/tests/config_mock_split_no_right.h + +encoder_split_no_right_SRC := \ + $(QUANTUM_PATH)/encoder/tests/mock_split.c \ + $(QUANTUM_PATH)/encoder/tests/encoder_tests_split_no_right.cpp \ + $(QUANTUM_PATH)/encoder.c diff --git a/quantum/encoder/tests/testlist.mk b/quantum/encoder/tests/testlist.mk index 7ef6864baccc..6b2fd84d9668 100644 --- a/quantum/encoder/tests/testlist.mk +++ b/quantum/encoder/tests/testlist.mk @@ -2,4 +2,6 @@ TEST_LIST += \ encoder \ encoder_split_left_eq_right \ encoder_split_left_gt_right \ - encoder_split_left_lt_right + encoder_split_left_lt_right \ + encoder_split_no_left \ + encoder_split_no_right From 29458b7d942220bba6aeae24748e9929d4cdf811 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sat, 5 Feb 2022 08:42:59 +1100 Subject: [PATCH 03/10] Fix no-encoder cases. --- quantum/encoder.c | 2 +- quantum/encoder/tests/encoder_tests_split_no_left.cpp | 8 ++++---- quantum/encoder/tests/encoder_tests_split_no_right.cpp | 8 +++++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/quantum/encoder.c b/quantum/encoder.c index 6730e3009e1c..053f83ec8d15 100644 --- a/quantum/encoder.c +++ b/quantum/encoder.c @@ -172,7 +172,7 @@ bool encoder_read(void) { #ifdef SPLIT_KEYBOARD void last_encoder_activity_trigger(void); -void encoder_state_raw(uint8_t *slave_state) { memcpy(slave_state, &encoder_value[thisHand], sizeof(uint8_t) * thatCount); } +void encoder_state_raw(uint8_t *slave_state) { memcpy(slave_state, &encoder_value[thisHand], sizeof(uint8_t) * thisCount); } void encoder_update_raw(uint8_t *slave_state) { bool changed = false; diff --git a/quantum/encoder/tests/encoder_tests_split_no_left.cpp b/quantum/encoder/tests/encoder_tests_split_no_left.cpp index befd24a4d776..d48a9b36a1b5 100644 --- a/quantum/encoder/tests/encoder_tests_split_no_left.cpp +++ b/quantum/encoder/tests/encoder_tests_split_no_left.cpp @@ -106,8 +106,8 @@ TEST_F(EncoderSplitTestNoLeft, TestOneClockwiseRightSent) { uint8_t slave_state[32] = {0}; encoder_state_raw(slave_state); - EXPECT_EQ(slave_state[0], 0xFF); - EXPECT_EQ(slave_state[1], 0); + EXPECT_EQ(slave_state[0], 0); + EXPECT_EQ(slave_state[1], 0xFF); } TEST_F(EncoderSplitTestNoLeft, TestMultipleEncodersRightReceived) { @@ -118,8 +118,8 @@ TEST_F(EncoderSplitTestNoLeft, TestMultipleEncodersRightReceived) { encoder_update_raw(slave_state); EXPECT_EQ(updates_array_idx, 2); // two updates received, one for each changed item on the right side - EXPECT_EQ(updates[0].index, 3); + EXPECT_EQ(updates[0].index, 0); EXPECT_EQ(updates[0].clockwise, false); - EXPECT_EQ(updates[1].index, 4); + EXPECT_EQ(updates[1].index, 1); EXPECT_EQ(updates[1].clockwise, true); } diff --git a/quantum/encoder/tests/encoder_tests_split_no_right.cpp b/quantum/encoder/tests/encoder_tests_split_no_right.cpp index c1ff58cd921e..f6253c75eec8 100644 --- a/quantum/encoder/tests/encoder_tests_split_no_right.cpp +++ b/quantum/encoder/tests/encoder_tests_split_no_right.cpp @@ -91,14 +91,16 @@ TEST_F(EncoderSplitTestNoRight, TestOneClockwiseLeft) { setAndRead(0, true); setAndRead(1, true); - EXPECT_EQ(updates_array_idx, 0); // no updates received + EXPECT_EQ(updates_array_idx, 1); // one updates received + EXPECT_EQ(updates[0].index, 0); + EXPECT_EQ(updates[0].clockwise, true); } TEST_F(EncoderSplitTestNoRight, TestOneClockwiseRightSent) { isLeftHand = false; encoder_init(); - uint8_t slave_state[32] = {0xAA}; + uint8_t slave_state[32] = {0xAA, 0xAA}; encoder_state_raw(slave_state); EXPECT_EQ(slave_state[0], 0xAA); @@ -109,7 +111,7 @@ TEST_F(EncoderSplitTestNoRight, TestMultipleEncodersRightReceived) { isLeftHand = true; encoder_init(); - uint8_t slave_state[32] = {1, 0xFF}; // First right encoder is CCW, Second right encoder no change, third right encoder CW + uint8_t slave_state[32] = {1, 0xFF}; // These values would trigger updates if there were encoders on the other side encoder_update_raw(slave_state); EXPECT_EQ(updates_array_idx, 0); // no updates received -- no right-hand encoders From fc8baa1e5dc23eefae3f89d89335295c3887c214 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sat, 5 Feb 2022 08:46:04 +1100 Subject: [PATCH 04/10] `qmk format-c -a` --- quantum/encoder/tests/config_mock_split_no_left.h | 4 ++-- quantum/encoder/tests/config_mock_split_no_right.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/quantum/encoder/tests/config_mock_split_no_left.h b/quantum/encoder/tests/config_mock_split_no_left.h index 813db0e4604b..9db7fa7e41b1 100644 --- a/quantum/encoder/tests/config_mock_split_no_left.h +++ b/quantum/encoder/tests/config_mock_split_no_left.h @@ -7,9 +7,9 @@ /* Here, "pins" from 0 to 31 are allowed. */ #define ENCODERS_PAD_A \ - { } + {} #define ENCODERS_PAD_B \ - { } + {} #define ENCODERS_PAD_A_RIGHT \ { 0, 2 } #define ENCODERS_PAD_B_RIGHT \ diff --git a/quantum/encoder/tests/config_mock_split_no_right.h b/quantum/encoder/tests/config_mock_split_no_right.h index 187375302c22..14f18015e661 100644 --- a/quantum/encoder/tests/config_mock_split_no_right.h +++ b/quantum/encoder/tests/config_mock_split_no_right.h @@ -11,9 +11,9 @@ #define ENCODERS_PAD_B \ { 1, 3 } #define ENCODERS_PAD_A_RIGHT \ - { } + {} #define ENCODERS_PAD_B_RIGHT \ - { } + {} #ifdef __cplusplus extern "C" { From a12115203a5a54ae371b74a280034d7d9e05b15c Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Mon, 7 Feb 2022 11:10:39 +1100 Subject: [PATCH 05/10] Speedup as per mtei. --- quantum/encoder.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/quantum/encoder.c b/quantum/encoder.c index 053f83ec8d15..2f37bee6d995 100644 --- a/quantum/encoder.c +++ b/quantum/encoder.c @@ -162,9 +162,12 @@ static bool encoder_update(uint8_t index, uint8_t state) { bool encoder_read(void) { bool changed = false; for (uint8_t i = 0; i < thisCount; i++) { - encoder_state[i] <<= 2; - encoder_state[i] |= (readPin(encoders_pad_a[i]) << 0) | (readPin(encoders_pad_b[i]) << 1); - changed |= encoder_update(i, encoder_state[i]); + uint8_t new_status = (readPin(encoders_pad_a[i]) << 0) | (readPin(encoders_pad_b[i]) << 1); + if ((encoder_state[i] & 0x3) != new_status) { + encoder_state[i] <<= 2; + encoder_state[i] |= new_status; + changed |= encoder_update(i, encoder_state[i]); + } } return changed; } From 4b2b955420ddc141717764ebabb0e6d93dd11256 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 6 Mar 2022 08:51:53 +1100 Subject: [PATCH 06/10] Build fix --- quantum/encoder.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/quantum/encoder.c b/quantum/encoder.c index 46d8f6789879..8c3435c777e5 100644 --- a/quantum/encoder.c +++ b/quantum/encoder.c @@ -131,7 +131,7 @@ void encoder_init(void) { setPinInputHigh(encoders_pad_b[i]); } encoder_wait_pullup_charge(); - for (int i = 0; i < NUMBER_OF_ENCODERS; i++) { + for (int i = 0; i < thisCount; i++) { encoder_state[i] = (readPin(encoders_pad_a[i]) << 0) | (readPin(encoders_pad_b[i]) << 1); } } @@ -185,13 +185,7 @@ bool encoder_read(void) { #ifdef SPLIT_KEYBOARD void last_encoder_activity_trigger(void); -<<<<<<< HEAD void encoder_state_raw(uint8_t *slave_state) { memcpy(slave_state, &encoder_value[thisHand], sizeof(uint8_t) * thisCount); } -======= -void encoder_state_raw(uint8_t* slave_state) { - memcpy(slave_state, &encoder_value[thisHand], sizeof(uint8_t) * NUMBER_OF_ENCODERS); -} ->>>>>>> upstream/develop void encoder_update_raw(uint8_t *slave_state) { bool changed = false; From 6c408a9d4a5d75b00d924c0f500db45dfb942c93 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 6 Mar 2022 08:54:01 +1100 Subject: [PATCH 07/10] `qmk format-c` --- quantum/encoder.c | 16 +++++++++------- .../tests/encoder_tests_split_left_eq_right.cpp | 10 +++++----- .../tests/encoder_tests_split_left_gt_right.cpp | 10 +++++----- .../tests/encoder_tests_split_left_lt_right.cpp | 10 +++++----- .../tests/encoder_tests_split_no_left.cpp | 10 +++++----- .../tests/encoder_tests_split_no_right.cpp | 10 +++++----- quantum/keymap.h | 8 ++++---- 7 files changed, 38 insertions(+), 36 deletions(-) diff --git a/quantum/encoder.c b/quantum/encoder.c index 8c3435c777e5..9cb09f36bfbb 100644 --- a/quantum/encoder.c +++ b/quantum/encoder.c @@ -82,7 +82,7 @@ void encoder_init(void) { thatHand = NUM_ENCODERS_LEFT - thisHand; thisCount = isLeftHand ? NUM_ENCODERS_LEFT : NUM_ENCODERS_RIGHT; thatCount = isLeftHand ? NUM_ENCODERS_RIGHT : NUM_ENCODERS_LEFT; -#else // SPLIT_KEYBOARD +#else // SPLIT_KEYBOARD thisCount = NUM_ENCODERS; #endif @@ -112,19 +112,19 @@ void encoder_init(void) { encoders_pad_b[i] = encoders_pad_b_right[i]; } } -#endif // defined(SPLIT_KEYBOARD) && defined(ENCODERS_PAD_A_RIGHT) && defined(ENCODERS_PAD_B_RIGHT) +#endif // defined(SPLIT_KEYBOARD) && defined(ENCODERS_PAD_A_RIGHT) && defined(ENCODERS_PAD_B_RIGHT) // Encoder resolutions is handled purely master-side, so concatenate the two arrays #if defined(SPLIT_KEYBOARD) && defined(ENCODER_RESOLUTIONS) # if defined(ENCODER_RESOLUTIONS_RIGHT) static const uint8_t encoder_resolutions_right[NUM_ENCODERS_RIGHT] = ENCODER_RESOLUTIONS_RIGHT; -# else // defined(ENCODER_RESOLUTIONS_RIGHT) +# else // defined(ENCODER_RESOLUTIONS_RIGHT) static const uint8_t encoder_resolutions_right[NUM_ENCODERS_RIGHT] = ENCODER_RESOLUTIONS; -# endif // defined(ENCODER_RESOLUTIONS_RIGHT) +# endif // defined(ENCODER_RESOLUTIONS_RIGHT) for (uint8_t i = 0; i < NUM_ENCODERS_RIGHT; i++) { encoder_resolutions[NUM_ENCODERS_LEFT + i] = encoder_resolutions_right[i]; } -#endif // defined(SPLIT_KEYBOARD) && defined(ENCODER_RESOLUTIONS) +#endif // defined(SPLIT_KEYBOARD) && defined(ENCODER_RESOLUTIONS) for (uint8_t i = 0; i < thisCount; i++) { setPinInputHigh(encoders_pad_a[i]); @@ -185,11 +185,13 @@ bool encoder_read(void) { #ifdef SPLIT_KEYBOARD void last_encoder_activity_trigger(void); -void encoder_state_raw(uint8_t *slave_state) { memcpy(slave_state, &encoder_value[thisHand], sizeof(uint8_t) * thisCount); } +void encoder_state_raw(uint8_t *slave_state) { + memcpy(slave_state, &encoder_value[thisHand], sizeof(uint8_t) * thisCount); +} void encoder_update_raw(uint8_t *slave_state) { bool changed = false; - for (uint8_t i = 0; i < thatCount; i++) { // Note inverted logic -- we want the opposite side + for (uint8_t i = 0; i < thatCount; i++) { // Note inverted logic -- we want the opposite side const uint8_t index = i + thatHand; int8_t delta = slave_state[i] - encoder_value[index]; while (delta > 0) { diff --git a/quantum/encoder/tests/encoder_tests_split_left_eq_right.cpp b/quantum/encoder/tests/encoder_tests_split_left_eq_right.cpp index 3cae432663f5..916e47b18517 100644 --- a/quantum/encoder/tests/encoder_tests_split_left_eq_right.cpp +++ b/quantum/encoder/tests/encoder_tests_split_left_eq_right.cpp @@ -73,7 +73,7 @@ TEST_F(EncoderSplitTestLeftEqRight, TestInitLeft) { EXPECT_EQ(pinIsInputHigh[5], false); EXPECT_EQ(pinIsInputHigh[6], false); EXPECT_EQ(pinIsInputHigh[7], false); - EXPECT_EQ(updates_array_idx, 0); // no updates received + EXPECT_EQ(updates_array_idx, 0); // no updates received } TEST_F(EncoderSplitTestLeftEqRight, TestInitRight) { @@ -87,7 +87,7 @@ TEST_F(EncoderSplitTestLeftEqRight, TestInitRight) { EXPECT_EQ(pinIsInputHigh[5], true); EXPECT_EQ(pinIsInputHigh[6], true); EXPECT_EQ(pinIsInputHigh[7], true); - EXPECT_EQ(updates_array_idx, 0); // no updates received + EXPECT_EQ(updates_array_idx, 0); // no updates received } TEST_F(EncoderSplitTestLeftEqRight, TestOneClockwiseLeft) { @@ -99,7 +99,7 @@ TEST_F(EncoderSplitTestLeftEqRight, TestOneClockwiseLeft) { setAndRead(0, true); setAndRead(1, true); - EXPECT_EQ(updates_array_idx, 1); // one update received + EXPECT_EQ(updates_array_idx, 1); // one update received EXPECT_EQ(updates[0].index, 0); EXPECT_EQ(updates[0].clockwise, true); } @@ -124,10 +124,10 @@ TEST_F(EncoderSplitTestLeftEqRight, TestMultipleEncodersRightReceived) { isLeftHand = true; encoder_init(); - uint8_t slave_state[32] = {1, 0xFF}; // First right encoder is CCW, Second right encoder CW + uint8_t slave_state[32] = {1, 0xFF}; // First right encoder is CCW, Second right encoder CW encoder_update_raw(slave_state); - EXPECT_EQ(updates_array_idx, 2); // two updates received, one for each changed item on the right side + EXPECT_EQ(updates_array_idx, 2); // two updates received, one for each changed item on the right side EXPECT_EQ(updates[0].index, 2); EXPECT_EQ(updates[0].clockwise, false); EXPECT_EQ(updates[1].index, 3); diff --git a/quantum/encoder/tests/encoder_tests_split_left_gt_right.cpp b/quantum/encoder/tests/encoder_tests_split_left_gt_right.cpp index 952491e7cf79..7b64bb298136 100644 --- a/quantum/encoder/tests/encoder_tests_split_left_gt_right.cpp +++ b/quantum/encoder/tests/encoder_tests_split_left_gt_right.cpp @@ -75,7 +75,7 @@ TEST_F(EncoderSplitTestLeftGreaterThanRight, TestInitLeft) { EXPECT_EQ(pinIsInputHigh[7], false); EXPECT_EQ(pinIsInputHigh[8], false); EXPECT_EQ(pinIsInputHigh[9], false); - EXPECT_EQ(updates_array_idx, 0); // no updates received + EXPECT_EQ(updates_array_idx, 0); // no updates received } TEST_F(EncoderSplitTestLeftGreaterThanRight, TestInitRight) { @@ -91,7 +91,7 @@ TEST_F(EncoderSplitTestLeftGreaterThanRight, TestInitRight) { EXPECT_EQ(pinIsInputHigh[7], true); EXPECT_EQ(pinIsInputHigh[8], true); EXPECT_EQ(pinIsInputHigh[9], true); - EXPECT_EQ(updates_array_idx, 0); // no updates received + EXPECT_EQ(updates_array_idx, 0); // no updates received } TEST_F(EncoderSplitTestLeftGreaterThanRight, TestOneClockwiseLeft) { @@ -103,7 +103,7 @@ TEST_F(EncoderSplitTestLeftGreaterThanRight, TestOneClockwiseLeft) { setAndRead(0, true); setAndRead(1, true); - EXPECT_EQ(updates_array_idx, 1); // one update received + EXPECT_EQ(updates_array_idx, 1); // one update received EXPECT_EQ(updates[0].index, 0); EXPECT_EQ(updates[0].clockwise, true); } @@ -128,10 +128,10 @@ TEST_F(EncoderSplitTestLeftGreaterThanRight, TestMultipleEncodersRightReceived) isLeftHand = true; encoder_init(); - uint8_t slave_state[32] = {1, 0xFF}; // First right encoder is CCW, Second right encoder no change, third right encoder CW + uint8_t slave_state[32] = {1, 0xFF}; // First right encoder is CCW, Second right encoder no change, third right encoder CW encoder_update_raw(slave_state); - EXPECT_EQ(updates_array_idx, 2); // two updates received, one for each changed item on the right side + EXPECT_EQ(updates_array_idx, 2); // two updates received, one for each changed item on the right side EXPECT_EQ(updates[0].index, 3); EXPECT_EQ(updates[0].clockwise, false); EXPECT_EQ(updates[1].index, 4); diff --git a/quantum/encoder/tests/encoder_tests_split_left_lt_right.cpp b/quantum/encoder/tests/encoder_tests_split_left_lt_right.cpp index 43ce3d1cab8b..a6519c576257 100644 --- a/quantum/encoder/tests/encoder_tests_split_left_lt_right.cpp +++ b/quantum/encoder/tests/encoder_tests_split_left_lt_right.cpp @@ -75,7 +75,7 @@ TEST_F(EncoderSplitTestLeftLessThanRight, TestInitLeft) { EXPECT_EQ(pinIsInputHigh[7], false); EXPECT_EQ(pinIsInputHigh[8], false); EXPECT_EQ(pinIsInputHigh[9], false); - EXPECT_EQ(updates_array_idx, 0); // no updates received + EXPECT_EQ(updates_array_idx, 0); // no updates received } TEST_F(EncoderSplitTestLeftLessThanRight, TestInitRight) { @@ -91,7 +91,7 @@ TEST_F(EncoderSplitTestLeftLessThanRight, TestInitRight) { EXPECT_EQ(pinIsInputHigh[7], true); EXPECT_EQ(pinIsInputHigh[8], true); EXPECT_EQ(pinIsInputHigh[9], true); - EXPECT_EQ(updates_array_idx, 0); // no updates received + EXPECT_EQ(updates_array_idx, 0); // no updates received } TEST_F(EncoderSplitTestLeftLessThanRight, TestOneClockwiseLeft) { @@ -103,7 +103,7 @@ TEST_F(EncoderSplitTestLeftLessThanRight, TestOneClockwiseLeft) { setAndRead(0, true); setAndRead(1, true); - EXPECT_EQ(updates_array_idx, 1); // one update received + EXPECT_EQ(updates_array_idx, 1); // one update received EXPECT_EQ(updates[0].index, 0); EXPECT_EQ(updates[0].clockwise, true); } @@ -128,10 +128,10 @@ TEST_F(EncoderSplitTestLeftLessThanRight, TestMultipleEncodersRightReceived) { isLeftHand = true; encoder_init(); - uint8_t slave_state[32] = {1, 0, 0xFF}; // First right encoder is CCW, Second right encoder no change, third right encoder CW + uint8_t slave_state[32] = {1, 0, 0xFF}; // First right encoder is CCW, Second right encoder no change, third right encoder CW encoder_update_raw(slave_state); - EXPECT_EQ(updates_array_idx, 2); // two updates received, one for each changed item on the right side + EXPECT_EQ(updates_array_idx, 2); // two updates received, one for each changed item on the right side EXPECT_EQ(updates[0].index, 2); EXPECT_EQ(updates[0].clockwise, false); EXPECT_EQ(updates[1].index, 4); diff --git a/quantum/encoder/tests/encoder_tests_split_no_left.cpp b/quantum/encoder/tests/encoder_tests_split_no_left.cpp index d48a9b36a1b5..b6b2d7e2d19a 100644 --- a/quantum/encoder/tests/encoder_tests_split_no_left.cpp +++ b/quantum/encoder/tests/encoder_tests_split_no_left.cpp @@ -69,7 +69,7 @@ TEST_F(EncoderSplitTestNoLeft, TestInitLeft) { EXPECT_EQ(pinIsInputHigh[1], false); EXPECT_EQ(pinIsInputHigh[2], false); EXPECT_EQ(pinIsInputHigh[3], false); - EXPECT_EQ(updates_array_idx, 0); // no updates received + EXPECT_EQ(updates_array_idx, 0); // no updates received } TEST_F(EncoderSplitTestNoLeft, TestInitRight) { @@ -79,7 +79,7 @@ TEST_F(EncoderSplitTestNoLeft, TestInitRight) { EXPECT_EQ(pinIsInputHigh[1], true); EXPECT_EQ(pinIsInputHigh[2], true); EXPECT_EQ(pinIsInputHigh[3], true); - EXPECT_EQ(updates_array_idx, 0); // no updates received + EXPECT_EQ(updates_array_idx, 0); // no updates received } TEST_F(EncoderSplitTestNoLeft, TestOneClockwiseLeft) { @@ -91,7 +91,7 @@ TEST_F(EncoderSplitTestNoLeft, TestOneClockwiseLeft) { setAndRead(0, true); setAndRead(1, true); - EXPECT_EQ(updates_array_idx, 0); // no updates received + EXPECT_EQ(updates_array_idx, 0); // no updates received } TEST_F(EncoderSplitTestNoLeft, TestOneClockwiseRightSent) { @@ -114,10 +114,10 @@ TEST_F(EncoderSplitTestNoLeft, TestMultipleEncodersRightReceived) { isLeftHand = true; encoder_init(); - uint8_t slave_state[32] = {1, 0xFF}; // First right encoder is CCW, Second right encoder no change, third right encoder CW + uint8_t slave_state[32] = {1, 0xFF}; // First right encoder is CCW, Second right encoder no change, third right encoder CW encoder_update_raw(slave_state); - EXPECT_EQ(updates_array_idx, 2); // two updates received, one for each changed item on the right side + EXPECT_EQ(updates_array_idx, 2); // two updates received, one for each changed item on the right side EXPECT_EQ(updates[0].index, 0); EXPECT_EQ(updates[0].clockwise, false); EXPECT_EQ(updates[1].index, 1); diff --git a/quantum/encoder/tests/encoder_tests_split_no_right.cpp b/quantum/encoder/tests/encoder_tests_split_no_right.cpp index f6253c75eec8..fa0a7c18a806 100644 --- a/quantum/encoder/tests/encoder_tests_split_no_right.cpp +++ b/quantum/encoder/tests/encoder_tests_split_no_right.cpp @@ -69,7 +69,7 @@ TEST_F(EncoderSplitTestNoRight, TestInitLeft) { EXPECT_EQ(pinIsInputHigh[1], true); EXPECT_EQ(pinIsInputHigh[2], true); EXPECT_EQ(pinIsInputHigh[3], true); - EXPECT_EQ(updates_array_idx, 0); // no updates received + EXPECT_EQ(updates_array_idx, 0); // no updates received } TEST_F(EncoderSplitTestNoRight, TestInitRight) { @@ -79,7 +79,7 @@ TEST_F(EncoderSplitTestNoRight, TestInitRight) { EXPECT_EQ(pinIsInputHigh[1], false); EXPECT_EQ(pinIsInputHigh[2], false); EXPECT_EQ(pinIsInputHigh[3], false); - EXPECT_EQ(updates_array_idx, 0); // no updates received + EXPECT_EQ(updates_array_idx, 0); // no updates received } TEST_F(EncoderSplitTestNoRight, TestOneClockwiseLeft) { @@ -91,7 +91,7 @@ TEST_F(EncoderSplitTestNoRight, TestOneClockwiseLeft) { setAndRead(0, true); setAndRead(1, true); - EXPECT_EQ(updates_array_idx, 1); // one updates received + EXPECT_EQ(updates_array_idx, 1); // one updates received EXPECT_EQ(updates[0].index, 0); EXPECT_EQ(updates[0].clockwise, true); } @@ -111,8 +111,8 @@ TEST_F(EncoderSplitTestNoRight, TestMultipleEncodersRightReceived) { isLeftHand = true; encoder_init(); - uint8_t slave_state[32] = {1, 0xFF}; // These values would trigger updates if there were encoders on the other side + uint8_t slave_state[32] = {1, 0xFF}; // These values would trigger updates if there were encoders on the other side encoder_update_raw(slave_state); - EXPECT_EQ(updates_array_idx, 0); // no updates received -- no right-hand encoders + EXPECT_EQ(updates_array_idx, 0); // no updates received -- no right-hand encoders } diff --git a/quantum/keymap.h b/quantum/keymap.h index e87349a1d7fe..2fe8471e22d1 100644 --- a/quantum/keymap.h +++ b/quantum/keymap.h @@ -61,13 +61,13 @@ extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; # define NUM_ENCODERS_RIGHT NUM_ENCODERS_LEFT # endif # define NUM_ENCODERS (NUM_ENCODERS_LEFT + NUM_ENCODERS_RIGHT) -# else // SPLIT_KEYBOARD +# else // SPLIT_KEYBOARD # define NUM_ENCODERS (sizeof(((pin_t[])ENCODERS_PAD_A)) / sizeof(pin_t)) # define NUM_ENCODERS_LEFT NUM_ENCODERS # define NUM_ENCODERS_RIGHT 0 -# endif // SPLIT_KEYBOARD +# endif // SPLIT_KEYBOARD # define NUM_ENCODERS_MAX_PER_SIDE MAX(NUM_ENCODERS_LEFT, NUM_ENCODERS_RIGHT) -#else // defined(ENCODER_ENABLE) +#else // defined(ENCODER_ENABLE) # define NUM_ENCODERS 0 # define NUM_ENCODERS_MAX_PER_SIDE NUM_ENCODERS -#endif // defined(ENCODER_ENABLE) +#endif // defined(ENCODER_ENABLE) From 1769f4f3f4fd666c18aad2f203c9d29f29a823b0 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 6 Mar 2022 09:00:25 +1100 Subject: [PATCH 08/10] Fix unit tests, consistency with datatypes. --- quantum/encoder.c | 2 +- quantum/encoder/tests/rules.mk | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/quantum/encoder.c b/quantum/encoder.c index 9cb09f36bfbb..c295329e0004 100644 --- a/quantum/encoder.c +++ b/quantum/encoder.c @@ -131,7 +131,7 @@ void encoder_init(void) { setPinInputHigh(encoders_pad_b[i]); } encoder_wait_pullup_charge(); - for (int i = 0; i < thisCount; i++) { + for (uint8_t i = 0; i < thisCount; i++) { encoder_state[i] = (readPin(encoders_pad_a[i]) << 0) | (readPin(encoders_pad_b[i]) << 1); } } diff --git a/quantum/encoder/tests/rules.mk b/quantum/encoder/tests/rules.mk index 62817690e7a7..6a2611952cd7 100644 --- a/quantum/encoder/tests/rules.mk +++ b/quantum/encoder/tests/rules.mk @@ -2,6 +2,7 @@ encoder_DEFS := -DENCODER_TESTS -DENCODER_ENABLE -DENCODER_MOCK_SINGLE encoder_CONFIG := $(QUANTUM_PATH)/encoder/tests/config_mock.h encoder_SRC := \ + platforms/test/timer.c \ $(QUANTUM_PATH)/encoder/tests/mock.c \ $(QUANTUM_PATH)/encoder/tests/encoder_tests.cpp \ $(QUANTUM_PATH)/encoder.c @@ -11,6 +12,7 @@ encoder_split_left_eq_right_INC := $(QUANTUM_PATH)/split_common encoder_split_left_eq_right_CONFIG := $(QUANTUM_PATH)/encoder/tests/config_mock_split_left_eq_right.h encoder_split_left_eq_right_SRC := \ + platforms/test/timer.c \ $(QUANTUM_PATH)/encoder/tests/mock_split.c \ $(QUANTUM_PATH)/encoder/tests/encoder_tests_split_left_eq_right.cpp \ $(QUANTUM_PATH)/encoder.c @@ -20,6 +22,7 @@ encoder_split_left_gt_right_INC := $(QUANTUM_PATH)/split_common encoder_split_left_gt_right_CONFIG := $(QUANTUM_PATH)/encoder/tests/config_mock_split_left_gt_right.h encoder_split_left_gt_right_SRC := \ + platforms/test/timer.c \ $(QUANTUM_PATH)/encoder/tests/mock_split.c \ $(QUANTUM_PATH)/encoder/tests/encoder_tests_split_left_gt_right.cpp \ $(QUANTUM_PATH)/encoder.c @@ -29,6 +32,7 @@ encoder_split_left_lt_right_INC := $(QUANTUM_PATH)/split_common encoder_split_left_lt_right_CONFIG := $(QUANTUM_PATH)/encoder/tests/config_mock_split_left_lt_right.h encoder_split_left_lt_right_SRC := \ + platforms/test/timer.c \ $(QUANTUM_PATH)/encoder/tests/mock_split.c \ $(QUANTUM_PATH)/encoder/tests/encoder_tests_split_left_lt_right.cpp \ $(QUANTUM_PATH)/encoder.c @@ -38,6 +42,7 @@ encoder_split_no_left_INC := $(QUANTUM_PATH)/split_common encoder_split_no_left_CONFIG := $(QUANTUM_PATH)/encoder/tests/config_mock_split_no_left.h encoder_split_no_left_SRC := \ + platforms/test/timer.c \ $(QUANTUM_PATH)/encoder/tests/mock_split.c \ $(QUANTUM_PATH)/encoder/tests/encoder_tests_split_no_left.cpp \ $(QUANTUM_PATH)/encoder.c @@ -47,6 +52,7 @@ encoder_split_no_right_INC := $(QUANTUM_PATH)/split_common encoder_split_no_right_CONFIG := $(QUANTUM_PATH)/encoder/tests/config_mock_split_no_right.h encoder_split_no_right_SRC := \ + platforms/test/timer.c \ $(QUANTUM_PATH)/encoder/tests/mock_split.c \ $(QUANTUM_PATH)/encoder/tests/encoder_tests_split_no_right.cpp \ $(QUANTUM_PATH)/encoder.c From e9b9e71fe8807e7545f4009685b9dcf44348ddc6 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 6 Mar 2022 10:19:42 +1100 Subject: [PATCH 09/10] Decouple encoder counts from keymap.h --- quantum/encoder.c | 1 - quantum/encoder.h | 28 +++++++++++++++++++++++++++- quantum/keymap.h | 22 ---------------------- quantum/split_common/transport.h | 2 -- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/quantum/encoder.c b/quantum/encoder.c index c295329e0004..0a3d6f577c38 100644 --- a/quantum/encoder.c +++ b/quantum/encoder.c @@ -19,7 +19,6 @@ #ifdef SPLIT_KEYBOARD # include "split_util.h" #endif -#include "keymap.h" // for memcpy #include diff --git a/quantum/encoder.h b/quantum/encoder.h index 25dc77721da9..dd6db1462986 100644 --- a/quantum/encoder.h +++ b/quantum/encoder.h @@ -18,6 +18,7 @@ #pragma once #include "quantum.h" +#include "util.h" void encoder_init(void); bool encoder_read(void); @@ -26,6 +27,31 @@ bool encoder_update_kb(uint8_t index, bool clockwise); bool encoder_update_user(uint8_t index, bool clockwise); #ifdef SPLIT_KEYBOARD + void encoder_state_raw(uint8_t* slave_state); void encoder_update_raw(uint8_t* slave_state); -#endif + +# if defined(ENCODERS_PAD_A_RIGHT) +# define NUM_ENCODERS_LEFT (sizeof(((pin_t[])ENCODERS_PAD_A)) / sizeof(pin_t)) +# define NUM_ENCODERS_RIGHT (sizeof(((pin_t[])ENCODERS_PAD_A_RIGHT)) / sizeof(pin_t)) +# else +# define NUM_ENCODERS_LEFT (sizeof(((pin_t[])ENCODERS_PAD_A)) / sizeof(pin_t)) +# define NUM_ENCODERS_RIGHT NUM_ENCODERS_LEFT +# endif +# define NUM_ENCODERS (NUM_ENCODERS_LEFT + NUM_ENCODERS_RIGHT) + +#else // SPLIT_KEYBOARD + +# define NUM_ENCODERS (sizeof(((pin_t[])ENCODERS_PAD_A)) / sizeof(pin_t)) +# define NUM_ENCODERS_LEFT NUM_ENCODERS +# define NUM_ENCODERS_RIGHT 0 + +#endif // SPLIT_KEYBOARD + +#ifndef NUM_ENCODERS +# define NUM_ENCODERS 0 +# define NUM_ENCODERS_LEFT 0 +# define NUM_ENCODERS_RIGHT 0 +#endif // NUM_ENCODERS + +#define NUM_ENCODERS_MAX_PER_SIDE MAX(NUM_ENCODERS_LEFT, NUM_ENCODERS_RIGHT) diff --git a/quantum/keymap.h b/quantum/keymap.h index 2fe8471e22d1..2ee2e1b57625 100644 --- a/quantum/keymap.h +++ b/quantum/keymap.h @@ -31,7 +31,6 @@ along with this program. If not, see . #include "host.h" // #include "print.h" #include "debug.h" -#include "util.h" #include "keycode_config.h" // ChibiOS uses RESET in its FlagStatus enumeration @@ -50,24 +49,3 @@ along with this program. If not, see . uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; - -#if defined(ENCODER_ENABLE) -# ifdef SPLIT_KEYBOARD -# if defined(ENCODERS_PAD_A_RIGHT) -# define NUM_ENCODERS_LEFT (sizeof(((pin_t[])ENCODERS_PAD_A)) / sizeof(pin_t)) -# define NUM_ENCODERS_RIGHT (sizeof(((pin_t[])ENCODERS_PAD_A_RIGHT)) / sizeof(pin_t)) -# else -# define NUM_ENCODERS_LEFT (sizeof(((pin_t[])ENCODERS_PAD_A)) / sizeof(pin_t)) -# define NUM_ENCODERS_RIGHT NUM_ENCODERS_LEFT -# endif -# define NUM_ENCODERS (NUM_ENCODERS_LEFT + NUM_ENCODERS_RIGHT) -# else // SPLIT_KEYBOARD -# define NUM_ENCODERS (sizeof(((pin_t[])ENCODERS_PAD_A)) / sizeof(pin_t)) -# define NUM_ENCODERS_LEFT NUM_ENCODERS -# define NUM_ENCODERS_RIGHT 0 -# endif // SPLIT_KEYBOARD -# define NUM_ENCODERS_MAX_PER_SIDE MAX(NUM_ENCODERS_LEFT, NUM_ENCODERS_RIGHT) -#else // defined(ENCODER_ENABLE) -# define NUM_ENCODERS 0 -# define NUM_ENCODERS_MAX_PER_SIDE NUM_ENCODERS -#endif // defined(ENCODER_ENABLE) diff --git a/quantum/split_common/transport.h b/quantum/split_common/transport.h index 2e07221d67e7..e62679990adb 100644 --- a/quantum/split_common/transport.h +++ b/quantum/split_common/transport.h @@ -42,8 +42,6 @@ bool transport_execute_transaction(int8_t id, const void *initiator2target_buf, #ifdef ENCODER_ENABLE # include "encoder.h" -# include "keymap.h" -# define NUMBER_OF_ENCODERS (sizeof((pin_t[])ENCODERS_PAD_A) / sizeof(pin_t)) #endif // ENCODER_ENABLE #ifdef BACKLIGHT_ENABLE From f45952873f3a9326a8ffab3678c38794a2ef4848 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 6 Mar 2022 10:40:54 +1100 Subject: [PATCH 10/10] Docs example for a right-side only encoder. --- docs/feature_encoders.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/feature_encoders.md b/docs/feature_encoders.md index 6a1a3750a6cb..f71c7e73259f 100644 --- a/docs/feature_encoders.md +++ b/docs/feature_encoders.md @@ -54,6 +54,19 @@ If you are using different pinouts for the encoders on each half of a split keyb #define ENCODER_RESOLUTIONS_RIGHT { 2, 4 } ``` +If the `_RIGHT` definitions aren't specified in your `config.h`, then the non-`_RIGHT` versions will be applied to both sides of the split. + +Additionally, if one side does not have an encoder, you can specify `{}` for the pins/resolution -- for example, a split keyboard with only a right-side encoder: + +```c +#define ENCODERS_PAD_A { } +#define ENCODERS_PAD_B { } +#define ENCODER_RESOLUTIONS { } +#define ENCODERS_PAD_A_RIGHT { B12 } +#define ENCODERS_PAD_B_RIGHT { B13 } +#define ENCODER_RESOLUTIONS_RIGHT { 4 } +``` + ## Callbacks The callback functions can be inserted into your `.c`: