From 2ba67329bdadd68d78235846fb5dfd3805f601f6 Mon Sep 17 00:00:00 2001 From: whowechina Date: Wed, 22 Apr 2026 13:53:39 +0800 Subject: [PATCH] Better PS4 slider action --- Production/Firmware/diva_pico.uf2 | Bin 195584 -> 195072 bytes firmware/src/gesture.c | 40 ++++++++++++++++-------------- firmware/src/gesture.h | 3 +-- firmware/src/main.c | 2 +- 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/Production/Firmware/diva_pico.uf2 b/Production/Firmware/diva_pico.uf2 index 9cc55b5cdac71b28ea0ebbcee227820ab07afb78..9fc1f747a5160b12994250c7ab2075850d487c7b 100644 GIT binary patch delta 29046 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 diff --git a/firmware/src/gesture.c b/firmware/src/gesture.c index 8aac65c..7cca03a 100644 --- a/firmware/src/gesture.c +++ b/firmware/src/gesture.c @@ -23,19 +23,23 @@ #define MAX_REGIONS 12 // Per-frame extracted regions. #define MAX_CLUSTERS 12 // Living clusters tracked across frames. -#define REGION_GAP_SIZE 1 // Maximum gap size (in electrodes) allowed inside one region. -#define MATCH_MAX_DIST_Q4 56 // Max cluster-to-region match distance in Q4 units. +#define REGION_GAP_SIZE 2 // Maximum gap size (in electrodes) allowed inside one region. +#define MATCH_MAX_DIST_Q4 80 // Max cluster-to-region match distance in Q4 units. -#define DEBOUNCE_SET_FRAMES 4 -#define DEBOUNCE_RESET_FRAMES 50 +#define DEBOUNCE_SET_FRAMES 2 +#define DEBOUNCE_RESET_FRAMES 10 -#define SEQ_MIN_STEPS 3 // Required consecutive +/-1 index moves to confirm direction. -#define SEQ_TIMEOUT_FRAMES 200 // Max frames allowed between sequential steps. -#define DEATH_HOLD_FRAMES 100 // Cluster death delay. +#define LATCH_FRAMES 100 + +#define SEQ_MIN_STEPS 2 // Required consecutive +/-1 index moves to confirm direction. +#define SEQ_TIMEOUT_FRAMES 100 // Max frames allowed between sequential steps. +#define DEATH_HOLD_FRAMES 50 // Cluster death delay. #define AXIS_CENTER 0x80 #define AXIS_OFFSET 100 // Signed offset from center when steering left/right. +static uint16_t total_zone_num = 32; + // A region is a contiguous (or gap-bridged) set of active electrodes in one frame. // Q4 units are used for more precise center position and distance calculation. typedef struct { @@ -68,7 +72,6 @@ static uint32_t db_state; static int db_cnt[ELEC_COUNT]; static bool debug_cluster; -static int latch_frames = 100; static int hold_left_dir; static int hold_right_dir; @@ -162,7 +165,7 @@ static int q4_to_idx(int q4) return (q4 + 8) / 16; } -static int sgn16(int x) +static int sign(int x) { return (x > 0) - (x < 0); } @@ -182,7 +185,7 @@ static void update_seq(cluster_t *c) int diff = idx - c->last_idx; int ad = abs(diff); - int sd = sgn16(diff); + int sd = sign(diff); if (ad == 1 && c->seq_age <= SEQ_TIMEOUT_FRAMES) { if (sd == c->seq_dir) { @@ -225,7 +228,9 @@ static void assign_slot_if_needed(cluster_t *c) } } - if (c->center_q4 < (16 * 16)) { + int mid_q4 = (total_zone_num * 16) / 2; + + if (c->center_q4 < mid_q4) { if (!left_used) { c->slot = 0; } else if (!right_used) { @@ -373,7 +378,7 @@ static void hold_axis(int in_l, int in_r, int *out_l, int *out_r) { if (in_l != 0) { hold_left_dir = in_l; - hold_left_frames = latch_frames; + hold_left_frames = LATCH_FRAMES; } else if (hold_left_frames > 0) { hold_left_frames--; } else { @@ -382,7 +387,7 @@ static void hold_axis(int in_l, int in_r, int *out_l, int *out_r) if (in_r != 0) { hold_right_dir = in_r; - hold_right_frames = latch_frames; + hold_right_frames = LATCH_FRAMES; } else if (hold_right_frames > 0) { hold_right_frames--; } else { @@ -427,8 +432,10 @@ static void debug_print(void) } } -void gesture_reset(void) +void gesture_init(uint16_t zone_num) { + total_zone_num = zone_num; + memset(clusters, 0, sizeof(clusters)); next_id = 1; @@ -441,11 +448,6 @@ void gesture_reset(void) hold_right_frames = 0; } -void gesture_set_latch(int frames) -{ - latch_frames = (frames == 0) ? 1 : frames; -} - void gesture_set_debug_cluster(bool enable) { debug_cluster = enable; diff --git a/firmware/src/gesture.h b/firmware/src/gesture.h index 0f6ed6a..471b8e6 100644 --- a/firmware/src/gesture.h +++ b/firmware/src/gesture.h @@ -10,8 +10,7 @@ #include #include -void gesture_reset(void); -void gesture_set_latch(int frames); +void gesture_init(uint16_t zone_num); void gesture_set_debug_cluster(bool enable); void gesture_process(uint32_t mask, uint8_t *axis_a, uint8_t *axis_b); diff --git a/firmware/src/main.c b/firmware/src/main.c index a2414eb..f0afa7e 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -222,7 +222,7 @@ void init() keymap_check(); - gesture_reset(); + gesture_init(slider_zone_num()); board_init(); tusb_init();