From c857811315e93b507221fd299aeaae9dfffaf625 Mon Sep 17 00:00:00 2001 From: whowechina Date: Thu, 2 Jan 2025 20:21:50 +0800 Subject: [PATCH] Compiled UF2 in firmware folder --- firmware/chu_arcade.uf2 | Bin 0 -> 120832 bytes firmware/src/main.c | 585 ++++++++++++++++++++-------------------- 2 files changed, 293 insertions(+), 292 deletions(-) create mode 100644 firmware/chu_arcade.uf2 diff --git a/firmware/chu_arcade.uf2 b/firmware/chu_arcade.uf2 new file mode 100644 index 0000000000000000000000000000000000000000..1af69b91709cc46bc6855ee1822d15f25bd4f163 GIT binary patch literal 120832 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 - */ - -#include -#include -#include - -#include "pico/stdio.h" -#include "pico/stdlib.h" -#include "bsp/board.h" -#include "pico/multicore.h" -#include "pico/bootrom.h" - -#include "hardware/gpio.h" -#include "hardware/sync.h" -#include "hardware/uart.h" -#include "hardware/structs/ioqspi.h" -#include "hardware/structs/sio.h" - -#include "tusb.h" -#include "usb_descriptors.h" - -#include "board_defs.h" - -#include "save.h" -#include "config.h" -#include "cli.h" -#include "commands.h" - -#include "air.h" -#include "rgb.h" -#include "button.h" - -struct __attribute__((packed)) { - uint16_t adcs[8]; - uint16_t spinners[4]; - uint16_t chutes[2]; - uint16_t buttons[2]; - uint8_t system_status; - uint8_t usb_status; - uint8_t padding[29]; -} hid_joy; - -struct __attribute__((packed)) { - uint8_t modifier; - uint8_t keymap[15]; -} hid_nkro, sent_hid_nkro; - -void report_usb_hid() -{ - if (tud_hid_ready()) { - if (chu_cfg->hid.joy) { - tud_hid_n_report(0, REPORT_ID_JOYSTICK, &hid_joy, sizeof(hid_joy)); - } - if (chu_cfg->hid.nkro && - (memcmp(&hid_nkro, &sent_hid_nkro, sizeof(hid_nkro)) != 0)) { - sent_hid_nkro = hid_nkro; - tud_hid_n_report(1, 0, &sent_hid_nkro, sizeof(sent_hid_nkro)); - } - } -} - -static void gen_joy_report() -{ - hid_joy.buttons[0] = 0; - hid_joy.buttons[1] = 0; - - if (button_pressed(0)) { - hid_joy.buttons[0] |= 1 << 9; - } - if (button_pressed(1)) { - hid_joy.buttons[0] |= 1 << 6; - } - - static bool last_coin_pressed = false; - bool coin_pressed = button_pressed(2); - if (coin_pressed && !last_coin_pressed) { - hid_joy.chutes[0] += 0x100; - } - last_coin_pressed = coin_pressed; - - uint16_t air[6][2] = { - { 1 << 13, 0 }, - { 0, 1 << 13 }, - { 1 << 12, 0 }, - { 0, 1 << 12 }, - { 1 << 11, 0 }, - { 0, 1 << 11 }, - }; - - uint8_t airkey = air_bitmap(); - for (int i = 0; i < 6; i++) { - if (~airkey & (1 << i)) { - hid_joy.buttons[0] |= air[i][0]; - hid_joy.buttons[1] |= air[i][1]; - } - } -} - -const uint8_t keycode_table[128][2] = { HID_ASCII_TO_KEYCODE }; -const uint8_t keymap[38 + 1] = NKRO_KEYMAP; // 32 keys, 6 air keys, 1 terminator -static void gen_nkro_report() -{ - uint8_t air = air_bitmap(); - for (int i = 0; i < 6; i++) { - uint8_t code = keycode_table[keymap[32 + i]][1]; - uint8_t byte = code / 8; - uint8_t bit = code % 8; - if (air & (1 << i)) { - hid_nkro.keymap[byte] |= (1 << bit); - } else { - hid_nkro.keymap[byte] &= ~(1 << bit); - } - } -} - -static uint64_t last_hid_time = 0; - -static void run_lights() -{ - uint64_t now = time_us_64(); - - if (now - last_hid_time >= 1000000) { - const uint32_t colors[] = {0x080808, 0x000080, 0x800000, 0x008000, - 0x008080, 0x808000, 0x800080}; - for (int i = 0; i < air_num(); i++) { - int d = air_value(i); - rgb_set_color(i, colors[d]); - } - } -} - -void bridge_slider_port() -{ - if (tud_cdc_n_available(1)) { - uint8_t buf[128]; - int len = tud_cdc_n_read(1, buf, sizeof(buf)); - if (len > 0) { - uart_write_blocking(SLIDER_UART, buf, len); - } - } - while (uart_is_readable(SLIDER_UART)) { - tud_cdc_n_write_char(1, uart_getc(SLIDER_UART)); - tud_cdc_n_write_flush(1); - } -} - -static mutex_t core1_io_lock; -static void core1_loop() -{ - while (1) { - if (mutex_try_enter(&core1_io_lock, NULL)) { - run_lights(); - rgb_update(); - mutex_exit(&core1_io_lock); - } - cli_fps_count(1); - bridge_slider_port(); - sleep_us(100); - } -} - -static void core0_loop() -{ - while(1) { - tud_task(); - - cli_run(); - //aime_update(); - - save_loop(); - cli_fps_count(0); - - air_update(); - - gen_joy_report(); - gen_nkro_report(); - report_usb_hid(); - } -} - -void slider_init() -{ - // init uart for slider port - gpio_set_function(SLIDER_TX, GPIO_FUNC_UART); - gpio_set_function(SLIDER_RX, GPIO_FUNC_UART); - gpio_pull_up(SLIDER_TX); - gpio_pull_up(SLIDER_RX); - uart_init(SLIDER_UART, 115200); -} - -void update_check() -{ - uint8_t pins[] = BUTTON_DEF; - - for (int i = 0; i < sizeof(pins); i++) { - uint8_t gpio = pins[i]; - gpio_init(gpio); - gpio_set_function(gpio, GPIO_FUNC_SIO); - gpio_set_dir(gpio, GPIO_IN); - gpio_pull_up(gpio); - sleep_ms(1); - if (button_pressed(i)) { - sleep_ms(100); - reset_usb_boot(0, 2); - } - } -} - -void init() -{ - sleep_ms(50); - set_sys_clock_khz(180000, true); - board_init(); - update_check(); - - tusb_init(); - stdio_init_all(); - - config_init(); - mutex_init(&core1_io_lock); - save_init(0xca341234, &core1_io_lock); - - air_init(); - rgb_init(); - button_init(); - slider_init(); - - cli_init("chu_arcade>", "\n << Chu Arcade Controller >>\n" - " https://github.com/whowechina\n\n"); - - commands_init(); -} - -int main(void) -{ - init(); - multicore_launch_core1(core1_loop); - core0_loop(); - return 0; -} - -// Invoked when received GET_REPORT control request -// Application must fill buffer report's content and return its length. -// Return zero will cause the stack to STALL request -uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, - hid_report_type_t report_type, uint8_t *buffer, - uint16_t reqlen) -{ - printf("Get from USB %d-%d\n", report_id, report_type); - return 0; -} - -typedef struct __attribute__((packed)) { - uint8_t report_id; - uint8_t cmd; - uint8_t payload[62]; -} hid_output_t; - -// Invoked when received SET_REPORT control request or -// received data on OUT endpoint ( Report ID = 0, Type = 0 ) -void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, - hid_report_type_t report_type, uint8_t const *buffer, - uint16_t bufsize) -{ - hid_output_t *output = (hid_output_t *)buffer; - if (output->report_id != REPORT_ID_OUTPUT) { - return; - } - - switch (output->cmd) { - case 0x01: - case 0x02: - hid_joy.system_status = 0x30; - break; - case 0x03: - hid_joy.chutes[0] = 0; - hid_joy.chutes[1] = 0; - hid_joy.system_status = 0; - printf("IO4 reset.\n"); - break; - case 0x04: - case 0x41: - break; - default: - printf("IO4 unknown cmd: %02x\n", output->cmd); - break; - break; - } -} +/* + * Controller Main + * WHowe + */ + +#include +#include +#include + +#include "pico/stdio.h" +#include "pico/stdlib.h" +#include "bsp/board.h" +#include "pico/multicore.h" +#include "pico/bootrom.h" + +#include "hardware/gpio.h" +#include "hardware/sync.h" +#include "hardware/uart.h" +#include "hardware/structs/ioqspi.h" +#include "hardware/structs/sio.h" +#include "hardware/clocks.h" + +#include "tusb.h" +#include "usb_descriptors.h" + +#include "board_defs.h" + +#include "save.h" +#include "config.h" +#include "cli.h" +#include "commands.h" + +#include "air.h" +#include "rgb.h" +#include "button.h" + +struct __attribute__((packed)) { + uint16_t adcs[8]; + uint16_t spinners[4]; + uint16_t chutes[2]; + uint16_t buttons[2]; + uint8_t system_status; + uint8_t usb_status; + uint8_t padding[29]; +} hid_joy; + +struct __attribute__((packed)) { + uint8_t modifier; + uint8_t keymap[15]; +} hid_nkro, sent_hid_nkro; + +void report_usb_hid() +{ + if (tud_hid_ready()) { + if (chu_cfg->hid.joy) { + tud_hid_n_report(0, REPORT_ID_JOYSTICK, &hid_joy, sizeof(hid_joy)); + } + if (chu_cfg->hid.nkro && + (memcmp(&hid_nkro, &sent_hid_nkro, sizeof(hid_nkro)) != 0)) { + sent_hid_nkro = hid_nkro; + tud_hid_n_report(1, 0, &sent_hid_nkro, sizeof(sent_hid_nkro)); + } + } +} + +static void gen_joy_report() +{ + hid_joy.buttons[0] = 0; + hid_joy.buttons[1] = 0; + + if (button_pressed(0)) { + hid_joy.buttons[0] |= 1 << 9; + } + if (button_pressed(1)) { + hid_joy.buttons[0] |= 1 << 6; + } + + static bool last_coin_pressed = false; + bool coin_pressed = button_pressed(2); + if (coin_pressed && !last_coin_pressed) { + hid_joy.chutes[0] += 0x100; + } + last_coin_pressed = coin_pressed; + + uint16_t air[6][2] = { + { 1 << 13, 0 }, + { 0, 1 << 13 }, + { 1 << 12, 0 }, + { 0, 1 << 12 }, + { 1 << 11, 0 }, + { 0, 1 << 11 }, + }; + + uint8_t airkey = air_bitmap(); + for (int i = 0; i < 6; i++) { + if (~airkey & (1 << i)) { + hid_joy.buttons[0] |= air[i][0]; + hid_joy.buttons[1] |= air[i][1]; + } + } +} + +const uint8_t keycode_table[128][2] = { HID_ASCII_TO_KEYCODE }; +const uint8_t keymap[38 + 1] = NKRO_KEYMAP; // 32 keys, 6 air keys, 1 terminator +static void gen_nkro_report() +{ + uint8_t air = air_bitmap(); + for (int i = 0; i < 6; i++) { + uint8_t code = keycode_table[keymap[32 + i]][1]; + uint8_t byte = code / 8; + uint8_t bit = code % 8; + if (air & (1 << i)) { + hid_nkro.keymap[byte] |= (1 << bit); + } else { + hid_nkro.keymap[byte] &= ~(1 << bit); + } + } +} + +static uint64_t last_hid_time = 0; + +static void run_lights() +{ + uint64_t now = time_us_64(); + + if (now - last_hid_time >= 1000000) { + const uint32_t colors[] = {0x080808, 0x000080, 0x800000, 0x008000, + 0x008080, 0x808000, 0x800080}; + for (int i = 0; i < air_num(); i++) { + int d = air_value(i); + rgb_set_color(i, colors[d]); + } + } +} + +void bridge_slider_port() +{ + if (tud_cdc_n_available(1)) { + uint8_t buf[128]; + int len = tud_cdc_n_read(1, buf, sizeof(buf)); + if (len > 0) { + uart_write_blocking(SLIDER_UART, buf, len); + } + } + while (uart_is_readable(SLIDER_UART)) { + tud_cdc_n_write_char(1, uart_getc(SLIDER_UART)); + tud_cdc_n_write_flush(1); + } +} + +static mutex_t core1_io_lock; +static void core1_loop() +{ + while (1) { + if (mutex_try_enter(&core1_io_lock, NULL)) { + run_lights(); + rgb_update(); + mutex_exit(&core1_io_lock); + } + cli_fps_count(1); + bridge_slider_port(); + sleep_us(100); + } +} + +static void core0_loop() +{ + while(1) { + tud_task(); + + cli_run(); + //aime_update(); + + save_loop(); + cli_fps_count(0); + + air_update(); + + gen_joy_report(); + gen_nkro_report(); + report_usb_hid(); + } +} + +void slider_init() +{ + // init uart for slider port + gpio_set_function(SLIDER_TX, GPIO_FUNC_UART); + gpio_set_function(SLIDER_RX, GPIO_FUNC_UART); + gpio_pull_up(SLIDER_TX); + gpio_pull_up(SLIDER_RX); + uart_init(SLIDER_UART, 115200); +} + +void update_check() +{ + uint8_t pins[] = BUTTON_DEF; + + for (int i = 0; i < sizeof(pins); i++) { + uint8_t gpio = pins[i]; + gpio_init(gpio); + gpio_set_function(gpio, GPIO_FUNC_SIO); + gpio_set_dir(gpio, GPIO_IN); + gpio_pull_up(gpio); + sleep_ms(1); + if (button_pressed(i)) { + sleep_ms(100); + reset_usb_boot(0, 2); + } + } +} + +void init() +{ + sleep_ms(50); + set_sys_clock_khz(180000, true); + board_init(); + update_check(); + + tusb_init(); + stdio_init_all(); + + config_init(); + mutex_init(&core1_io_lock); + save_init(0xca341234, &core1_io_lock); + + air_init(); + rgb_init(); + button_init(); + slider_init(); + + cli_init("chu_arcade>", "\n << Chu Arcade Controller >>\n" + " https://github.com/whowechina\n\n"); + + commands_init(); +} + +int main(void) +{ + init(); + multicore_launch_core1(core1_loop); + core0_loop(); + return 0; +} + +// Invoked when received GET_REPORT control request +// Application must fill buffer report's content and return its length. +// Return zero will cause the stack to STALL request +uint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, + hid_report_type_t report_type, uint8_t *buffer, + uint16_t reqlen) +{ + printf("Get from USB %d-%d\n", report_id, report_type); + return 0; +} + +typedef struct __attribute__((packed)) { + uint8_t report_id; + uint8_t cmd; + uint8_t payload[62]; +} hid_output_t; + +// Invoked when received SET_REPORT control request or +// received data on OUT endpoint ( Report ID = 0, Type = 0 ) +void tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, + hid_report_type_t report_type, uint8_t const *buffer, + uint16_t bufsize) +{ + hid_output_t *output = (hid_output_t *)buffer; + if (output->report_id != REPORT_ID_OUTPUT) { + return; + } + + switch (output->cmd) { + case 0x01: + case 0x02: + hid_joy.system_status = 0x30; + break; + case 0x03: + hid_joy.chutes[0] = 0; + hid_joy.chutes[1] = 0; + hid_joy.system_status = 0; + printf("IO4 reset.\n"); + break; + case 0x04: + case 0x41: + break; + default: + printf("IO4 unknown cmd: %02x\n", output->cmd); + break; + break; + } +}