diff options
Diffstat (limited to 'quantum/encoder.c')
-rw-r--r-- | quantum/encoder.c | 42 |
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, | |||
40 | static uint8_t encoder_state[NUMBER_OF_ENCODERS] = {0}; | 40 | static 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 |
44 | static int8_t encoder_value[NUMBER_OF_ENCODERS * 2] = {0}; | 44 | static int8_t encoder_value[NUMBER_OF_ENCODERS * 2] = {0}; |
45 | // row offsets for each hand | ||
46 | static uint8_t thisHand, thatHand; | ||
45 | #else | 47 | #else |
46 | static int8_t encoder_value[NUMBER_OF_ENCODERS] = {0}; | 48 | static 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 | |||
80 | static 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 | ||
73 | void encoder_read(void) { | 91 | void 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 | ||
91 | void encoder_update_raw(uint8_t* slave_state) { | 106 | void 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 |