From 8a5e9bbd9d0fd95bd7ae9a3697cf7fb73675751a Mon Sep 17 00:00:00 2001 From: Luke Arntson Date: Sun, 5 Nov 2023 17:25:34 -0500 Subject: [PATCH] Revert "Documentation - Docusaurus port (#586)" This reverts commit 00adac81f3edc55141b7b8a7f35603552f02254a. --- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- .github/ISSUE_TEMPLATE/issue---bug-report.md | 2 +- .github/workflows/deploy.yml | 45 - .github/workflows/test-deploy.yml | 26 - .gitignore | 3 +- README.md | 10 +- configs/AlpacaOwO/BoardConfig.h | 2 +- configs/BentoBox/BoardConfig.h | 2 +- configs/Pico/BoardConfig.h | 2 +- configs/PicoW/BoardConfig.h | 2 +- {site/static => docs}/.nojekyll | 0 {site => docs}/CNAME | 0 docs/_sidebar.md | 53 + docs/add-ons.md | 26 + .../analog.mdx => docs/add-ons/analog.md | 8 - .../add-ons/bootsel-button.md | 8 - .../add-ons/buzzer-speaker.md | 8 - .../add-ons/dual-direction-input.md | 8 - .../add-ons/extra-button.md | 8 - .../add-ons/focus-mode.md | 7 - .../add-ons/i2c-analog-ads1219.md | 8 - .../add-ons/input-reverse.md | 8 - .../add-ons/joystick-selection-slider.md | 8 - docs/add-ons/keyboard-host.md | 3 + .../add-ons/on-board-led.md | 8 - docs/add-ons/player-number.md | 5 + docs/add-ons/ps-passthrough.md | 5 + .../ps4-mode.mdx => docs/add-ons/ps4-mode.md | 8 - .../add-ons/snes-input.md | 8 - .../add-ons/socd-selection-slider.md | 8 - .../add-ons/tilt-input.md | 12 +- .../turbo.mdx => docs/add-ons/turbo.md | 8 - docs/add-ons/usb-host-based-add-ons.md | 18 + .../add-ons/wii-extensions.md | 8 - docs/app.js | 487 ++++ .../docs => docs}/assets/boards/AlpacaOwO.jpg | Bin .../docs => docs}/assets/boards/BentoBox.jpg | Bin {site/docs => docs}/assets/boards/DURAL.jpg | Bin .../assets/boards/FightboardV3.jpg | Bin .../assets/boards/FightboardV3Mirrored.jpg | Bin .../assets/boards/FlatboxRev4.jpg | Bin .../assets/boards/FlatboxRev5.jpg | Bin .../assets/boards/FlatboxRev5RGB.jpg | Bin .../assets/boards/FlatboxRev5Southpaw.jpg | Bin {site/docs => docs}/assets/boards/KB2040.jpg | Bin .../assets/boards/KeyboardConverter.jpg | Bin docs/assets/boards/Liatris.jpg | Bin 0 -> 14238 bytes .../assets/boards/MavercadeKeebfighter.jpg | Bin .../docs => docs}/assets/boards/OpenCore0.jpg | Bin .../assets/boards/OpenCore0WASD.jpg | Bin {site/docs => docs}/assets/boards/Pico.jpg | Bin {site/docs => docs}/assets/boards/PicoAnn.jpg | Bin .../assets/boards/PicoFightingBoard.jpg | Bin {site/docs => docs}/assets/boards/PicoW.jpg | Bin .../boards/RP2040AdvancedBreakoutBoard.jpg | Bin ...040AdvancedBreakoutBoardUSBPassthrough.jpg | Bin .../assets/boards/RP2040MiniBreakoutBoard.jpg | Bin .../assets/boards/RanaTadpole.jpg | Bin .../assets/boards/ReflexCtrlSNES.jpg | Bin .../assets/boards/ReflexEncodeV1.jpg | Bin .../assets/boards/ReflexEncodeV2.jpg | Bin .../assets/boards/SGFDevices.jpg | Bin .../assets/boards/SparkFunProMicro.jpg | Bin {site/docs => docs}/assets/boards/Stress.jpg | Bin .../assets/boards/WaveshareZero.jpg | Bin .../assets/images/GP2040-PFB-demo-1.jpg | Bin .../assets/images/GP2040-PFB-demo-2.jpg | Bin .../community-splash-screens/BentoBox.png | Bin .../Crush Counter v2.0.png | Bin .../community-splash-screens/GP2040-CE 1.png | Bin .../community-splash-screens/GP2040-CE 2.png | Bin .../community-splash-screens/GP2040-CE 3.png | Bin .../community-splash-screens/GP2040-CE 4.png | Bin .../community-splash-screens/GP2040-CE 5.png | Bin .../community-splash-screens/GP2040-CE 6.png | Bin .../community-splash-screens/GP2040-CE 7.png | Bin .../Sega Astro City.png | Bin .../Street Fighter.png | Bin .../TheTrain Logo.png | Bin .../assets/images/gcp-display-config.png | Bin .../assets/images/github-sponsor-dark.png | Bin .../assets/images/github-sponsor-dimmed.png | Bin .../assets/images/github-sponsor-light.png | Bin .../assets/images/gp2040-ce-logo.png | Bin .../assets/images/gpc-add-ons-ads1219.png | Bin .../assets/images/gpc-add-ons-analog.png | Bin .../images/gpc-add-ons-bootsel-button.png | Bin .../assets/images/gpc-add-ons-buzzer.png | Bin .../images/gpc-add-ons-dual-directional.png | Bin .../images/gpc-add-ons-extra-button.png | Bin .../assets/images/gpc-add-ons-focus-mode.png | Bin .../images/gpc-add-ons-input-reverse.png | Bin .../images/gpc-add-ons-joystick-slider.png | Bin ...oard-host-configuration-wiring-diagram.png | Bin ...pc-add-ons-keyboard-host-configuration.png | Bin .../assets/images/gpc-add-ons-onboard-led.png | Bin .../images/gpc-add-ons-player-number.png | Bin .../images/gpc-add-ons-ps-passthrough.png | Bin .../assets/images/gpc-add-ons-ps4-mode.png | Bin .../images/gpc-add-ons-snespad-input.png | Bin .../assets/images/gpc-add-ons-socd-slider.png | Bin docs/assets/images/gpc-add-ons-tilt.png | Bin 0 -> 57156 bytes .../assets/images/gpc-add-ons-turbo-shmup.png | Bin .../assets/images/gpc-add-ons-turbo.png | Bin .../images/gpc-add-ons-wii-extensions.png | Bin .../assets/images/gpc-backup-and-restore.png | Bin .../assets/images/gpc-display-config.png | Bin .../docs => docs}/assets/images/gpc-home.png | Bin .../assets/images/gpc-hotkey-settings.png | Bin .../assets/images/gpc-keyboard-mapping.png | Bin .../assets/images/gpc-label-selection.png | Bin .../assets/images/gpc-macros-input-line.png | Bin .../assets/images/gpc-macros.png | Bin .../assets/images/gpc-pin-mapping.png | Bin .../assets/images/gpc-pled-pwm.png | Bin .../assets/images/gpc-pled-rgb.png | Bin .../assets/images/gpc-profile-settings.png | Bin .../assets/images/gpc-reset-settings.png | Bin .../images/gpc-rgb-led-button-order.png | Bin .../assets/images/gpc-rgb-led-config.png | Bin .../images/gpc-rgb-led-custom-theme.png | Bin .../assets/images/gpc-settings.png | Bin .../images/led-themes/_base-template.xcf | Bin .../assets/images/led-themes/fightboard.png | Bin .../images/led-themes/guilty-gear-type-a.png | Bin .../images/led-themes/guilty-gear-type-b.png | Bin .../images/led-themes/guilty-gear-type-c.png | Bin .../images/led-themes/guilty-gear-type-d.png | Bin .../images/led-themes/guilty-gear-type-e.png | Bin .../images/led-themes/neogeo-curved.png | Bin .../images/led-themes/neogeo-modern.png | Bin .../images/led-themes/neogeo-straight.png | Bin .../images/led-themes/playstation-all.png | Bin .../assets/images/led-themes/playstation.png | Bin .../led-themes/six-button-fighter-plus.png | Bin .../images/led-themes/six-button-fighter.png | Bin .../images/led-themes/static-rainbow.png | Bin .../images/led-themes/street-fighter-2.png | Bin .../images/led-themes/super-famicom-all.png | Bin .../images/led-themes/super-famicom.png | Bin .../assets/images/led-themes/tekken.png | Bin .../assets/images/led-themes/xbox-all.png | Bin .../assets/images/led-themes/xbox.png | Bin .../assets/wiring/AdafruitKB2040_Pinout.png | Bin .../assets/wiring/RaspberryPiPico_Pinout.png | Bin .../wiring/SparkFunProMicroRP2040_Pinout.png | Bin .../wiring/WaveshareRP2040Zero_Pinout.png | Bin docs/community-splash-screens.md | 10 + .../contribution-guide.md | 21 +- .../development.md | 145 +- docs/download.md | 3 + {site/docs => docs}/downloads/flash_nuke.uf2 | Bin .../faq-ps4-ps5-compatibility.md | 20 +- site/docs/faq/faq-general.mdx => docs/faq.md | 14 +- {site/static/img => docs}/favicon.ico | Bin .../getting-help-support.md | 8 - site/docs/hotkeys.mdx => docs/hotkeys.md | 50 +- docs/index.html | 48 + .../installation.mdx => docs/installation.md | 20 +- .../introduction.mdx => docs/introduction.md | 17 +- ...2040-CE_Firmware_Latency_Test_Results.xlsx | Bin site/docs/macros.mdx => docs/macros.md | 24 +- docs/package-lock.json | 2234 +++++++++++++++++ docs/package.json | 14 + site/docs/rgb-leds.mdx => docs/rgb-leds.md | 40 +- docs/site.css | 176 ++ .../templates.mdx => docs/templates.md | 71 - docs/usage.md | 86 + docs/web-configurator.md | 193 ++ docs/wiring.md | 21 + package-lock.json | 6 - site/.gitignore | 32 - site/babel.config.js | 3 - site/docs/add-ons/keyboard-host.mdx | 24 - site/docs/add-ons/player-number.mdx | 19 - site/docs/add-ons/ps-passthrough.mdx | 31 - .../_example-wiring-diagram.mdx | 6 - .../add-ons/usb-host-add-on/_pin-options.mdx | 3 - site/docs/assets/boards/Liatris.jpg | Bin 10292 -> 0 bytes site/docs/assets/boards/ReflexEncoder.jpg | Bin 32454 -> 0 bytes site/docs/assets/images/gpc-add-ons-tilt.png | Bin 50759 -> 0 bytes .../gpc-documentation-current-version.png | Bin 4153 -> 0 bytes .../images/gpc-documentation-next-version.png | Bin 4794 -> 0 bytes site/docs/community-splash-screens.mdx | 18 - site/docs/controller-build/wiring.mdx | 33 - .../development/documentation-preview.mdx | 66 - .../documentation-update-downloads.mdx | 45 - .../development/documentation-versioning.mdx | 56 - site/docs/downloads/download-page.mdx | 47 - site/docs/home.mdx | 11 - site/docs/usage.mdx | 115 - site/docs/web-configurator.mdx | 218 -- site/docusaurus.config.js | 133 - site/package.json | 53 - site/sidebars.js | 79 - site/src/components/Download.tsx | 88 - site/src/components/LabelSelector.tsx | 232 -- site/src/components/LinkIcon.tsx | 37 - site/src/components/download.module.css | 71 - site/src/components/labelselector.module.css | 3 - site/src/config/boards.tsx | 476 ---- site/src/css/custom.css | 30 - site/src/hooks/useGitHubInfo.ts | 28 - site/static/img/gp2040-ce-logo.svg | 814 ------ site/tsconfig.json | 9 - www/README.md | 2 +- 206 files changed, 3525 insertions(+), 3302 deletions(-) delete mode 100644 .github/workflows/deploy.yml delete mode 100644 .github/workflows/test-deploy.yml rename {site/static => docs}/.nojekyll (100%) rename {site => docs}/CNAME (100%) create mode 100644 docs/_sidebar.md create mode 100644 docs/add-ons.md rename site/docs/add-ons/analog.mdx => docs/add-ons/analog.md (95%) rename site/docs/add-ons/bootsel-button.mdx => docs/add-ons/bootsel-button.md (80%) rename site/docs/add-ons/buzzer-speaker.mdx => docs/add-ons/buzzer-speaker.md (75%) rename site/docs/add-ons/dual-direction-input.mdx => docs/add-ons/dual-direction-input.md (92%) rename site/docs/add-ons/extra-button.mdx => docs/add-ons/extra-button.md (72%) rename site/docs/add-ons/focus-mode.mdx => docs/add-ons/focus-mode.md (86%) rename site/docs/add-ons/i2c-analog-ads1219.mdx => docs/add-ons/i2c-analog-ads1219.md (86%) rename site/docs/add-ons/input-reverse.mdx => docs/add-ons/input-reverse.md (88%) rename site/docs/add-ons/joystick-selection-slider.mdx => docs/add-ons/joystick-selection-slider.md (74%) create mode 100644 docs/add-ons/keyboard-host.md rename site/docs/add-ons/on-board-led.mdx => docs/add-ons/on-board-led.md (81%) create mode 100644 docs/add-ons/player-number.md create mode 100644 docs/add-ons/ps-passthrough.md rename site/docs/add-ons/ps4-mode.mdx => docs/add-ons/ps4-mode.md (87%) rename site/docs/add-ons/snes-input.mdx => docs/add-ons/snes-input.md (93%) rename site/docs/add-ons/socd-selection-slider.mdx => docs/add-ons/socd-selection-slider.md (85%) rename site/docs/add-ons/tilt-input.mdx => docs/add-ons/tilt-input.md (96%) rename site/docs/add-ons/turbo.mdx => docs/add-ons/turbo.md (95%) create mode 100644 docs/add-ons/usb-host-based-add-ons.md rename site/docs/add-ons/wii-extensions.mdx => docs/add-ons/wii-extensions.md (89%) create mode 100644 docs/app.js rename {site/docs => docs}/assets/boards/AlpacaOwO.jpg (100%) rename {site/docs => docs}/assets/boards/BentoBox.jpg (100%) rename {site/docs => docs}/assets/boards/DURAL.jpg (100%) rename {site/docs => docs}/assets/boards/FightboardV3.jpg (100%) rename {site/docs => docs}/assets/boards/FightboardV3Mirrored.jpg (100%) rename {site/docs => docs}/assets/boards/FlatboxRev4.jpg (100%) rename {site/docs => docs}/assets/boards/FlatboxRev5.jpg (100%) rename {site/docs => docs}/assets/boards/FlatboxRev5RGB.jpg (100%) rename {site/docs => docs}/assets/boards/FlatboxRev5Southpaw.jpg (100%) rename {site/docs => docs}/assets/boards/KB2040.jpg (100%) rename {site/docs => docs}/assets/boards/KeyboardConverter.jpg (100%) create mode 100644 docs/assets/boards/Liatris.jpg rename {site/docs => docs}/assets/boards/MavercadeKeebfighter.jpg (100%) rename {site/docs => docs}/assets/boards/OpenCore0.jpg (100%) rename {site/docs => docs}/assets/boards/OpenCore0WASD.jpg (100%) rename {site/docs => docs}/assets/boards/Pico.jpg (100%) rename {site/docs => docs}/assets/boards/PicoAnn.jpg (100%) rename {site/docs => docs}/assets/boards/PicoFightingBoard.jpg (100%) rename {site/docs => docs}/assets/boards/PicoW.jpg (100%) rename {site/docs => docs}/assets/boards/RP2040AdvancedBreakoutBoard.jpg (100%) rename {site/docs => docs}/assets/boards/RP2040AdvancedBreakoutBoardUSBPassthrough.jpg (100%) rename {site/docs => docs}/assets/boards/RP2040MiniBreakoutBoard.jpg (100%) rename {site/docs => docs}/assets/boards/RanaTadpole.jpg (100%) rename {site/docs => docs}/assets/boards/ReflexCtrlSNES.jpg (100%) rename site/docs/assets/boards/ReflexEncode_v1.2.jpg => docs/assets/boards/ReflexEncodeV1.jpg (100%) rename site/docs/assets/boards/ReflexEncode_v2.0.jpg => docs/assets/boards/ReflexEncodeV2.jpg (100%) rename {site/docs => docs}/assets/boards/SGFDevices.jpg (100%) rename {site/docs => docs}/assets/boards/SparkFunProMicro.jpg (100%) rename {site/docs => docs}/assets/boards/Stress.jpg (100%) rename {site/docs => docs}/assets/boards/WaveshareZero.jpg (100%) rename {site/docs => docs}/assets/images/GP2040-PFB-demo-1.jpg (100%) rename {site/docs => docs}/assets/images/GP2040-PFB-demo-2.jpg (100%) rename {site/docs => docs}/assets/images/community-splash-screens/BentoBox.png (100%) rename site/docs/assets/images/community-splash-screens/CrushCounter-v2-0.png => docs/assets/images/community-splash-screens/Crush Counter v2.0.png (100%) rename site/docs/assets/images/community-splash-screens/GP2040-CE-1.png => docs/assets/images/community-splash-screens/GP2040-CE 1.png (100%) rename site/docs/assets/images/community-splash-screens/GP2040-CE-2.png => docs/assets/images/community-splash-screens/GP2040-CE 2.png (100%) rename site/docs/assets/images/community-splash-screens/GP2040-CE-3.png => docs/assets/images/community-splash-screens/GP2040-CE 3.png (100%) rename site/docs/assets/images/community-splash-screens/GP2040-CE-4.png => docs/assets/images/community-splash-screens/GP2040-CE 4.png (100%) rename site/docs/assets/images/community-splash-screens/GP2040-CE-5.png => docs/assets/images/community-splash-screens/GP2040-CE 5.png (100%) rename site/docs/assets/images/community-splash-screens/GP2040-CE-6.png => docs/assets/images/community-splash-screens/GP2040-CE 6.png (100%) rename site/docs/assets/images/community-splash-screens/GP2040-CE-7.png => docs/assets/images/community-splash-screens/GP2040-CE 7.png (100%) rename site/docs/assets/images/community-splash-screens/Sega-Astro-City.png => docs/assets/images/community-splash-screens/Sega Astro City.png (100%) rename site/docs/assets/images/community-splash-screens/Street-Fighter.png => docs/assets/images/community-splash-screens/Street Fighter.png (100%) rename site/docs/assets/images/community-splash-screens/TheTrain-Logo.png => docs/assets/images/community-splash-screens/TheTrain Logo.png (100%) rename {site/docs => docs}/assets/images/gcp-display-config.png (100%) rename {site/docs => docs}/assets/images/github-sponsor-dark.png (100%) rename {site/docs => docs}/assets/images/github-sponsor-dimmed.png (100%) rename {site/docs => docs}/assets/images/github-sponsor-light.png (100%) rename {site/docs => docs}/assets/images/gp2040-ce-logo.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-ads1219.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-analog.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-bootsel-button.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-buzzer.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-dual-directional.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-extra-button.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-focus-mode.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-input-reverse.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-joystick-slider.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-keyboard-host-configuration-wiring-diagram.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-keyboard-host-configuration.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-onboard-led.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-player-number.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-ps-passthrough.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-ps4-mode.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-snespad-input.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-socd-slider.png (100%) create mode 100644 docs/assets/images/gpc-add-ons-tilt.png rename {site/docs => docs}/assets/images/gpc-add-ons-turbo-shmup.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-turbo.png (100%) rename {site/docs => docs}/assets/images/gpc-add-ons-wii-extensions.png (100%) rename {site/docs => docs}/assets/images/gpc-backup-and-restore.png (100%) rename {site/docs => docs}/assets/images/gpc-display-config.png (100%) rename {site/docs => docs}/assets/images/gpc-home.png (100%) rename {site/docs => docs}/assets/images/gpc-hotkey-settings.png (100%) rename {site/docs => docs}/assets/images/gpc-keyboard-mapping.png (100%) rename {site/docs => docs}/assets/images/gpc-label-selection.png (100%) rename {site/docs => docs}/assets/images/gpc-macros-input-line.png (100%) rename {site/docs => docs}/assets/images/gpc-macros.png (100%) rename {site/docs => docs}/assets/images/gpc-pin-mapping.png (100%) rename {site/docs => docs}/assets/images/gpc-pled-pwm.png (100%) rename {site/docs => docs}/assets/images/gpc-pled-rgb.png (100%) rename {site/docs => docs}/assets/images/gpc-profile-settings.png (100%) rename {site/docs => docs}/assets/images/gpc-reset-settings.png (100%) rename {site/docs => docs}/assets/images/gpc-rgb-led-button-order.png (100%) rename {site/docs => docs}/assets/images/gpc-rgb-led-config.png (100%) rename {site/docs => docs}/assets/images/gpc-rgb-led-custom-theme.png (100%) rename {site/docs => docs}/assets/images/gpc-settings.png (100%) rename {site/docs => docs}/assets/images/led-themes/_base-template.xcf (100%) rename {site/docs => docs}/assets/images/led-themes/fightboard.png (100%) rename {site/docs => docs}/assets/images/led-themes/guilty-gear-type-a.png (100%) rename {site/docs => docs}/assets/images/led-themes/guilty-gear-type-b.png (100%) rename {site/docs => docs}/assets/images/led-themes/guilty-gear-type-c.png (100%) rename {site/docs => docs}/assets/images/led-themes/guilty-gear-type-d.png (100%) rename {site/docs => docs}/assets/images/led-themes/guilty-gear-type-e.png (100%) rename {site/docs => docs}/assets/images/led-themes/neogeo-curved.png (100%) rename {site/docs => docs}/assets/images/led-themes/neogeo-modern.png (100%) rename {site/docs => docs}/assets/images/led-themes/neogeo-straight.png (100%) rename {site/docs => docs}/assets/images/led-themes/playstation-all.png (100%) rename {site/docs => docs}/assets/images/led-themes/playstation.png (100%) rename {site/docs => docs}/assets/images/led-themes/six-button-fighter-plus.png (100%) rename {site/docs => docs}/assets/images/led-themes/six-button-fighter.png (100%) rename {site/docs => docs}/assets/images/led-themes/static-rainbow.png (100%) rename {site/docs => docs}/assets/images/led-themes/street-fighter-2.png (100%) rename {site/docs => docs}/assets/images/led-themes/super-famicom-all.png (100%) rename {site/docs => docs}/assets/images/led-themes/super-famicom.png (100%) rename {site/docs => docs}/assets/images/led-themes/tekken.png (100%) rename {site/docs => docs}/assets/images/led-themes/xbox-all.png (100%) rename {site/docs => docs}/assets/images/led-themes/xbox.png (100%) rename {site/docs => docs}/assets/wiring/AdafruitKB2040_Pinout.png (100%) rename {site/docs => docs}/assets/wiring/RaspberryPiPico_Pinout.png (100%) rename {site/docs => docs}/assets/wiring/SparkFunProMicroRP2040_Pinout.png (100%) rename {site/docs => docs}/assets/wiring/WaveshareRP2040Zero_Pinout.png (100%) create mode 100644 docs/community-splash-screens.md rename site/docs/development/contribution-guide.mdx => docs/contribution-guide.md (92%) rename site/docs/development/firmware-development.mdx => docs/development.md (82%) create mode 100644 docs/download.md rename {site/docs => docs}/downloads/flash_nuke.uf2 (100%) rename site/docs/faq/faq-ps4-ps5-compatibility.mdx => docs/faq-ps4-ps5-compatibility.md (85%) rename site/docs/faq/faq-general.mdx => docs/faq.md (90%) rename {site/static/img => docs}/favicon.ico (100%) rename site/docs/getting-help-support.mdx => docs/getting-help-support.md (92%) rename site/docs/hotkeys.mdx => docs/hotkeys.md (66%) create mode 100644 docs/index.html rename site/docs/installation.mdx => docs/installation.md (84%) rename site/docs/introduction.mdx => docs/introduction.md (68%) rename {site => docs}/latency_tests/GP2040-CE_Firmware_Latency_Test_Results.xlsx (100%) rename site/docs/macros.mdx => docs/macros.md (85%) create mode 100644 docs/package-lock.json create mode 100644 docs/package.json rename site/docs/rgb-leds.mdx => docs/rgb-leds.md (70%) create mode 100644 docs/site.css rename site/docs/development/templates.mdx => docs/templates.md (63%) create mode 100644 docs/usage.md create mode 100644 docs/web-configurator.md create mode 100644 docs/wiring.md delete mode 100644 package-lock.json delete mode 100644 site/.gitignore delete mode 100644 site/babel.config.js delete mode 100644 site/docs/add-ons/keyboard-host.mdx delete mode 100644 site/docs/add-ons/player-number.mdx delete mode 100644 site/docs/add-ons/ps-passthrough.mdx delete mode 100644 site/docs/add-ons/usb-host-add-on/_example-wiring-diagram.mdx delete mode 100644 site/docs/add-ons/usb-host-add-on/_pin-options.mdx delete mode 100644 site/docs/assets/boards/Liatris.jpg delete mode 100644 site/docs/assets/boards/ReflexEncoder.jpg delete mode 100644 site/docs/assets/images/gpc-add-ons-tilt.png delete mode 100644 site/docs/assets/images/gpc-documentation-current-version.png delete mode 100644 site/docs/assets/images/gpc-documentation-next-version.png delete mode 100644 site/docs/community-splash-screens.mdx delete mode 100644 site/docs/controller-build/wiring.mdx delete mode 100644 site/docs/development/documentation-preview.mdx delete mode 100644 site/docs/development/documentation-update-downloads.mdx delete mode 100644 site/docs/development/documentation-versioning.mdx delete mode 100644 site/docs/downloads/download-page.mdx delete mode 100644 site/docs/home.mdx delete mode 100644 site/docs/usage.mdx delete mode 100644 site/docs/web-configurator.mdx delete mode 100644 site/docusaurus.config.js delete mode 100644 site/package.json delete mode 100644 site/sidebars.js delete mode 100644 site/src/components/Download.tsx delete mode 100644 site/src/components/LabelSelector.tsx delete mode 100644 site/src/components/LinkIcon.tsx delete mode 100644 site/src/components/download.module.css delete mode 100644 site/src/components/labelselector.module.css delete mode 100644 site/src/config/boards.tsx delete mode 100644 site/src/css/custom.css delete mode 100644 site/src/hooks/useGitHubInfo.ts delete mode 100644 site/static/img/gp2040-ce-logo.svg delete mode 100644 site/tsconfig.json diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 88217f019..01d592bed 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -7,7 +7,7 @@ assignees: '' --- -### Have you checked the GP2040-CE documentation [HERE](https://gp2040-ce.info/) to confirm this feature doesn't already exist? +### Have you checked the GP2040-CE documentation [HERE](https://gp2040-ce.info/#/) to confirm this feature doesn't already exist? Yes/No diff --git a/.github/ISSUE_TEMPLATE/issue---bug-report.md b/.github/ISSUE_TEMPLATE/issue---bug-report.md index 84732ce87..45a23d517 100644 --- a/.github/ISSUE_TEMPLATE/issue---bug-report.md +++ b/.github/ISSUE_TEMPLATE/issue---bug-report.md @@ -12,7 +12,7 @@ assignees: '' Please check the following before posting an issue / bug report. - [ ] I am running the latest version of the firmware found [HERE](https://github.com/OpenStickCommunity/GP2040-CE/releases) -- [ ] I have checked the documentation [HERE](https://gp2040-ce.info/) and found no answer +- [ ] I have checked the documentation [HERE](https://gp2040-ce.info/#/) and found no answer - [ ] I checked to make sure that this issue has not already been filed [HERE](https://github.com/OpenStickCommunity/GP2040-CE/issues) - [ ] I am reporting the issue to the correct repository diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index 425cff30c..000000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: Deploy to GitHub Pages - -on: - push: - branches: - - main - # Review gh actions docs if you want to further define triggers, paths, etc - # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on - -permissions: - contents: write - -jobs: - deploy: - name: Deploy to GitHub Pages - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 18 - cache: npm - - - name: Install dependencies - run: npm install --frozen-lockfile - working-directory: site - - name: Build website - run: npm run build - working-directory: site - - # Popular action to deploy to GitHub Pages: - # Docs: https://github.com/peaceiris/actions-gh-pages#%EF%B8%8F-docusaurus - - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.ACTION_SECRET }} - # Build output to publish to the `gh-pages` branch: - publish_dir: site/build - # The following lines assign commit authorship to the official - # GH-Actions bot for deploys to `gh-pages` branch: - # https://github.com/actions/checkout/issues/13#issuecomment-724415212 - # The GH actions bot is used by default if you didn't specify the two fields. - # You can swap them out with your own user credentials. - user_name: github-actions[bot] - user_email: 41898282+github-actions[bot]@users.noreply.github.com \ No newline at end of file diff --git a/.github/workflows/test-deploy.yml b/.github/workflows/test-deploy.yml deleted file mode 100644 index 70bfdac0e..000000000 --- a/.github/workflows/test-deploy.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Test Docs Deployment - -on: - pull_request: - branches: - - main - # Review gh actions docs if you want to further define triggers, paths, etc - # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on - -jobs: - test-deploy: - name: Test docs deployment - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 18 - cache: npm - - - name: Install dependencies - run: npm install --frozen-lockfile - working-directory: site - - name: Test build website - run: npm run build - working-directory: site diff --git a/.gitignore b/.gitignore index 84bfbfed4..51b23a8b4 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,5 @@ lib/httpd/fsdata.c modules/Custom.cmake .idea cmake-* -env.ini \ No newline at end of file +env.ini + diff --git a/README.md b/README.md index 965573876..6f776e12a 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ ## Links -[Downloads](https://gp2040-ce.info/downloads/download-page) | [Installation](https://gp2040-ce.info/installation) | [Wiring](https://gp2040-ce.info/controller-build/wiring) | [Usage](https://gp2040-ce.info/usage) | [FAQ](https://gp2040-ce.info/faq/faq-general) | [GitHub](https://github.com/OpenStickCommunity/GP2040-CE) +[Downloads](https://gp2040-ce.info/#/download) | [Installation](https://gp2040-ce.info/#/installation) | [Wiring](https://gp2040-ce.info/#/wiring) | [Usage](https://gp2040-ce.info/#/usage) | [FAQ](https://gp2040-ce.info/#/faq) | [GitHub](https://github.com/OpenStickCommunity/GP2040-CE) Full documentation can be found at @@ -38,16 +38,16 @@ Full documentation can be found at * Left and Right stick emulation via D-pad inputs as well as dedicated toggle switches. * Dual direction via D-pad + LS/RS. * Reversed input via a button. -* [Turbo and Turbo LED](https://gp2040-ce.info/add-ons/turbo) with selectable speed +* [Turbo and Turbo LED](https://gp2040-ce.info/#/add-ons/turbo) with selectable speed * Per-button RGB LED support. * PWM Player indicator LED support (XInput only). * Multiple LED profiles support. * Support for 128x64 monochrome I2C displays - SSD1306, SH1106, and SH1107 compatible. * Custom startup splash screen and easy image upload via web configuration. * Support for passive buzzer speaker (3v or 5v). -* [Built-in, embedded web configuration](https://gp2040-ce.info/web-configurator) - No download required! +* [Built-in, embedded web configuration](https://gp2040-ce.info/#/web-configurator) - No download required! -Visit the [GP2040-CE Usage](https://gp2040-ce.info/usage) page for more details. +Visit the [GP2040-CE Usage](https://gp2040-ce.info/#/usage) page for more details. ## Performance @@ -58,7 +58,7 @@ Input latency is tested using the methodology outlined at [WydD's inputlag.scien | v0.7.5 | All modes (except PS4) | 1 ms | 0.45 ms | 1.28 ms | 0.77 ms | 0.24 ms | 96.27% | 3.73% | 0% | | v0.7.5 | PS4 Mode | 1 ms | 1.34 ms | 2.01 ms | 1.72 ms | 0.16 ms | 90.55% | 9.45% | 0% | -Full results can be found in the [GP2040-CE Firmware Latency Test Results](https://raw.githubusercontent.com/OpenStickCommunity/GP2040-CE/main/site/latency_tests/GP2040-CE_Firmware_Latency_Test_Results.xlsx) .xlsx Sheet. +Full results can be found in the [GP2040-CE Firmware Latency Test Results](https://raw.githubusercontent.com/OpenStickCommunity/GP2040-CE/main/docs/latency_tests/GP2040-CE_Firmware_Latency_Test_Results.xlsx) .xlsx Sheet. ## Support diff --git a/configs/AlpacaOwO/BoardConfig.h b/configs/AlpacaOwO/BoardConfig.h index 35cd9fcea..c5c633386 100644 --- a/configs/AlpacaOwO/BoardConfig.h +++ b/configs/AlpacaOwO/BoardConfig.h @@ -276,7 +276,7 @@ #define KEY_BUTTON_A1 HID_KEY_9 // A1 / Guide / Home / PS / 13 / ~ #define KEY_BUTTON_A2 HID_KEY_F2 // A2 / ~ / Capture / ~ / 14 / ~ -// For details on this, see: https://gp2040-ce.info/development?id=i2c-display-splash +// For details on this, see: https://gp2040-ce.info/#/development?id=i2c-display-splash #define DEFAULT_SPLASH \ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, \ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, \ diff --git a/configs/BentoBox/BoardConfig.h b/configs/BentoBox/BoardConfig.h index 9eadaeea0..9710842dd 100644 --- a/configs/BentoBox/BoardConfig.h +++ b/configs/BentoBox/BoardConfig.h @@ -254,7 +254,7 @@ #define KEY_BUTTON_A1 HID_KEY_9 // A1 / Guide / Home / PS / 13 / ~ #define KEY_BUTTON_A2 HID_KEY_F2 // A2 / ~ / Capture / ~ / 14 / ~ -// For details on this, see: https://gp2040-ce.info/development/firmware-development#i2c-display-splash +// For details on this, see: https://gp2040-ce.info/#/development?id=i2c-display-splash #define DEFAULT_SPLASH \ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, \ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, \ diff --git a/configs/Pico/BoardConfig.h b/configs/Pico/BoardConfig.h index 0394289bf..511ac9f69 100644 --- a/configs/Pico/BoardConfig.h +++ b/configs/Pico/BoardConfig.h @@ -316,7 +316,7 @@ #define PSPASSTHROUGH_HOST_PIN_DPLUS -1 #define PSPASSTHROUGH_HOST_PIN_5V -1 -// For details on this, see: https://gp2040-ce.info/development?id=i2c-display-splash +// For details on this, see: https://gp2040-ce.info/#/development?id=i2c-display-splash #define DEFAULT_SPLASH \ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, \ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, \ diff --git a/configs/PicoW/BoardConfig.h b/configs/PicoW/BoardConfig.h index 124819c64..ed96eafa5 100644 --- a/configs/PicoW/BoardConfig.h +++ b/configs/PicoW/BoardConfig.h @@ -297,7 +297,7 @@ #define KEYBOARD_HOST_PIN_DPLUS -1 #define KEYBOARD_HOST_PIN_5V -1 -// For details on this, see: https://gp2040-ce.info/development/firmware-development#i2c-display-splash +// For details on this, see: https://gp2040-ce.info/#/development?id=i2c-display-splash #define DEFAULT_SPLASH \ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, \ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, \ diff --git a/site/static/.nojekyll b/docs/.nojekyll similarity index 100% rename from site/static/.nojekyll rename to docs/.nojekyll diff --git a/site/CNAME b/docs/CNAME similarity index 100% rename from site/CNAME rename to docs/CNAME diff --git a/docs/_sidebar.md b/docs/_sidebar.md new file mode 100644 index 000000000..ebafcca05 --- /dev/null +++ b/docs/_sidebar.md @@ -0,0 +1,53 @@ +[**Home**](README "GP2040-CE | RP2040 Gamepad Firmware Documentation") +[**Download**](download "GP2040-CE | Download") +**General** +- [Introduction](introduction "GP2040-CE | Introduction") +- [Firmware Installation](installation "GP2040-CE | Firmware Installation") +- [Usage](usage "GP2040-CE | Usage") +- [Hotkeys](hotkeys "GP2040-CE | Hotkeys") +- [RGB LEDs](rgb-leds "GP2040-CE | RGB LEDs") +- [Getting Help/Support](getting-help-support "GP2040-CE | Getting Help") + +**FAQs** + +- [General FAQ](faq "GP2040-CE | Frequently Asked Questions (FAQ)") +- [PS4/PS5 Compatibility FAQ](faq-ps4-ps5-compatibility "GP2040-CE | PS4-PS5 Compatibility") + +**Web Configurator** + +- [Web Configurator](web-configurator "GP2040-CE | Web Configurator") +- [Macros](macros "GP2040-CE | Macros") +- [Add-Ons](add-ons "GP2040-CE | Web Configurator - Add-ons") + - [Analog](add-ons/analog.md) + - [BOOTSEL Button](add-ons/bootsel-button.md) + - [Buzzer Speaker](add-ons/buzzer-speaker.md) + - [Dual Directional Input](add-ons/dual-direction-input.md) + - [Extra Button](add-ons/extra-button.md) + - [Focus Mode](add-ons/focus-mode.md) + - [I2C Analog ADS1219](add-ons/i2c-analog-ads1219.md) + - [Input Reverse](add-ons/input-reverse.md) + - [Joystick Selection Slider](add-ons/joystick-selection-slider.md) + - [On-board LED](add-ons/on-board-led.md) + - [Player Number](add-ons/player-number.md) + - [PS4 Mode](add-ons/ps4-mode.md) + - [SNES Input](add-ons/snes-input.md) + - [SOCD Selection Slider](add-ons/socd-selection-slider.md) + - [Tilt Input](add-ons/tilt-input.md) + - [Turbo](add-ons/turbo.md) + - [USB Host Based Add-ons](add-ons/usb-host-based-add-ons.md) + - [PS Passthrough](add-ons/ps-passthrough.md) + - [Keyboard Host](add-ons/keyboard-host.md) + - [Wii Extensions](add-ons/wii-extensions.md) + +**Controller Building** + +- [Wiring](wiring "GP2040-CE | Wiring Guide") + +**Developing GP2040-CE** + +- [Firmware Development](development "GP2040-CE | Development") + +**References** + +- [Contribution Guide](contribution-guide "GP2040-CE | Contribution Guide") +- [Templates](templates "GP2040-CE | Templates") diff --git a/docs/add-ons.md b/docs/add-ons.md new file mode 100644 index 000000000..164fe4f6c --- /dev/null +++ b/docs/add-ons.md @@ -0,0 +1,26 @@ +# Add-Ons Configuration + +This section is for custom add-ons that can be enabled to expand the functionality of GP2040-CE. Some of these add-ons are experimental. Please note that not all add-ons may work together. + +## Available Add-ons + +- [Analog](add-ons/analog.md) +- [BOOTSEL Button Configuration](add-ons/bootsel-button.md) +- [Buzzer Speaker](add-ons/buzzer-speaker.md) +- [Dual Directional Input](add-ons/dual-direction-input.md) +- [Extra Button Configuration](add-ons/extra-button.md) +- [Focus Mode Configuration](add-ons/focus-mode.md) +- [I2C Analog ADS1219](add-ons/i2c-analog-ads1219.md) +- [Input Reverse](add-ons/input-reverse.md) +- [Joystick Selection Slider](add-ons/joystick-selection-slider.md) +- [On-board LED Configuration](add-ons/on-board-led.md) +- [Player Number (X-INPUT ONLY)](add-ons/player-number.md) +- [PS4 Mode](add-ons/ps4-mode.md) +- [SNES Input](add-ons/snes-input.md) +- [SOCD Selection Slider](add-ons/socd-selection-slider.md) +- [Tilt Input](add-ons/tilt-input.md) +- [Turbo](add-ons/turbo.md) +- [USB Host Based Add-ons](add-ons/usb-host-based-add-ons.md) + - [PS Passthrough](add-ons/ps-passthrough.md) + - [Keyboard Host Configuration](add-ons/keyboard-host.md) +- [Wii Extensions](add-ons/wii-extensions.md) \ No newline at end of file diff --git a/site/docs/add-ons/analog.mdx b/docs/add-ons/analog.md similarity index 95% rename from site/docs/add-ons/analog.mdx rename to docs/add-ons/analog.md index 378d63872..5c27ae43b 100644 --- a/site/docs/add-ons/analog.mdx +++ b/docs/add-ons/analog.md @@ -1,11 +1,3 @@ ---- -title: Analog -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # Analog ![GP2040-CE Configurator - Add-Ons Analog](../assets/images/gpc-add-ons-analog.png) diff --git a/site/docs/add-ons/bootsel-button.mdx b/docs/add-ons/bootsel-button.md similarity index 80% rename from site/docs/add-ons/bootsel-button.mdx rename to docs/add-ons/bootsel-button.md index d7bee954c..413e8c11c 100644 --- a/site/docs/add-ons/bootsel-button.mdx +++ b/docs/add-ons/bootsel-button.md @@ -1,11 +1,3 @@ ---- -title: BOOTSEL Button Configuration -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # BOOTSEL Button Configuration ![GP2040-CE Configurator - Add-Ons BOOTSEL Button Configuration](../assets/images/gpc-add-ons-bootsel-button.png) diff --git a/site/docs/add-ons/buzzer-speaker.mdx b/docs/add-ons/buzzer-speaker.md similarity index 75% rename from site/docs/add-ons/buzzer-speaker.mdx rename to docs/add-ons/buzzer-speaker.md index 9ec0349d6..52542ce8e 100644 --- a/site/docs/add-ons/buzzer-speaker.mdx +++ b/docs/add-ons/buzzer-speaker.md @@ -1,11 +1,3 @@ ---- -title: Buzzer Speaker -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # Buzzer Speaker ![GP2040-CE Configurator - Add-Ons Buzzer](../assets/images/gpc-add-ons-buzzer.png) diff --git a/site/docs/add-ons/dual-direction-input.mdx b/docs/add-ons/dual-direction-input.md similarity index 92% rename from site/docs/add-ons/dual-direction-input.mdx rename to docs/add-ons/dual-direction-input.md index 6a97386d8..8fc15a814 100644 --- a/site/docs/add-ons/dual-direction-input.mdx +++ b/docs/add-ons/dual-direction-input.md @@ -1,11 +1,3 @@ ---- -title: Dual Directional Input -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # Dual Directional Input ![GP2040-CE Configuration - Add-Ons Dual Directional Input](../assets/images/gpc-add-ons-dual-directional.png) diff --git a/site/docs/add-ons/extra-button.mdx b/docs/add-ons/extra-button.md similarity index 72% rename from site/docs/add-ons/extra-button.mdx rename to docs/add-ons/extra-button.md index b316c3a11..a0587da31 100644 --- a/site/docs/add-ons/extra-button.mdx +++ b/docs/add-ons/extra-button.md @@ -1,11 +1,3 @@ ---- -title: Extra Button Configuration -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # Extra Button Configuration ![GP2040-CE Configurator - Extra Button](../assets/images/gpc-add-ons-extra-button.png) diff --git a/site/docs/add-ons/focus-mode.mdx b/docs/add-ons/focus-mode.md similarity index 86% rename from site/docs/add-ons/focus-mode.mdx rename to docs/add-ons/focus-mode.md index d4189d62b..ae08a9923 100644 --- a/site/docs/add-ons/focus-mode.mdx +++ b/docs/add-ons/focus-mode.md @@ -1,10 +1,3 @@ ---- -title: Focus Mode Configuration -# tags: -# - -pagination_next: null -pagination_prev: null ---- # Focus Mode Configuration ![GP2040-CE Configurator - Focus Mode](../assets/images/gpc-add-ons-focus-mode.png) diff --git a/site/docs/add-ons/i2c-analog-ads1219.mdx b/docs/add-ons/i2c-analog-ads1219.md similarity index 86% rename from site/docs/add-ons/i2c-analog-ads1219.mdx rename to docs/add-ons/i2c-analog-ads1219.md index 631357e8f..c2958c3ff 100644 --- a/site/docs/add-ons/i2c-analog-ads1219.mdx +++ b/docs/add-ons/i2c-analog-ads1219.md @@ -1,11 +1,3 @@ ---- -title: I2C Analog ADS1219 -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # I2C Analog ADS1219 ![GP2040-CE Configurator - Add-Ons ADS1219](../assets/images/gpc-add-ons-ads1219.png) diff --git a/site/docs/add-ons/input-reverse.mdx b/docs/add-ons/input-reverse.md similarity index 88% rename from site/docs/add-ons/input-reverse.mdx rename to docs/add-ons/input-reverse.md index 4fce5eabd..a16262e61 100644 --- a/site/docs/add-ons/input-reverse.mdx +++ b/docs/add-ons/input-reverse.md @@ -1,11 +1,3 @@ ---- -title: Input Reverse -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # Input Reverse ![GP2040-CE Configurator - Add-Ons Input Reverse](../assets/images/gpc-add-ons-input-reverse.png) diff --git a/site/docs/add-ons/joystick-selection-slider.mdx b/docs/add-ons/joystick-selection-slider.md similarity index 74% rename from site/docs/add-ons/joystick-selection-slider.mdx rename to docs/add-ons/joystick-selection-slider.md index a4e052c23..1df0d96cb 100644 --- a/site/docs/add-ons/joystick-selection-slider.mdx +++ b/docs/add-ons/joystick-selection-slider.md @@ -1,11 +1,3 @@ ---- -title: Joystick Selection Slider -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # Joystick Selection Slider ![GP2040-CE Configurator - Add-Ons Joystick Slider](../assets/images/gpc-add-ons-joystick-slider.png) diff --git a/docs/add-ons/keyboard-host.md b/docs/add-ons/keyboard-host.md new file mode 100644 index 000000000..73795aea7 --- /dev/null +++ b/docs/add-ons/keyboard-host.md @@ -0,0 +1,3 @@ +# Keyboard Host Configuration + +![GP2040-CE Configurator - Keyboard Host Configuration](../assets/images/gpc-add-ons-keyboard-host-configuration.png) \ No newline at end of file diff --git a/site/docs/add-ons/on-board-led.mdx b/docs/add-ons/on-board-led.md similarity index 81% rename from site/docs/add-ons/on-board-led.mdx rename to docs/add-ons/on-board-led.md index 2b1ffe3fb..0b6014ebb 100644 --- a/site/docs/add-ons/on-board-led.mdx +++ b/docs/add-ons/on-board-led.md @@ -1,11 +1,3 @@ ---- -title: On-board LED Configuration -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # On-board LED Configuration ![GP2040-CE Configurator - Add-Ons On-Board LED Configuration](../assets/images/gpc-add-ons-onboard-led.png) diff --git a/docs/add-ons/player-number.md b/docs/add-ons/player-number.md new file mode 100644 index 000000000..dd972fbf3 --- /dev/null +++ b/docs/add-ons/player-number.md @@ -0,0 +1,5 @@ +# Player Number (X-INPUT ONLY) + +![GP2040-CE Configurator - Player Number](../assets/images/gpc-add-ons-player-number.png) + +* `Player Number` - Choose what player number this RP2040 based device will be representing. This is only for X-INPUT mode. \ No newline at end of file diff --git a/docs/add-ons/ps-passthrough.md b/docs/add-ons/ps-passthrough.md new file mode 100644 index 000000000..4e0553ce0 --- /dev/null +++ b/docs/add-ons/ps-passthrough.md @@ -0,0 +1,5 @@ +# PS Passthrough + +![GP2040-CE Configurator - PS Passthrough](../assets/images/gpc-add-ons-ps-passthrough.png) + +Enabling this add-on will allow you to use a licensed 3rd party device to authenticate off of. This add-on requires that you have something like the ![USB Passthrough Board](https://github.com/OpenStickCommunity/Hardware/tree/main/USB%20Passthrough%20Board) or a board with a USB passthrough port on it already. If you have passthrough enabled you can turn off the above `PS4 Mode` add-on as the two will not work together. Please also ensure that under the `Settings` section you have chosen PS4 mode and picked if you want the GP2040-CE unit to function as a controller or as a fightstick. \ No newline at end of file diff --git a/site/docs/add-ons/ps4-mode.mdx b/docs/add-ons/ps4-mode.md similarity index 87% rename from site/docs/add-ons/ps4-mode.mdx rename to docs/add-ons/ps4-mode.md index 706206360..2bc095bbe 100644 --- a/site/docs/add-ons/ps4-mode.mdx +++ b/docs/add-ons/ps4-mode.md @@ -1,11 +1,3 @@ ---- -title: PS4 Mode -tags: -- PS4 -pagination_next: null -pagination_prev: null ---- - # PS4 Mode ![GP2040-CE Configurator - PS4 Mode](../assets/images/gpc-add-ons-ps4-mode.png) diff --git a/site/docs/add-ons/snes-input.mdx b/docs/add-ons/snes-input.md similarity index 93% rename from site/docs/add-ons/snes-input.mdx rename to docs/add-ons/snes-input.md index 032317b50..c86575b95 100644 --- a/site/docs/add-ons/snes-input.mdx +++ b/docs/add-ons/snes-input.md @@ -1,11 +1,3 @@ ---- -title: SNES Input -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # SNES Input ![GP2040-CE Configurator - SNES Input](../assets/images/gpc-add-ons-snespad-input.png) diff --git a/site/docs/add-ons/socd-selection-slider.mdx b/docs/add-ons/socd-selection-slider.md similarity index 85% rename from site/docs/add-ons/socd-selection-slider.mdx rename to docs/add-ons/socd-selection-slider.md index 1e4236a7f..af6616676 100644 --- a/site/docs/add-ons/socd-selection-slider.mdx +++ b/docs/add-ons/socd-selection-slider.md @@ -1,11 +1,3 @@ ---- -title: SOCD Selection Slider -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # SOCD Selection Slider ![GP2040-CE Configurator - SOCD Selection Slider](../assets/images/gpc-add-ons-socd-slider.png) diff --git a/site/docs/add-ons/tilt-input.mdx b/docs/add-ons/tilt-input.md similarity index 96% rename from site/docs/add-ons/tilt-input.mdx rename to docs/add-ons/tilt-input.md index a68d2dd2a..24f5429a2 100644 --- a/site/docs/add-ons/tilt-input.mdx +++ b/docs/add-ons/tilt-input.md @@ -1,11 +1,3 @@ ---- -title: Tilt Input -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # Tilt Input Purpose: The Tilt Input add-on allows users to send analog inputs from the Left and Right analog sticks that are some percent of the maximum directional input (e.g. send 65% of a Down-Right input on the Right analog stick). @@ -32,11 +24,11 @@ Purpose: The Tilt Input add-on allows users to send analog inputs from the Left * `Tilt Right Analog Right Pin` - The GPIO pin used for the Right direction on the Right analog stick. * `Tilt SOCD Mode` - Choose the default SOCD Cleaning Mode (Neutral, Last Win, First Win). -## Hardware Requirements: +Hardware Requirements: - Additional buttons, switches, or joysticks, are recommended for this add-on as this add-on entirely prevents the primary Dpad from being set as the Left analog or Right analog stick. -## Notes +Notes - Because this add-on disables the Dpad from being set as Left analog and Right analog, using the hotkeys `Dpad Left Analog` and `Dpad Right Analog` deactivates the Dpad and using the `Dpad Digital` will reactivate the Dpad once more. - Not all Tilt analog pins are required to be set, but not setting the pins will prevent you from using that input without using the Web Configurator to remap the inputs. diff --git a/site/docs/add-ons/turbo.mdx b/docs/add-ons/turbo.md similarity index 95% rename from site/docs/add-ons/turbo.mdx rename to docs/add-ons/turbo.md index 5e82b05d9..6a1f157b5 100644 --- a/site/docs/add-ons/turbo.mdx +++ b/docs/add-ons/turbo.md @@ -1,11 +1,3 @@ ---- -title: Turbo -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # Turbo ![GP2040-CE Configurator - Add-Ons Turbo](../assets/images/gpc-add-ons-turbo.png) diff --git a/docs/add-ons/usb-host-based-add-ons.md b/docs/add-ons/usb-host-based-add-ons.md new file mode 100644 index 000000000..a68d397a9 --- /dev/null +++ b/docs/add-ons/usb-host-based-add-ons.md @@ -0,0 +1,18 @@ +# USB Host Based Add-ons + +These add-ons are predicated on having and using a USB Host Port on the device. These settings are shared between the add-ons in this section. + +* `D+` - The GPIO Pin used to carry Data Plus between the USB Host Port and RP2040 +* `D-` - The GPIO Pin used to carry Data Minus between the USB Host Port and RP2040. This cannot be set and will be automatically determined from `D+`. +* `5V Power (optional)` - The GPIO Pin used to enable 5V power to the host port on the board. This is only applicable to a small number of boards (e.g. Adafruit RP2040 Feather USB Host) and most boards do not require this to be set. + +## Example Wiring Diagram + +This example wiring diagram is applicable to both the PS Passthrough and the Keyboard Host Configuration Add-ons as both require a USB host port to be set up and connected to the board. + +![USB Host Wiring Diagram](../assets/images/gpc-add-ons-keyboard-host-configuration-wiring-diagram.png) + +* `VCC` - Connects to 5V power (Example: VBUS on the Raspberry Pi Pico) +* `D+` - Connects to the `D+` GPIO Pin above, set in the Web Configurator. (Example: GPIO0 on the Raspberry Pi Pico) +* `D-` - Connects to the `D-` GPIO Pin above, automatically set based on D+. (Example: GPIO1 on the Raspberry Pi Pico) +* `GND` - Connects to a ground pin, any `GND` pin will work. (Example: GND on the Raspberry Pi Pico) diff --git a/site/docs/add-ons/wii-extensions.mdx b/docs/add-ons/wii-extensions.md similarity index 89% rename from site/docs/add-ons/wii-extensions.mdx rename to docs/add-ons/wii-extensions.md index 41d1bc3a8..a1e2c06b5 100644 --- a/site/docs/add-ons/wii-extensions.mdx +++ b/docs/add-ons/wii-extensions.md @@ -1,11 +1,3 @@ ---- -title: Wii Extensions -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # Wii Extensions ![GP2040-CE Configurator - Wii Extensions](../assets/images/gpc-add-ons-wii-extensions.png) diff --git a/docs/app.js b/docs/app.js new file mode 100644 index 000000000..9e9fedf98 --- /dev/null +++ b/docs/app.js @@ -0,0 +1,487 @@ +const configCategories = [ + 'Microcontroller Boards', + 'Open Source Devices', + 'Closed Source Devices', + 'Legacy Devices' +]; + +const configData = { + AlpacaOwO: { + name: 'Alpaca-OwO', + category: configCategories[1], + website: 'https://github.com/Project-Alpaca/Alpaca-OwO', + desc: 'Arcade controller I/O platform designed by dogtopus.' + }, + BentoBox: { + name: 'ScrubTier BentoBox', + category: configCategories[2], + website: 'https://github.com/OpenStickCommunity/GP2040-CE/tree/main/configs/BentoBox', + desc: '' + }, + DURAL: { + name: 'BatiKING DURAL', + category: configCategories[3], + website: 'https://github.com/BatiKING/DURAL_DIY', + desc: '' + }, + FightboardV3: { + name: 'thnikk Fightboard V3', + category: configCategories[3], + website: 'https://docs.thnikk.moe/models/fightboard/v3.html', + desc: '' + }, + FightboardV3Mirrored: { + name: 'thnikk Fightboard V3 (Mirrored)', + category: configCategories[3], + website: 'https://docs.thnikk.moe/models/fightboard/v3.html', + desc: '' + }, + FlatboxRev4: { + name: 'Flatbox Rev 4', + category: configCategories[1], + website: 'https://github.com/jfedor2/flatbox/tree/master/hardware-rev4', + desc: 'Stickless PCB designed by jfedor2 using an embedded RP2040 chip.' + }, + FlatboxRev5: { + name: 'Flatbox Rev 5', + category: configCategories[1], + website: 'https://github.com/jfedor2/flatbox/tree/master/hardware-rev5', + desc: 'Stickless PCB designed by jfedor2 using the Waveshare RP2040-Zero.' + }, + FlatboxRev5RGB: { + name: 'Flatbox Rev 5 RGB', + category: configCategories[1], + website: 'https://github.com/OpenStickCommunity/Hardware/tree/main/Flatbox%20Rev%205%20RGB', + desc: 'Stickless PCB designed by jfedor2 and TheTrain using the Waveshare RP2040-Zero.' + }, + FlatboxRev5Southpaw: { + name: 'Flatbox Rev 5 Southpaw', + category: configCategories[1], + website: 'https://github.com/SkylaHila/flatbox-southpaw
', + desc: 'Mirrored version of the Flatbox Rev 5 by SkylaHila. Based on the Flatbox Rev 5 by jfedor2.' + }, + KB2040: { + name: 'Adafruit KB2040', + category: configCategories[0], + pinout: '/#/wiring?id=adafruit-kb2040', + website: 'https://learn.adafruit.com/adafruit-kb2040', + desc: 'Another RP2040 board in the Pro Micro form factor, with 2 additional pins for USB data. This build is configured for DIY gamepad mods.' + }, + KeyboardConverter: { + name: 'GP2040-CE Keyboard Converter', + category: configCategories[1], + website: 'https://github.com/OpenStickCommunity/Hardware/blob/main/GP2040%20Keyboard%20Converter/Waveshare%20Zero-PCB/README.md', + desc: 'The GP2040-CE Keyboard Converter Case is designed to be a USB Host Device for the use of a keyboard with the GP2040-CE project. The end result is a device that allows you to play on a keyboard, but have it registered just as GP2040-CE controller, whether that is XInput, DInput, PS4, or Switch.' + }, + Liatris: { + name: 'Liatris', + category: configCategories[0], + website: 'https://splitkb.com/products/liatris', + desc: 'Drop in RP2040 replacement for Pro Micro builds by SplitKB.com' + }, + MavercadeKeebfighter: { + name: 'Mavercade Keebfighter', + category: configCategories[2], + website: 'https://github.com/OpenStickCommunity/GP2040-CE/tree/main/configs/MavercadeKeebfighter', + desc: '' + }, + OpenCore0: { + name: 'Open Core0', + category: configCategories[1], + website: 'https://github.com/OpenStickCommunity/Hardware/tree/main/Open_Core0', + desc: 'Open source stickless controller designed by TheTrain.' + }, + OpenCore0WASD: { + name: 'Open Core0 WASD', + category: configCategories[1], + website: 'https://github.com/OpenStickCommunity/Hardware/tree/main/Open_Core0%20WASD', + desc: 'Open source stickless WASD controller designed by TheTrain.' + }, + Pico: { + name: 'Raspberry Pi Pico', + category: configCategories[0], + pos: 1, + pinout: '/#/wiring?id=raspberry-pi-pico', + website: 'https://www.raspberrypi.com/products/raspberry-pi-pico/', + desc: 'The Raspberry Pi Pico is a powerful, low-cost board based on the Raspberry Pi RP2040 microcontroller. This build is the reference implementation for GP2040-CE.' + }, + PicoAnn: { + name: 'PicoAnn', + category: configCategories[3], + website: '', + desc: '' + }, + PicoFightingBoard: { + name: 'Pico Fighting Board', + category: configCategories[1], + website: 'https://github.com/FeralAI/PicoFightingBoard', + desc: 'Arcade encoder board designed by FeralAI using a Raspberry Pi Pico or pin-equivalent RP2040 board.' + }, + PicoW: { + name: 'Raspberry Pi Pico W', + category: configCategories[0], + pos: 2, + pinout: '/#/wiring?id=raspberry-pi-pico', + website: 'https://www.raspberrypi.com/products/raspberry-pi-pico/', + desc: 'The Raspberry Pi Pico W is a powerful, low-cost board based on the Raspberry Pi RP2040 microcontroller.' + }, + RanaTadpole: { + name: 'Rana Tadpole', + category: configCategories[1], + website: 'https://github.com/rana-sylvatica/rana-tadpole', + desc: 'Pocket-sized digital controller from RanaLabs.' + }, + RP2040AdvancedBreakoutBoard: { + name: 'RP2040 Advanced Breakout', + category: configCategories[1], + website: 'https://github.com/OpenStickCommunity/Hardware/tree/main/RP2040%20Advanced%20Breakout%20Board', + desc: 'Arcade encoder board designed by TheTrain using an embedded RP2040, and is the official board of the GP2040-CE project.' + }, + RP2040AdvancedBreakoutBoardUSBPassthrough: { + name: 'RP2040 Advanced Breakout (USB Passthrough)', + category: configCategories[1], + website: 'https://github.com/OpenStickCommunity/Hardware/tree/main/RP2040%20Advanced%20Breakout%20Board%20-%20Passthrough', + desc: 'Official USB Passthrough Board of the Open Stick project. Updated version of the RP2040 Advanced Breakout Board with USB passthrough included on the board.' + }, + RP2040MiniBreakoutBoard: { + name: 'RP2040 Mini Breakout', + category: configCategories[1], + website: 'https://github.com/OpenStickCommunity/Hardware/tree/main/RP2040%20Mini%20Breakout%20Board', + desc: 'A reduced-footprint spin off of the RP2040 Advanced Breakout Board designed by TheTrain.' + }, + ReflexEncodeV1: { + name: 'Reflex Arcade Encoder v1', + category: configCategories[1], + website: 'https://github.com/misteraddons/ReflexFightingBoard', + desc: 'Open source PCB for arcade sticks v1 designed and sold by MiSTerAddons using an embedded RP2040 chip.' + }, + ReflexEncodeV2: { + name: 'Reflex Arcade Encoder v2', + category: configCategories[1], + website: 'https://github.com/misteraddons/ReflexFightingBoard', + desc: 'Open source PCB for arcade sticks v2 designed and sold by MiSTerAddons using an embedded RP2040 chip.' + }, + ReflexCtrlSNES: { + name: 'Reflex CTRL SNES', + category: configCategories[1], + website: 'https://github.com/misteraddons/Reflex-CTRL', + desc: 'Reflex Board Open source PCB for SNES Controller replacement PCBs designed and sold by MiSTerAddons using an embedded RP2040 chip.' + }, + SGFDevices: { + name: 'SGF Flatbox', + category: configCategories[1], + website: 'https://github.com/sgfdevices/SGFlatbox', + desc: 'Configuration for the SGF Flatbox-based controllers, based on the excellent revisions of the Flatbox design by jfedor2 powered by an RP2040 MCU.' + }, + SparkFunProMicro: { + name: 'SparkFun Pro Micro', + category: configCategories[0], + pos: 2, + pinout: '/#/wiring?id=sparkfun-pro-micro-rp2040', + website: 'https://learn.sparkfun.com/tutorials/pro-micro-rp2040-hookup-guide', + desc: 'An RP2040 board in the Pro Micro form factor. This build is a drop-in replacement for the Daemonbite Arcade Encoder.' + }, + Stress: { + name: 'Stress', + category: configCategories[1], + website: 'https://github.com/GroooveBob/Stress', + desc: 'A small and portable PCB-as-a-controller designed by GroooveBob using the Waveshare RP-2040-Zero.' + }, + WaveshareZero: { + name: 'Waveshare RP2040-Zero', + category: configCategories[0], + pos: 3, + pinout: '/#/wiring?id=waveshare-rp2040-zero', + website: 'https://www.waveshare.com/wiki/RP2040-Zero', + desc: 'The Waveshare RP2040-Zero is a small form factor board with castellated pins and USB-C, making this a popular choice for custom built PCBs without the need for SMT assembly.' + }, +}; + +window.$docsify = { + name: 'GP2040-CE', + repo: 'https://github.com/OpenStickCommunity/GP2040-CE', + homepage: 'https://raw.githubusercontent.com/OpenStickCommunity/GP2040-CE/main/README.md', + search: { + maxAge: 86400000, // Expiration time, the default one day + placeholder: 'Type to search', + depth: 6, + hideOtherSidebarContent: false, + }, + logo: 'assets/images/gp2040-ce-logo.png', + loadSidebar: true, + alias: { + '/.*/_sidebar.md': '/_sidebar.md', + }, + auto2top: true, + subMaxLevel: 1, + sidebarDisplayLevel: 3, // set sidebar display level + externalLinkTarget: '_self', + cornerExternalLinkTarget: '_self', + themeable: { + readyTransition : true, // default + responsiveTables: true // default + }, + vueGlobalOptions: { + directives: { + VScrollThreshold, + VueStickyElement, + }, + data() { + return { + labelData: { + "GP2040": { "name": "GP2040", "Up": "Up", "Down": "Down", "Left": "Left", "Right": "Right", "B1": "B1", "B2": "B2", "B3": "B3", "B4": "B4", "L1": "L1", "R1": "R1", "L2": "L2", "R2": "R2", "S1": "S1", "S2": "S2", "L3": "L3", "R3": "R3", "A1": "A1", "A2": "A2" }, + "XInput": { "name": "XInput", "Up": "Up", "Down": "Down", "Left": "Left", "Right": "Right", "B1": "A", "B2": "B", "B3": "X", "B4": "Y", "L1": "LB", "R1": "RB", "L2": "LT", "R2": "RT", "S1": "Back", "S2": "Start", "L3": "LS", "R3": "RS", "A1": "Guide", "A2": "(A2)" }, + "DirectInput": { "name": "DirectInput", "Up": "Up", "Down": "Down", "Left": "Left", "Right": "Right", "B1": "2", "B2": "3", "B3": "1", "B4": "4", "L1": "5", "R1": "6", "L2": "7", "R2": "8", "S1": "9", "S2": "10", "L3": "11", "R3": "12", "A1": "13", "A2": "14" }, + "Nintendo Switch": { "name": "Nintendo Switch", "Up": "Up", "Down": "Down", "Left": "Left", "Right": "Right", "B1": "B", "B2": "A", "B3": "Y", "B4": "X", "L1": "L", "R1": "R", "L2": "ZL", "R2": "ZR", "S1": "Minus", "S2": "Plus", "L3": "LS", "R3": "RS", "A1": "Home", "A2": "Capture" }, + "PS4": { "name": "PS4", "Up": "Up", "Down": "Down", "Left": "Left", "Right": "Right", "B1": "Cross", "B2": "Circle", "B3": "Square", "B4": "Triangle", "L1": "L1", "R1": "R1", "L2": "L2", "R2": "R2", "S1": "Share", "S2": "Options", "L3": "L3", "R3": "R3", "A1": "PS", "A2": "Touchpad" }, + "PS3": { "name": "PS3", "Up": "Up", "Down": "Down", "Left": "Left", "Right": "Right", "B1": "Cross", "B2": "Circle", "B3": "Square", "B4": "Triangle", "L1": "L1", "R1": "R1", "L2": "L2", "R2": "R2", "S1": "Select", "S2": "Start", "L3": "L3", "R3": "R3", "A1": "PS", "A2": "(A2)" }, + "Arcade": { "name": "Arcade", "Up": "Up", "Down": "Down", "Left": "Left", "Right": "Right", "B1": "K1", "B2": "K2", "B3": "P1", "B4": "P2", "L1": "P4", "R1": "P3", "L2": "K4", "R2": "K3", "S1": "Select", "S2": "Start", "L3": "LS", "R3": "RS", "A1": "Home", "A2": "(A2)" }, + }, + selectedLabels: localStorage.getItem('selectedLabels') || 'GP2040', + }; + } + }, + vueComponents: { + 'download-box': { + props: ['release'], + template: ` +
+ + + +
+
{{ release.name }}
+ +
+
+
+
+ `, + }, + + 'download-category': { + props: ['category'], + template: ` +
+

