Skip to content

Commit

Permalink
Updated slave encoder sync to reduce dropped pulses - v2 (#7505)
Browse files Browse the repository at this point in the history
* Updated slave encoder sync to reduce dropped pulses

* Fixing encoder direction

* Encoder behavior fixes, tested

* Update keyboards/rgbkb/sol/keymaps/xulkal/rules.mk

To make fauxpark happy

Co-Authored-By: fauxpark <[email protected]>

* Update custom_encoder.c

* Update rules.mk

* Iris r4 fix

* More fixes for Iris & Kira

* Fix for right master encoders
  • Loading branch information
XScorpion2 authored and drashna committed Dec 8, 2019
1 parent 34f302e commit 201c5bf
Showing 1 changed file with 30 additions and 16 deletions.
46 changes: 30 additions & 16 deletions quantum/encoder.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,15 @@ static pin_t encoders_pad_b[] = ENCODERS_PAD_B;
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};

#ifdef SPLIT_KEYBOARD
// right half encoders come over as second set of encoders
static int8_t encoder_value[NUMBER_OF_ENCODERS * 2] = {0};
static uint8_t encoder_value[NUMBER_OF_ENCODERS * 2] = {0};
// row offsets for each hand
static uint8_t thisHand, thatHand;
#else
static int8_t encoder_value[NUMBER_OF_ENCODERS] = {0};
static uint8_t encoder_value[NUMBER_OF_ENCODERS] = {0};
#endif

__attribute__((weak)) void encoder_update_user(int8_t index, bool clockwise) {}
Expand Down Expand Up @@ -78,34 +79,47 @@ void encoder_init(void) {
}

static void encoder_update(int8_t index, uint8_t state) {
encoder_value[index] += encoder_LUT[state & 0xF];
if (encoder_value[index] >= ENCODER_RESOLUTION) {
encoder_update_kb(index, false);
}
if (encoder_value[index] <= -ENCODER_RESOLUTION) { // direction is arbitrary here, but this clockwise
uint8_t i = index;
#ifdef SPLIT_KEYBOARD
index += thisHand;
#endif
encoder_pulses[i] += encoder_LUT[state & 0xF];
if (encoder_pulses[i] >= ENCODER_RESOLUTION) {
encoder_value[index]++;
encoder_update_kb(index, true);
}
encoder_value[index] %= ENCODER_RESOLUTION;
if (encoder_pulses[i] <= -ENCODER_RESOLUTION) { // direction is arbitrary here, but this clockwise
encoder_value[index]--;
encoder_update_kb(index, false);
}
encoder_pulses[i] %= ENCODER_RESOLUTION;
}

void encoder_read(void) {
for (int i = 0; i < NUMBER_OF_ENCODERS; i++) {
for (uint8_t i = 0; i < NUMBER_OF_ENCODERS; i++) {
encoder_state[i] <<= 2;
encoder_state[i] |= (readPin(encoders_pad_a[i]) << 0) | (readPin(encoders_pad_b[i]) << 1);
#if SPLIT_KEYBOARD
encoder_update(i + thisHand, encoder_state[i]);
#else
encoder_update(i, encoder_state[i]);
#endif
}
}

#ifdef SPLIT_KEYBOARD
void encoder_state_raw(uint8_t* slave_state) { memcpy(slave_state, encoder_state, sizeof(encoder_state)); }
void encoder_state_raw(uint8_t* slave_state) { memcpy(slave_state, &encoder_value[thisHand], sizeof(uint8_t) * NUMBER_OF_ENCODERS); }

void encoder_update_raw(uint8_t* slave_state) {
for (int i = 0; i < NUMBER_OF_ENCODERS; i++) {
encoder_update(i + thatHand, slave_state[i]);
for (uint8_t i = 0; i < NUMBER_OF_ENCODERS; i++) {
uint8_t index = i + thatHand;
int8_t delta = slave_state[i] - encoder_value[index];
while (delta > 0) {
delta--;
encoder_value[index]++;
encoder_update_kb(index, true);
}
while (delta < 0) {
delta++;
encoder_value[index]--;
encoder_update_kb(index, false);
}
}
}
#endif

1 comment on commit 201c5bf

@Zurga
Copy link

@Zurga Zurga commented on 201c5bf Jan 18, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After reverting this commit, my Keebio Iris V4 has the expected behaviour for my right encoder. The right halve is also the slave side, i have not tried this commit and changing the master and slave sides though. If you want to test code, please let me know, I am happy to test things out. Sorry if there is already an issue which mentions my problems and if I am commenting in the wrong place.

Please sign in to comment.