From c7dfd393bfb89a753885e66b998981dd5c774739 Mon Sep 17 00:00:00 2001 From: Nicholas G Date: Sat, 25 Sep 2021 01:29:48 -0400 Subject: [PATCH] Pocket IIDX Configuration --- README.md | 2 +- build_uf2/Pico_Game_Controller.uf2 | Bin 76288 -> 76288 bytes src/controller_config.h | 20 ++++++------ src/pico_game_controller.c | 7 ++--- src/usb_descriptors.c | 47 +++++++++++++---------------- src/usb_descriptors.h | 15 +++++---- 6 files changed, 41 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 85e5fbf..c1bd045 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Pico-Game-Controller -Code for a keyboard or game controller using a Raspberry Pi Pico. Capable of handling 11 buttons, 10 LEDs, 1 WS2812B RGB strip, and 2 encoders. Developed with SDVX and IIDX in mind - see branches release/pocket-sdvx-pico and release/pocket-iidx for preconfigured versions. +This branch was developed with IIDX in mind. Capable of handling 11 buttons, 11 LEDs, 1 WS2812B RGB strip, and 1 encoder. Note: 12 buttons/LEDs are reported but B8 should probably not be used (https://github.com/veroxzik/arduino-konami-spoof) Demo of this firmware running on Pocket SDVX Pico, purchasable at https://discord.gg/MmuKd73XbY diff --git a/build_uf2/Pico_Game_Controller.uf2 b/build_uf2/Pico_Game_Controller.uf2 index 10a29a2d55157c19dcc15b0c9a88136499add2d6..9bd3c7e0ec1b426d8e0e265cdd712ef7cc509142 100644 GIT binary patch delta 9659 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 delta 9823 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