{{ category }}

+
+

GP2040-CE builds for these devices have been deprecated due to one or more of the following reasons:

+
    +
  • The manufacturer already provides a custom build of GP2040-CE
  • +
  • The device is no longer available for purchase
  • +
  • The operation of the device running an updated GP2040-CE build cannot be verified by the development team
  • +
+

These builds remain available, however legacy devices are not supported by the GP2040-CE team.

+

Please ensure you have a backup of the original firmware and your settings before updating your device!

+
+
+ + +
+
+ `, + data() { + return { + releases: this.$root.releases, + }; + }, + }, + + 'download-page': { + template: ` +
+ + + +
+

Flash Nuke

+

+ Use the flash_nuke.uf2 + file to completely erase the flash of the RP2040 board. THIS WILL ERASE ALL SAVED SETTINGS! + Use this prior to flashing GP2040-CE on your device if you want to start from a clean slate, or as a troubleshooting step before to reporting an issue. +

+
+ +
+ `, + data() { + return { + configCategories, + configData, + fetched: false, + releaseNotes: this.$root.releaseNotes, + releaseVersion: this.$root.releaseVersion, + releases: this.$root.releases, + }; + }, + created() { + fetch("https://api.github.com/repos/OpenStickCommunity/GP2040-CE/releases/latest", { method: "GET", cache: "force-cache" }) + .then(response => response.json()) + .then(data => { + const releaseInfo = data; + /* + Tries to find a board and redirects to download url based on the URL + e.g: https://gp2040-ce.info/#/download?RP2040AdvancedBreakoutBoard + */ + const uf2ToDownload = window.location.hash + .split('?')?.[1] + ?.toLowerCase(); + if (uf2ToDownload) { + releaseInfo.assets.forEach(({ browser_download_url, name }) => { + if ( + name + .substring(name.lastIndexOf('_') + 1) + .replace('.uf2', '') + .toLowerCase() === uf2ToDownload + ) { + window.location.href = browser_download_url; + } + }); + } + + this.$root.releaseNotes = releaseInfo.body; + this.$root.releaseVersion = releaseInfo.name; + + this.$root.releases = releaseInfo.assets + .filter(a => a.name.startsWith('GP2040-CE_')) + .filter(a => { + const key = a.name.substring(a.name.lastIndexOf('_') + 1).replace('.uf2', ''); + return Object.keys(this.configData).indexOf(key) > -1; + }) + .map(a => { + const key = a.name.substring(a.name.lastIndexOf('_') + 1).replace('.uf2', ''); + return { + key, + ...this.configData[key], + url: a.browser_download_url, + img: `/assets/boards/${key}.jpg`, + }; + }) + .sort((a, b) => { + if (a.name < b.name) return -1; + if (a.name > b.name) return 1; + return 0; + }) + .sort((a, b) => (a.pos === undefined ? Number.MAX_VALUE : a.pos) - (b.pos === undefined ? Number.MAX_VALUE : b.pos)) + .reduce((p, r) => { + let values = { ...p }; + if (!values[r.category]) + values[r.category] = []; + + values[r.category].push(r); + return values; + }, { }); + + this.fetched = true; + }); + }, + }, + + 'label-selector': { + template: ` + +
+ +
+
+ `, + data() { + return { + labelData: this.$root.labelData, + selectedLabels: this.$root.selectedLabels, + }; + }, + methods: { + setSelectedLabels($event) { + localStorage.setItem('selectedLabels', $event.target.value); + this.$root.selectedLabels = $event.target.value; + }, + }, + }, + + 'hotkey': { + props: ['buttons'], + template: ` + + {{ buttons.reduce((prev, next) => prev ? prev + " + " + labelData[state.selectedLabels][next] : labelData[state.selectedLabels][next] , "") }} + + `, + data() { + return { + state: this.$root.$data, + labelData: this.$root.labelData, + }; + }, + }, + + 'version-name': { + template: `

