From efbee3124004ad9afcf41a6b8773cf0eec895a79 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 76288 -> 74752 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 7c95f78b02e41d0ad467f39e09e537af3d88f6c8..2283fc5e44f07f484bd8ee78d4d315ef72553bff 100644 GIT binary patch delta 10994 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 #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 @@ -41,72 +42,8 @@ void (*loop_mode)(); uint16_t (*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 @@ -205,9 +142,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); } } @@ -263,12 +202,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; @@ -282,11 +215,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; @@ -310,7 +239,6 @@ int main(void) { update_inputs(); report.buttons = debounce_mode(); 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];