diff options
author | Nick Brassel <nick@tzarc.org> | 2024-02-18 21:17:15 +1100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-18 21:17:15 +1100 |
commit | 9d9cdaaa2d035787b0b50c26f2975695fdbc16f4 (patch) | |
tree | 1a9f5d16ffc0e3bd27bc14791c25405a79ccd069 /keyboards/pica40/rev2 | |
parent | 2eb9ff8efd1df2c98724481c71c8ab8a5b62e31e (diff) |
Add encoder abstraction. (#21548)
Diffstat (limited to 'keyboards/pica40/rev2')
-rw-r--r-- | keyboards/pica40/rev2/post_rules.mk | 8 | ||||
-rw-r--r-- | keyboards/pica40/rev2/rev2.c | 98 |
2 files changed, 17 insertions, 89 deletions
diff --git a/keyboards/pica40/rev2/post_rules.mk b/keyboards/pica40/rev2/post_rules.mk deleted file mode 100644 index e4dda1925b..0000000000 --- a/keyboards/pica40/rev2/post_rules.mk +++ /dev/null @@ -1,8 +0,0 @@ -# if ENCODER_ENABLE is set, add defines but avoid adding encoder.c as it's replaced by custom code in rev2.c -ifeq ($(strip $(ENCODER_ENABLE)), yes) - ENCODER_ENABLE := no - OPT_DEFS += -DENCODER_ENABLE - ifeq ($(strip $(ENCODER_MAP_ENABLE)), yes) - OPT_DEFS += -DENCODER_MAP_ENABLE - endif -endif diff --git a/keyboards/pica40/rev2/rev2.c b/keyboards/pica40/rev2/rev2.c index c585ec56d6..2ee73dcc6b 100644 --- a/keyboards/pica40/rev2/rev2.c +++ b/keyboards/pica40/rev2/rev2.c @@ -2,99 +2,29 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include "rev2.h" +#include "gpio.h" #ifdef ENCODER_ENABLE // code based on encoder.c -static const pin_t encoders_pad_a[] = ENCODERS_PAD_A; -static const 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 = 3; -static int8_t encoder_pulses = 0; -static uint8_t encoder_value = 0; - -typedef struct encoder_sync_data { - int value; -} encoder_sync_data; +#define ENCODER_PIN_A (((pin_t[])ENCODERS_PAD_A)[0]) +#define ENCODER_PIN_B (((pin_t[])ENCODERS_PAD_B)[0]) // custom handler that returns encoder B pin status from slave side void encoder_sync_slave_handler(uint8_t in_buflen, const void *in_data, uint8_t out_buflen, void *out_data) { - encoder_sync_data *data = (encoder_sync_data *)out_data; - data->value = readPin(encoders_pad_b[0]); -} - -__attribute__((weak)) bool encoder_update_user(uint8_t index, bool clockwise) { - return true; + *(uint8_t *)out_data = readPin(ENCODER_PIN_B) ? 1 : 0; } -bool encoder_update_kb(uint8_t index, bool clockwise) { - if (!encoder_update_user(index, clockwise)) return false; - - tap_code(clockwise ? KC_VOLU : KC_VOLD); +void encoder_quadrature_init_pin(uint8_t index, bool pad_b) {} - return false; -} - -#ifdef ENCODER_MAP_ENABLE -static void encoder_exec_mapping(uint8_t index, bool clockwise) { - action_exec(clockwise ? ENCODER_CW_EVENT(index, true) : ENCODER_CCW_EVENT(index, true)); - wait_ms(ENCODER_MAP_KEY_DELAY); - action_exec(clockwise ? ENCODER_CW_EVENT(index, false) : ENCODER_CCW_EVENT(index, false)); - wait_ms(ENCODER_MAP_KEY_DELAY); -} -#endif // ENCODER_MAP_ENABLE - -void encoder_init(void) { - setPinInputHigh(encoders_pad_a[0]); - setPinInputHigh(encoders_pad_b[0]); - wait_us(100); - transaction_register_rpc(ENCODER_SYNC, encoder_sync_slave_handler); -} - -bool encoder_read(void) { - // ignore if running on slave side - if (!is_keyboard_master()) return false; - - bool changed = false; - encoder_sync_data data = {0}; - // request pin B status from slave side - if (transaction_rpc_recv(ENCODER_SYNC, sizeof(data), &data)) { - uint8_t new_status = (readPin(encoders_pad_a[0]) << 0) | (data.value << 1); - if ((encoder_state & 0x3) != new_status) { - encoder_state <<= 2; - encoder_state |= new_status; - encoder_pulses += encoder_LUT[encoder_state & 0xF]; - - if (encoder_pulses >= ENCODER_RESOLUTION) { - encoder_value++; - changed = true; -#ifdef ENCODER_MAP_ENABLE - encoder_exec_mapping(0, false); -#else // ENCODER_MAP_ENABLE - encoder_update_kb(0, false); -#endif // ENCODER_MAP_ENABLE - } - - if (encoder_pulses <= -ENCODER_RESOLUTION) { - encoder_value--; - changed = true; -#ifdef ENCODER_MAP_ENABLE - encoder_exec_mapping(0, true); -#else // ENCODER_MAP_ENABLE - encoder_update_kb(0, true); -#endif // ENCODER_MAP_ENABLE - } - - encoder_pulses %= ENCODER_RESOLUTION; - } +uint8_t encoder_quadrature_read_pin(uint8_t index, bool pad_b) { + if(pad_b) { + uint8_t data = 0; + transaction_rpc_recv(ENCODER_SYNC, sizeof(data), &data); + return data; } - return changed; + return readPin(ENCODER_PIN_A) ? 1 : 0; } -// do not use standard split encoder transactions -void encoder_state_raw(uint8_t *slave_state) {} -void encoder_update_raw(uint8_t *slave_state) {} - #endif // ENCODER_ENABLE #ifdef PICA40_RGBLIGHT_TIMEOUT @@ -125,6 +55,12 @@ bool should_set_rgblight = false; void keyboard_post_init_kb(void) { setPinOutput(PICA40_RGB_POWER_PIN); +#ifdef ENCODER_ENABLE + setPinInputHigh(ENCODER_PIN_A); + setPinInputHigh(ENCODER_PIN_B); + transaction_register_rpc(ENCODER_SYNC, encoder_sync_slave_handler); +#endif // ENCODER_ENABLE + #ifdef PICA40_RGBLIGHT_TIMEOUT idle_timer = timer_read(); check_rgblight_timer = timer_read(); |