From 8aa22f8083e8318e950892776b5111239afffa37 Mon Sep 17 00:00:00 2001 From: Nicholas G Date: Mon, 5 Sep 2022 02:53:19 -0400 Subject: [PATCH] v5 Configuration and refactors --- build_uf2/Pico_Game_Controller.uf2 | Bin 52736 -> 49664 bytes src/controller_config.h | 14 ++--- src/pico_game_controller.c | 90 +++-------------------------- src/rgb/color_cycle_v5.c | 79 +++++++++++++++++++++++++ src/rgb/rgb_include.h | 11 +++- src/rgb/ws2812b_util.c | 29 ++++++++-- src/types.h | 19 ++++++ src/usb_descriptors.c | 9 +-- 8 files changed, 149 insertions(+), 102 deletions(-) create mode 100644 src/rgb/color_cycle_v5.c create mode 100644 src/types.h diff --git a/build_uf2/Pico_Game_Controller.uf2 b/build_uf2/Pico_Game_Controller.uf2 index ea0f40a94ec2731ee0c267b9f26163610192ab50..58cdffef35e2a2243ecb1726b0331abd865b3a2c 100644 GIT binary patch delta 8001 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 I9zLe{e?2H{vH$=8 diff --git a/src/controller_config.h b/src/controller_config.h index dc1f1af..87af152 100644 --- a/src/controller_config.h +++ b/src/controller_config.h @@ -10,8 +10,8 @@ #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_LED_SIZE 32 // Number of WS2812B LEDs +#define WS2812B_LED_ZONES 1 // Number of WS2812B LED Zones #define WS2812B_LEDS_PER_ZONE \ WS2812B_LED_SIZE / WS2812B_LED_ZONES // Number of LEDs per zone @@ -23,14 +23,12 @@ const uint8_t SW_KEYCODE[] = { HID_KEY_M, HID_KEY_A, HID_KEY_B, HID_KEY_1, }; const uint8_t SW_GPIO[] = { - 4, 6, 8, 10, 12, 14, 27, 18, 20, + 29, 3, 4, 5, 17, 12, 0, 8, 1, }; -const uint8_t LED_GPIO[] = { - 5, 7, 9, 11, 13, 15, 21, -}; -const uint8_t ENC_GPIO[] = {0, 2}; // L_ENC(0, 1); R_ENC(2, 3) +const uint8_t LED_GPIO[] = {21}; +const uint8_t ENC_GPIO[] = {27, 6}; // L_ENC(0, 1); R_ENC(2, 3) const bool ENC_REV[] = {false, false}; // Reverse Encoders -const uint8_t WS2812B_GPIO = 28; +const uint8_t WS2812B_GPIO = 2; #endif diff --git a/src/pico_game_controller.c b/src/pico_game_controller.c index 576dfe1..c2c6b39 100644 --- a/src/pico_game_controller.c +++ b/src/pico_game_controller.c @@ -8,8 +8,10 @@ #include #include +// clang-format off #include "bsp/board.h" #include "controller_config.h" +#include "types.h" #include "encoders.pio.h" #include "hardware/clocks.h" #include "hardware/dma.h" @@ -19,7 +21,6 @@ #include "pico/stdlib.h" #include "tusb.h" #include "usb_descriptors.h" -// clang-format off #include "debounce/debounce_include.h" #include "rgb/rgb_include.h" // clang-format on @@ -42,72 +43,8 @@ void (*loop_mode)(); void (*debounce_mode)(); bool joy_mode_check = true; -union { - struct { - uint8_t buttons[LED_GPIO_SIZE]; - RGB_t rgb[WS2812B_LED_ZONES]; - } lights; - uint8_t raw[LED_GPIO_SIZE + WS2812B_LED_ZONES * 3]; -} lights_report; - -/** - * WS2812B Lighting - * @param counter Current number of WS2812B cycles - **/ -void ws2812b_update(uint32_t counter) { - if (time_us_64() - reactive_timeout_timestamp >= REACTIVE_TIMEOUT_MAX) { - ws2812b_mode(counter); - } else { - for (int i = 0; i < WS2812B_LED_ZONES; i++) { - for (int j = 0; j < WS2812B_LEDS_PER_ZONE; j++) { - put_pixel(urgb_u32(lights_report.lights.rgb[i].r, - lights_report.lights.rgb[i].g, - lights_report.lights.rgb[i].b)); - } - } - } -} - -/** - * HID/Reactive Lights - **/ -void update_lights() { - for (int i = 0; i < LED_GPIO_SIZE - 1; i++) { - if (time_us_64() - reactive_timeout_timestamp >= REACTIVE_TIMEOUT_MAX) { - if (!gpio_get(SW_GPIO[i])) { - gpio_put(LED_GPIO[i], 1); - } else { - gpio_put(LED_GPIO[i], 0); - } - } else { - if (lights_report.lights.buttons[i] == 0) { - gpio_put(LED_GPIO[i], 0); - } else { - gpio_put(LED_GPIO[i], 1); - } - } - /* start button sw_val index is offset by two with respect to LED_GPIO */ - if (time_us_64() - reactive_timeout_timestamp >= REACTIVE_TIMEOUT_MAX) { - if (!gpio_get(SW_GPIO[LED_GPIO_SIZE + 1])) { - gpio_put(LED_GPIO[LED_GPIO_SIZE - 1], 1); - } else { - gpio_put(LED_GPIO[LED_GPIO_SIZE - 1], 0); - } - } else { - if (lights_report.lights.buttons[LED_GPIO_SIZE - 1] == 0) { - gpio_put(LED_GPIO[LED_GPIO_SIZE - 1], 0); - } else { - gpio_put(LED_GPIO[LED_GPIO_SIZE - 1], 1); - } - } - } -} - -struct report { - uint16_t buttons; - uint8_t joy0; - uint8_t joy1; -} report; +lights_report_t lights_report; +report_t report; /** * Gamepad Mode @@ -206,9 +143,11 @@ void dma_handler() { **/ void core1_entry() { uint32_t counter = 0; + uint32_t rgb_idx = 0; while (1) { - ws2812b_update(++counter); - sleep_ms(5); + counter++; + if (counter % 32 == 0) ws2812b_mode(++rgb_idx); + sleep_ms(1); } } @@ -265,12 +204,6 @@ void init() { gpio_pull_up(SW_GPIO[i]); } - // Setup LED GPIO - for (int i = 0; i < LED_GPIO_SIZE; i++) { - gpio_init(LED_GPIO[i]); - gpio_set_dir(LED_GPIO[i], GPIO_OUT); - } - // Set listener bools kbm_report = false; @@ -284,11 +217,7 @@ void init() { } // RGB Mode Switching - if (!gpio_get(SW_GPIO[1])) { - ws2812b_mode = &turbocharger_color_cycle; - } else { - ws2812b_mode = &ws2812b_color_cycle; - } + ws2812b_mode = &ws2812b_color_cycle_v5; // Debouncing Mode debounce_mode = &debounce_eager; @@ -312,7 +241,6 @@ int main(void) { debounce_mode(); update_inputs(); loop_mode(); - update_lights(); } return 0; diff --git a/src/rgb/color_cycle_v5.c b/src/rgb/color_cycle_v5.c new file mode 100644 index 0000000..055e113 --- /dev/null +++ b/src/rgb/color_cycle_v5.c @@ -0,0 +1,79 @@ +/** + * Color cycle effect & reactive buttons for Pocket SDVX Pico v5 + * @author SpeedyPotato + **/ +const double WS2812B_BRIGHTNESS = 0.5; +const RGB_t COLOR_BLACK = {0, 0, 0}; +const RGB_t SW_LABEL_COLORS[] = { + {255, 255, 255}, // START + {255, 255, 255}, // BT-A + {255, 255, 255}, // BT-B + {255, 255, 255}, // BT-C + {255, 255, 255}, // BT-D + {255, 255, 255}, // FX-L + {255, 255, 255}, // FX-R +}; +const RGB_t SW_COLORS[] = { + {0, 0, 255}, // START + {255, 255, 255}, // BT-A + {255, 255, 255}, // BT-B + {255, 255, 255}, // BT-C + {255, 255, 255}, // BT-D + {255, 0, 0}, // FX-L + {255, 0, 0}, // FX-R +}; + +RGB_t ws2812b_data[WS2812B_LED_SIZE] = {0}; + +void ws2812b_color_cycle_v5(uint32_t counter) { + RGB_t base_color = color_wheel_rgbt(counter); + /* Peripheral RGB */ + for (int i = (SW_GPIO_SIZE - 2) * 2; i < WS2812B_LED_SIZE; i++) { + if (time_us_64() - reactive_timeout_timestamp >= REACTIVE_TIMEOUT_MAX) { + ws2812b_data[i] = base_color; + } else { + ws2812b_data[i].r = lights_report.lights.rgb[0].r; + ws2812b_data[i].g = lights_report.lights.rgb[0].g; + ws2812b_data[i].b = lights_report.lights.rgb[0].b; + } + } + /* Switches */ + for (int i = 0; i < SW_GPIO_SIZE - 3; i++) { + if (time_us_64() - reactive_timeout_timestamp >= REACTIVE_TIMEOUT_MAX) { + if ((report.buttons >> i) % 2 == 1) { + ws2812b_data[2 * i + 2] = SW_COLORS[i + 1]; + } else { + ws2812b_data[2 * i + 2] = COLOR_BLACK; + } + } else { + if (lights_report.lights.buttons[i] == 0) { + ws2812b_data[2 * i + 2] = COLOR_BLACK; + } else { + ws2812b_data[2 * i + 2] = SW_COLORS[i + 1]; + } + } + } + /* start button sw_val index is offset by two with respect to LED_GPIO */ + if (time_us_64() - reactive_timeout_timestamp >= REACTIVE_TIMEOUT_MAX) { + if ((report.buttons >> (SW_GPIO_SIZE - 1)) % 2 == 1) { + ws2812b_data[0] = SW_COLORS[0]; + } else { + ws2812b_data[0] = COLOR_BLACK; + } + } else { + if (lights_report.lights.buttons[SW_GPIO_SIZE - 3] == 0) { + ws2812b_data[0] = COLOR_BLACK; + } else { + ws2812b_data[0] = SW_COLORS[0]; + } + } + /* Switch Labels */ + for (int i = 0; i < SW_GPIO_SIZE - 2; i++) { + ws2812b_data[2 * i + 1] = SW_LABEL_COLORS[i]; + } + for (int i = 0; i < WS2812B_LED_SIZE; ++i) { + put_pixel(urgb_u32(ws2812b_data[i].r * WS2812B_BRIGHTNESS, + ws2812b_data[i].g * WS2812B_BRIGHTNESS, + ws2812b_data[i].b * WS2812B_BRIGHTNESS)); + } +} \ No newline at end of file diff --git a/src/rgb/rgb_include.h b/src/rgb/rgb_include.h index b4de733..77c3b78 100644 --- a/src/rgb/rgb_include.h +++ b/src/rgb/rgb_include.h @@ -1,12 +1,17 @@ +// clang-format off /** * Simple header file to include all files in the folder * @author SpeedyPotato - * - * 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. + * + * 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]; +extern report_t report; +extern lights_report_t lights_report; +extern uint64_t reactive_timeout_timestamp; #include "ws2812b_util.c" #include "color_cycle.c" +#include "color_cycle_v5.c" #include "turbocharger.c" \ No newline at end of file diff --git a/src/rgb/ws2812b_util.c b/src/rgb/ws2812b_util.c index aae7f18..c364758 100644 --- a/src/rgb/ws2812b_util.c +++ b/src/rgb/ws2812b_util.c @@ -4,10 +4,6 @@ */ #include "ws2812.pio.h" -typedef struct { - uint8_t r, g, b; -} RGB_t; - /** * WS2812B RGB Format Helper **/ @@ -32,6 +28,31 @@ static inline uint32_t color_wheel(uint16_t wheel_pos) { } } +/** + * 768 Color Wheel Picker + * @param wheel_pos Color value, r->g->b->r... + **/ +static inline RGB_t color_wheel_rgbt(uint16_t wheel_pos) { + wheel_pos %= 768; + RGB_t init; + if (wheel_pos < 256) { + init.r = wheel_pos; + init.g = 255 - wheel_pos; + init.b = 0; + } else if (wheel_pos < 512) { + wheel_pos -= 256; + init.r = 255 - wheel_pos; + init.g = 0; + init.b = wheel_pos; + } else { + wheel_pos -= 512; + init.r = 0; + init.g = wheel_pos; + init.b = 255 - wheel_pos; + }; + return init; +} + /** * WS2812B RGB Assignment * @param pixel_grb The pixel color to set diff --git a/src/types.h b/src/types.h new file mode 100644 index 0000000..54c11d6 --- /dev/null +++ b/src/types.h @@ -0,0 +1,19 @@ +typedef struct { + uint8_t r, g, b; +} RGB_t; + +typedef struct { + uint16_t buttons; + uint8_t joy0; + uint8_t joy1; +} report_t; + +typedef struct { + uint8_t buttons[LED_GPIO_SIZE]; + RGB_t rgb[WS2812B_LED_ZONES]; +} lights_t; + +typedef union { + lights_t lights; + uint8_t raw[LED_GPIO_SIZE + WS2812B_LED_ZONES * 3]; +} lights_report_t; \ No newline at end of file diff --git a/src/usb_descriptors.c b/src/usb_descriptors.c index 0c0aaaa..954445d 100644 --- a/src/usb_descriptors.c +++ b/src/usb_descriptors.c @@ -162,12 +162,9 @@ char const* string_desc_arr[] = { "FX-L", "FX-R", "Start", - "Left R", - "Left G", - "Left B", - "Right R", - "Right G", - "Right B", + "Controller R", + "Controller G", + "Controller B", }; static uint16_t _desc_str[64];