summaryrefslogtreecommitdiff
path: root/keyboards/pica40
diff options
context:
space:
mode:
authorNick Brassel <nick@tzarc.org>2024-02-18 21:17:15 +1100
committerGitHub <noreply@github.com>2024-02-18 21:17:15 +1100
commit9d9cdaaa2d035787b0b50c26f2975695fdbc16f4 (patch)
tree1a9f5d16ffc0e3bd27bc14791c25405a79ccd069 /keyboards/pica40
parent2eb9ff8efd1df2c98724481c71c8ab8a5b62e31e (diff)
Add encoder abstraction. (#21548)
Diffstat (limited to 'keyboards/pica40')
-rw-r--r--keyboards/pica40/rev2/post_rules.mk8
-rw-r--r--keyboards/pica40/rev2/rev2.c98
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();