From bcbe883c3753bfcb621055986ddd2cab43b30609 Mon Sep 17 00:00:00 2001 From: shylie Date: Tue, 24 Feb 2026 21:27:10 -0500 Subject: [PATCH] Begin pong --- CMakeLists.txt | 2 +- include/devicelib.h | 37 +++++++++++ include/lib.h | 13 ---- programs/CMakeLists.txt | 1 + programs/mtgcard/src/main.cpp | 23 +------ programs/pong/CMakeLists.txt | 13 ++++ programs/pong/src/main.cpp | 115 +++++++++++++++++++++++++++++++++ src/{lib.cpp => devicelib.cpp} | 2 +- src/display.cpp | 2 +- src/flash.cpp | 2 +- 10 files changed, 171 insertions(+), 39 deletions(-) create mode 100644 include/devicelib.h delete mode 100644 include/lib.h create mode 100644 programs/pong/CMakeLists.txt create mode 100644 programs/pong/src/main.cpp rename src/{lib.cpp => devicelib.cpp} (83%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 51dfa90..5cf0b13 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,7 @@ pico_sdk_init() add_library(devicelib STATIC src/display.cpp src/flash.cpp - src/lib.cpp + src/devicelib.cpp src/pixelstream.cpp src/usb_descriptors.c ) diff --git a/include/devicelib.h b/include/devicelib.h new file mode 100644 index 0000000..c009099 --- /dev/null +++ b/include/devicelib.h @@ -0,0 +1,37 @@ +#ifndef LIB_H +#define LIB_H + +#include "display.h" +#include "flash.h" +#include "pixelstream.h" + +#include +#include + +bi_decl(bi_program_feature_group(0x1111, 0, "Display Pinout")); +bi_decl(bi_ptr_int32(0x1111, 0, DISPLAY_SCK, 2)); +bi_decl(bi_ptr_int32(0x1111, 0, DISPLAY_TX, 3)); +bi_decl(bi_ptr_int32(0x1111, 0, DISPLAY_CS, 5)); +bi_decl(bi_ptr_int32(0x1111, 0, DISPLAY_DC, 4)); + +bi_decl(bi_program_feature_group(0x1111, 1, "Flash Pinout")); +bi_decl(bi_ptr_int32(0x1111, 1, FLASH_SCK, 10)); +bi_decl(bi_ptr_int32(0x1111, 1, FLASH_TX, 11)); +bi_decl(bi_ptr_int32(0x1111, 1, FLASH_RX, 12)); +bi_decl(bi_ptr_int32(0x1111, 1, FLASH_CS, 9)); +bi_decl(bi_ptr_int32(0x1111, 1, FLASH_IO_2, 13)); +bi_decl(bi_ptr_int32(0x1111, 1, FLASH_IO_3, 14)); + +bi_decl(bi_program_feature_group(0x1111, 2, "Buttons")); +bi_decl(bi_ptr_int32(0x1111, 2, BUTTON_LEFT, 15)); +bi_decl(bi_ptr_int32(0x1111, 2, BUTTON_MIDDLE, 16)); +bi_decl(bi_ptr_int32(0x1111, 2, BUTTON_RIGHT, 17)); + +namespace lib::detail +{ + +spi_inst_t* get_spi_instance(uint8_t gpio); + +} + +#endif // LIB_H diff --git a/include/lib.h b/include/lib.h deleted file mode 100644 index 98d6398..0000000 --- a/include/lib.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef LIB_H -#define LIB_H - -#include - -namespace lib::detail -{ - -spi_inst_t* get_spi_instance(uint8_t gpio); - -} - -#endif // LIB_H diff --git a/programs/CMakeLists.txt b/programs/CMakeLists.txt index e15a78f..7cb5dea 100644 --- a/programs/CMakeLists.txt +++ b/programs/CMakeLists.txt @@ -1,3 +1,4 @@ cmake_minimum_required(VERSION 3.13) add_subdirectory(mtgcard) +add_subdirectory(pong) diff --git a/programs/mtgcard/src/main.cpp b/programs/mtgcard/src/main.cpp index 7f1e192..22c29a4 100644 --- a/programs/mtgcard/src/main.cpp +++ b/programs/mtgcard/src/main.cpp @@ -1,8 +1,6 @@ #include "cardslot.h" -#include "display.h" -#include "flash.h" +#include "devicelib.h" #include "menu.h" -#include "pixelstream.h" #include #include @@ -15,25 +13,6 @@ using namespace lib; namespace { -bi_decl(bi_program_feature_group(0x1111, 0, "Display Pinout")); -bi_decl(bi_ptr_int32(0x1111, 0, DISPLAY_SCK, 2)); -bi_decl(bi_ptr_int32(0x1111, 0, DISPLAY_TX, 3)); -bi_decl(bi_ptr_int32(0x1111, 0, DISPLAY_CS, 5)); -bi_decl(bi_ptr_int32(0x1111, 0, DISPLAY_DC, 4)); - -bi_decl(bi_program_feature_group(0x1111, 1, "Flash Pinout")); -bi_decl(bi_ptr_int32(0x1111, 1, FLASH_SCK, 10)); -bi_decl(bi_ptr_int32(0x1111, 1, FLASH_TX, 11)); -bi_decl(bi_ptr_int32(0x1111, 1, FLASH_RX, 12)); -bi_decl(bi_ptr_int32(0x1111, 1, FLASH_CS, 9)); -bi_decl(bi_ptr_int32(0x1111, 1, FLASH_IO_2, 13)); -bi_decl(bi_ptr_int32(0x1111, 1, FLASH_IO_3, 14)); - -bi_decl(bi_program_feature_group(0x1111, 2, "Buttons")); -bi_decl(bi_ptr_int32(0x1111, 2, BUTTON_LEFT, 15)); -bi_decl(bi_ptr_int32(0x1111, 2, BUTTON_MIDDLE, 16)); -bi_decl(bi_ptr_int32(0x1111, 2, BUTTON_RIGHT, 17)); - Display display(DISPLAY_SCK, DISPLAY_TX, DISPLAY_CS, DISPLAY_DC, 100 * 1000 * 1000); Flash flash(FLASH_SCK, FLASH_TX, FLASH_RX, FLASH_CS, 25 * 1000 * 1000); diff --git a/programs/pong/CMakeLists.txt b/programs/pong/CMakeLists.txt new file mode 100644 index 0000000..6f990d4 --- /dev/null +++ b/programs/pong/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.13) + +add_executable(pong + src/main.cpp + + ${ICON_SOURCES} +) + +target_include_directories(pong PRIVATE include) + +target_link_libraries(pong PRIVATE devicelib) + +pico_add_extra_outputs(pong) diff --git a/programs/pong/src/main.cpp b/programs/pong/src/main.cpp new file mode 100644 index 0000000..40dc6d5 --- /dev/null +++ b/programs/pong/src/main.cpp @@ -0,0 +1,115 @@ +#include "devicelib.h" + +#include +#include +#include + +using namespace lib; + +namespace +{ + +Display display(DISPLAY_SCK, DISPLAY_TX, DISPLAY_CS, DISPLAY_DC, + 100 * 1000 * 1000); +Flash flash(FLASH_SCK, FLASH_TX, FLASH_RX, FLASH_CS, 25 * 1000 * 1000); + +void draw_rectangle(float x, float y, float w, float h, uint8_t r, uint8_t g, + uint8_t b) +{ + int wi = w; + int hi = h; + display.set_update_area(x - w / 2, y - h / 2, wi, hi); + + auto pixels = display.pixels(); + for (int i = 0; i < (wi + 1) * (hi + 1); i++) + { + pixels.write(r, g, b); + } +} + +} + +int main() +{ + set_sys_clock_khz(150 * 1000, false); + + gpio_set_function(FLASH_IO_2, GPIO_FUNC_SIO); + gpio_set_function(FLASH_IO_3, GPIO_FUNC_SIO); + + gpio_set_dir(FLASH_IO_2, GPIO_OUT); + gpio_set_dir(FLASH_IO_3, GPIO_OUT); + + gpio_put(FLASH_IO_2, 1); + gpio_put(FLASH_IO_3, 1); + + gpio_set_function(BUTTON_LEFT, GPIO_FUNC_SIO); + gpio_set_function(BUTTON_MIDDLE, GPIO_FUNC_SIO); + gpio_set_function(BUTTON_RIGHT, GPIO_FUNC_SIO); + + gpio_set_dir(BUTTON_LEFT, GPIO_IN); + gpio_set_dir(BUTTON_MIDDLE, GPIO_IN); + gpio_set_dir(BUTTON_RIGHT, GPIO_IN); + + gpio_pull_up(BUTTON_LEFT); + gpio_pull_up(BUTTON_MIDDLE); + gpio_pull_up(BUTTON_RIGHT); + + tusb_rhport_init_t dev_init + = { .role = TUSB_ROLE_DEVICE, .speed = TUSB_SPEED_AUTO }; + tud_init(0); + + absolute_time_t previous_time = get_absolute_time(); + float time_since_last_display = 0; + + constexpr float SPEED = 100; + float paddle_x = 120; + constexpr float paddle_y = 280; + + uint8_t left_history = 0; + uint8_t right_history = 0; + + bool moved = true; + + while (true) + { + tud_task(); + absolute_time_t current = get_absolute_time(); + float dt = absolute_time_diff_us(previous_time, current) / 1000000.0f; + previous_time = current; + + float old_pos = paddle_x; + + left_history = (left_history << 1) | !gpio_get(BUTTON_LEFT); + right_history = (right_history << 1) | !gpio_get(BUTTON_RIGHT); + + if (left_history == 0xFF) + { + paddle_x -= SPEED * dt; + moved = true; + } + + if (right_history == 0xFF) + { + paddle_x += SPEED * dt; + moved = true; + } + + time_since_last_display += dt; + + if (moved && time_since_last_display > 0.016f) + { + moved = false; + draw_rectangle(old_pos, paddle_y, 50, 7, 0, 0, 0); + draw_rectangle(paddle_x, paddle_y, 40, 5, 0xFF, 0xFF, 0xFF); + time_since_last_display = 0; + } + } +} + +void tud_vendor_rx_cb(uint8_t itf, const uint8_t* buffer, uint16_t bufsize) +{ + if (buffer[0] == 0x99) + { + rom_reset_usb_boot(0, 0); + } +} diff --git a/src/lib.cpp b/src/devicelib.cpp similarity index 83% rename from src/lib.cpp rename to src/devicelib.cpp index b9266bb..5a21e9d 100644 --- a/src/lib.cpp +++ b/src/devicelib.cpp @@ -1,4 +1,4 @@ -#include "lib.h" +#include "devicelib.h" using namespace lib; diff --git a/src/display.cpp b/src/display.cpp index 2458a73..e9a1314 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -1,6 +1,6 @@ #include "display.h" -#include "lib.h" +#include "devicelib.h" #include "pixelstream.h" #include diff --git a/src/flash.cpp b/src/flash.cpp index 6e9b67c..133c2f1 100644 --- a/src/flash.cpp +++ b/src/flash.cpp @@ -1,6 +1,6 @@ #include "flash.h" -#include "lib.h" +#include "devicelib.h" #include