GP2040-CE

`, + data() { + return { + version: this.$root.releaseVersion, + }; + }, + }, + + 'release-notes': { + template: ` +
+ `, + data() { + marked.use({ + renderer: { + heading(text, level) { + return `

${text}

`; + } + } + }) + return { + body: marked.parse(this.$root.releaseNotes ? "---\r\n## Release Notes\r\n" + this.$root.releaseNotes : ""), + } + }, + }, + + }, + tabs: { + persist : true, // default + sync : true, // default + theme : 'classic', // default + tabComments: true, // default + tabHeadings: true // default + }, + toc: { + tocMaxLevel: 6, + target: 'h2, h3, h4, h5, h6', + ignoreHeaders: ['', ''] + // scope: '.markdown-section', + // headings: 'h1, h2, h3, h4, h5, h6', + // title: 'Table of Contents', + } +}; diff --git a/site/docs/assets/boards/AlpacaOwO.jpg b/docs/assets/boards/AlpacaOwO.jpg similarity index 100% rename from site/docs/assets/boards/AlpacaOwO.jpg rename to docs/assets/boards/AlpacaOwO.jpg diff --git a/site/docs/assets/boards/BentoBox.jpg b/docs/assets/boards/BentoBox.jpg similarity index 100% rename from site/docs/assets/boards/BentoBox.jpg rename to docs/assets/boards/BentoBox.jpg diff --git a/site/docs/assets/boards/DURAL.jpg b/docs/assets/boards/DURAL.jpg similarity index 100% rename from site/docs/assets/boards/DURAL.jpg rename to docs/assets/boards/DURAL.jpg diff --git a/site/docs/assets/boards/FightboardV3.jpg b/docs/assets/boards/FightboardV3.jpg similarity index 100% rename from site/docs/assets/boards/FightboardV3.jpg rename to docs/assets/boards/FightboardV3.jpg diff --git a/site/docs/assets/boards/FightboardV3Mirrored.jpg b/docs/assets/boards/FightboardV3Mirrored.jpg similarity index 100% rename from site/docs/assets/boards/FightboardV3Mirrored.jpg rename to docs/assets/boards/FightboardV3Mirrored.jpg diff --git a/site/docs/assets/boards/FlatboxRev4.jpg b/docs/assets/boards/FlatboxRev4.jpg similarity index 100% rename from site/docs/assets/boards/FlatboxRev4.jpg rename to docs/assets/boards/FlatboxRev4.jpg diff --git a/site/docs/assets/boards/FlatboxRev5.jpg b/docs/assets/boards/FlatboxRev5.jpg similarity index 100% rename from site/docs/assets/boards/FlatboxRev5.jpg rename to docs/assets/boards/FlatboxRev5.jpg diff --git a/site/docs/assets/boards/FlatboxRev5RGB.jpg b/docs/assets/boards/FlatboxRev5RGB.jpg similarity index 100% rename from site/docs/assets/boards/FlatboxRev5RGB.jpg rename to docs/assets/boards/FlatboxRev5RGB.jpg diff --git a/site/docs/assets/boards/FlatboxRev5Southpaw.jpg b/docs/assets/boards/FlatboxRev5Southpaw.jpg similarity index 100% rename from site/docs/assets/boards/FlatboxRev5Southpaw.jpg rename to docs/assets/boards/FlatboxRev5Southpaw.jpg diff --git a/site/docs/assets/boards/KB2040.jpg b/docs/assets/boards/KB2040.jpg similarity index 100% rename from site/docs/assets/boards/KB2040.jpg rename to docs/assets/boards/KB2040.jpg diff --git a/site/docs/assets/boards/KeyboardConverter.jpg b/docs/assets/boards/KeyboardConverter.jpg similarity index 100% rename from site/docs/assets/boards/KeyboardConverter.jpg rename to docs/assets/boards/KeyboardConverter.jpg diff --git a/docs/assets/boards/Liatris.jpg b/docs/assets/boards/Liatris.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b56faafae0656823003bbf0bcd90b952df8e8e5b GIT binary patch literal 14238 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 literal 0 HcmV?d00001 diff --git a/site/docs/assets/images/gpc-add-ons-turbo-shmup.png b/docs/assets/images/gpc-add-ons-turbo-shmup.png similarity index 100% rename from site/docs/assets/images/gpc-add-ons-turbo-shmup.png rename to docs/assets/images/gpc-add-ons-turbo-shmup.png diff --git a/site/docs/assets/images/gpc-add-ons-turbo.png b/docs/assets/images/gpc-add-ons-turbo.png similarity index 100% rename from site/docs/assets/images/gpc-add-ons-turbo.png rename to docs/assets/images/gpc-add-ons-turbo.png diff --git a/site/docs/assets/images/gpc-add-ons-wii-extensions.png b/docs/assets/images/gpc-add-ons-wii-extensions.png similarity index 100% rename from site/docs/assets/images/gpc-add-ons-wii-extensions.png rename to docs/assets/images/gpc-add-ons-wii-extensions.png diff --git a/site/docs/assets/images/gpc-backup-and-restore.png b/docs/assets/images/gpc-backup-and-restore.png similarity index 100% rename from site/docs/assets/images/gpc-backup-and-restore.png rename to docs/assets/images/gpc-backup-and-restore.png diff --git a/site/docs/assets/images/gpc-display-config.png b/docs/assets/images/gpc-display-config.png similarity index 100% rename from site/docs/assets/images/gpc-display-config.png rename to docs/assets/images/gpc-display-config.png diff --git a/site/docs/assets/images/gpc-home.png b/docs/assets/images/gpc-home.png similarity index 100% rename from site/docs/assets/images/gpc-home.png rename to docs/assets/images/gpc-home.png diff --git a/site/docs/assets/images/gpc-hotkey-settings.png b/docs/assets/images/gpc-hotkey-settings.png similarity index 100% rename from site/docs/assets/images/gpc-hotkey-settings.png rename to docs/assets/images/gpc-hotkey-settings.png diff --git a/site/docs/assets/images/gpc-keyboard-mapping.png b/docs/assets/images/gpc-keyboard-mapping.png similarity index 100% rename from site/docs/assets/images/gpc-keyboard-mapping.png rename to docs/assets/images/gpc-keyboard-mapping.png diff --git a/site/docs/assets/images/gpc-label-selection.png b/docs/assets/images/gpc-label-selection.png similarity index 100% rename from site/docs/assets/images/gpc-label-selection.png rename to docs/assets/images/gpc-label-selection.png diff --git a/site/docs/assets/images/gpc-macros-input-line.png b/docs/assets/images/gpc-macros-input-line.png similarity index 100% rename from site/docs/assets/images/gpc-macros-input-line.png rename to docs/assets/images/gpc-macros-input-line.png diff --git a/site/docs/assets/images/gpc-macros.png b/docs/assets/images/gpc-macros.png similarity index 100% rename from site/docs/assets/images/gpc-macros.png rename to docs/assets/images/gpc-macros.png diff --git a/site/docs/assets/images/gpc-pin-mapping.png b/docs/assets/images/gpc-pin-mapping.png similarity index 100% rename from site/docs/assets/images/gpc-pin-mapping.png rename to docs/assets/images/gpc-pin-mapping.png diff --git a/site/docs/assets/images/gpc-pled-pwm.png b/docs/assets/images/gpc-pled-pwm.png similarity index 100% rename from site/docs/assets/images/gpc-pled-pwm.png rename to docs/assets/images/gpc-pled-pwm.png diff --git a/site/docs/assets/images/gpc-pled-rgb.png b/docs/assets/images/gpc-pled-rgb.png similarity index 100% rename from site/docs/assets/images/gpc-pled-rgb.png rename to docs/assets/images/gpc-pled-rgb.png diff --git a/site/docs/assets/images/gpc-profile-settings.png b/docs/assets/images/gpc-profile-settings.png similarity index 100% rename from site/docs/assets/images/gpc-profile-settings.png rename to docs/assets/images/gpc-profile-settings.png diff --git a/site/docs/assets/images/gpc-reset-settings.png b/docs/assets/images/gpc-reset-settings.png similarity index 100% rename from site/docs/assets/images/gpc-reset-settings.png rename to docs/assets/images/gpc-reset-settings.png diff --git a/site/docs/assets/images/gpc-rgb-led-button-order.png b/docs/assets/images/gpc-rgb-led-button-order.png similarity index 100% rename from site/docs/assets/images/gpc-rgb-led-button-order.png rename to docs/assets/images/gpc-rgb-led-button-order.png diff --git a/site/docs/assets/images/gpc-rgb-led-config.png b/docs/assets/images/gpc-rgb-led-config.png similarity index 100% rename from site/docs/assets/images/gpc-rgb-led-config.png rename to docs/assets/images/gpc-rgb-led-config.png diff --git a/site/docs/assets/images/gpc-rgb-led-custom-theme.png b/docs/assets/images/gpc-rgb-led-custom-theme.png similarity index 100% rename from site/docs/assets/images/gpc-rgb-led-custom-theme.png rename to docs/assets/images/gpc-rgb-led-custom-theme.png diff --git a/site/docs/assets/images/gpc-settings.png b/docs/assets/images/gpc-settings.png similarity index 100% rename from site/docs/assets/images/gpc-settings.png rename to docs/assets/images/gpc-settings.png diff --git a/site/docs/assets/images/led-themes/_base-template.xcf b/docs/assets/images/led-themes/_base-template.xcf similarity index 100% rename from site/docs/assets/images/led-themes/_base-template.xcf rename to docs/assets/images/led-themes/_base-template.xcf diff --git a/site/docs/assets/images/led-themes/fightboard.png b/docs/assets/images/led-themes/fightboard.png similarity index 100% rename from site/docs/assets/images/led-themes/fightboard.png rename to docs/assets/images/led-themes/fightboard.png diff --git a/site/docs/assets/images/led-themes/guilty-gear-type-a.png b/docs/assets/images/led-themes/guilty-gear-type-a.png similarity index 100% rename from site/docs/assets/images/led-themes/guilty-gear-type-a.png rename to docs/assets/images/led-themes/guilty-gear-type-a.png diff --git a/site/docs/assets/images/led-themes/guilty-gear-type-b.png b/docs/assets/images/led-themes/guilty-gear-type-b.png similarity index 100% rename from site/docs/assets/images/led-themes/guilty-gear-type-b.png rename to docs/assets/images/led-themes/guilty-gear-type-b.png diff --git a/site/docs/assets/images/led-themes/guilty-gear-type-c.png b/docs/assets/images/led-themes/guilty-gear-type-c.png similarity index 100% rename from site/docs/assets/images/led-themes/guilty-gear-type-c.png rename to docs/assets/images/led-themes/guilty-gear-type-c.png diff --git a/site/docs/assets/images/led-themes/guilty-gear-type-d.png b/docs/assets/images/led-themes/guilty-gear-type-d.png similarity index 100% rename from site/docs/assets/images/led-themes/guilty-gear-type-d.png rename to docs/assets/images/led-themes/guilty-gear-type-d.png diff --git a/site/docs/assets/images/led-themes/guilty-gear-type-e.png b/docs/assets/images/led-themes/guilty-gear-type-e.png similarity index 100% rename from site/docs/assets/images/led-themes/guilty-gear-type-e.png rename to docs/assets/images/led-themes/guilty-gear-type-e.png diff --git a/site/docs/assets/images/led-themes/neogeo-curved.png b/docs/assets/images/led-themes/neogeo-curved.png similarity index 100% rename from site/docs/assets/images/led-themes/neogeo-curved.png rename to docs/assets/images/led-themes/neogeo-curved.png diff --git a/site/docs/assets/images/led-themes/neogeo-modern.png b/docs/assets/images/led-themes/neogeo-modern.png similarity index 100% rename from site/docs/assets/images/led-themes/neogeo-modern.png rename to docs/assets/images/led-themes/neogeo-modern.png diff --git a/site/docs/assets/images/led-themes/neogeo-straight.png b/docs/assets/images/led-themes/neogeo-straight.png similarity index 100% rename from site/docs/assets/images/led-themes/neogeo-straight.png rename to docs/assets/images/led-themes/neogeo-straight.png diff --git a/site/docs/assets/images/led-themes/playstation-all.png b/docs/assets/images/led-themes/playstation-all.png similarity index 100% rename from site/docs/assets/images/led-themes/playstation-all.png rename to docs/assets/images/led-themes/playstation-all.png diff --git a/site/docs/assets/images/led-themes/playstation.png b/docs/assets/images/led-themes/playstation.png similarity index 100% rename from site/docs/assets/images/led-themes/playstation.png rename to docs/assets/images/led-themes/playstation.png diff --git a/site/docs/assets/images/led-themes/six-button-fighter-plus.png b/docs/assets/images/led-themes/six-button-fighter-plus.png similarity index 100% rename from site/docs/assets/images/led-themes/six-button-fighter-plus.png rename to docs/assets/images/led-themes/six-button-fighter-plus.png diff --git a/site/docs/assets/images/led-themes/six-button-fighter.png b/docs/assets/images/led-themes/six-button-fighter.png similarity index 100% rename from site/docs/assets/images/led-themes/six-button-fighter.png rename to docs/assets/images/led-themes/six-button-fighter.png diff --git a/site/docs/assets/images/led-themes/static-rainbow.png b/docs/assets/images/led-themes/static-rainbow.png similarity index 100% rename from site/docs/assets/images/led-themes/static-rainbow.png rename to docs/assets/images/led-themes/static-rainbow.png diff --git a/site/docs/assets/images/led-themes/street-fighter-2.png b/docs/assets/images/led-themes/street-fighter-2.png similarity index 100% rename from site/docs/assets/images/led-themes/street-fighter-2.png rename to docs/assets/images/led-themes/street-fighter-2.png diff --git a/site/docs/assets/images/led-themes/super-famicom-all.png b/docs/assets/images/led-themes/super-famicom-all.png similarity index 100% rename from site/docs/assets/images/led-themes/super-famicom-all.png rename to docs/assets/images/led-themes/super-famicom-all.png diff --git a/site/docs/assets/images/led-themes/super-famicom.png b/docs/assets/images/led-themes/super-famicom.png similarity index 100% rename from site/docs/assets/images/led-themes/super-famicom.png rename to docs/assets/images/led-themes/super-famicom.png diff --git a/site/docs/assets/images/led-themes/tekken.png b/docs/assets/images/led-themes/tekken.png similarity index 100% rename from site/docs/assets/images/led-themes/tekken.png rename to docs/assets/images/led-themes/tekken.png diff --git a/site/docs/assets/images/led-themes/xbox-all.png b/docs/assets/images/led-themes/xbox-all.png similarity index 100% rename from site/docs/assets/images/led-themes/xbox-all.png rename to docs/assets/images/led-themes/xbox-all.png diff --git a/site/docs/assets/images/led-themes/xbox.png b/docs/assets/images/led-themes/xbox.png similarity index 100% rename from site/docs/assets/images/led-themes/xbox.png rename to docs/assets/images/led-themes/xbox.png diff --git a/site/docs/assets/wiring/AdafruitKB2040_Pinout.png b/docs/assets/wiring/AdafruitKB2040_Pinout.png similarity index 100% rename from site/docs/assets/wiring/AdafruitKB2040_Pinout.png rename to docs/assets/wiring/AdafruitKB2040_Pinout.png diff --git a/site/docs/assets/wiring/RaspberryPiPico_Pinout.png b/docs/assets/wiring/RaspberryPiPico_Pinout.png similarity index 100% rename from site/docs/assets/wiring/RaspberryPiPico_Pinout.png rename to docs/assets/wiring/RaspberryPiPico_Pinout.png diff --git a/site/docs/assets/wiring/SparkFunProMicroRP2040_Pinout.png b/docs/assets/wiring/SparkFunProMicroRP2040_Pinout.png similarity index 100% rename from site/docs/assets/wiring/SparkFunProMicroRP2040_Pinout.png rename to docs/assets/wiring/SparkFunProMicroRP2040_Pinout.png diff --git a/site/docs/assets/wiring/WaveshareRP2040Zero_Pinout.png b/docs/assets/wiring/WaveshareRP2040Zero_Pinout.png similarity index 100% rename from site/docs/assets/wiring/WaveshareRP2040Zero_Pinout.png rename to docs/assets/wiring/WaveshareRP2040Zero_Pinout.png diff --git a/docs/community-splash-screens.md b/docs/community-splash-screens.md new file mode 100644 index 000000000..73cd0d1fb --- /dev/null +++ b/docs/community-splash-screens.md @@ -0,0 +1,10 @@ +# Community Splash Screens + +Here is a collection of community created splash screens that can be used with an optional OLED screen. Upload the image using the web configurator to set it up. + +All images been formatted to 128x64 in black / white color. + +| ![BentoBox](assets/images/community-splash-screens/BentoBox.png) | ![Crush_Counter](assets/images/community-splash-screens/Crush%20Counter%20v2.0.png) | ![GP2040-CE1](assets/images/community-splash-screens/GP2040-CE%201.png) | ![GP2040-CE2](assets/images/community-splash-screens/GP2040-CE%202.png) | ![GP2040-CE3](assets/images/community-splash-screens/GP2040-CE%203.png) | +|---|---|---|---|---| +| ![GP2040-CE4](assets/images/community-splash-screens/GP2040-CE%204.png) | ![GP2040-CE5](assets/images/community-splash-screens/GP2040-CE%205.png) | ![Sega_Astro_City](assets/images/community-splash-screens/Sega%20Astro%20City.png) | ![Street_Fighter](assets/images/community-splash-screens/Street%20Fighter.png) | ![TheTrain](assets/images/community-splash-screens/TheTrain%20Logo.png) | +| ![GP2040-CE6](assets/images/community-splash-screens/GP2040-CE%206.png) | ![GP2040-CE7](assets/images/community-splash-screens/GP2040-CE%207.png) | | | | \ No newline at end of file diff --git a/site/docs/development/contribution-guide.mdx b/docs/contribution-guide.md similarity index 92% rename from site/docs/development/contribution-guide.mdx rename to docs/contribution-guide.md index 9b480c474..e26caafe5 100644 --- a/site/docs/development/contribution-guide.mdx +++ b/docs/contribution-guide.md @@ -1,11 +1,3 @@ ---- -title: How to Contribute -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # How to Contribute Thank you for taking the time to read this and contributing to the project! @@ -51,4 +43,15 @@ Never made an open source contribution before? Wondering how contributions work ## Documentation -Documentation is one of the easiest ways to get started contributing to GP2040-CE. Finding places where the documentation is wrong or incomplete and fixing those is easy! We also very badly need someone to edit our documentation, so if you have editing skills but aren’t sure where or how to jump in please [reach out for help](getting-help-support "GP2040-CE | Getting Help")! \ No newline at end of file +Documentation is one of the easiest ways to get started contributing to GP2040-CE. Finding places where the documentation is wrong or incomplete and fixing those is easy! We also very badly need someone to edit our documentation, so if you have editing skills but aren’t sure where or how to jump in please [reach out for help](getting-help-support "GP2040-CE | Getting Help")! + +### Previewing Documentation + +1. Open a terminal in the root of the GP2040-CE project +2. Change the directory to `docs` +3. Run the following commands + ``` + npm install + npm start + ``` +4. In a web browser, go to `http://localhost:3000` diff --git a/site/docs/development/firmware-development.mdx b/docs/development.md similarity index 82% rename from site/docs/development/firmware-development.mdx rename to docs/development.md index cafbc371f..96d05d3d7 100644 --- a/site/docs/development/firmware-development.mdx +++ b/docs/development.md @@ -1,15 +1,4 @@ ---- -title: Firmware Development -# tags: -# - -pagination_next: null -pagination_prev: null ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -# Firmware Development +# GP2040-CE Development GP2040-CE is written in C++ and set up as a standard Pico SDK project. See [Getting Started with the Raspberry Pi Pico](https://rptl.io/pico-get-started). @@ -20,10 +9,14 @@ Most of this will be parroting the above linked PDF from the Raspberry Pi Founda For GP2040-CE development on the Windows platform using the Pico SDK Installer, please skip ahead to the 'Windows Setup (Pico SDK Installer)' section on this page. - - + + +### **Windows (Pico SDK)** + +### Windows (Pico SDK) + -1. Download and install [CMake](https://github.com/Kitware/CMake/releases/download/v3.27.4/cmake-3.27.4-windows-x86_64.msi). +1. Download and install CMake from the [CMake Website](https://github.com/Kitware/CMake/releases/download/v3.27.4/cmake-3.27.4-windows-x86_64.msi). 2. Download and install [pico-setup-windows-x64-standalone](https://github.com/raspberrypi/pico-setup-windows/releases/). 3. Download and install VSCode. 4. Download and install [Windows Terminal](https://github.com/microsoft/terminal/releases/tag/v1.17.11461.0). @@ -36,27 +29,36 @@ For GP2040-CE development on the Windows platform using the Pico SDK Installer, git submodule update --init ``` -After installing the Raspberry Pi Pico SDK, you should now have a shortcut to "Pico-Visual Studio Code" (search for it using Windows Search). + After installing the Raspberry Pi Pico SDK, you should now have a shortcut to "Pico-Visual Studio Code" (search for it using Windows Search). 7. Open "Pico-Visual Studio Code" via Windows search. This is a shortcut with pre-configured environment variables (this will be explained later). 8. Navigate to the Extensions window by pressing `Ctrl+Shift+X`. 9. Install "CMake Tools" by Microsoft. 10. Open the GP2040-CE folder you downloaded earlier via "File > Open Folder." - - +### **Windows (Manual)** -1. Install the latest[Arm GNU Toolchain](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads) -2. Install latest version of [CMake](https://cmake.org/download/) -3. Install [Visual Studio Build tools](https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022), or the full [Visual Studio Community Edition IDE](https://visualstudio.microsoft.com/downloads/#visual-studio-community-2022) +### Windows (Manual) + + +1. Install the latest ARM GNU Toolchain + - [Arm GNU Toolchain](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads) +2. Install latest version of CMake + - [CMake](https://cmake.org/download/) +3. Install Visual Studio Build tools, or the full Visual Studio IDE - Make sure to select the Desktop development with C++ workload - Select the latest Windows 10 or Windows 11 SDK from the Individual Components -4. Install [Python 3.10](https://www.python.org/downloads/windows/) + - [Visual Studio Build tools](https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022) + - [Visual Studio Community Edition](https://visualstudio.microsoft.com/downloads/#visual-studio-community-2022) +4. Install Python 3.10 - At the end of the installation, there is an option to disable max file path length. You want to select this. -5. Install [Visual Studio Code](https://code.visualstudio.com/) - Optional + - [Python](https://www.python.org/downloads/windows/) +5. Install Visual Studio Code - Optional + - [Visual Studio Code](https://code.visualstudio.com/) 6. Install git - - Set default editor to anything other than VIM, such as Visual Studio Code -7. Install [NodeJS](https://nodejs.org/en/download) and NPM + - Set default editor to anything other than VIM, such as Visual Studio Code +7. Install NodeJS and NPM + - [Download and install NodeJS](https://nodejs.org/en/download) 8. Clone the Pico SDK to your local computer ```console @@ -73,8 +75,10 @@ After installing the Raspberry Pi Pico SDK, you should now have a shortcut to "P cd GP2040-CE ``` - - +### **Linux** + +### Linux + #### Ubuntu @@ -92,7 +96,7 @@ This setup assumes an understanding of Linux terminal usage. cd .. ``` -2. Install the toolchain +1. Install the toolchain ```bash sudo apt update @@ -101,14 +105,14 @@ This setup assumes an understanding of Linux terminal usage. - May additionally need to install `libstdc++-arm-none-eabi-newlib` -3. Install NodeJS and NPM +1. Install NodeJS and NPM ```bash curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - &&\ sudo apt-get install -y nodejs ``` -4. Get GP2040-CE +1. Get GP2040-CE ```bash git clone https://github.com/OpenStickCommunity/GP2040-CE.git @@ -126,26 +130,26 @@ This setup script requires approximately 2.5GB of disk space on your SD card. wget https://raw.githubusercontent.com/raspberrypi/pico-setup/master/pico_setup.sh ``` -2. Make script executable and Run it. +1. Make script executable and Run it. ```bash chmod +x pico_setup.sh ``` -3. Install NodeJS and NPM +1. Install NodeJS and NPM ```bash curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - &&\ sudo apt-get install -y nodejs ``` -4. Reboot your Pi +1. Reboot your Pi ```bash sudo reboot ``` -5. Get GP2040-CE +1. Get GP2040-CE ```bash git clone https://github.com/OpenStickCommunity/GP2040-CE.git @@ -153,8 +157,7 @@ This setup script requires approximately 2.5GB of disk space on your SD card. git submodule update --init ``` - - + ## Building @@ -176,8 +179,11 @@ There are a few SDK variables we take advantage of for our builds. | ----------- | --------- | ----------- | |PICO_BOARD|pico| This is the embedded board that the RP2040 chip is part of. By default, it assumes the Pico. This variable would match the `` file in the board's configs folder.| - - + + +### **Windows (Pico SDK)** + +### Windows (Pico SDK) After installing the Raspberry Pi Pico SDK, you should now have a shortcut to "Pico-Visual Studio Code" (search for it using Windows Search). This shortcut should already have everything configured, **allowing you to skip to step 7**. If you're experiencing compilation issues, consider following the manual steps outlined here. @@ -210,16 +216,13 @@ From inside VSCode: 4. Click "Build All Projects" in the CMake project outline. 5. The files should be in a new folder named "build" inside the GP2040-CE folder - - - -Start in the GP2040-CE folder. **From a Developer Powershell or Developer Command Command Prompt**: +### **Windows (Manual)** -:::note +### Windows (Manual) -A new Powershell or Command Prompt session will be required after setting an environment variable. +Start in the GP2040-CE folder. **From a Developer Powershell or Developer Command Command Prompt**: -::: +?> A new Powershell or Command Prompt session will be required after setting an environment variable. 1. Ensure you have the `PICO_SDK_PATH` environment variable set to the path to your pico-sdk folder. 2. (optional) Set the `GP2040_BOARDCONFIG` environment variable to the folder name for your board configuration. @@ -236,8 +239,9 @@ A new Powershell or Command Prompt session will be required after setting an env 4. Your UF2 file should be in the build directory. - - +### **Linux** + +### Linux Start in the GP2040-CE folder @@ -255,16 +259,11 @@ Start in the GP2040-CE folder 4. Your UF2 file should be in the build directory. - - + ## Configuration -:::note - -We're looking to move away from compile time configuration, in favor of runtime configuration. - -::: +?> We're moving away from compile time configuration, in favor of runtime configuration. There are two simple options for building GP2040-CE for your board. You can either edit an existing board definition, or create your own. Several example configurations are located in the repository **[configs](https://github.com/OpenStickCommunity/GP2040-CE/tree/main/configs)** folder. This document will outline setting up a new build configuration. @@ -275,9 +274,9 @@ Each subfolder in [`configs`](https://github.com/OpenStickCommunity/GP2040-CE/tr | Name | Required? | Description | | ----------- | --------- | ----------- | | `BoardConfig.h` | Yes | The configuration file used when building GP2040-CE for a specific controller/board. Contains initial pin mappings, LED configuration, etc. | -| `README.mdx` | No | Provides information related to this board configuration. Not required for the build process, but suggested for pull requests of new board configurations. | -| `assets/` | No | Folder for containing assets included in the `README.mdx`. Not required for the build process. -|'\'|No| Board definition file, named after the board itself, used by the Pico SDK for configuring board specific SDK features. [Pico Example](https://github.com/raspberrypi/pico-sdk/blob/master/src/boards/include/boards/pico.h) +| `README.md` | No | Provides information related to this board configuration. Not required for the build process, but suggested for pull requests of new board configurations. | +| `assets/` | No | Folder for containing assets included in the `README.md`. Not required for the build process. +|''|No| Board definition file, named after the board itself, used by the Pico SDK for configuring board specific SDK features. [Pico Example](https://github.com/raspberrypi/pico-sdk/blob/master/src/boards/include/boards/pico.h) ### Board Configuration (`BoardConfig.h`) @@ -285,9 +284,9 @@ The following board options are available in the `BoardConfig.h` file: | Name | Description | Required? | | ---------------- | ---------------------------- | --------- | -| **PIN_DPAD_*X***
**PIN_BUTTON_*X*** | The GPIO pin for the button. Replace the *`X`* with GP2040-CE button or D-pad direction. | Yes | -| **DEFAULT_SOCD_MODE** | The default SOCD mode to use, defaults to `SOCD_MODE_NEUTRAL`.
Available options are:
`SOCD_MODE_NEUTRAL`
`SOCD_MODE_UP_PRIORITY`
`SOCD_MODE_SECOND_INPUT_PRIORITY` | No | -| **BUTTON_LAYOUT** | The layout of controls/buttons for use with per-button LEDs and external displays.
Available options are:
`BUTTON_LAYOUT_STICKLESS`
`BUTTON_LAYOUT_WASD` | Yes | +| **PIN_DPAD_*X***
**PIN_BUTTON_*X*** | The GPIO pin for the button. Replace the *`X`* with GP2040-CE button or D-pad direction. | Yes | +| **DEFAULT_SOCD_MODE** | The default SOCD mode to use, defaults to `SOCD_MODE_NEUTRAL`.
Available options are:
`SOCD_MODE_NEUTRAL`
`SOCD_MODE_UP_PRIORITY`
`SOCD_MODE_SECOND_INPUT_PRIORITY` | No | +| **BUTTON_LAYOUT** | The layout of controls/buttons for use with per-button LEDs and external displays.
Available options are:
`BUTTON_LAYOUT_STICKLESS`
`BUTTON_LAYOUT_WASD` | Yes | Create `configs/NewBoard/BoardConfig.h` and add your pin configuration and options. An example `BoardConfig.h` file: @@ -330,13 +329,13 @@ The following RGB LED options are available in the `BoardConfig.h` file: | Name | Description | Required? | | ---------------- | ---------------------------- | --------- | -| **BUTTON_LAYOUT** | The layout of controls/buttons for use with per-button LEDs and external displays.
Available options are:
`BUTTON_LAYOUT_STICKLESS`
`BUTTON_LAYOUT_WASD` | Yes | +| **BUTTON_LAYOUT** | The layout of controls/buttons for use with per-button LEDs and external displays.
Available options are:
`BUTTON_LAYOUT_STICKLESS`
`BUTTON_LAYOUT_WASD` | Yes | | **BOARD_LEDS_PIN** | Data PIN for your LED strand | Yes | -| **LED_FORMAT** | The color data format for the LED chain.
Available options are:
`LED_FORMAT_GRB`
`LED_FORMAT_RGB`
`LED_FORMAT_GRBW`
`LED_FORMAT_RGBW` | No, default value `LED_FORMAT_GRB` | +| **LED_FORMAT** | The color data format for the LED chain.
Available options are:
`LED_FORMAT_GRB`
`LED_FORMAT_RGB`
`LED_FORMAT_GRBW`
`LED_FORMAT_RGBW` | No, default value `LED_FORMAT_GRB` | | **LEDS_PER_PIXEL** | The number of LEDs per button. | Yes | | **LED_BRIGHTNESS_MAXIMUM** | Max brightness value, `uint8_t` 0-255. | Yes | | **LED_BRIGHTNESS_STEPS** | The number of brightness steps when using the up/down hotkey. | Yes | -| **LEDS_DPAD_*X***
**LEDS_BUTTON_*X*** | The index of the button on the LED chain. Replace the *`X`* with GP2040-CE button or D-pad direction. | Yes | +| **LEDS_DPAD_*X***
**LEDS_BUTTON_*X*** | The index of the button on the LED chain. Replace the *`X`* with GP2040-CE button or D-pad direction. | Yes | | **LEDS_BASE_ANIMATION_INDEX** | The default LED animation index. | No, defaults to `1` | | **LEDS_STATIC_COLOR_INDEX** | The default color index for the static color theme | No, defaults to `2` | | **LEDS_BUTTON_COLOR_INDEX** | The default color index for the pressed button color | No, defaults to `1` | @@ -379,21 +378,17 @@ An example RGB LED setup in the `BoardConfig.h` file: GP2040-CE supports PWM and RGB player LEDs (PLEDs) and can be configured in the `BoardConfig.h` file. -:::note - -RGB PLEDs require [RGB LEDs](#rgb-leds) to be configured. - -::: +?> RGB PLEDs require [RGB LEDs](#rgb-leds) to be configured. The following PLED options are available in the `BoardConfig.h` file: | Name | Description | Required? | | ---------------- | ---------------------------- | --------- | -| **PLED_TYPE** | Configures the type of PLEDs.
Available options are: `PLED_TYPE_PWM`, `PLED_TYPE_RGB` | Yes | -| **PLED1_PIN** | (PWM) The GPIO pin for PLED #1.
(RGB) The index of PLED #1 on the LED chain. | Yes | -| **PLED2_PIN** | (PWM) The GPIO pin for PLED #2.
(RGB) The index of PLED #2 on the LED chain. | Yes | -| **PLED3_PIN** | (PWM) The GPIO pin for PLED #3.
(RGB) The index of PLED #3 on the LED chain. | Yes | -| **PLED4_PIN** | (PWM) The GPIO pin for PLED #4.
(RGB) The index of PLED #4 on the LED chain. | Yes | +| **PLED_TYPE** | Configures the type of PLEDs.
Available options are: `PLED_TYPE_PWM`, `PLED_TYPE_RGB` | Yes | +| **PLED1_PIN** | (PWM) The GPIO pin for PLED #1.
(RGB) The index of PLED #1 on the LED chain. | Yes | +| **PLED2_PIN** | (PWM) The GPIO pin for PLED #2.
(RGB) The index of PLED #2 on the LED chain. | Yes | +| **PLED3_PIN** | (PWM) The GPIO pin for PLED #3.
(RGB) The index of PLED #3 on the LED chain. | Yes | +| **PLED4_PIN** | (PWM) The GPIO pin for PLED #4.
(RGB) The index of PLED #4 on the LED chain. | Yes | An example PLED setup in the `BoardConfig.h` file: @@ -415,12 +410,12 @@ GP2040-CE supports 128x64 monochrome displays that run on the SSD1306, SH1106 or | Name | Description | Required? | | - | - | - | -| **BUTTON_LAYOUT** | The layout of controls/buttons for use with per-button LEDs and external displays.
Available options are:
`BUTTON_LAYOUT_STICKLESS`
`BUTTON_LAYOUT_WASD` | Yes | +| **BUTTON_LAYOUT** | The layout of controls/buttons for use with per-button LEDs and external displays.
Available options are:
`BUTTON_LAYOUT_STICKLESS`
`BUTTON_LAYOUT_WASD` | Yes | | **HAS_I2C_DISPLAY** | Flag to indicate the controller contains an I2C display module. | No | | **DISPLAY_I2C_ADDR** | The I2C address of the display. | No, defaults to `0x3C` | | **I2C_SDA_PIN** | The GPIO pin for the I2C SDA line. | If `HAS_I2C_DISPLAY` is enabled | | **I2C_SCL_PIN** | The GPIO pin for the I2C SCL line. | If `HAS_I2C_DISPLAY` is enabled | -| **I2C_BLOCK** | The I2C block on the Pico. Refer to the [Pico Pinout Diagram](https://datasheets.raspberrypi.com/pico/Pico-R3-A4-Pinout.pdf) to identify which block is in use based on the SDA and SCL pins being used.
Available options are:
`i2c0`
`i2c1` | No, defaults to `i2c0` | +| **I2C_BLOCK** | The I2C block on the Pico. Refer to the [Pico Pinout Diagram](https://datasheets.raspberrypi.com/pico/Pico-R3-A4-Pinout.pdf) to identify which block is in use based on the SDA and SCL pins being used.
Available options are:
`i2c0`
`i2c1` | No, defaults to `i2c0` | | **I2C_SPEED** | The speed of the I2C bus. `100000` is standard mode, while `400000` is used for fast mode communication. Higher values may be used but will require testing the device for support. | No, defaults to `400000` | | **DISPLAY_FLIP** | Flag to flip the rendered display output. Set to `1` to enable. | No, defaults to `0` | | **DISPLAY_INVERT** | Flag to invert the rendered display output. Set to `1` to enable. | No, defaults to `0` | diff --git a/docs/download.md b/docs/download.md new file mode 100644 index 000000000..fc213f88b --- /dev/null +++ b/docs/download.md @@ -0,0 +1,3 @@ +# Downloads + + diff --git a/site/docs/downloads/flash_nuke.uf2 b/docs/downloads/flash_nuke.uf2 similarity index 100% rename from site/docs/downloads/flash_nuke.uf2 rename to docs/downloads/flash_nuke.uf2 diff --git a/site/docs/faq/faq-ps4-ps5-compatibility.mdx b/docs/faq-ps4-ps5-compatibility.md similarity index 85% rename from site/docs/faq/faq-ps4-ps5-compatibility.mdx rename to docs/faq-ps4-ps5-compatibility.md index d1acb8990..e0dea6c93 100644 --- a/site/docs/faq/faq-ps4-ps5-compatibility.mdx +++ b/docs/faq-ps4-ps5-compatibility.md @@ -1,11 +1,3 @@ ---- -title: PS4/PS5 Compatibility -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # FAQ: PS4/PS5 Compatibility ## How do I get my GP2040-CE unit to work on a Playstation 4 or Playstation 5? @@ -20,7 +12,7 @@ PS4 mode is an add-on that grants GP2040-CE compatibility with the Playstation 4 The team behind Passing Link are in no way affiliated with the GP2040-CE project, however the work and information they've made available was greatly appreciated so we could bring this highly-requested feature to our users. -For more information, refer to [PS4 Mode](../add-ons/ps4-mode.mdx) in the `Web Configurator - Add-ons` section of the documentation. +For more information, refer to [PS4 Mode](add-ons/ps4-mode) in the `Web Configurator - Add-ons` section of the documentation. ## What is PS Passthrough? @@ -28,7 +20,7 @@ PS Passthrough is an add-on that grants GP2040-CE compatibility with the Playsta Depending on the controller or dongle used, you may be limited to only Playstation 4 support. -For more information, refer to [PS Passthrough](../add-ons/ps-passthrough) in the `Web Configurator - Add-ons` section of the documentation. +For more information, refer to [PS Passthrough](add-ons/ps-passthrough) in the `Web Configurator - Add-ons` section of the documention. ## Why does my controller stop responding after a while on PS4 or PS5? @@ -49,7 +41,7 @@ The 8-minute timeout works like this: ## How do I avoid the 8-Minute Timeout? -GP2040-CE allows you to upload the files required to authenticate your device via the [PS4 Mode add-on](../add-ons/ps4-mode), which effectively removes this timeout issue. +GP2040-CE allows you to upload the files required to authenticate your device via the [PS4 Mode add-on](add-ons/ps4-mode), which effectively removes this timeout issue. If you're using an OLED display, the input mode will change from `PS4` to `PS4:AS` to indicate your device has successfully authenticated with the PS4/PS5 console. @@ -57,11 +49,7 @@ If you're using an OLED display, the input mode will change from `PS4` to `PS4:A The GP2040-CE project will not provide ***any*** files or information related to acquiring these keys and files. -:::danger - -**Do not ask via any of communication channels (e.g. social media, direct messages, Github Issues, GP2040-CE Discord) as this will result in a permanent blacklist/ban.** - -::: +!> **Do not ask via any of communication channels (e.g. social media, direct messages, Github Issues, GP2040-CE) as this will result in a permanent blacklist/ban.** ## What controller or dongle do I use for PS Passthrough? diff --git a/site/docs/faq/faq-general.mdx b/docs/faq.md similarity index 90% rename from site/docs/faq/faq-general.mdx rename to docs/faq.md index 15ae223fc..de0d5d044 100644 --- a/site/docs/faq/faq-general.mdx +++ b/docs/faq.md @@ -1,11 +1,3 @@ ---- -title: GP2040-CE FAQ -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # GP2040-CE FAQ ## General Questions @@ -22,13 +14,13 @@ This will depend on the platform you will be playing on: ### Will GP2040-CE natively support PS5, Xbox One, or Xbox Series consoles? -These consoles implement security measures that prevent unauthorized accessories from being used. The process of cracking or bypassing that security may not be legal everywhere. These consoles could be supported in the future if a user-friendly and completely legal implementation method is found, such as the implementation of [PS4 Mode](../add-ons/ps4-mode.mdx). +These consoles implement security measures that prevent unauthorized accessories from being used. The process of cracking or bypassing that security may not be legal everywhere. These consoles could be supported in the future if a user-friendly and completely legal implementation method is found, such as the implementation of [PS4 Mode](add-ons/ps4-mode). ### Can I use multiple controllers with GP2040-CE on the same system? Yes! Each GP2040-CE board is treated as a separate controller. Be sure to only run the embedded web configurator for each controller one at a time. -If you're installing boards with GP2040-CE in an arcade cabinet, check out the [Player Number add-on](../add-ons/player-number.mdx) to force each board to a specific player number. +If you're installing boards with GP2040-CE in an arcade cabinet, check out the [Player Number add-on](add-ons/player-number.md) to force each board to a specific player number. ### Does GP2040-CE really have less than 1 ms of input latency? @@ -40,7 +32,7 @@ Not at all! The RP2040 processor of the Pico has two cores. GP2040-CE dedicates ### Why do the buttons have weird labels like B3, A1, S2, etc.? -GP2040-CE uses a generic system for handling button inputs that resembles a traditional PlayStation controller layout with a few extra buttons. This means 4 face buttons (B1-B4), 4 shoulder buttons (L1, L2, R1, R2), Select and Start (S1, S2), 2 stick buttons (L3, R3) and 2 auxiliary buttons for things like Home and Capture (A1, A2) on the Switch. The GP2040-CE documentation and web configurator both provide a dropdown to change the button labels to more familiar controller layouts. You can refer to the button mapping table on the [GP2040-CE Usage](../usage.mdx#buttons) page. +GP2040-CE uses a generic system for handling button inputs that resembles a traditional PlayStation controller layout with a few extra buttons. This means 4 face buttons (B1-B4), 4 shoulder buttons (L1, L2, R1, R2), Select and Start (S1, S2), 2 stick buttons (L3, R3) and 2 auxiliary buttons for things like Home and Capture (A1, A2) on the Switch. The GP2040-CE documentation and web configurator both provide a dropdown to change the button labels to more familiar controller layouts. You can refer to the button mapping table on the [GP2040-CE Usage](usage.md#buttons) page. ## Technical Questions diff --git a/site/static/img/favicon.ico b/docs/favicon.ico similarity index 100% rename from site/static/img/favicon.ico rename to docs/favicon.ico diff --git a/site/docs/getting-help-support.mdx b/docs/getting-help-support.md similarity index 92% rename from site/docs/getting-help-support.mdx rename to docs/getting-help-support.md index 2454c2056..84d8a2766 100644 --- a/site/docs/getting-help-support.mdx +++ b/docs/getting-help-support.md @@ -1,11 +1,3 @@ ---- -title: Getting Help/Support -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # Getting Help/Support ## Discord diff --git a/site/docs/hotkeys.mdx b/docs/hotkeys.md similarity index 66% rename from site/docs/hotkeys.mdx rename to docs/hotkeys.md index 7387ad383..3fadf12c9 100644 --- a/site/docs/hotkeys.mdx +++ b/docs/hotkeys.md @@ -1,26 +1,8 @@ ---- -title: Hotkeys -# tags: -# - -pagination_next: null -pagination_prev: null ---- - -import InputLabelSelector, { Hotkey } from "@site/src/components/LabelSelector.tsx"; - - # Hotkeys -Select the button labels to be displayed in the usage guide: - - -
+Select the button labels to be displayed in the usage guide: -:::note - -All of the following hotkey bindings can be changed or assigned to different button combinations in [Hotkeys Settings](./web-configurator.mdx#hotkey-settings) section of the Web Configurator. - -::: +> All of the following hotkey bindings can be changed or assigned to different button combinations in [Hotkeys Settings](web-configurator.md#hotkey-settings) section of the Web Configurator. ## No Action @@ -30,27 +12,27 @@ This hotkey does nothing. Use this hotkey to disable a specific hotkey combinati This hotkey changes the DPad mode such the directions to be read as digital inputs on the DPad. -**Default**: +**Default**: ## DPad Left Analog This hotkey changes the DPad mode to such the directions to be read as inputs on the Left Analog Stick. The directional input is always the minimum, maximum, or zero value on that axis. -**Default**: +**Default**: ## DPad Right Analog This hotkey changes the DPad mode to such the directions to be read as inputs on the Right Analog Stick. The directional input is always the minimum, maximum, or zero value on that axis. -**Default**: +**Default**: ## Home Button -This hotkey emulates a press of the button as not all controllers may have this button natively on the controller. +This hotkey emulates a press of the button as not all controllers may have this button natively on the controller. ## Capture Button -This hotkey emulates a press of the button as not all controllers may have this button natively on the controller. +This hotkey emulates a press of the button as not all controllers may have this button natively on the controller. ## SOCD Up Priority @@ -100,11 +82,7 @@ This hotkey changes the SOCD cleaning method to prioritize the first directional This hotkey changes the SOCD cleaning method to not resolve any directional inputs on both the X-axis and Y-axis when both directions are pressed simultaneously. The controller will send both directional inputs. -:::note - -This cleaning mode is only available in XInput mode as PS3/DirectInput, PS4 and Nintendo Switch modes do not support setting SOCD Cleaning to Off and will default to Neutral SOCD Cleaning mode. - -::: +?> This cleaning mode is only available in XInput mode as PS3/DirectInput, PS4 and Nintendo Switch modes do not support setting SOCD Cleaning to Off and will default to Neutral SOCD Cleaning mode. | 1st Input + 2nd Input | Result | |:---------------------:|:--------------:| @@ -121,7 +99,7 @@ This hotkey will invert the X-axis of your controller (i.e. pressing the Right b This hotkey will invert the Y-axis of your controller (i.e. pressing the Up button will result in a Down input and vice versa). -**Default**: +**Default**: ## Toggle 4-Way Joystick Mode @@ -129,23 +107,23 @@ This hotkey will alter the behavior of the directional buttons such that only th ## Toggle DDI 4-Way Joystick Mode -This hotkey will alter the behavior of the directional buttons mapped with the [Dual Direction Input](./add-ons/dual-direction-input) add-on such that only the cardinal directions will register as inputs and diagonal directions will be disabled and ignored. +This hotkey will alter the behavior of the directional buttons mapped with the [Dual Direction Input](add-ons.md#dual-directional-input) add-on such that only the cardinal directions will register as inputs and diagonal directions will be disabled and ignored. ## Load Profile # 1-4 -This hotkey will load various input to pin mapping profiles set in [Profile Settings](./web-configurator#profile-settings) in the Web Configurator. +This hotkey will load various input to pin mapping profiles set in [Profile Settings](web-configurator#profile-settings) in the Web Configurator. ## L3 Button -This hotkey emulates a press of the button as not all controllers may have this button natively on the controller. +This hotkey emulates a press of the button as not all controllers may have this button natively on the controller. ## R3 Button -This hotkey emulates a press of the button as not all controllers may have this button natively on the controller. +This hotkey emulates a press of the button as not all controllers may have this button natively on the controller. ## Touchpad Button -This hotkey emulates a press of the button as not all controllers may have this button natively on the controller. +This hotkey emulates a press of the button as not all controllers may have this button natively on the controller. ## Restart GP2040-CE diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 000000000..3bd817f8b --- /dev/null +++ b/docs/index.html @@ -0,0 +1,48 @@ + + + + + GP2040-CE | Community Edition Firmware + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/site/docs/installation.mdx b/docs/installation.md similarity index 84% rename from site/docs/installation.mdx rename to docs/installation.md index c10e84528..747ab37b4 100644 --- a/site/docs/installation.mdx +++ b/docs/installation.md @@ -1,11 +1,3 @@ ---- -title: Firmware Installation -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # Firmware Installation ## General Process @@ -15,18 +7,18 @@ pagination_prev: null 1. Download the compiled firmware (.uf2 file) for your device 2. Unplug your device. 3. Put your device into Bootsel/USB mode. A new removable drive named `RPI-RP2` should appear in your file explorer. -4. Drag and drop the compiled firmware (.uf2 file) downloaded in step 1 into the removable drive +4. Drag and drop the compiled firmware (.uf2 file) downloaded in step 1 into the removable drive. 5. Wait for the device to automatically disconnect. Congratulations! The board is now running the GP2040-CE firmware and will appear as a controller on your computer. You can test it in a game, using the website like [Gamepad Tester](https://gamepad-tester.com/), or in another application such as the Steam Input Overlay. -If you would like to customize your device, check out the built-in [Web Configurator](./web-configurator.mdx). +If you would like to customize your device, check out the built-in [Web Configurator](web-configurator). ### Example Process (Raspberry Pi Pico) **The instructions will slightly vary based on your device. These instructions are for a Raspberry Pi Pico.** -1. Download the latest `GP2040-CE_X.X.X_Pico.uf2` file for the Raspberry Pi Pico from the [Download](./downloads/download-page.mdx) page. +1. Download the latest `GP2040-CE_X.X.X_Pico.uf2` file for the Raspberry Pi Pico from the [Download](download) page. 2. Unplug your Pico. 3. Hold the BOOTSEL button on the Pico and plug into your computer. 4. Drag and drop the `GP2040-CE_X.X.X_Pico.uf2` file into the removable drive. @@ -34,11 +26,7 @@ If you would like to customize your device, check out the built-in [Web Configur ## Flash Nuke process -:::caution - -*Warning* - Flash nuking your board wipes all your custom configuration for pin mappings and addons. - -::: +!> *Warning* - Flash nuking your board wipes all your custom configuration for pin mappings and addons. 1. Download the [flash_nuke.uf2 file](https://raw.githubusercontent.com/OpenStickCommunity/GP2040-CE/main/docs/downloads/flash_nuke.uf2) 2. Boot into bootsel/RPI drive (multiple methods to do so) diff --git a/site/docs/introduction.mdx b/docs/introduction.md similarity index 68% rename from site/docs/introduction.mdx rename to docs/introduction.md index b22daf751..ea3125bda 100644 --- a/site/docs/introduction.mdx +++ b/docs/introduction.md @@ -1,12 +1,3 @@ ---- -id: introduction -title: Introduction -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # Introduction Your controller has a control board in it that processes your inputs and translates that to commands that your computer or game console understands. GP2040-CE is firmware that facilitates this process, providing compatibility with a number of consoles and input modes. In addition to this, there are many other useful features through the Web Configurator and the system of community developed add-ons. @@ -17,13 +8,13 @@ Not sure if your board can run GP2040-CE? As long as it has a RP2040 microproces This section of the documentation is primarily geared towards end users who are looking to use their controllers without diving into the minutiae of configuring and customizing their device. Given a controller, how to get to using it as soon as possible. It consists of the following sections. -- [Firmware Installation](./installation.mdx "GP2040-CE | Firmware Installation"): In the event that you need to install firmware (e.g. setting up a new board, updating to a new version, or as part of troubleshooting) -- [Usage](./usage.mdx "GP2040-CE | Usage"): Descriptions of the various features and functions available for use with GP2040-CE -- [Hotkeys](./hotkeys.mdx "GP2040-CE | Hotkeys"): A list of the various hotkey shortcuts available for use with GP2040-CE. +- [Firmware Installation](installation.md "GP2040-CE | Firmware Installation"): In the event that you need to install firmware (e.g. setting up a new board, updating to a new version, or as part of troubleshooting) +- [Usage](usage.md "GP2040-CE | Usage"): Descriptions of the various features and functions available for use with GP2040-CE +- [Hotkeys](usage.md "GP2040-CE | Hotkeys"): A list of the various hotkey shortcuts available for use with GP2040-CE. > The actual buttons for the shortcut may differ as they are customizable and can be set by your device's vendor or seller. -- [Getting Help/Support](./getting-help-support.mdx "GP2040-CE | Getting Help"): How to get help in the event of issues or malfunction +- [Getting Help/Support](getting-help-support.md "GP2040-CE | Getting Help"): How to get help in the event of issues or malfunction ## Additional Resources diff --git a/site/latency_tests/GP2040-CE_Firmware_Latency_Test_Results.xlsx b/docs/latency_tests/GP2040-CE_Firmware_Latency_Test_Results.xlsx similarity index 100% rename from site/latency_tests/GP2040-CE_Firmware_Latency_Test_Results.xlsx rename to docs/latency_tests/GP2040-CE_Firmware_Latency_Test_Results.xlsx diff --git a/site/docs/macros.mdx b/docs/macros.md similarity index 85% rename from site/docs/macros.mdx rename to docs/macros.md index a35fce91f..afeabcf9a 100644 --- a/site/docs/macros.mdx +++ b/docs/macros.md @@ -1,16 +1,8 @@ ---- -title: Macro Settings -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # Macro Settings Purpose: Macros are a series or combination of gamepad inputs triggered with a single button or a combination of buttons. -![GP2040-CE Configurator - Macros](./assets/images/gpc-macros.png) +![GP2040-CE Configurator - Macros](../assets/images/gpc-macros.png) ## Macro Options @@ -30,12 +22,6 @@ This is the name of the macro and is optional. - `Off` - The macro cannot be stopped and will execute all lines until the macro is completed. - `On` - Any input will stop the current ongoing macro or, if the input is another macro, the interrupting macro trigger will start executing instead. -:::note Interrupting Macros - -When a macro stops for any reason and are triggered. again, the macro starts again from the beginning. - -::: - ### Exclusive - `Off` - Additional inputs from user will be sent as the macro continues to execute, resulting in a blend of macro and user inputs. @@ -65,7 +51,7 @@ This describes is how the GPIO pin or the combination set in [`Uses Button`](#us Each individual macro has a maximum of 50 lines where each input line has a maximum of 18 gamepad inputs (using all available gamepad inputs). -![GP2040-CE Configurator - Macro Input Line](./assets/images/gpc-macros-input-line.png) +![GP2040-CE Configurator - Macro Input Line](../assets/images/gpc-macros-input-line.png) Each input line is composed of the following elements from left to right. @@ -75,8 +61,8 @@ Each input line is composed of the following elements from left to right. - Inputs - The inputs to be held during the execution of the input line. - Post Input Wait Duration - The duration in-between when that input line finishes executing and when the next line will start executing. (Maximum 4,294,967ms or 268,435 frames) -:::note Deleting Input Lines +?> To delete an input line, double-click the "x" button. -To delete an input line, double-click the "x" button. +## Note -::: \ No newline at end of file +- When a macro stops for any reason and are triggered. again, the macro starts again from the beginning. \ No newline at end of file diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 000000000..de0a44071 --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,2234 @@ +{ + "name": "docs", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "docs", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "docsify-cli": "^4.4.4" + } + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/boxen/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/boxen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect-livereload": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz", + "integrity": "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/cp-file": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-7.0.0.tgz", + "integrity": "sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "nested-error-stacks": "^2.0.0", + "p-event": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/docsify": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/docsify/-/docsify-4.13.0.tgz", + "integrity": "sha512-dM2D0LZKrhK9e5cPwzOTO8FJ2l9IxgiSmTgLBIMjkBlTs1rAUT5camzekbk2AhH0Tw+5lzkNrSb7dmKFuTiLCA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "marked": "^1.2.9", + "medium-zoom": "^1.0.6", + "opencollective-postinstall": "^2.0.2", + "prismjs": "^1.27.0", + "strip-indent": "^3.0.0", + "tinydate": "^1.3.0", + "tweezer.js": "^1.4.0" + } + }, + "node_modules/docsify-cli": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/docsify-cli/-/docsify-cli-4.4.4.tgz", + "integrity": "sha512-NAZgg6b0BsDuq/Pe+P19Qb2J1d+ZVbS0eGkeCNxyu4F9/CQSsRqZqAvPJ9/0I+BCHn4sgftA2jluqhQVzKzrSA==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "connect": "^3.6.0", + "connect-history-api-fallback": "^1.6.0", + "connect-livereload": "^0.6.0", + "cp-file": "^7.0.0", + "docsify": "^4.12.2", + "docsify-server-renderer": ">=4.10.0", + "enquirer": "^2.3.6", + "fs-extra": "^8.1.0", + "get-port": "^5.0.0", + "livereload": "^0.9.2", + "lru-cache": "^5.1.1", + "open": "^6.4.0", + "serve-static": "^1.12.1", + "update-notifier": "^4.1.0", + "yargonaut": "^1.1.2", + "yargs": "^15.3.0" + }, + "bin": { + "docsify": "bin/docsify" + }, + "engines": { + "node": ">= 10", + "npm": ">= 6" + } + }, + "node_modules/docsify-server-renderer": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/docsify-server-renderer/-/docsify-server-renderer-4.13.0.tgz", + "integrity": "sha512-dgJ+mYfkTLuePfTKMmdcRJMFw9YBhmqFS9SgdOc2Fw8emiCTcnOup23wnZ0VdmrEmlc+97K85kASiw/75w6PPQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.3", + "docsify": "^4.12.4", + "node-fetch": "^2.6.6", + "resolve-pathname": "^3.0.0" + } + }, + "node_modules/docsify-server-renderer/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/docsify-server-renderer/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/figlet": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.6.0.tgz", + "integrity": "sha512-31EQGhCEITv6+hi2ORRPyn3bulaV9Fl4xOdR169cBzH/n1UqcxsiSB/noo6SJdD7Kfb1Ljit+IgR1USvF/XbdA==", + "dev": true, + "bin": { + "figlet": "bin/index.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dev": true, + "dependencies": { + "ini": "1.3.7" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/livereload": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz", + "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.0", + "livereload-js": "^3.3.1", + "opts": ">= 1.2.0", + "ws": "^7.4.3" + }, + "bin": { + "livereload": "bin/livereload.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/livereload-js": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.4.1.tgz", + "integrity": "sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/marked": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.9.tgz", + "integrity": "sha512-H8lIX2SvyitGX+TRdtS06m1jHMijKN/XjfH6Ooii9fvxMlh8QdqBfBDkGUpMWH2kQNrtixjzYUa3SH8ROTgRRw==", + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 8.16.2" + } + }, + "node_modules/medium-zoom": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.0.8.tgz", + "integrity": "sha512-CjFVuFq/IfrdqesAXfg+hzlDKu6A2n80ZIq0Kl9kWjoHh9j1N9Uvk5X0/MmN0hOfm5F9YBswlClhcwnmtwz7gA==", + "dev": true + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/nested-error-stacks": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", + "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true, + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/opts": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", + "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", + "dev": true + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dev": true, + "dependencies": { + "p-timeout": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parent-require": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz", + "integrity": "sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "dev": true, + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "dev": true + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tinydate": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", + "integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/tweezer.js": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/tweezer.js/-/tweezer.js-1.5.0.tgz", + "integrity": "sha512-aSiJz7rGWNAQq7hjMK9ZYDuEawXupcCWgl3woQQSoDP2Oh8O4srWb/uO1PzzHIsrPEOqrjJ2sUb9FERfzuBabQ==", + "dev": true + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dev": true, + "dependencies": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/update-notifier/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/update-notifier/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargonaut": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/yargonaut/-/yargonaut-1.1.4.tgz", + "integrity": "sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==", + "dev": true, + "dependencies": { + "chalk": "^1.1.1", + "figlet": "^1.1.1", + "parent-require": "^1.0.0" + } + }, + "node_modules/yargonaut/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargonaut/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargonaut/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargonaut/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargonaut/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 000000000..dd5c73c0d --- /dev/null +++ b/docs/package.json @@ -0,0 +1,14 @@ +{ + "name": "docs", + "version": "1.0.0", + "description": "", + "scripts": { + "start": "docsify serve ./ --open" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "docsify-cli": "^4.4.4" + } +} diff --git a/site/docs/rgb-leds.mdx b/docs/rgb-leds.md similarity index 70% rename from site/docs/rgb-leds.mdx rename to docs/rgb-leds.md index 30dd209eb..c21a3208d 100644 --- a/site/docs/rgb-leds.mdx +++ b/docs/rgb-leds.md @@ -1,43 +1,25 @@ ---- -title: RGB LEDs -# tags: -# - -pagination_next: null -pagination_prev: null ---- - -import InputLabelSelector, { Hotkey } from "@site/src/components/LabelSelector.tsx"; - # RGB LEDs -Select the button labels to be displayed in the usage guide: - - - ## Hardware Requirements GP2040-CE requires that addressable RGB LEDs be used for nearly all LED functions. -The exception to this are [Player LEDs](./add-ons/player-number.mdx), which can use pulse width modulation (PWM) to vary the brightness of the LEDs. +The exception to this are [Player LEDs](add-ons/player-number.md), which can use pulse width modulation (PWM) to vary the brightness of the LEDs. ## RGB LED Hotkeys | Hotkey | Description | | - | - | -| | Next Animation | -| | Previous Animation | -| | Brightness Up | -| | Brightness Down | -| | LED Parameter Up | -| | LED Parameter Down | -| | Pressed Parameter Up | -| | Pressed Parameter Down | - -:::note - -The `LED Parameter` hotkeys may affect color, speed or theme depending on the current RGB LED animation. The `Pressed Parameter` options will change the colors/effects for the on-press animations. - -::: +| | Next Animation | +| | Previous Animation | +| | Brightness Up | +| | Brightness Down | +| | LED Parameter Up | +| | LED Parameter Down | +| | Pressed Parameter Up | +| | Pressed Parameter Down | + +?> The `LED Parameter` hotkeys may affect color, speed or theme depending on the current RGB LED animation. The `Pressed Parameter` options will change the colors/effects for the on-press animations. ## RGB LED Animations diff --git a/docs/site.css b/docs/site.css new file mode 100644 index 000000000..48ea8cffd --- /dev/null +++ b/docs/site.css @@ -0,0 +1,176 @@ + :root { + --mono-hue: 0; + --mono-saturation : 0%; + --modular-scale : 1.25; + --base-font-size: 0.875rem; + --theme-color : #C73C8B; + --sidebar-width : 20rem; + /* --sidebar-padding: 0 0.75rem; */ + --content-max-width: 70em; + --docsifytabs-border-color: #ededed; + --docsifytabs-tab-highlight-color: #C73C8B; +} + +hr { + margin: 1.5em 0; +} + +.form-dropdown label { + display: none; + margin-right: 4px; +} + +.hotkey { + text-transform: uppercase; +} + +.label-select { + display: inline-block; + margin-left: 4px; +} + +.sticky-label-select { + /* width: 100%; */ + position: fixed !important; + top: var(--sidebar-toggle-offset-top); + height: var(--sidebar-toggle-height); + right: 0px; + background: var(--sidebar-toggle-background, transparent); + padding: 4px; + border-radius: 4px; + transform: translateY(-100%); + opacity: 0.8; + z-index: 10; +} + +.sticky-label-select label { + display: block; + text-align: center; + margin-top: -4px; + margin-bottom: 4px; +} + +.sidebar .search .clear-button { + margin: auto; +} + +/*************/ +/* Downloads */ +/*************/ + +.download-category { + margin-bottom: 2rem; +} + +.download-category h3 { + margin-bottom: 1rem; +} + +.download-category-list { + display: grid; + grid-template-columns: 1fr; + gap: 2rem 1rem; + width: 100%; +} + +.download-box { + display: flex; + flex-direction: column; +} + +.download-box .download-img { + display: flex; +} + +.download-box .download-img img { + width: 100%; + height: 100%; +} + +.download-box .download-info { + display: flex; + flex: 1 0 auto; + flex-direction: column; + width: 100%; + color: #000000; + background-color: #d2d2d2; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; +} + +.download-box .download-info .download-title { + text-align: center; + font-family: Arial, Helvetica, sans-serif; + font-size: 1.25rem; + font-weight: 600; + padding: 0.5rem 0rem 1.5rem 0.5rem; +} + +.download-box .download-info .download-links { + display: flex; + list-style: none; + justify-content: space-around; + margin: 0; + padding: 0; + padding-bottom: 0.75rem; +} + +.download-box .download-info .download-links li { + font-weight: 600; +} + +.download-box .download-info .download-links li a { + display: flex; + flex-direction: column; + align-items: center; + text-decoration: none; + font-size: 0.85rem; +} + +.download-box .download-info .download-links li a:hover { + color: var(--theme-color); +} + +.download-box .download-info .download-links li a i { + height: 1rem; +} + +.download-box .download-info .download-desc { + padding: 0rem 1.25rem 1rem; +} + +@media screen and (min-width: 500px) { + .download-category-list { + grid-template-columns: 1fr 1fr; + } +} + +@media screen and (min-width: 900px) { + .download-category-list { + grid-template-columns: 1fr 1fr 1fr; + } +} + +/*************/ +/* Table of Contents */ +/*************/ + +@media only screen and (max-width: 1299px) { + aside.toc-nav { + max-width: 0%; + } +} + +@media only screen and (min-width: 1300px) { + section.content { + padding-right: 285px; + } +} + +aside.toc-nav { + right: 1%; + margin-right: 0px; + width: 270px; + max-height: 85vh; +} + \ No newline at end of file diff --git a/site/docs/development/templates.mdx b/docs/templates.md similarity index 63% rename from site/docs/development/templates.mdx rename to docs/templates.md index 410c72072..e80626b39 100644 --- a/site/docs/development/templates.mdx +++ b/docs/templates.md @@ -1,11 +1,3 @@ ---- -title: Templates -# tags: -# - -pagination_next: null -pagination_prev: null ---- - # Templates ## Configuration Templates @@ -60,34 +52,9 @@ Hardware Availability: List where one can purchase the boards that share this co ## Documentation Templates -### Page Template - -```md ---- -title: TITLE -# tags: -# - -pagination_next: null -pagination_prev: null ---- - -# Document Title - -CONTENT - -``` - ### Add-On Template ```md ---- -title: ADD-ON NAME -# tags: -# - -pagination_next: null -pagination_prev: null ---- - ## Add-On Name Purpose: The intended function and purpose of this add-on for an end user. @@ -106,41 +73,3 @@ Notes Provide any miscellaneous notes that an end user may want or need to know with regard to this addon. ``` - -### Downloads Page Configurations - -#### Microcontroller Boards - -```tsx -{ - name: 'Microcontroller Board Name', - configName: 'ConfigName', - pinout: null, - website: 'http://www.example.com/index.html', - image: require('@site/docs/assets/boards/BoardName.jpg').default, - supported: true, - desc: () => ( -

- Description of Microcontroller board and manufacturer -

- ), -}, - -``` - -#### Controllers - -```tsx -{ - name: 'Controller Name', - configName: 'ConfigName', - pinout: null, - website: 'http://www.example.com/index.html', - image: require('@site/docs/assets/boards/DeviceName.jpg').default, - category: 'official/open/closed/legacy', - desc: () => -

- Description of the device and maker. -

, -}, -``` \ No newline at end of file diff --git a/docs/usage.md b/docs/usage.md new file mode 100644 index 000000000..946f658bc --- /dev/null +++ b/docs/usage.md @@ -0,0 +1,86 @@ +# GP2040-CE Usage + +Select the button labels to be displayed in the usage guide: + +!> The v0.5+ release has some breaking changes to boards other than the Raspberry Pi Pico. If you are using such a board, do not update from an older version unless you have a backup .uf2 from a known good version, or you know what you're doing. + +## Buttons + +GP2040-CE uses generic button labeling for gamepad state, which is then converted to the appropriate input type before sending. This table provides a map of GP2040-CE buttons to the supported input types and layouts: + +| GP2040-CE | XInput | Switch | PS4 | PS3 | DirectInput | Arcade | +| ---------- | ------ | ------- | ------------ | ------------ | ------------ | ------ | +| B1 | A | B | Cross | Cross | 2 | K1 | +| B2 | B | A | Circle | Circle | 3 | K2 | +| B3 | X | Y | Square | Square | 1 | P1 | +| B4 | Y | X | Triangle | Triangle | 4 | P2 | +| L1 | LB | L | L1 | L1 | 5 | P4 | +| R1 | RB | R | R1 | R1 | 6 | P3 | +| L2 | LT | ZL | L2 | L2 | 7 | K4 | +| R2 | RT | ZR | R2 | R2 | 8 | K3 | +| S1 | Back | Minus | Share | Select | 9 | Coin | +| S2 | Start | Plus | Options | Start | 10 | Start | +| L3 | LS | LS | L3 | L3 | 11 | LS | +| R3 | RS | RS | R3 | R3 | 12 | RS | +| A1 | Guide | Home | PS | PS | 13 | Home | +| A2 | - | Capture | Touchpad | - | 14 | - | + +If your controller is missing dedicated buttons for any specific inputs, check the [Hotkeys page](hotkeys) on how to map a button combination that will emulate those missing inputs. + +?> Unlike other controllers, Keyboard gets different keys for directional buttons.
You can change the key mappings for Keyboard mode in [Webconfig mode > Configuration > Keyboard Mapping](web-configurator.md#keyboard-mapping) + +| Direction | Keyboard | +| --------- | ---------- | +| Up | Up Arrow | +| Down | Down Arrow | +| Left | Left Arrow | +| Right | Right Arrow| + +## Bootsel Mode + +Bootsel Mode is the state of the board where firmware can be flashed onto the board. You will need to use this whenever there is an update or as part of the troubleshooting process. + +You can boot into Bootsel Mode by either holding buttons while plugging in the controller or by booting into the Web Configurator and then restarting in Bootsel Mode. + +## Webconfig Mode + +Webconfig Mode is the state of the board where built-in web browser-based configuration application is launched. From here, you can customize and configure your controller as needed. + +You can boot into Webconfig Mode by holding the button while plugging in the controller. + +## Input Modes + +GP2040-CE is compatible with a number of systems and input modes. To change the input mode, **hold one of the following buttons as the controller is plugged in:** + +| Input Mode | Button Held | +|:----------------|:-----------------------------------------:| +| Nintendo Switch | | +| XInput | | +| DirectInput/PS3 | | +| PS4 | | +| Keyboard | | + +?> Input mode is saved across power cycles. + +## Hotkeys + +A number of useful hotkeys exist that change the functionality of GP2040 without needing to access the Web Configurator. Commonly used hotkeys include changing the directions to emulate a digital DPad, Left Analog Stick, Right Analog Stick or to change [Simultaneous Opposite Cardinal Direction (SOCD)](https://glossary.infil.net/?t=SOCD) cleaning modes. Different SOCD cleaning modes will ensure the controller obeys certain directional input rules when sending inputs to the computer or game console. + +A number of hotkeys are enabled by default and if you are encountering issues with unexpected behavior on your controller, verify that you did not accidentally trigger a hotkey. + +| Hotkeys Enabled By Default | Inputs | +|:----------------------------------------------------|:-------------------------------------------------------| +| [Home Button](hotkeys.md#home-button) | | +| [Dpad Digital](hotkeys.md#dpad-digital) | | +| [Dpad Left Analog](hotkeys.md#dpad-left-analog) | | +| [Dpad Right Analog](hotkeys.md#dpad-right-analog) | | +| [SOCD Up Priority](hotkeys.md#socd-up-priority) | | +| [SOCD Neutral](hotkeys.md#socd-neutral) | | +| [SOCD Last Wins](hotkeys.md#socd-last-win) | | +| [SOCD Invert Y Axis](hotkeys.md#invert-y-axis) | | + +?> Selected D-Pad mode and SOCD cleaning mode are saved across power cycles. + +## Add-Ons and Additional Features + +There are a number of add-ons that expand the functionality of GP2040-CE, such as [analog stick emulation](add-ons/analog) and [turbo functions](add-ons/turbo). Due to the large number of add-ons created by the community, they are located in a separate documentation page. Navigate to [Add-Ons page](add-ons) for more information on the individual add-ons. diff --git a/docs/web-configurator.md b/docs/web-configurator.md new file mode 100644 index 000000000..0cc74b989 --- /dev/null +++ b/docs/web-configurator.md @@ -0,0 +1,193 @@ +# GP2040-CE Web Configurator + +Select the button labels to be displayed in the web configurator guide: + +GP2040-CE contains a built-in web-based configuration application which can be started up by holding when plugging your controller into a PC. Then access in a web browser to begin configuration. This mode is compatible with Windows, Mac, Linux and SteamOS. When using the web-based configuration on Windows and Mac, RNDIS works on a default install. Linux distributions may need some extra steps to access the web configurator; see [Linux Setup](#linux-setup). + +## Home + +![GP2040-CE Configurator - Home](assets/images/gpc-home.png) + +Here you can see the current version of your firmware and the latest version available on GitHub in the releases section. If a firmware update is available, a link to that release will appear. + +The options in the main menu are: + +* [Home](#home) - The start page. +* [Settings](#settings) - Adjust settings like input mode, d-pad mode, etc. +* [Configuration > Pin Mapping](#pin-mapping) - Allows for remapping of GPIO pins to different buttons. +* [Configuration > Keyboard Mapping](#keyboard-mapping) - Allows for remapping of keyboard keys to different controller inputs. +* [Configuration > Profile Settings](#profile-settings) - Allows for remapping of GPIO pins to different buttons. +* [Configuration > LED Configuration](#led-configuration) - Enable and configure RGB LEDs here. +* [Configuration > Display Configuration](#display-configuration) - Enable and configure display options. +* [Configuration > Add-Ons Configuration](#add-ons-configuration) - Enable and configure available add-ons. +* [Configuration > Data Backup and Restoration](#data-backup-and-restoration) - Backup and restore settings. +* Links - Useful links to the project and documentation +* [DANGER ZONE](#danger-zone) - Don't be afraid of the big red button. If something becomes misconfigured, you can reset your settings here. + +## Settings + +![GP2040-CE Configurator - Settings](assets/images/gpc-settings.png) + +Here you can select the basic settings which are normally available via hotkeys. + +* `Input Mode` - Choose the main input mode (XINPUT, DINPUT, Switch, PS4, HID-Keyboard) this connected device will boot into when powered on. This selection will persist through unplug / replug. +* `D-Pad Mode` - Choose the default D-Pad mode (D-Pad, Left Stick or Right Stick). +* `SOCD Cleaning Mode` - Choose the default SOCD Cleaning Mode (Neutral, Last Win, First Win, OFF). Please note that PS4, PS3 and Nintendo Switch modes do not support setting SOCD to off and will default to Neutral SOCD. +* `Forced Setup Mode` - Allows you to lock out Input Mode, the ability to enter Web-Config or both. Enabling a web-config lockout will require you to nuke and reload the firmware if you wish to make further changes. +* `4-Way Joystick Mode` - Enables 4-Way Joystick mode which will prevent cardinal directions. + +Please note that if you choose `PS4` mode you will have an additional option to set the device as a `Controller` or a `Fightstick`. If you choose `Fightstick` and want to use this device with compatible PS5 games you will need to enable the `PS Passthrough` add-on and have a way to connect the device you with to use for passthrough authentication to the RP2040-CE based device via a USB passthrough port. + +### Hotkey Settings + +![GP2040-CE Configurator - Hotkey Settings](assets/images/gpc-hotkey-settings.png) + +An arbitrary number of buttons and directions, plus the optional Function (Fn) button, can be used to define +desired hotkey actions. Select Fn if desired, plus one or more buttons/directions, and associate them with a +hotkey action. The default hotkeys can be modified or removed, and new ones added, up to 12 in total. + +The available hotkey actions will expand over time. We may also expand the number of hotkeys available to +configure in the future. + +## Pin Mapping + +![GP2040-CE Configurator - Pin Mapping](assets/images/gpc-pin-mapping.png) + +Here you can remap the GP2040-CE buttons to different GPIO pins on the RP2040 chip. This can be used to simply remap buttons, or bypass a GPIO pin that may have issues on your device. + +## Keyboard Mapping + +![GP2040-CE Configurator - Keyboard Mapping](assets/images/gpc-keyboard-mapping.png) + +Here you can remap the GP2040-CE buttons to different keyboard keycodes that will be sent to the PC or game console when pressed in Keyboard Mode. + +## Profile Settings + +![GP2040-CE Configurator - Profile Settings](assets/images/gpc-profile-settings.png) + +Here you can set profiles that will change the GPIO to GP2040-CE button mapping based on what profile you have set. You can change the profile number either using the Web Configurator or using a hotkey shortcut. + +## LED Configuration + +If you have a setup with per-button RGB LEDs, they can be configured here. + +### RGB LED Configuration + +![GP2040-CE Configurator - LED Configuration](assets/images/gpc-rgb-led-config.png) + +* `Data Pin` - The GPIO pin that will drive the data line for your RGB LED chain. Set to `-1` to disable RGB LEDs. +* `LED Format` - The data format used to communicate with your RGB LEDs. If unsure the default `GRB` value is usually safe. +* `LED Layout` - Select the layout for your controls/buttons. This is used for static themes and some per-button animations. +* `LEDs Per Button` - Set the number of LEDs in each button on your chain. +* `Max Brightness` - Set the maximum brightness for the LEDs. Ranges from 0-255. +* `Brightness Steps` - The number of levels of brightness to cycle through when turning brightness up and down. + +### RGB LED Button Order + +!> Please note that RGB Button LEDs must be the first LEDs configured. They will start at index 0 on the RGB LED strip. + +![GP2040-CE Configurator - RGB LED Button Order](assets/images/gpc-rgb-led-button-order.png) + +* `LED Button Order` - Configure which buttons and what order they reside on the LED chain. + +### Player LEDs (XInput) + +Available selections for `Player LED Type` are `None`, `PWM` or `RGB`. + +#### PWM Player LEDs + +![GP2040-CE Configurator - PWM Player LEDs](assets/images/gpc-pled-pwm.png) + +* `PLED #[1-4] Pin` - The GPIO pin the standard LED is connected to. + +#### RGB Player LEDs + +!> Please note that RGB Player LEDs must be located at an index after the RGB LED Buttons on the LED strip! The Web Config interface will suggest a starting index based on the number of LED buttons mapped in [RGB LED Button Order](#rgb-led-button-order) and the select `LEDs Per Button` value. We hope to remove this limitation in the future. + +![GP2040-CE Configurator - PWM Player LEDs](assets/images/gpc-pled-rgb.png) + +* `PLED #[1-4] Index` - The index of the LED module on the RGB strip. +* `RGB PLED Color` - Click the box to reveal a color picker, or manually enter the color. + +## Custom LED Theme + +![GP2040-CE Configurator - Custom LED Theme](assets/images/gpc-rgb-led-custom-theme.png) + +* `Enable` - Enables the use of Custom LED Theme. +* `Preview Layout` - Predefined layouts for previewing LED theme. **NOTE:** This is for preview only, does not affect controller operation. +* `Clear All` - Prompts for confirmation to reset the current theme to all buttons black (LEDs off). Make sure you have saved and have a backup if you don't want to lose your customizations. +* `Set All To Color` - Presents a color picker to set all buttons to the same normal or pressed color. +* `Set Gradient` - Sets a horizontal gradient across the action buttons according to the `Preview Layout` selection. +* `Set Pressed Gradient` - Same as `Set Gradient`, but for pressed button state. +* `Save Color` - Save a custom color to the color picker palette. +* `Delete Color` - Deletes a custom color from the color picker palette. Stock colors cannot be deleted. + +?> All saved colors and gradient selections are saved to your browser's local storage. + +If enabled, the Custom LED Theme will be available as another animation mode and will cycle with the `Previous Animation` and `Next Animation` shortcuts on your controller. You can also use the [Data Backup and Restoration](#data-backup-and-restoration) feature to create and share themes! + +## Display Configuration + +![GP2040-CE Configurator - Display Configuration](assets/images/gpc-display-config.png) + +* `Use Display` - Turns on/off the display module. +* `I2C Block` - The Pico I2C block that will be used. Set based on pins, refer to table on page. +* `SDA Pin` - The GPIO pin used for the I2C SDA channel. +* `SCL Pin` - The GPIO pin used for the I2C SCL channel. +* `I2C Address` - The I2C address of your device, defaults to the very commonly used `0x3C`. +* `I2C Speed` - Sets the speed of I2C communication. Common values are `100000` for standard, `400000` for fast and `800000` ludicrous speed. +* `Flip Display` - Allows you to flip or mirror the display in a variety of ways. +* `Invert Display` - Inverts the pixel colors, effectively giving you a negative image when enabled. +* `Button Layout (Left)` - Changes the onscreen layout for the left side of the display and stick. +* `Button Layout (Right)` - Changes the onscreen layout for the right side of the display and stick. +* `Splash Mode` - Enables or disables a splash screen displaying when the unit is turned on. +* `Splash Duration` - Sets the amount of time the splash screen displays for on boot. +* `Display Saver Timeout` - Will cause the display to turn off after the specified number of minutes. Pressing any input will cause the display to turn back on. +* `Choose File` - This will allow you to upload your own image to be used for the splash screen. It is recommend that you use a two color 128x64 image (or one that is sized appropriately for your display). Uploading any other type of image will result in a conversion and sizing of the image automatically. If the image is inverted upon upload, just check off the `Invert` box. + +Check out our collection of great custom splash screens from the community [HERE](community-splash-screens.md) + +## Add-Ons Configuration + +This section is for custom add-ons that can be enabled to expand the functionality of GP2040-CE. Due to the large number of add-ons created by the community, they are located in a separate documentation page. Navigate to [Web Configurator - Add-ons](add-ons "GP2040-CE | Web Configurator - Add-ons") for more information. + +## Data Backup and Restoration + +![GP2040-CE Configurator - Add-Ons Backup and Restore](assets/images/gpc-backup-and-restore.png) + +* `Backup To File` - Allows you to select what to backup to a file (default is all selected). +* `Restore From File` - Allows you to select what to restore from a file (default is all selected). + +## DANGER ZONE + +![GP2040-CE Configurator - Reset Settings](assets/images/gpc-reset-settings.png) + +## Linux Setup + +When you plug in your controller while holding , you should see it connect in the kernel logs if you run `dmesg`: + +```sh +[ 72.291060] usb 1-3: new full-speed USB device number 12 using xhci_hcd +[ 72.450166] usb 1-3: New USB device found, idVendor=cafe, idProduct=4028, bcdDevice= 1.01 +[ 72.450172] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 +[ 72.450174] usb 1-3: Product: TinyUSB Device +[ 72.450176] usb 1-3: Manufacturer: TinyUSB +[ 72.450177] usb 1-3: SerialNumber: 123456 +[ 72.484285] rndis_host 1-3:1.0 usb0: register 'rndis_host' at usb-0000:06:00.1-3, RNDIS device, 02:02:84:6a:96:00 +[ 72.498630] rndis_host 1-3:1.0 enp6s0f1u3: renamed from usb0 +``` + +In the above example, **enp6s0f1u3** is the virtual Ethernet interface for your controller. If you don't see the first `rndis_host` line, make sure `CONFIG_USB_NET_RNDIS_HOST` is compiled in your kernel or as a module. + +The web configurator is automatically running, you just need to be able to reach it. Some configurations automatically set up the route, so try in your browser now. If it doesn't load, try configuring an IP for the interface manually via: `sudo ifconfig enp6s0f1u3 192.168.7.2`. + +Whether or not you had to add an IP manually, you should end up with a route something like this: + +```sh +% ip route +default via 10.0.5.1 dev enp5s0 proto dhcp src 10.0.5.38 metric 2 +10.0.5.0/24 dev enp5s0 proto dhcp scope link src 10.0.5.38 metric 2 +192.168.7.0/24 dev enp6s0f1u3 proto kernel scope link src 192.168.7.2 <--- +``` + +Then the configurator should be reachable in your browser. diff --git a/docs/wiring.md b/docs/wiring.md new file mode 100644 index 000000000..6a11a003b --- /dev/null +++ b/docs/wiring.md @@ -0,0 +1,21 @@ +# Wiring + +These are the default pin mappings for each GP2040-CE supported microcontroller board. + +## Raspberry Pi Pico + +?> The Raspberry Pi Pico pinout can also be used on clone boards with the same form factor and pinout, such as the Pimironi Pico LiPo and the Waveshare RP2040-Plus. + +![Raspberry Pi Pico Pinout](assets/wiring/RaspberryPiPico_Pinout.png) + +## SparkFun Pro Micro - RP2040 + +![SparkFun Pro Micro - RP2040 Pinout](assets/wiring/SparkFunProMicroRP2040_Pinout.png) + +## Waveshare RP2040-Zero + +![Waveshare RP2040-Zero Pinout](assets/wiring/WaveshareRP2040Zero_Pinout.png) + +## Adafruit KB2040 + +![Adafruit KB2040 Pinout](assets/wiring/AdafruitKB2040_Pinout.png) diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b8a95e183..000000000 --- a/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "GP2040-CE", - "lockfileVersion": 3, - "requires": true, - "packages": {} -} diff --git a/site/.gitignore b/site/.gitignore deleted file mode 100644 index 94a23a47c..000000000 --- a/site/.gitignore +++ /dev/null @@ -1,32 +0,0 @@ -.DS_Store -.vscode/* -!.vscode/extensions.json -.idea -*.iml -*.code-workspace -.changelog -.history - -node_modules -.yarn -package-lock.json - -.eslintcache - -yarn-error.log -build -coverage -.docusaurus -.cache-loader -types - -packages/create-docusaurus/lib/ -packages/lqip-loader/lib/ -packages/docusaurus/lib/ -packages/docusaurus-*/lib/* -packages/eslint-plugin/lib/ -packages/stylelint-copyright/lib/ - -CrowdinTranslations_*.zip - -.netlify \ No newline at end of file diff --git a/site/babel.config.js b/site/babel.config.js deleted file mode 100644 index e00595dae..000000000 --- a/site/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: [require.resolve('@docusaurus/core/lib/babel/preset')], -}; diff --git a/site/docs/add-ons/keyboard-host.mdx b/site/docs/add-ons/keyboard-host.mdx deleted file mode 100644 index 3ddeb127a..000000000 --- a/site/docs/add-ons/keyboard-host.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Keyboard Host Configuration -# tags: -# - -pagination_next: null -pagination_prev: null ---- - -import PinOption from './usb-host-add-on/_pin-options.mdx' -import ExampleWiringDiagram from './usb-host-add-on/_example-wiring-diagram.mdx' - -# Keyboard Host Configuration - -![GP2040-CE Configurator - Keyboard Host Configuration](../assets/images/gpc-add-ons-keyboard-host-configuration.png) - - - -## Hardware Requirements - - This add-on requires that you have something like the ![USB Passthrough Board](https://github.com/OpenStickCommunity/Hardware/tree/main/USB%20Passthrough%20Board) or a board with a USB passthrough port on it already. - -### Example Wiring Diagram - - \ No newline at end of file diff --git a/site/docs/add-ons/player-number.mdx b/site/docs/add-ons/player-number.mdx deleted file mode 100644 index 400a5399c..000000000 --- a/site/docs/add-ons/player-number.mdx +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Player Number -# tags: -# - -pagination_next: null -pagination_prev: null ---- - -# Player Number - -:::note - -This add-on is applicable to X-Input mode only. - -::: - -![GP2040-CE Configurator - Player Number](../assets/images/gpc-add-ons-player-number.png) - -* `Player Number` - Choose what player number this RP2040 based device will be representing. \ No newline at end of file diff --git a/site/docs/add-ons/ps-passthrough.mdx b/site/docs/add-ons/ps-passthrough.mdx deleted file mode 100644 index 27ab9e068..000000000 --- a/site/docs/add-ons/ps-passthrough.mdx +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: PS Passthrough -tags: -- PS4 -- PS5 -pagination_next: null -pagination_prev: null ---- - -import PinOption from './usb-host-add-on/_pin-options.mdx' -import ExampleWiringDiagram from './usb-host-add-on/_example-wiring-diagram.mdx' - -# PS Passthrough - -Purpose: Enabling this add-on will allow you to use a licensed 3rd party device to authenticate off of. - -![GP2040-CE Configurator - PS Passthrough](../assets/images/gpc-add-ons-ps-passthrough.png) - - - -## Hardware Requirements - - This add-on requires that you have something like the ![USB Passthrough Board](https://github.com/OpenStickCommunity/Hardware/tree/main/USB%20Passthrough%20Board) or a board with a USB passthrough port on it already. - - ### Example Wiring Diagram - - - -## Note - - If you have passthrough enabled you can turn off the above `PS4 Mode` add-on as the two will not work together. Please also ensure that under the `Settings` section you have chosen PS4 mode and picked if you want the GP2040-CE unit to function as a controller or as a fightstick. diff --git a/site/docs/add-ons/usb-host-add-on/_example-wiring-diagram.mdx b/site/docs/add-ons/usb-host-add-on/_example-wiring-diagram.mdx deleted file mode 100644 index 863f53747..000000000 --- a/site/docs/add-ons/usb-host-add-on/_example-wiring-diagram.mdx +++ /dev/null @@ -1,6 +0,0 @@ -![USB Host Wiring Diagram](../../assets/images/gpc-add-ons-keyboard-host-configuration-wiring-diagram.png) - -* `VCC` - Connects to 5V power (Example: VBUS on the Raspberry Pi Pico) -* `D+` - Connects to the `D+` GPIO Pin above, set in the Web Configurator. (Example: GPIO0 on the Raspberry Pi Pico) -* `D-` - Connects to the `D-` GPIO Pin above, automatically set based on D+. (Example: GPIO1 on the Raspberry Pi Pico) -* `GND` - Connects to a ground pin, any `GND` pin will work. (Example: GND on the Raspberry Pi Pico) \ No newline at end of file diff --git a/site/docs/add-ons/usb-host-add-on/_pin-options.mdx b/site/docs/add-ons/usb-host-add-on/_pin-options.mdx deleted file mode 100644 index 026c5d25d..000000000 --- a/site/docs/add-ons/usb-host-add-on/_pin-options.mdx +++ /dev/null @@ -1,3 +0,0 @@ -* `D+` - The GPIO Pin used to carry Data Plus between the USB Host Port and RP2040 -* `D-` - The GPIO Pin used to carry Data Minus between the USB Host Port and RP2040. This cannot be set and will be automatically determined from `D+`. -* `5V Power (optional)` - The GPIO Pin used to enable 5V power to the host port on the board. This is only applicable to a small number of boards (e.g. Adafruit RP2040 Feather USB Host) and most boards do not require this to be set. \ No newline at end of file diff --git a/site/docs/assets/boards/Liatris.jpg b/site/docs/assets/boards/Liatris.jpg deleted file mode 100644 index 39c3d9d20ed64cf3bca735073622f992c20c326f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10292 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 diff --git a/site/docs/assets/images/gpc-add-ons-tilt.png b/site/docs/assets/images/gpc-add-ons-tilt.png deleted file mode 100644 index 16263f3cc107693ab0d4908fa84b8891f3bd2ae2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50759 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 X&CXmago9uF0%#E0kF?6+Hevq*5n%cP diff --git a/site/docs/assets/images/gpc-documentation-next-version.png b/site/docs/assets/images/gpc-documentation-next-version.png deleted file mode 100644 index bc1b6bee9a29496b0a2f22b54227963b61855a9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4794 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 UVr>n7#Q*>R07*qoM6N<$f^!E+J^%m! diff --git a/site/docs/community-splash-screens.mdx b/site/docs/community-splash-screens.mdx deleted file mode 100644 index 52aebec3d..000000000 --- a/site/docs/community-splash-screens.mdx +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Community Splash Screens -# tags: -# - -pagination_next: null -pagination_prev: null ---- - -# Community Splash Screens - -Here is a collection of community created splash screens that can be used with an optional OLED screen. Upload the image using the web configurator to set it up. - -All images been formatted to 128x64 in black / white color. - -| ![BentoBox](@site/docs/assets/images/community-splash-screens/BentoBox.png) | ![Crush_Counter](@site/docs/assets/images/community-splash-screens/CrushCounter-v2-0.png) | ![GP2040-CE1](@site/docs/assets/images/community-splash-screens/GP2040-CE-1.png) | ![GP2040-CE2](@site/docs/assets/images/community-splash-screens/GP2040-CE-2.png) | ![GP2040-CE3](@site/docs/assets/images/community-splash-screens/GP2040-CE-3.png) | -|---|---|---|---|---| -| ![GP2040-CE4](@site/docs/assets/images/community-splash-screens/GP2040-CE-4.png) | ![GP2040-CE5](@site/docs/assets/images/community-splash-screens/GP2040-CE-5.png) | ![Sega_Astro_City](@site/docs/assets/images/community-splash-screens/Sega-Astro-City.png) | ![Street_Fighter](@site/docs/assets/images/community-splash-screens/Street-Fighter.png) | ![TheTrain](@site/docs/assets/images/community-splash-screens/TheTrain-Logo.png) | -| ![GP2040-CE6](@site/docs/assets/images/community-splash-screens/GP2040-CE-6.png) | ![GP2040-CE7](@site/docs/assets/images/community-splash-screens/GP2040-CE-7.png) | | | | \ No newline at end of file diff --git a/site/docs/controller-build/wiring.mdx b/site/docs/controller-build/wiring.mdx deleted file mode 100644 index faed90093..000000000 --- a/site/docs/controller-build/wiring.mdx +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Microcontroller Board Wiring -# tags: -# - -pagination_next: null -pagination_prev: null ---- - -# Wiring - -These are the default pin mappings for each GP2040-CE supported microcontroller board. - -## Raspberry Pi Pico - -:::note - -The Raspberry Pi Pico pinout can also be used on clone boards with the same form factor and pinout, such as the Pimironi Pico LiPo and the Waveshare RP2040-Plus. - -::: - -![Raspberry Pi Pico Pinout](../assets//wiring/RaspberryPiPico_Pinout.png) - -## SparkFun Pro Micro - RP2040 - -![SparkFun Pro Micro - RP2040 Pinout](../assets/wiring/SparkFunProMicroRP2040_Pinout.png) - -## Waveshare RP2040-Zero - -![Waveshare RP2040-Zero Pinout](../assets/wiring/WaveshareRP2040Zero_Pinout.png) - -## Adafruit KB2040 - -![Adafruit KB2040 Pinout](../assets/wiring/AdafruitKB2040_Pinout.png) diff --git a/site/docs/development/documentation-preview.mdx b/site/docs/development/documentation-preview.mdx deleted file mode 100644 index d3f8f2992..000000000 --- a/site/docs/development/documentation-preview.mdx +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: Documentation Preview -# tags: -# - -pagination_next: null -pagination_prev: null ---- - -# Documentation Preview - -While writing and developing the documentation, you will want to build locally so you can see changes without making updates to the main repository. However, when you are ready to test for a pull request, compile for production as this will build the files that would be used for a live site and will reveal issues that may not be present when building locally. - -## Clear Local Build - -This process will clear generated assets, caches, build artifacts from your docs folder. It's recommended to do so anytime there are issues with the Docusaurus site when building locally or compiling for production. - -1. Open a terminal in the root of the GP2040-CE project -2. Run the following commands - - ```shell - cd docs/ - npm run docusaurus clear - ``` - -## Build Locally - -This will build and serve your site locally with [Webpack Dev Server](https://webpack.js.org/configuration/dev-server/). - -:::note - -Changes made to documents while the dev server is running will update the live site on save. - -::: - -1. Open a terminal in the root of the GP2040-CE project -2. Run the following commands - - ```shell - cd docs/ - npm install - npm start - ``` - -3. In the default web browser, `http://localhost:port` should automatically open and allow you to preview the site. - -## Production Preview - -This will compile your site for production, creating a build folder that would be used as a static site. - -:::note - -Changes made to documents while the dev server is running will **not** update the live site on save. - -::: - -1. Open a terminal in the root of the GP2040-CE project -2. Run the following commands - - ```shell - cd docs/ - npm install - npm run build - npm run serve - ``` - -3. In the default web browser, `http://localhost:port` should automatically open and allow you to preview the site. \ No newline at end of file diff --git a/site/docs/development/documentation-update-downloads.mdx b/site/docs/development/documentation-update-downloads.mdx deleted file mode 100644 index 9519920f5..000000000 --- a/site/docs/development/documentation-update-downloads.mdx +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: Update Downloads Page -# tags: -# - -pagination_next: null -pagination_prev: null ---- - -# Update Downloads Page - -Adding a microcontroller board or device to the [Downloads](../downloads/download-page.mdx) page requires an update to the `docs/src/config/boards.tsx` file. The information required will depend on whether you are adding a microcontroller board or a controller. - -| Key | Value | -|--------------|------------------------------------------------------------------------------------------------------------------| -| `name` | The name of the device what will be listed on the Downloads page | -| `configName` | The name of the device that will be used to generate the .uf2 file and used to generate link to release firmware | -| `pinout` | Link to the devices pinout diagram | -| `website` | Link to the website containing device information | -| `image` | Absolute link to the asset used for device, change only `BoardName` to match file name in `docs/docs/assets/` | -| `supported` | (Microcontroller Board Only) Whether the device is currently supported by the project | -| `category` | (Controller Only) The category classification following convention listed below | -| `desc` | Short description of the device and manufacturer to be displayed on Downloads page | - -## Microcontroller Board - -The template for microcontroller boards can be found in [Templates - Microcontroller Boards](..//development/templates.mdx#microcontroller-boards). - -To add a microcontroller board to the download list, fill out the template with all of the infomation and add it to the array `boards['Microcontroller Boards']`. The order that the boards are listed determine the order that they appear on the page so note the following order of boards. - -- Raspberry Pi Pico -- Raspberry Pi Pico W -- The rest of the microcontroller boards in alphabetical order - -## Controllers - -The template for controllers can be found in [Templates - Controllers](..//development/templates.mdx#controllers). - -To add a controller to the download list, fill out the template with all of the infomation and add it to the array `boards['Controllers']`. The order of the controllers in this array should be alphabetical. - -For categories, the convention is as follows. - -- `official` - Official boards of the project -- `open` - Open source devices -- `closed` - Closed source devices -- `legacy` - Devices that are not or are no longer supported by the project \ No newline at end of file diff --git a/site/docs/development/documentation-versioning.mdx b/site/docs/development/documentation-versioning.mdx deleted file mode 100644 index a8ced1e1a..000000000 --- a/site/docs/development/documentation-versioning.mdx +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Documentation Preview -# tags: -# - -pagination_next: null -pagination_prev: null ---- - -# Versioning - -Versioning is used so that the documentation for features currently in development can be updated without affecting user documentation, which should remain fairly static and only updated with a new release version. There should only ever be **one** versioned copy of the documentation that matches to latest release version number of firmware. - -The result is a default versions copy for the latest release that is served to the user when visiting https://gp2040-ce.info and another "Next" version that reflects unfinished documentation for the next release. - -## On New Release - -When a new release is ready, first delete the prior version. Then tag a new version with a name that matches the release number (i.e. X.X.X). Once that has been completed, commit the changes and make a pull request to update the site documentation. - -### Delete Prior Version - -At the root of the GP2040-CE folder, run the following command to delete the versioned folders and files entirely as they will be recreated in when a new version is tagged. - -```shell -rm -rf docs/versioned_docs -rm -rf docs/versioned_sidebars -rm -rf docs/versions.json -``` - -### Tag New Version - -```shell -cd docs/ -npm run docusaurus docs:version X.X.X -``` - -When tagging a new version, the document versioning mechanism will: - -- Copy the full docs/ folder contents into a new versioned_docs/version-[versionName]/ folder. -- Create a versioned sidebars file based from your current sidebar configuration (if it exists) - saved as versioned_sidebars/version-[versionName]-sidebars.json. -- Append the new version number to versions.json. - -## Updating Documentation - -### Update Future Release Documentation - -Updates can be made directly in the `docs/docs/` folder or `sidebars.js` as these changes are not reflected in the default versioned documents users will see on the site. Any changes to the `docs/docs/` folder or `sidebars.js` are made to the `Next` version. - -![GP2040-CE | Next Version](../assets/images/gpc-documentation-next-version.png) - -### Update Current Release Documentation - -This process is different from updating documentation for future releases as changes need to be made with the versioned documents. Changes to the current release version of documentation will need to be made to the files in `docs/versioned_docs/version-X.X.X` and `docs/versioned_sidebars/version-X.X.X-sidebars.json`. - -These changes will be reflected in the default user facing documentation that appears when users go to https://gp2040-ce.info and do not specifically select the `Next` version of documentation. - -![GP2040-CE | Current Version](../assets/images/gpc-documentation-current-version.png) \ No newline at end of file diff --git a/site/docs/downloads/download-page.mdx b/site/docs/downloads/download-page.mdx deleted file mode 100644 index 7a2386f92..000000000 --- a/site/docs/downloads/download-page.mdx +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Downloads -# tags: -# - -pagination_next: null -pagination_prev: null ---- - -import { - Microcontrollers, - OfficialDevices, - OpenSourceDevices, - ClosedSourceDevices, - LegacyDevices, -} from "@site/src/components/Download.tsx"; - -# Downloads - -## Microcontroller Boards - - - -## Official Project Boards - - - -## Open Source Community Devices - - - -## Closed Source Community Devices - - - -## Legacy Devices - -GP2040-CE builds for these devices have been deprecated due to one or more of the following reasons: - -- The manufacturer already provides a custom build of GP2040-CE -- The device is no longer available for purchase -- The operation of the device running an updated GP2040-CE build cannot be verified by the development team - -These builds remain available, however legacy devices are not supported by the GP2040-CE team. - -Please ensure you have a backup of the original firmware and your settings before updating your device! - - diff --git a/site/docs/home.mdx b/site/docs/home.mdx deleted file mode 100644 index 2d2c7f1f6..000000000 --- a/site/docs/home.mdx +++ /dev/null @@ -1,11 +0,0 @@ ---- -slug: '/' -hide_title: true -title: 'Home' -pagination_next: null -pagination_prev: null ---- - - import README from '@site/../README.md' - - \ No newline at end of file diff --git a/site/docs/usage.mdx b/site/docs/usage.mdx deleted file mode 100644 index 5648b95e5..000000000 --- a/site/docs/usage.mdx +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: GP2040-CE Usage -# tags: -# - -pagination_next: null -pagination_prev: null ---- - -import InputLabelSelector, { Hotkey } from "@site/src/components/LabelSelector.tsx"; - -# GP2040-CE Usage - -Select the button labels to be displayed in the usage guide: - - -
- -:::caution - -The v0.5+ release has some breaking changes to boards other than the Raspberry Pi Pico. If you are using such a board, do not update from an older version unless you have a backup .uf2 from a known good version, or you know what you're doing. - -::: - -## Buttons - -GP2040-CE uses generic button labeling for gamepad state, which is then converted to the appropriate input type before sending. This table provides a map of GP2040-CE buttons to the supported input types and layouts: - -| GP2040-CE | XInput | Switch | PS4 | PS3 | DirectInput | Arcade | -| --------- | ------ | ------- | -------- | -------- | ----------- | ------ | -| B1 | A | B | Cross | Cross | 2 | K1 | -| B2 | B | A | Circle | Circle | 3 | K2 | -| B3 | X | Y | Square | Square | 1 | P1 | -| B4 | Y | X | Triangle | Triangle | 4 | P2 | -| L1 | LB | L | L1 | L1 | 5 | P4 | -| R1 | RB | R | R1 | R1 | 6 | P3 | -| L2 | LT | ZL | L2 | L2 | 7 | K4 | -| R2 | RT | ZR | R2 | R2 | 8 | K3 | -| S1 | Back | Minus | Share | Select | 9 | Coin | -| S2 | Start | Plus | Options | Start | 10 | Start | -| L3 | LS | LS | L3 | L3 | 11 | LS | -| R3 | RS | RS | R3 | R3 | 12 | RS | -| A1 | Guide | Home | PS | PS | 13 | Home | -| A2 | - | Capture | Touchpad | - | 14 | - | - -If your controller is missing dedicated buttons for any specific inputs, check the [Hotkeys page](./hotkeys.mdx) on how to map a button combination that will emulate those missing inputs. - -:::note - -Unlike other controllers, Keyboard gets different keys for directional buttons. You can change the key mappings for Keyboard mode in [Webconfig mode > Configuration > Keyboard Mapping](./web-configurator.mdx#keyboard-mapping) - -::: - -| Direction | Keyboard | -| --------- | ----------- | -| Up | Up Arrow | -| Down | Down Arrow | -| Left | Left Arrow | -| Right | Right Arrow | - -## Bootsel Mode - -Bootsel Mode is the state of the board where firmware can be flashed onto the board. You will need to use this whenever there is an update or as part of the troubleshooting process. - -You can boot into Bootsel Mode by either holding buttons while plugging in the controller or by booting into the Web Configurator and then restarting in Bootsel Mode. - -## Webconfig Mode - -Webconfig Mode is the state of the board where built-in web browser-based configuration application is launched. From here, you can customize and configure your controller as needed. - -You can boot into Webconfig Mode by holding the button while plugging in the controller. - -## Input Modes - -GP2040-CE is compatible with a number of systems and input modes. To change the input mode, **hold one of the following buttons as the controller is plugged in:** - -| Input Mode | Button Held | -| :-------------- | :---------: | -| Nintendo Switch | | -| XInput | | -| DirectInput/PS3 | | -| PS4 | | -| Keyboard | | - -:::note - -Input mode is saved across power cycles. - -::: - -## Hotkeys - -A number of useful hotkeys exist that change the functionality of GP2040 without needing to access the Web Configurator. Commonly used hotkeys include changing the directions to emulate a digital DPad, Left Analog Stick, Right Analog Stick or to change [Simultaneous Opposite Cardinal Direction (SOCD)](https://glossary.infil.net/?t=SOCD) cleaning modes. Different SOCD cleaning modes will ensure the controller obeys certain directional input rules when sending inputs to the computer or game console. - -A number of hotkeys are enabled by default and if you are encountering issues with unexpected behavior on your controller, verify that you did not accidentally trigger a hotkey. - -| Hotkeys Enabled By Default | Inputs | -| :------------------------------------------------ | :-------------------- | -| [Home Button](hotkeys.mdx#home-button) | | -| [Dpad Digital](hotkeys.mdx#dpad-digital) | | -| [Dpad Left Analog](hotkeys.mdx#dpad-left-analog) | | -| [Dpad Right Analog](hotkeys.mdx#dpad-right-analog) | | -| [SOCD Up Priority](hotkeys.mdx#socd-up-priority) | | -| [SOCD Neutral](hotkeys.mdx#socd-neutral) | | -| [SOCD Last Wins](hotkeys.mdx#socd-last-win) | | -| [SOCD Invert Y Axis](hotkeys.mdx#invert-y-axis) | | - -:::note - -Selected D-Pad mode and SOCD cleaning mode are saved across power cycles. - -::: - -## Add-Ons and Additional Features - -There are a number of add-ons that expand the functionality of GP2040-CE, such as [analog stick emulation](./add-ons/analog) and [turbo functions](./add-ons/turbo). Due to the large number of add-ons created by the community, they are located in a separate documentation page. Navigate to Add-Ons page for more information on the individual add-ons. diff --git a/site/docs/web-configurator.mdx b/site/docs/web-configurator.mdx deleted file mode 100644 index 3d91bcd38..000000000 --- a/site/docs/web-configurator.mdx +++ /dev/null @@ -1,218 +0,0 @@ ---- -title: GP2040-CE Web Configurator -# tags: -# - -pagination_next: null -pagination_prev: null ---- - -import InputLabelSelector, { Hotkey } from "@site/src/components/LabelSelector.tsx"; - -# GP2040-CE Web Configurator - -Select the button labels to be displayed in the usage guide: - - -
- -GP2040-CE contains a built-in web-based configuration application which can be started up by holding when plugging your controller into a PC. Then access in a web browser to begin configuration. This mode is compatible with Windows, Mac, Linux and SteamOS. When using the web-based configuration on Windows and Mac, RNDIS works on a default install. Linux distributions may need some extra steps to access the web configurator; see [Linux Setup](#linux-setup). - -## Home - -![GP2040-CE Configurator - Home](./assets/images/gpc-home.png) - -Here you can see the current version of your firmware and the latest version available on GitHub in the releases section. If a firmware update is available, a link to that release will appear. - -The options in the main menu are: - -- [Home](#home) - The start page. -- [Settings](#settings) - Adjust settings like input mode, d-pad mode, etc. -- [Configuration > Pin Mapping](#pin-mapping) - Allows for remapping of GPIO pins to different buttons. -- [Configuration > Keyboard Mapping](#keyboard-mapping) - Allows for remapping of keyboard keys to different controller inputs. -- [Configuration > Profile Settings](#profile-settings) - Allows for remapping of GPIO pins to different buttons. -- [Configuration > LED Configuration](#led-configuration) - Enable and configure RGB LEDs here. -- [Configuration > Display Configuration](#display-configuration) - Enable and configure display options. -- [Configuration > Add-Ons Configuration](#add-ons-configuration) - Enable and configure available add-ons. -- [Configuration > Data Backup and Restoration](#data-backup-and-restoration) - Backup and restore settings. -- Links - Useful links to the project and documentation -- [DANGER ZONE](#danger-zone) - Don't be afraid of the big red button. If something becomes misconfigured, you can reset your settings here. - -## Settings - -![GP2040-CE Configurator - Settings](./assets/images/gpc-settings.png) - -Here you can select the basic settings which are normally available via hotkeys. - -- `Input Mode` - Choose the main input mode (XINPUT, DINPUT, Switch, PS4, HID-Keyboard) this connected device will boot into when powered on. This selection will persist through unplug / replug. -- `D-Pad Mode` - Choose the default D-Pad mode (D-Pad, Left Stick or Right Stick). -- `SOCD Cleaning Mode` - Choose the default SOCD Cleaning Mode (Neutral, Last Win, First Win, OFF). Please note that PS4, PS3 and Nintendo Switch modes do not support setting SOCD to off and will default to Neutral SOCD. -- `Forced Setup Mode` - Allows you to lock out Input Mode, the ability to enter Web-Config or both. Enabling a web-config lockout will require you to nuke and reload the firmware if you wish to make further changes. -- `4-Way Joystick Mode` - Enables 4-Way Joystick mode which will prevent cardinal directions. - -Please note that if you choose `PS4` mode you will have an additional option to set the device as a `Controller` or a `Fightstick`. If you choose `Fightstick` and want to use this device with compatible PS5 games you will need to enable the `PS Passthrough` add-on and have a way to connect the device you with to use for passthrough authentication to the RP2040-CE based device via a USB passthrough port. - -### Hotkey Settings - -![GP2040-CE Configurator - Hotkey Settings](./assets/images/gpc-hotkey-settings.png) - -An arbitrary number of buttons and directions, plus the optional Function (Fn) button, can be used to define -desired hotkey actions. Select Fn if desired, plus one or more buttons/directions, and associate them with a -hotkey action. The default hotkeys can be modified or removed, and new ones added, up to 12 in total. - -The available hotkey actions will expand over time. We may also expand the number of hotkeys available to -configure in the future. - -## Pin Mapping - -![GP2040-CE Configurator - Pin Mapping](./assets/images/gpc-pin-mapping.png) - -Here you can remap the GP2040-CE buttons to different GPIO pins on the RP2040 chip. This can be used to simply remap buttons, or bypass a GPIO pin that may have issues on your device. - -## Keyboard Mapping - -![GP2040-CE Configurator - Keyboard Mapping](./assets/images/gpc-keyboard-mapping.png) - -Here you can remap the GP2040-CE buttons to different keyboard keycodes that will be sent to the PC or game console when pressed in Keyboard Mode. - -## Profile Settings - -![GP2040-CE Configurator - Profile Settings](./assets/images/gpc-profile-settings.png) - -Here you can set profiles that will change the GPIO to GP2040-CE button mapping based on what profile you have set. You can change the profile number either using the Web Configurator or using a hotkey shortcut. - -## LED Configuration - -If you have a setup with per-button RGB LEDs, they can be configured here. - -### RGB LED Configuration - -![GP2040-CE Configurator - LED Configuration](./assets/images/gpc-rgb-led-config.png) - -- `Data Pin` - The GPIO pin that will drive the data line for your RGB LED chain. Set to `-1` to disable RGB LEDs. -- `LED Format` - The data format used to communicate with your RGB LEDs. If unsure the default `GRB` value is usually safe. -- `LED Layout` - Select the layout for your controls/buttons. This is used for static themes and some per-button animations. -- `LEDs Per Button` - Set the number of LEDs in each button on your chain. -- `Max Brightness` - Set the maximum brightness for the LEDs. Ranges from 0-255. -- `Brightness Steps` - The number of levels of brightness to cycle through when turning brightness up and down. - -### RGB LED Button Order - -:::note - -Please note that RGB Button LEDs must be the first LEDs configured. They will start at index 0 on the RGB LED strip. - -::: - -![GP2040-CE Configurator - RGB LED Button Order](./assets/images/gpc-rgb-led-button-order.png) - -- `LED Button Order` - Configure which buttons and what order they reside on the LED chain. - -### Player LEDs (XInput) - -Available selections for `Player LED Type` are `None`, `PWM` or `RGB`. - -#### PWM Player LEDs - -![GP2040-CE Configurator - PWM Player LEDs](./assets/images/gpc-pled-pwm.png) - -- `PLED #[1-4] Pin` - The GPIO pin the standard LED is connected to. - -#### RGB Player LEDs - -:::note - -Please note that RGB Player LEDs must be located at an index after the RGB LED Buttons on the LED strip! The Web Config interface will suggest a starting index based on the number of LED buttons mapped in [RGB LED Button Order](#rgb-led-button-order) and the select `LEDs Per Button` value. We hope to remove this limitation in the future. - -::: - -![GP2040-CE Configurator - PWM Player LEDs](./assets/images/gpc-pled-rgb.png) - -- `PLED #[1-4] Index` - The index of the LED module on the RGB strip. -- `RGB PLED Color` - Click the box to reveal a color picker, or manually enter the color. - -## Custom LED Theme - -![GP2040-CE Configurator - Custom LED Theme](./assets/images/gpc-rgb-led-custom-theme.png) - -- `Enable` - Enables the use of Custom LED Theme. -- `Preview Layout` - Predefined layouts for previewing LED theme. **NOTE:** This is for preview only, does not affect controller operation. -- `Clear All` - Prompts for confirmation to reset the current theme to all buttons black (LEDs off). Make sure you have saved and have a backup if you don't want to lose your customizations. -- `Set All To Color` - Presents a color picker to set all buttons to the same normal or pressed color. -- `Set Gradient` - Sets a horizontal gradient across the action buttons according to the `Preview Layout` selection. -- `Set Pressed Gradient` - Same as `Set Gradient`, but for pressed button state. -- `Save Color` - Save a custom color to the color picker palette. -- `Delete Color` - Deletes a custom color from the color picker palette. Stock colors cannot be deleted. - -:::note - -All saved colors and gradient selections are saved to your browser's local storage. - -::: - -If enabled, the Custom LED Theme will be available as another animation mode and will cycle with the `Previous Animation` and `Next Animation` shortcuts on your controller. You can also use the [Data Backup and Restoration](#data-backup-and-restoration) feature to create and share themes! - -## Display Configuration - -![GP2040-CE Configurator - Display Configuration](./assets/images/gpc-display-config.png) - -- `Use Display` - Turns on/off the display module. -- `I2C Block` - The Pico I2C block that will be used. Set based on pins, refer to table on page. -- `SDA Pin` - The GPIO pin used for the I2C SDA channel. -- `SCL Pin` - The GPIO pin used for the I2C SCL channel. -- `I2C Address` - The I2C address of your device, defaults to the very commonly used `0x3C`. -- `I2C Speed` - Sets the speed of I2C communication. Common values are `100000` for standard, `400000` for fast and `800000` ludicrous speed. -- `Flip Display` - Allows you to flip or mirror the display in a variety of ways. -- `Invert Display` - Inverts the pixel colors, effectively giving you a negative image when enabled. -- `Button Layout (Left)` - Changes the onscreen layout for the left side of the display and stick. -- `Button Layout (Right)` - Changes the onscreen layout for the right side of the display and stick. -- `Splash Mode` - Enables or disables a splash screen displaying when the unit is turned on. -- `Splash Duration` - Sets the amount of time the splash screen displays for on boot. -- `Display Saver Timeout` - Will cause the display to turn off after the specified number of minutes. Pressing any input will cause the display to turn back on. -- `Choose File` - This will allow you to upload your own image to be used for the splash screen. It is recommend that you use a two color 128x64 image (or one that is sized appropriately for your display). Uploading any other type of image will result in a conversion and sizing of the image automatically. If the image is inverted upon upload, just check off the `Invert` box. - -Check out our collection of great custom splash screens from the community [HERE](./community-splash-screens.mdx) - -## Add-Ons Configuration - -This section is for custom add-ons that can be enabled to expand the functionality of GP2040-CE. Due to the large number of add-ons created by the community, they are located in a separate documentation page. Navigate to Web Configurator - Add-ons for more information. - -## Data Backup and Restoration - -![GP2040-CE Configurator - Add-Ons Backup and Restore](./assets/images/gpc-backup-and-restore.png) - -- `Backup To File` - Allows you to select what to backup to a file (default is all selected). -- `Restore From File` - Allows you to select what to restore from a file (default is all selected). - -## DANGER ZONE - -![GP2040-CE Configurator - Reset Settings](./assets/images/gpc-reset-settings.png) - -## Linux Setup - -When you plug in your controller while holding , you should see it connect in the kernel logs if you run `dmesg`: - -```sh -[ 72.291060] usb 1-3: new full-speed USB device number 12 using xhci_hcd -[ 72.450166] usb 1-3: New USB device found, idVendor=cafe, idProduct=4028, bcdDevice= 1.01 -[ 72.450172] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 -[ 72.450174] usb 1-3: Product: TinyUSB Device -[ 72.450176] usb 1-3: Manufacturer: TinyUSB -[ 72.450177] usb 1-3: SerialNumber: 123456 -[ 72.484285] rndis_host 1-3:1.0 usb0: register 'rndis_host' at usb-0000:06:00.1-3, RNDIS device, 02:02:84:6a:96:00 -[ 72.498630] rndis_host 1-3:1.0 enp6s0f1u3: renamed from usb0 -``` - -In the above example, **enp6s0f1u3** is the virtual Ethernet interface for your controller. If you don't see the first `rndis_host` line, make sure `CONFIG_USB_NET_RNDIS_HOST` is compiled in your kernel or as a module. - -The web configurator is automatically running, you just need to be able to reach it. Some configurations automatically set up the route, so try in your browser now. If it doesn't load, try configuring an IP for the interface manually via: `sudo ifconfig enp6s0f1u3 192.168.7.2`. - -Whether or not you had to add an IP manually, you should end up with a route something like this: - -```sh -% ip route -default via 10.0.5.1 dev enp5s0 proto dhcp src 10.0.5.38 metric 2 -10.0.5.0/24 dev enp5s0 proto dhcp scope link src 10.0.5.38 metric 2 -192.168.7.0/24 dev enp6s0f1u3 proto kernel scope link src 192.168.7.2 <--- -``` - -Then the configurator should be reachable in your browser. diff --git a/site/docusaurus.config.js b/site/docusaurus.config.js deleted file mode 100644 index a9736bd2c..000000000 --- a/site/docusaurus.config.js +++ /dev/null @@ -1,133 +0,0 @@ -// @ts-check -// Note: type annotations allow type checking and IDEs autocompletion - -const lightCodeTheme = require('prism-react-renderer').themes.github; -const darkCodeTheme = require('prism-react-renderer').themes.dracula; - -const releaseVersion = '0.7.5'; - -/** @type {import('@docusaurus/types').Config} */ -const config = { - title: 'GP2040-CE', - tagline: 'Community Edition Firmware', - favicon: 'img/favicon.ico', - - url: 'https://gp2040-ce.info', - baseUrl: '/', - - organizationName: 'OpenStickCommunity', - projectName: 'GP2040-CE', - - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'warn', - - i18n: { - defaultLocale: 'en', - locales: ['en'], - }, - - presets: [ - [ - 'classic', - /** @type {import('@docusaurus/preset-classic').Options} */ - ({ - docs: { - sidebarPath: require.resolve('./sidebars.js'), - routeBasePath: '/', - }, - blog: false, - theme: { - customCss: require.resolve('./src/css/custom.css'), - }, - }), - ], - ], - themes: [ - [ - '@easyops-cn/docusaurus-search-local', - { - hashed: true, - highlightSearchTermsOnTargetPage: true, - docsRouteBasePath: '/', - }, - ], - ], - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ - colorMode: { - defaultMode: 'light', - disableSwitch: false, - respectPrefersColorScheme: true, - }, - announcementBar: { - id: 'new_release', - content: - `New Version Available! To get the v${releaseVersion} update, go to GP2040-CE Releases`, - backgroundColor: '#ec008c', - textColor: '#FFFFFF', - isCloseable: true, - }, - navbar: { - title: 'GP2040-CE | Community Edition Firmware', - logo: { - alt: 'GP2040-CE Logo', - src: 'img/gp2040-ce-logo.svg', - }, - items: [ - { - type: 'docSidebar', - position: 'left', - sidebarId: 'docSidebar', - label: 'Home', - }, - { - type: 'docSidebar', - position: 'left', - sidebarId: 'webConfigSidebar', - label: 'Web Configurator', - }, - { - type: 'docSidebar', - position: 'left', - sidebarId: 'contributeSidebar', - label: 'Contribute', - }, - { - type: 'doc', - position: 'left', - docId: 'downloads/download-page', - label: 'Downloads', - }, - // VersionDropdown - To Be Reconsidered - // { - // type: 'docsVersionDropdown', - // position: 'right', - // dropdownActiveClassDisabled: true, - // }, - { - href: 'https://discord.gg/k2pxhke7q8', - label: 'Discord', - position: 'right', - }, - { - href: 'https://github.com/OpenStickCommunity/GP2040-CE', - label: 'GitHub', - position: 'right', - }, - ], - }, - docs: { - sidebar: { - hideable: true, - autoCollapseCategories: false, - }, - }, - prism: { - theme: lightCodeTheme, - darkTheme: darkCodeTheme, - }, - }), -}; - -module.exports = config; diff --git a/site/package.json b/site/package.json deleted file mode 100644 index 59d8ca97d..000000000 --- a/site/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "website", - "version": "0.0.0", - "private": true, - "scripts": { - "docusaurus": "docusaurus", - "start": "docusaurus start", - "build": "docusaurus build", - "swizzle": "docusaurus swizzle", - "deploy": "docusaurus deploy", - "clear": "docusaurus clear", - "serve": "docusaurus serve", - "write-translations": "docusaurus write-translations", - "write-heading-ids": "docusaurus write-heading-ids", - "typecheck": "tsc" - }, - "dependencies": { - "@docusaurus/core": "2.4.3", - "@docusaurus/preset-classic": "2.4.3", - "@easyops-cn/docusaurus-search-local": "^0.36.0", - "@fortawesome/fontawesome-svg-core": "^6.4.2", - "@fortawesome/free-solid-svg-icons": "^6.4.2", - "@fortawesome/react-fontawesome": "^0.2.0", - "@mdx-js/react": "^1.6.22", - "clsx": "^2.0.0", - "prism-react-renderer": "^2.1.0", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-select": "^5.7.7", - "zustand": "^4.4.3" - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "2.4.3", - "@tsconfig/docusaurus": "^2.0.1", - "@types/node": "^20.8.7", - "typescript": "^5.2.2" - }, - "browserslist": { - "production": [ - ">0.5%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "engines": { - "node": ">=16.14" - } -} diff --git a/site/sidebars.js b/site/sidebars.js deleted file mode 100644 index 71267e25b..000000000 --- a/site/sidebars.js +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Creating a sidebar enables you to: - - create an ordered group of docs -- render a sidebar for each doc of that group -- provide next/previous navigation - -The sidebars can be generated from the filesystem, or explicitly defined here. - -Create as many sidebars as you want. -*/ - -// @ts-check - -/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ -const sidebars = { - // By default, Docusaurus generates a sidebar from the docs folder structure - // tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], - - // But you can create a sidebar manually - docSidebar: [ - { - type: 'doc', - id: 'home', - }, - { - type: 'category', - label: 'General', - collapsed: false, - items: [ - 'introduction', - 'installation', - 'usage', - 'hotkeys', - 'rgb-leds', - 'getting-help-support', - ], - }, - { - type: 'category', - label: 'FAQ', - collapsed: false, - items: ['faq/faq-general', 'faq/faq-ps4-ps5-compatibility'], - }, - { - type: 'category', - label: 'Controller Building', - collapsed: true, - items: ['controller-build/wiring'], - }, - ], - webConfigSidebar: [ - 'web-configurator', - 'macros', - { - type: 'category', - label: 'Add-Ons', - collapsed: false, - items: [{ type: 'autogenerated', dirName: 'add-ons' }], - }, - ], - contributeSidebar: [ - 'development/contribution-guide', - { - type: 'category', - label: 'Firmware', - collapsed: false, - items: ['development/firmware-development',], - }, - { - type: 'category', - label: 'Documentation', - collapsed: false, - items: ['development/documentation-preview', 'development/documentation-update-downloads'], - }, - 'development/templates', - ], -}; - -module.exports = sidebars; diff --git a/site/src/components/Download.tsx b/site/src/components/Download.tsx deleted file mode 100644 index e0b1a62f2..000000000 --- a/site/src/components/Download.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import React, { useEffect } from 'react'; -import styles from './download.module.css'; -import LinkIcon from './LinkIcon'; -import boards from '../config/boards'; -import { useGitHubInfo } from '../hooks/useGitHubInfo'; - -const createDownloadLink = ({ releaseVersion, configName }) => - releaseVersion - ? `https://github.com/OpenStickCommunity/GP2040-CE/releases/download/${releaseVersion}/GP2040-CE_${releaseVersion.substring( - 1 - )}_${configName}.uf2` - : ''; - -const RenderDownloadBox = ({ - name, - configName, - pinout, - desc, - image, - website, -}) => { - const releaseVersion = useGitHubInfo((state) => state.releaseVersion); - return ( -

- ); -}; - -const Container = ({ children }) => { - const getInfo = useGitHubInfo((state) => state.getInfo); - useEffect(() => { - getInfo(); - }, []); - return
{children}
; -}; - -export const Microcontrollers = () => ( - - {boards['Microcontroller Boards'].map(RenderDownloadBox)} - -); - -export const OfficialDevices = () => ( - - {boards['Community Devices'] - .filter((config) => config.category === 'official') - .map(RenderDownloadBox)} - -); - -export const OpenSourceDevices = () => ( - - {boards['Community Devices'] - .filter((config) => config.category === 'open') - .map(RenderDownloadBox)} - -); - -export const ClosedSourceDevices = () => ( - - {boards['Community Devices'] - .filter((config) => config.category === 'closed') - .map(RenderDownloadBox)} - -); - -export const LegacyDevices = () => ( - - {boards['Community Devices'] - .filter((config) => config.category === 'legacy') - .map(RenderDownloadBox)} - -); diff --git a/site/src/components/LabelSelector.tsx b/site/src/components/LabelSelector.tsx deleted file mode 100644 index 18a6fe59a..000000000 --- a/site/src/components/LabelSelector.tsx +++ /dev/null @@ -1,232 +0,0 @@ -import React from 'react'; -import Select from 'react-select'; -import { create } from 'zustand'; -import styles from '@site/src/components/labelselector.module.css'; -import { persist } from 'zustand/middleware'; - -const inputLabels = [ - { value: 'GP2040', label: 'GP2040' }, - { value: 'XInput', label: 'XInput' }, - { value: 'DirectInput', label: 'DirectInput' }, - { value: 'Nintendo Switch', label: 'Nintendo Switch' }, - { value: 'PS3', label: 'PS3' }, - { value: 'PS4', label: 'PS4' }, - { value: 'Arcade', label: 'Arcade' }, -]; - -const labelData = { - GP2040: { - name: 'GP2040', - Up: 'Up', - Down: 'Down', - Left: 'Left', - Right: 'Right', - B1: 'B1', - B2: 'B2', - B3: 'B3', - B4: 'B4', - L1: 'L1', - R1: 'R1', - L2: 'L2', - R2: 'R2', - S1: 'S1', - S2: 'S2', - L3: 'L3', - R3: 'R3', - A1: 'A1', - A2: 'A2', - }, - XInput: { - name: 'XInput', - Up: 'Up', - Down: 'Down', - Left: 'Left', - Right: 'Right', - B1: 'A', - B2: 'B', - B3: 'X', - B4: 'Y', - L1: 'LB', - R1: 'RB', - L2: 'LT', - R2: 'RT', - S1: 'Back', - S2: 'Start', - L3: 'LS', - R3: 'RS', - A1: 'Guide', - A2: '(A2)', - }, - DirectInput: { - name: 'DirectInput', - Up: 'Up', - Down: 'Down', - Left: 'Left', - Right: 'Right', - B1: '2', - B2: '3', - B3: '1', - B4: '4', - L1: '5', - R1: '6', - L2: '7', - R2: '8', - S1: '9', - S2: '10', - L3: '11', - R3: '12', - A1: '13', - A2: '14', - }, - 'Nintendo Switch': { - name: 'Nintendo Switch', - Up: 'Up', - Down: 'Down', - Left: 'Left', - Right: 'Right', - B1: 'B', - B2: 'A', - B3: 'Y', - B4: 'X', - L1: 'L', - R1: 'R', - L2: 'ZL', - R2: 'ZR', - S1: 'Minus', - S2: 'Plus', - L3: 'LS', - R3: 'RS', - A1: 'Home', - A2: 'Capture', - }, - PS4: { - name: 'PS4', - Up: 'Up', - Down: 'Down', - Left: 'Left', - Right: 'Right', - B1: 'Cross', - B2: 'Circle', - B3: 'Square', - B4: 'Triangle', - L1: 'L1', - R1: 'R1', - L2: 'L2', - R2: 'R2', - S1: 'Share', - S2: 'Options', - L3: 'L3', - R3: 'R3', - A1: 'PS', - A2: 'Touchpad', - }, - PS3: { - name: 'PS3', - Up: 'Up', - Down: 'Down', - Left: 'Left', - Right: 'Right', - B1: 'Cross', - B2: 'Circle', - B3: 'Square', - B4: 'Triangle', - L1: 'L1', - R1: 'R1', - L2: 'L2', - R2: 'R2', - S1: 'Select', - S2: 'Start', - L3: 'L3', - R3: 'R3', - A1: 'PS', - A2: '(A2)', - }, - Arcade: { - name: 'Arcade', - Up: 'Up', - Down: 'Down', - Left: 'Left', - Right: 'Right', - B1: 'K1', - B2: 'K2', - B3: 'P1', - B4: 'P2', - L1: 'P4', - R1: 'P3', - L2: 'K4', - R2: 'K3', - S1: 'Select', - S2: 'Start', - L3: 'LS', - R3: 'RS', - A1: 'Home', - A2: '(A2)', - }, -} as const; - -type SelectedType = { value: string; label: string }; - -type State = { - selected: SelectedType; -}; - -type Actions = { - select: (value: SelectedType) => void; -}; - -const INITIAL_STATE: State = { - selected: inputLabels[0], -}; - -const useLabelSelector = create()( - persist( - (set) => ({ - ...INITIAL_STATE, - select: (selected) => { - set({ selected }); - }, - }), - { name: 'SelectedLabel' } - ) -); - -const customStyles = { - option: (styles, { data, isDisabled, isSelected }) => { - const color = 0x000000; - return { - ...styles, - color: isDisabled ? '#ccc' : isSelected ? 'white' : 'black', - ':active': { - ...styles[':active'], - backgroundColor: !isDisabled - ? isSelected - ? data.color - : color - : undefined, - }, - }; - }, -}; - -export default function InputLabelSelector() { - const { selected, select } = useLabelSelector(); - return ( -