aboutsummaryrefslogtreecommitdiff
path: root/quantum/encoder.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/encoder.c')
-rw-r--r--quantum/encoder.c42
1 files changed, 25 insertions, 17 deletions
diff --git a/quantum/encoder.c b/quantum/encoder.c
index b3b1cd9f2..36a6403b3 100644
--- a/quantum/encoder.c
+++ b/quantum/encoder.c
@@ -40,8 +40,10 @@ static int8_t encoder_LUT[] = {0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1,
40static uint8_t encoder_state[NUMBER_OF_ENCODERS] = {0}; 40static uint8_t encoder_state[NUMBER_OF_ENCODERS] = {0};
41 41
42#ifdef SPLIT_KEYBOARD 42#ifdef SPLIT_KEYBOARD
43// slave half encoders come over as second set of encoders 43// right half encoders come over as second set of encoders
44static int8_t encoder_value[NUMBER_OF_ENCODERS * 2] = {0}; 44static int8_t encoder_value[NUMBER_OF_ENCODERS * 2] = {0};
45// row offsets for each hand
46static uint8_t thisHand, thatHand;
45#else 47#else
46static int8_t encoder_value[NUMBER_OF_ENCODERS] = {0}; 48static int8_t encoder_value[NUMBER_OF_ENCODERS] = {0};
47#endif 49#endif
@@ -68,20 +70,33 @@ void encoder_init(void) {
68 70
69 encoder_state[i] = (readPin(encoders_pad_a[i]) << 0) | (readPin(encoders_pad_b[i]) << 1); 71 encoder_state[i] = (readPin(encoders_pad_a[i]) << 0) | (readPin(encoders_pad_b[i]) << 1);
70 } 72 }
73
74#ifdef SPLIT_KEYBOARD
75 thisHand = isLeftHand ? 0 : NUMBER_OF_ENCODERS;
76 thatHand = NUMBER_OF_ENCODERS - thisHand;
77#endif
78}
79
80static void encoder_update(int8_t index, uint8_t state) {
81 encoder_value[index] += encoder_LUT[state & 0xF];
82 if (encoder_value[index] >= ENCODER_RESOLUTION) {
83 encoder_update_kb(index, false);
84 }
85 if (encoder_value[index] <= -ENCODER_RESOLUTION) { // direction is arbitrary here, but this clockwise
86 encoder_update_kb(index, true);
87 }
88 encoder_value[index] %= ENCODER_RESOLUTION;
71} 89}
72 90
73void encoder_read(void) { 91void encoder_read(void) {
74 for (int i = 0; i < NUMBER_OF_ENCODERS; i++) { 92 for (int i = 0; i < NUMBER_OF_ENCODERS; i++) {
75 encoder_state[i] <<= 2; 93 encoder_state[i] <<= 2;
76 encoder_state[i] |= (readPin(encoders_pad_a[i]) << 0) | (readPin(encoders_pad_b[i]) << 1); 94 encoder_state[i] |= (readPin(encoders_pad_a[i]) << 0) | (readPin(encoders_pad_b[i]) << 1);
77 encoder_value[i] += encoder_LUT[encoder_state[i] & 0xF]; 95#if SPLIT_KEYBOARD
78 if (encoder_value[i] >= ENCODER_RESOLUTION) { 96 encoder_update(i + thisHand, encoder_state[i]);
79 encoder_update_kb(i, false); 97#else
80 } 98 encoder_update(i, encoder_state[i]);
81 if (encoder_value[i] <= -ENCODER_RESOLUTION) { // direction is arbitrary here, but this clockwise 99#endif
82 encoder_update_kb(i, true);
83 }
84 encoder_value[i] %= ENCODER_RESOLUTION;
85 } 100 }
86} 101}
87 102
@@ -90,14 +105,7 @@ void encoder_state_raw(uint8_t* slave_state) { memcpy(slave_state, encoder_state
90 105
91void encoder_update_raw(uint8_t* slave_state) { 106void encoder_update_raw(uint8_t* slave_state) {
92 for (int i = 0; i < NUMBER_OF_ENCODERS; i++) { 107 for (int i = 0; i < NUMBER_OF_ENCODERS; i++) {
93 encoder_value[NUMBER_OF_ENCODERS + i] += encoder_LUT[slave_state[i] & 0xF]; 108 encoder_update(i + thatHand, slave_state[i]);
94 if (encoder_value[NUMBER_OF_ENCODERS + i] >= ENCODER_RESOLUTION) {
95 encoder_update_kb(NUMBER_OF_ENCODERS + i, false);
96 }
97 if (encoder_value[NUMBER_OF_ENCODERS + i] <= -ENCODER_RESOLUTION) { // direction is arbitrary here, but this clockwise
98 encoder_update_kb(NUMBER_OF_ENCODERS + i, true);
99 }
100 encoder_value[NUMBER_OF_ENCODERS + i] %= ENCODER_RESOLUTION;
101 } 109 }
102} 110}
103#endif 111#endif