From 9f446782f5dc210bf10b90b07723a546608dee66 Mon Sep 17 00:00:00 2001 From: Nicholas Gadjali Date: Tue, 5 Jul 2022 02:16:03 -0700 Subject: [PATCH] Refactored switch debouncing, added debouncing mode --- build_uf2/Pico_Game_Controller.uf2 | Bin 76800 -> 76800 bytes src/controller_config.h | 2 +- src/debounce/constant_switch.c | 17 +++++++++++++++++ src/debounce/debounce_include.h | 11 +++++++++++ src/debounce/minimum_hold.c | 16 ++++++++++++++++ src/pico_game_controller.c | 24 +++++++++--------------- src/rgb/rgb_include.h | 2 ++ src/rgb/turbocharger.c | 1 - 8 files changed, 56 insertions(+), 17 deletions(-) create mode 100644 src/debounce/constant_switch.c create mode 100644 src/debounce/debounce_include.h create mode 100644 src/debounce/minimum_hold.c diff --git a/build_uf2/Pico_Game_Controller.uf2 b/build_uf2/Pico_Game_Controller.uf2 index 5b0abf8ee8099fed32a2d13f764d76462adc3eeb..26bc47e0209fad631e56498b1ad980722f37d27c 100644 GIT binary patch delta 9240 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 delta 10537 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 LM@4B>X9E8RBS(dd diff --git a/src/controller_config.h b/src/controller_config.h index 4214193..abca538 100644 --- a/src/controller_config.h +++ b/src/controller_config.h @@ -6,7 +6,7 @@ #define ENC_GPIO_SIZE 2 // Number of encoders #define ENC_PPR 600 // Encoder PPR #define MOUSE_SENS 1 // Mouse sensitivity multiplier -#define ENC_DEBOUNCE false // Encoder Debouncing +#define ENC_DEBOUNCE false // Encoder Debouncing #define SW_DEBOUNCE_TIME_US 4000 // Switch debounce delay in us #define ENC_PULSE (ENC_PPR * 4) // 4 pulses per PPR #define REACTIVE_TIMEOUT_MAX 1000000 // HID to reactive timeout in us diff --git a/src/debounce/constant_switch.c b/src/debounce/constant_switch.c new file mode 100644 index 0000000..a06d79a --- /dev/null +++ b/src/debounce/constant_switch.c @@ -0,0 +1,17 @@ +/** + * Debouncing algorithm which waits for switch to output a constant n amount of time before outputting + * @author SpeedyPotato + **/ + +uint16_t constant_switch() { + uint16_t translate_buttons = 0; + for (int i = SW_GPIO_SIZE - 1; i >= 0; i--) { + if (!gpio_get(SW_GPIO[i]) && + time_us_64() - sw_timestamp[i] >= SW_DEBOUNCE_TIME_US) { + translate_buttons = (translate_buttons << 1) | 1; + } else { + translate_buttons <<= 1; + } + } + return translate_buttons; +} \ No newline at end of file diff --git a/src/debounce/debounce_include.h b/src/debounce/debounce_include.h new file mode 100644 index 0000000..1999583 --- /dev/null +++ b/src/debounce/debounce_include.h @@ -0,0 +1,11 @@ +/** + * Simple header file to include all files in the folder + * @author SpeedyPotato + * + * To add a debounce mode, return a uint16_t representing the button states. These are saved in report.buttons as truth. + * Create debounce mode as desired and then add the #include here. + **/ +extern uint64_t sw_timestamp[SW_GPIO_SIZE]; + +#include "constant_switch.c" +#include "minimum_hold.c" \ No newline at end of file diff --git a/src/debounce/minimum_hold.c b/src/debounce/minimum_hold.c new file mode 100644 index 0000000..a284cd0 --- /dev/null +++ b/src/debounce/minimum_hold.c @@ -0,0 +1,16 @@ +/** + * Debouncing algorithm which sends a report immediately when a switch is triggered and holds it for n amount of time. + * @author SpeedyPotato + **/ + +uint16_t minimum_hold() { + uint16_t translate_buttons = 0; + for (int i = SW_GPIO_SIZE - 1; i >= 0; i--) { + if (time_us_64() - sw_timestamp[i] <= SW_DEBOUNCE_TIME_US || !gpio_get(SW_GPIO[i])) { + translate_buttons = (translate_buttons << 1) | 1; + } else { + translate_buttons <<= 1; + } + } + return translate_buttons; +} \ No newline at end of file diff --git a/src/pico_game_controller.c b/src/pico_game_controller.c index 9bf19c4..68fa3a6 100644 --- a/src/pico_game_controller.c +++ b/src/pico_game_controller.c @@ -17,10 +17,12 @@ #include "hardware/pio.h" #include "pico/multicore.h" #include "pico/stdlib.h" -#include "rgb/rgb_include.h" #include "tusb.h" #include "usb_descriptors.h" +#include "rgb/rgb_include.h" +#include "debounce/debounce_include.h" + PIO pio, pio_1; uint32_t enc_val[ENC_GPIO_SIZE]; uint32_t prev_enc_val[ENC_GPIO_SIZE]; @@ -35,6 +37,7 @@ uint64_t reactive_timeout_timestamp; void (*ws2812b_mode)(); void (*loop_mode)(); +uint16_t (*debounce_mode)(); bool joy_mode_check = true; union { @@ -95,18 +98,6 @@ struct report { **/ void joy_mode() { if (tud_hid_ready()) { - uint16_t translate_buttons = 0; - for (int i = SW_GPIO_SIZE - 1; i >= 0; i--) { - if (!gpio_get(SW_GPIO[i]) && - time_us_64() - sw_timestamp[i] >= SW_DEBOUNCE_TIME_US) { - translate_buttons = - (translate_buttons << 1) | (!gpio_get(SW_GPIO[i]) ? 1 : 0); - } else { - translate_buttons <<= 1; - } - } - report.buttons = translate_buttons; - // find the delta between previous and current enc_val for (int i = 0; i < ENC_GPIO_SIZE; i++) { cur_enc_val[i] += @@ -133,8 +124,7 @@ void key_mode() { /*------------- Keyboard -------------*/ uint8_t nkro_report[32] = {0}; for (int i = 0; i < SW_GPIO_SIZE; i++) { - if (!gpio_get(SW_GPIO[i]) && - time_us_64() - sw_timestamp[i] >= SW_DEBOUNCE_TIME_US) { + if ((report.buttons >> i) % 2 == 1) { uint8_t bit = SW_KEYCODE[i] % 8; uint8_t byte = (SW_KEYCODE[i] / 8) + 1; if (SW_KEYCODE[i] >= 240 && SW_KEYCODE[i] <= 247) { @@ -284,6 +274,9 @@ void init() { ws2812b_mode = &ws2812b_color_cycle; } + // Debouncing Mode + debounce_mode = &minimum_hold; + // Disable RGB if (gpio_get(SW_GPIO[8])) { multicore_launch_core1(core1_entry); @@ -301,6 +294,7 @@ int main(void) { while (1) { tud_task(); // tinyusb device task update_inputs(); + report.buttons = debounce_mode(); loop_mode(); update_lights(); } diff --git a/src/rgb/rgb_include.h b/src/rgb/rgb_include.h index 02d2264..b4de733 100644 --- a/src/rgb/rgb_include.h +++ b/src/rgb/rgb_include.h @@ -5,6 +5,8 @@ * To add a lighting mode, create a function which accepts a uint32_t as a parameter. * Create lighting mode as desired and then add the #include here. **/ +extern uint32_t enc_val[ENC_GPIO_SIZE]; + #include "ws2812b_util.c" #include "color_cycle.c" #include "turbocharger.c" \ No newline at end of file diff --git a/src/rgb/turbocharger.c b/src/rgb/turbocharger.c index 81f2dec..4b92197 100644 --- a/src/rgb/turbocharger.c +++ b/src/rgb/turbocharger.c @@ -30,7 +30,6 @@ * By strategically positioning led 0 at the top, this avoids lighting areas * from suddenly appeaering. **/ -extern uint32_t enc_val[ENC_GPIO_SIZE]; #define TURBO_LIGHTS_CLAMP 0.1f #define TURBO_LIGHTS_THRESHOLD 0.05f