From 5fa48586b438fba0dfd0002450e84ce64b7ac527 Mon Sep 17 00:00:00 2001 From: Nicholas G Date: Mon, 8 Nov 2021 00:35:22 -0500 Subject: [PATCH] HID timeout using timestamps, updated HID SET buffer to work with pico-sdk 1.3.0 --- build_uf2/Pico_Game_Controller.uf2 | Bin 74240 -> 74240 bytes src/controller_config.h | 20 ++++++++++---------- src/pico_game_controller.c | 17 ++++++++--------- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/build_uf2/Pico_Game_Controller.uf2 b/build_uf2/Pico_Game_Controller.uf2 index c95ea122bd3ed281b1222377a5e843902a7942b3..cfd24d2432c5610368c63759572672e3553fcf47 100644 GIT binary patch delta 8114 zcmb_hdw5jE*`L{4vPqU4auQfVfV0V-T(|}Z5)fob$Yzrb5Cr9tP&O27ETB;WMu8>@ z;UcKyjJN@@B2|k@HDKa3DY2y%TGU0bf*>rGexWwD>#ey!*#2hE?q+-Yp6`!upXbfY zJM+H3_cHIynR8NiTvvBo*VL`iTOT8WTN{e{jDil&6Z$)LF&P0_HQFGf*uo>R(@C6%0Abn85{LP0wnRiZqyH@`u$+NEXyz> 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 aFl-hPrZ|c471k!O#M!h!mwoS%n1294j}m|Y delta 8194 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 diff --git a/src/controller_config.h b/src/controller_config.h index 478a74e..d948388 100644 --- a/src/controller_config.h +++ b/src/controller_config.h @@ -1,16 +1,16 @@ #ifndef CONTROLLER_CONFIG_H #define CONTROLLER_CONFIG_H -#define SW_GPIO_SIZE 11 // Number of switches -#define LED_GPIO_SIZE 10 // Number of switch LEDs -#define ENC_GPIO_SIZE 2 // Number of encoders -#define ENC_PPR 600 // Encoder PPR -#define ENC_DEBOUNCE true // 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 500000 // Cycles before HID falls back to reactive -#define WS2812B_LED_SIZE 10 // Number of WS2812B LEDs -#define WS2812B_LED_ZONES 2 // Number of WS2812B LED Zones +#define SW_GPIO_SIZE 11 // Number of switches +#define LED_GPIO_SIZE 10 // Number of switch LEDs +#define ENC_GPIO_SIZE 2 // Number of encoders +#define ENC_PPR 600 // Encoder PPR +#define ENC_DEBOUNCE true // 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 +#define WS2812B_LED_SIZE 10 // Number of WS2812B LEDs +#define WS2812B_LED_ZONES 2 // Number of WS2812B LED Zones #define WS2812B_LEDS_PER_ZONE \ WS2812B_LED_SIZE / WS2812B_LED_ZONES // Number of LEDs per zone diff --git a/src/pico_game_controller.c b/src/pico_game_controller.c index adb91a5..db2cf5a 100644 --- a/src/pico_game_controller.c +++ b/src/pico_game_controller.c @@ -31,7 +31,7 @@ uint64_t sw_timestamp[SW_GPIO_SIZE]; bool kbm_report; -unsigned long reactive_timeout_count = REACTIVE_TIMEOUT_MAX; +uint64_t reactive_timeout_timestamp; void (*loop_mode)(); bool joy_mode_check = true; @@ -94,7 +94,7 @@ void ws2812b_color_cycle(uint32_t counter) { * @param counter Current number of WS2812B cycles **/ void ws2812b_update(uint32_t counter) { - if (reactive_timeout_count >= REACTIVE_TIMEOUT_MAX) { + if (time_us_64() - reactive_timeout_timestamp >= REACTIVE_TIMEOUT_MAX) { ws2812b_color_cycle(counter); } else { for (int i = 0; i < WS2812B_LED_ZONES; i++) { @@ -111,11 +111,8 @@ void ws2812b_update(uint32_t counter) { * HID/Reactive Lights **/ void update_lights() { - if (reactive_timeout_count < REACTIVE_TIMEOUT_MAX) { - reactive_timeout_count++; - } for (int i = 0; i < LED_GPIO_SIZE; i++) { - if (reactive_timeout_count >= REACTIVE_TIMEOUT_MAX) { + if (time_us_64() - reactive_timeout_timestamp >= REACTIVE_TIMEOUT_MAX) { if (!gpio_get(SW_GPIO[i])) { gpio_put(LED_GPIO[i], 1); } else { @@ -276,6 +273,8 @@ void init() { dma_channel_set_irq0_enabled(i, true); } + reactive_timeout_timestamp = time_us_64(); + // Set up WS2812B pio_1 = pio1; uint offset2 = pio_add_program(pio_1, &ws2812_program); @@ -365,12 +364,12 @@ void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, uint16_t bufsize) { (void)itf; if (report_id == 2 && report_type == HID_REPORT_TYPE_OUTPUT && - buffer[0] == 2 && bufsize >= sizeof(lights_report)) // light data + bufsize >= sizeof(lights_report)) // light data { size_t i = 0; for (i; i < sizeof(lights_report); i++) { - lights_report.raw[i] = buffer[i + 1]; + lights_report.raw[i] = buffer[i]; } - reactive_timeout_count = 0; + reactive_timeout_timestamp = time_us_64(); } }