HayBox는 주로 B0XX 스타일 컨트롤러를 대상으로 하는 디지털 또는 혼합 아날로그/디지털 컨트롤러용 모듈식 크로스 플랫폼 펌웨어입니다.
기능은 다음과 같습니다:
기본 핀 매핑 및 구성이 포함된 사전 구축된 펌웨어를 사용하려면 사전 구축된 바이너리 섹션을 참조하세요. 코드를 변경하려면 소스에서 빌드 섹션을 참조하세요.
.uf2
파일)를 사용하는 경우 PC에 연결하는 동안 간단히 bootsel 모드로 전환하고 나타나는 RPI-RP2 드라이브에 .uf2
파일을 끌어다 놓습니다..hex
파일)를 사용하는 경우 QMK Toolbox와 같은 프로그램을 사용하여 .hex
파일을 플래시할 수 있습니다.현재 HayBox를 빌드하는 세 가지 주요 방법이 있습니다:
GitHub Actions와 GitHub Codespaces 모두 GitHub 계정을 생성해야 하지만 로컬 시스템에 종속성을 설치할 필요는 없습니다.
로컬로 빌드할 때는 다음 종속성이 필요합니다.
모든 요구 사항을 설치한 후 최신 HayBox 릴리스를 다운로드하여 추출하거나 git이 설치되어 있는 경우 저장소를 복제하세요(이렇게 하면 업데이트를 더 쉽게 가져올 수 있습니다).
이후:
git config --global core.longpaths true
명령을 실행하세요(VS Code 내에서 또는 일반 cmd/PowerShell 모두 괜찮습니다).config/<environment>/config.cpp
)에서 버튼 매핑 및 기타 핀을 편집할 수 있습니다. 컨트롤러에 없는 버튼은 목록에서 간단히 삭제할 수 있습니다.HayBox/.pio/build/<environment>/firmware.uf2
RPI에 끌어서 놓습니다. -RP2 드라이브가 나타납니다.이것은 아마도 HayBox를 수정하고 재구축하는 가장 편리한 방법일 것입니다. 그러나 GitHub의 무료 계층에서는 매달 Codespaces를 얼마나 사용할 수 있는지에 대해 몇 가지 제한이 있다는 점을 명심하십시오. 따라서 할당량에서 얻을 수 있는 것을 최대화하기 위해 Codespaces를 사용하지 않을 때는 종료했는지 확인하는 것이 좋습니다.
먼저 GitHub 계정을 생성하거나 이미 계정이 있는 경우 로그인한 다음 녹색 코드 버튼 -> Codespaces -> 마스터에서 코드 공간 생성을 클릭하여 이 저장소를 포크하고 새 Codespace에서 포크를 엽니다. 그러면 필요한 모든 확장 및 종속성이 사전 설치된 브라우저에서 VS Code가 열립니다. 여기서부터 프로세스는 업로드 버튼을 사용하여 펌웨어를 플래시할 수 없다는 점을 제외하면 로컬로 빌드하는 것과 거의 동일합니다. 대신 HayBox/.pio/build/<environment>/
에서 컴파일된 바이너리를 다운로드하고 수동으로 플래시해야 합니다(자세한 내용은 여기를 참조하세요).
이 리포지토리에는 푸시할 때마다 매트릭스에 지정된 각 PlatformIO 환경을 구축하고 기록에서 실행되는 특정 워크플로를 클릭하여 다운로드할 수 있는 펌웨어 바이너리를 아티팩트로 업로드하는 GitHub Actions 워크플로 정의가 포함되어 있습니다. 설정 -> 작업 -> 일반 -> "모든 작업 및 재사용 가능한 워크플로 허용" 선택 -> 저장을 클릭하여 이 저장소의 포크를 생성하고 작업을 활성화할 수 있습니다.
GitHub Actions를 통해서만 빌드하려는 경우 변경하는 가장 빠른 방법은 github.dev를 사용하는 것입니다. 을 누르기만 하면 됩니다 .
이 저장소의 포크가 열려 있는 동안 키보드를 누르면 브라우저에 VS Code 편집기가 열립니다. 이는 Codespace에서 얻을 수 있는 것과 동일한 개발 기능을 제공하지는 않지만 브라우저에서 직접 변경하고 커밋할 수 있도록 해줍니다. 원하는 대로 변경한 다음 왼쪽의 소스 제어 탭을 사용하여 변경 사항을 추가, 커밋, 푸시할 수 있습니다. 마지막으로 저장소로 돌아가 작업 탭을 클릭하고 워크플로 실행을 클릭한 후 아티팩트가 빌드될 때까지 기다립니다.
새 장치 구성/PlatformIO 환경을 추가하는 경우 GitHub Actions 워크플로를 통해 환경을 구축하려면 매트릭스에 환경을 추가해야 합니다. 리소스 사용량을 줄이고 잠재적으로 빌드 속도를 높이기 위해 신경 쓰지 않는 환경을 매트릭스에서 제거할 수도 있습니다.
Pico 기반 컨트롤러를 bootsel 모드로 재부팅하려면 플러그인에서 시작을 길게 누르세요.
GCPCCB2, GCCMX, B0XX R2 또는 LBX에서 Brook 보드 모드로 전환하려면 플러그인에서 B를 길게 누르세요.
통신 백엔드는 컨트롤러에 사용되는 마이크로 컨트롤러 유형에 따라 약간 다르게 선택됩니다.
Pico/RP2040에서는 USB, GameCube, Nintendo 64가 자동으로 감지됩니다. 콘솔에 연결되지 않은 경우 기본값은 XInput 이며 대부분의 PC 게임에서 플러그 앤 플레이로 작동합니다. 다른 백엔드는 플러그인에서 다음 버튼 중 하나를 눌러 선택합니다.
Arduino/AVR에서는 USB 연결이 감지되면 DInput 백엔드가 선택됩니다. 그렇지 않으면 플러그인에서 다음 버튼 중 하나를 눌러 다른 백엔드를 수동으로 선택하지 않는 한 기본적으로 GameCube 백엔드로 설정됩니다.
다른 유사한 펌웨어와 달리 HayBox는 기본적으로 컨트롤러를 분리하지 않고도 즉시 모드를 전환할 수 있습니다. 이는 일반적으로 게임을 전환하기 위해 콘솔을 다시 시작해야 하는 콘솔과 달리 PC에서 주로 유용합니다. 또한 연결하는 동안 한 손으로 눌러야 하는 버튼 수를 줄이는 목적도 있습니다.
기본 컨트롤러 모드 버튼 조합은 다음과 같습니다.
기본 키보드 모드 버튼 조합(XInput이 아닌 DInput 백엔드를 사용할 때만 사용 가능):
HayBox는 여러 게임에서 사용하기에 더 적합한 다양한 DInput 매핑을 사용하므로 공식 B0XX 펌웨어와는 다른 Dolphin 컨트롤러 프로필이 필요합니다. 이는 HayBox 저장소의 dolphin
폴더에서 찾을 수 있습니다. 프로필 파일의 이름은 해당 파일의 통신 백엔드 및 운영 체제를 나타내기 위해 지정됩니다.
프로필을 설치하려면:
dolphin
폴더의 적절한 .ini 파일을 <YourDolphinInstallation>UserConfigProfilesGCPad
폴더로 복사합니다(없는 경우 생성).%appdata%Slippi LaunchernetplayUserConfigProfilesGCPad
~/.config/SlippiOnline/Config/Profiles/GCPad/
Cmd + Shift + G
누르고 /Users/<USER>/Library/Application Support/Slippi Launcher/netplay/Slippi Dolphin.app/Contents/Resources/Sys/Config/Profiles/GCPad
경로를 입력하세요.%userprofile%DocumentsDolphin EmulatorConfigProfilesGCPad
~/.config/dolphin-emu/Profiles/GCPad/
* macOS는 DInput만 지원하므로(그다지 좋지 않음) Pico/RP2040 기반 컨트롤러를 사용하는 경우 플러그인에서 Z를 눌러 DInput 모드를 강제 실행해야 하며, 그래도 작동하지 않을 수 있습니다. 나는 Apple의 열악한 컨트롤러 지원(다른 모든 업데이트에서 작동하지 않는 것 같음)에 대해 실제로 아무것도 할 수 없으며 Apple 장치를 소유하고 있지 않으므로 이 또한 지원되지 않는 HayBox 사용으로 간주됩니다.
통신 백엔드(예: DInput, GameCube 또는 N64)는 부분적으로는 자동 감지를 통해 선택되고 부분적으로는 플러그인에 있는 버튼을 기반으로 선택됩니다. 이는 setup()
함수의 config/<environment>/config.cpp
에서 처리됩니다. 논리는 매우 간단하며 프로그래밍 경험이 없더라도 무슨 일이 일어나고 있는지 확인하고 원하는 경우 변경하는 것이 그리 어렵지 않을 것입니다.
Arduino 환경에 해당하는 구성 폴더는 다음과 같습니다.
config/arduino_nativeusb/
(예: Leonardo, Micro)config/arduino/
(예: Uno, Nano, Mega 2560) Arduino 장치 구성의 경우 숫자 125가 GamecubeBackend()
에 전달되는 것을 볼 수 있습니다. 이를 통해 DIY가 기본 USB를 지원하지 않고 오버클럭된 GameCube 컨트롤러 어댑터와 함께 사용하려는 경우 폴링 속도를 변경할 수 있습니다. 이 예에서는 1000을 전달하여 최대 1000Hz 폴링 속도로 동기화하거나 0을 전달하여 이 지연 수정을 완전히 비활성화할 수 있습니다. 이와 같은 방식으로 폴링 속도를 N64Backend 생성자에 전달할 수 있습니다.
1000Hz 폴링 속도가 콘솔에서도 작동한다는 것을 알 수 있습니다. 이것이 작동하는 동안 입력 지연이 더 많이 발생한다는 점에 유의하세요. 여기서 폴링 속도를 설정하는 요점은 GameCube 백엔드가 입력을 읽기 전에 다음 폴링 직전까지 지연하여 입력이 최신이고 오래되지 않도록 하는 것입니다.
Pico/RP2040의 경우 콘솔 폴링 속도를 전달할 필요가 없습니다. Pico는 콘솔 폴링을 수신한 후 입력을 읽고 처리할 수 있는 충분한 처리 능력을 갖고 있으므로 폴링이 언제 도착할지 예측하고 준비할 필요가 없기 때문입니다. 미리.
입력 모드(컨트롤러/키보드 모드)에 대한 버튼 유지를 구성하려면 config/mode_selection.hpp
에서 select_mode()
함수를 편집하세요. 각 if
문은 입력 모드를 선택하는 버튼 조합입니다.
대부분의 입력 모드는 SOCD 정리 모드(예: socd::2IP_NO_REAC
전달을 지원합니다. 사용 가능한 다른 모드는 여기를 참조하세요.
새로운 입력 모드를 만들려면 C++를 알고 있거나 최소한 프로그래밍 경험이 있으면 도움이 됩니다. 즉, 기존 모드를 바탕으로 새 모드를 기반으로 하고 이를 예시로 참고한다면 사전 경험이 없어도 해낼 수 있을 것입니다.
입력 모드에는 ControllerMode와 KeyboardMode의 두 가지 유형이 있습니다.
키보드 모드는 조금 더 간단하므로 거기서부터 시작해 보겠습니다.
KeyboardMode는 표준 키보드처럼 작동하며 키보드를 지원하는 모든 장치에서 작동해야 합니다.
UpdateKeys()
함수에서 원하는 논리 및 프로그래밍 트릭을 자유롭게 사용하여 입력 상태에 따라 출력을 결정할 수 있습니다. 입력 레이어(예: Mod X 및 Mod Y를 누르고 있을 때 활성화되는 Melee 모드의 D-Pad 레이어) 또는 다른 유형의 조건부 입력을 만들 수 있습니다.
사용 가능한 키코드 목록은 여기에서 확인할 수 있습니다.
키보드 모드는 DInput 통신 백엔드(XInput 아님 )를 사용할 때만 활성화할 수 있다는 점을 기억하세요.
ControllerMode는 디지털 버튼 입력 상태를 가져와 이를 표준 게임패드에 해당하는 출력 상태로 변환합니다. 모든 ControllerMode는 모든 CommunicationBackend에서 작동합니다. CommunicationBackend는 단순히 하나 이상의 입력 소스에서 입력을 읽고, 현재 ControllerMode를 사용하여 해당 입력을 기반으로 출력을 업데이트하고, 출력을 콘솔이나 PC로 보내는 작업을 처리합니다.
ControllerMode를 생성하려면 UpdateDigitalOutputs()
및 UpdateAnalogOutputs()
함수를 구현하기만 하면 됩니다.
UpdateDigitalOutputs()
키보드 모드의 UpdateKeys()
함수와 매우 유사합니다. 차이점은 Press()
함수를 호출하여 즉시 입력을 보내는 대신 이 반복에 대한 출력 상태를 간단히 설정한다는 것입니다. 이름에서 알 수 있듯이 이 기능에서는 디지털 출력만 다룹니다.
UpdateAnalogOutputs()
는 좀 더 복잡합니다. 첫째, 다른 작업을 수행하기 전에 UpdateDirections()
호출해야 합니다. 이 기능은 왼쪽 및 오른쪽 스틱이 왼쪽/오른쪽/위/아래를 가리키는지 여부를 나타내는 값을 가져옵니다. 또한 최소, 중립(중앙) 및 최대 스틱 아날로그 값을 전달하므로 이를 모드별로 구성할 수 있습니다. 이 모든 정보는 전달한 입력을 기반으로 스틱 아날로그 값을 자동으로 설정하는 데 사용됩니다. 수정자를 구현하려는 경우가 아니면 이 작업만 수행하면 됩니다.
UpdateDirections()
또한 현재 스틱 방향을 나타내는 값으로 변수 directions
채웁니다. 이 값은 두 스틱의 X 및 Y축에 대해 1, 0 또는 -1일 수 있습니다. 이러한 값을 사용하면 수정자 논리를 훨씬 쉽게 작성할 수 있습니다.
UpdateDirections()
호출한 후 원하는 수정자 처리 로직을 추가하세요. UpdateDirections()
는 이미 기본 아날로그 스틱 값을 설정했기 때문에 수정자를 처리할 때 실제로 수정되는 축의 값만 수동으로 설정하면 됩니다. 이 외에는 수정자 논리를 작성하는 방법을 가르칠 수 없으므로 예제를 보고 실험해 보세요.
마지막으로 필요한 아날로그 트리거 값을 설정합니다.
참고: 아날로그 트리거 출력은 UpdateDigitalOutputs()
에서 처리할 수도 있지만 일반적으로 다른 아날로그 출력과 함께 유지하는 것이 더 깔끔해 보인다고 생각합니다.
또한 참고: 출력 상태를 재설정하거나 출력 상태를 지우는 것에 대해 걱정할 필요가 없습니다. 이는 각 반복이 시작될 때 자동으로 수행됩니다.
각 모드(컨트롤러 모드 및 키보드 모드)의 생성자에서 SOCD 정리를 적용할 반대 방향 입력 쌍을 구성할 수 있습니다.
예를 들어, src/modes/Melee20Button.cpp
에서:
_socd_pair_count = 4;
_socd_pairs = new socd::SocdPair[_socd_pair_count]{
socd::SocdPair{&InputState::left, &InputState::right, socd_type},
socd::SocdPair{ &InputState::down, &InputState::up, socd_type},
socd::SocdPair{ &InputState::c_left, &InputState::c_right, socd_type},
socd::SocdPair{ &InputState::c_down, &InputState::c_up, socd_type},
};
이는 왼쪽/오른쪽, 아래쪽/위, C-왼쪽/C-오른쪽 및 C-아래/C-위를 SOCD 청소가 적용될 반대 기본 방향 쌍으로 설정합니다. SOCD 정리는 UpdateDigitalOutputs()
및 UpdateAnalogOutputs()
이전에 자동으로 수행되므로 이에 대해 더 이상 걱정할 필요가 없습니다.
각 SocdPair
에 대해 선택한 SocdType
을 전달할 수 있습니다. 대부분의 모드에서 기본적으로 이는 단일 생성자 매개변수로 전달되지만 여러 매개변수를 전달하거나 단순히 하드코딩된 값을 사용할 수도 있습니다. 이 두 접근 방식 모두 src/modes/FgcMode.cpp
에 예시되어 있습니다.
SocdType | 설명 |
---|---|
SOCD_NEUTRAL | 왼쪽 + 오른쪽 = 중립 - SocdPair 에 SocdType 지정되지 않은 경우 기본값 |
SOCD_2IP | 두 번째 입력 우선순위 - 왼쪽 -> 왼쪽 + 오른쪽 = 오른쪽, 그 반대. 두 번째 방향을 놓으면 원래 방향이 됩니다. |
SOCD_2IP_NO_REAC | 재활성화 없는 두 번째 입력 우선 순위 - 위와 동일하지만 두 번째 방향을 놓으면 중립이 됩니다. 원래 방향은 물리적으로 다시 작동되어야 합니다. |
SOCD_DIR1_PRIORITY | SocdPair 의 첫 번째 버튼은 항상 두 번째 버튼보다 우선합니다. |
SOCD_DIR2_PRIORITY | SocdPair 의 두 번째 버튼은 항상 첫 번째 버튼보다 우선합니다. |
SOCD_NONE | SOCD 해결 없음 - 게임이 결정합니다. |
Melee20Button 및 Melee18Button 모드에서처럼 HandleSocd()
함수를 구현할 필요는 없습니다. SOCD 클리닝 전에 왼쪽과 오른쪽이 모두 유지되는지 확인할 수 있도록 이러한 모드에서만 재정의됩니다. 왜냐하면 두 가지를 모두 누르고 있으면(세로 방향을 유지하지 않고) 모든 수정자를 재정의해야 하기 때문입니다.
컨트롤러에 라이트쉴드 버튼이 없는 경우 라이트쉴드에 Mod X를 사용하고 대신 R에 쉴드 기울기를 설정할 수 있습니다. Melee20Button 대신 Melee18Button 모드를 사용하면 이 작업을 수행할 수 있습니다.
Melee20Button 및 Melee18Button 모드에서는 아래쪽 + 오른쪽을 누를 때 사용할 좌표를 선택할 수 있습니다. 기본적으로 + 뒤로를 길게 누르면 자동으로 잽을 취소할 수 있는데, 이는 일부 캐릭터에 유용한 기술입니다.
아래쪽 + 오른쪽 대각선을 사용하는 또 다른 인기 있는 기술은 소위 웅크리기/걷기 옵션 선택입니다. 이 기술은 웅크린 상태에서 특정 각도로 +를 앞으로 누르는 것과 관련이 있습니다. 즉, 웅크려 공격을 취소한 후 다시 웅크리는 대신 자동으로 상대를 향해 걷기 시작합니다. 이것은 기술 추적에 매우 유용할 수 있지만 이 기술에 사용된 좌표는 자동 잽 취소를 허용하지 않습니다.
crouch_walk_os
옵션을 true로 설정하여 config/mode_selection.hpp
에서 볼 수 있는 것처럼 구성할 수 있습니다.
new Melee20Button(socd::SOCD_2IP_NO_REAC, { .crouch_walk_os = false })
mode_selection.hpp
모드를 전환할 때 발생하는 작업만 제어하므로 플러그인에 적용하려면 config/<environment>/config.cpp
에서 이를 변경해야 합니다.
ProjectM 모드에는 특정 동작을 구성하는 몇 가지 추가 옵션이 있습니다. config/mode_selection.hpp
에서 볼 수 있듯이:
new ProjectM(
socd::SOCD_2IP_NO_REAC,
{ .true_z_press = false, .ledgedash_max_jump_traj = true }
)
첫째, ledgedash_max_jump_traj
옵션을 사용하면 왼쪽과 오른쪽(수직 방향 없음)을 누르고 있으면 수정자 유지 여부에 관계없이 1.0 추기경이 제공되는 근접 모드에서 빌린 동작을 활성화하거나 비활성화할 수 있습니다.
SOCD 모드를 2IP(재활성화 포함)로 변경하는 경우 원활한 게임 플레이 경험을 원한다면 이 옵션도 false로 변경해야 합니다.
둘째, Project M/Project+는 Melee와 같은 방식으로 Z 누르기를 처리하지 않기 때문에 true_z_press
옵션이 존재합니다. Melee는 Z 누르기를 빛 방패 + A로 해석하므로 기술을 사용하지 않고도 L을 취소하는 데 사용할 수 있습니다. PM/P+에서 Z를 누르면 기술이 발동되므로 L을 취소하는 데 사용하면 원치 않는 기술 잠금이 발생합니다. 기본적으로 HayBox에서 ProjectM 모드는 Melee에서 예상되는 동작을 보존하기 위해 lightshield + A 매크로를 사용하도록 설정되어 있습니다. 그러나 이 매크로를 사용하면 테더/잡기 공격을 사용하거나 아이템을 잡을 수는 없습니다. 이 문제를 해결하려면 Mod X + Z를 눌러 실제 Z 입력을 보낼 수 있습니다.
이것이 귀찮고 Z를 누를 때 기본적으로 실제 Z 입력을 보내려는 경우 true_z_press
옵션을 true로 설정할 수 있습니다.
HayBox는 입력 상태를 업데이트하기 위해 읽을 수 있는 여러 입력 소스를 지원합니다.
GpioButtonInput
- GPIO 핀에 직접 연결된 스위치/버튼을 읽는 데 가장 일반적으로 사용됩니다. 입력 매핑은 거의 모든 기존 구성에서 볼 수 있듯이 GpioButtonMapping
배열로 정의됩니다.SwitchMatrixInput
- 위와 유사하지만 개별 스위치 대신 키보드 스타일 스위치 매트릭스를 검색합니다. Crane의 모델 C<=53에 대한 구성은 스위치 매트릭스 입력 소스를 정의하고 사용하는 방법의 예 역할을 하는 config/c53/config.cpp
에 포함되어 있습니다.NunchukInput
- i2c를 사용하여 Wii Nunchuk에서 입력을 읽습니다. 이것은 혼합 입력 컨트롤러에 사용될 수 있습니다(예: 왼손은 이동을 위해 Nunchuk을 사용하고 오른손은 다른 컨트롤을 위해 버튼을 사용합니다)GamecubeControllerInput
- 위와 유사하지만 GameCube 컨트롤러에서 읽습니다. GamecubeBackend와 유사하게 인스턴스화할 수 있습니다. 현재는 Pico용으로만 구현되어 있으며 GamecubeBackend의 인스턴스와 다른 pio 인스턴스(pio0 또는 pio1)에서 실행하거나 둘 다 동일한 PIO 명령 메모리 오프셋을 사용하는지 확인해야 합니다. 각 입력 소스에는 입력을 읽는 데 걸리는 대략적인 시간을 나타내는 "스캔 속도" 값이 있습니다. 빠른 입력 소스는 항상 가능한 마지막 순간(적어도 Pico에서는)에 읽혀지므로 대기 시간이 매우 짧습니다. 반대로, 느린 입력 소스는 일반적으로 필요하기 훨씬 전에 읽혀집니다. 왜냐하면 너무 느리기 때문에 폴링에 응답하여 읽을 수 없기 때문입니다. 이 때문에 별도의 코어에서 해당 입력을 지속적으로 읽는 것이 더 이상적입니다. 이는 모두 단일 코어이기 때문에 AVR MCU에서는 불가능하지만 Pico/RP2040에서는 가능하고 쉽습니다. 기본 Pico 구성 config/pico/config.cpp
의 하단에는 core1을 사용하여 Nunchuk 입력을 읽고 core0이 다른 모든 것을 처리하는 방법이 나와 있습니다. core1 사용에 대한 자세한 내용은 다음 섹션을 참조하세요.
각 구성의 setup()
함수에서 입력 소스 배열을 구축한 다음 이를 통신 백엔드로 전달합니다. 다양한 백엔드에 대해 서로 다른 시점에 입력을 읽어야 하기 때문에 통신 백엔드는 언제 어떤 입력 소스를 읽을지 결정합니다. 또한 우리는 한 번에 두 개 이상의 백엔드를 사용할 수 있도록 일련의 통신 백엔드를 구축합니다. 예를 들어 대부분의 구성에서 B0XX 입력 뷰어 백엔드는 DInput 백엔드가 사용될 때마다 보조 백엔드로 사용됩니다. 각 반복에서 메인 루프는 각 백엔드에 해당 보고서를 보내도록 지시합니다. 앞으로는 OLED 디스플레이에 정보를 쓰는 것과 같은 작업을 위한 백엔드가 더 많아질 수 있습니다.
각 구성에는 setup()
및 loop()
함수가 있으며, 여기서 setup()
먼저 실행된 다음 장치의 전원이 꺼질 때까지 loop()
반복적으로 실행됩니다.
Pico/RP2040에서는 setup()
및 loop()
함수가 core0에서 실행되며, core1에서 작업을 실행하기 위해 setup1()
및 loop1()
함수를 추가할 수 있습니다.
예를 들어, core1에서 GameCube 컨트롤러 입력을 읽으려면:
GamecubeControllerInput *gcc = nullptr;
void setup1() {
while (backends == nullptr) {
tight_loop_contents();
}
gcc = new GamecubeControllerInput(gcc_pin, 2500, pio1);
}
void loop1() {
if (backends != nullptr) {
gcc->UpdateInputs(backends[0]->GetInputs());
}
}
while
루프는 core0의 setup()
이 통신 백엔드 설정을 완료할 때까지 기다리도록 합니다. 그런 다음 폴링 속도가 2500Hz인 GameCube 컨트롤러 입력 소스를 생성합니다. 또한 달리 지정하지 않는 한 pio0
사용하는 GameCube/N64 백엔드를 방해하지 않는 쉬운 방법으로 pio1
에서 실행합니다. loop1()
에서는 기본 백엔드가 backends
배열의 첫 번째 요소(어차피 동일한 파일에 구성되어 있으므로 우리가 모르는 것을 실제로 가정하지 않음)라고 가정하고 GameCube 컨트롤러를 직접 스캔합니다. 백엔드의 입력 상태로 입력됩니다.
약간 더 터무니없는 가상의 예로서, 각각 별도의 코어에 있는 10개의 핀과 2개의 GameCube 백엔드를 사용하여 2개의 스위치 매트릭스 입력 소스를 생성함으로써 단일 Pico를 사용하여 2인용 아케이드 캐비닛의 모든 컨트롤에 전원을 공급할 수도 있습니다. 가능성은 무한합니다.
Arduino 기반 컨트롤러와 함께 공식 어댑터를 사용하는 경우 GamecubeBackend 생성자에 폴링 속도 0을 전달하여 폴링 대기 시간 최적화를 비활성화하는 플러그인에서 A를 유지해야 할 수 있습니다.
부스트 회로가 없는 Arduino 기반 컨트롤러를 사용하는 경우 5V 전원이 필요하므로 Mayflash 어댑터의 경우 두 USB 케이블을 모두 연결해야 하며 콘솔에서는 럼블 라인이 손상되지 않아야 합니다. Pico는 기본적으로 3.3V 전원으로 작동하므로 이는 문제가 되지 않습니다.
기여를 환영하며 공유하고 싶은 입력 모드를 만들면 언제든지 풀 요청을 해주세요. VS Code용 clang-format 플러그인을 설치하고 이를 사용하여 추가하려는 코드의 형식을 지정하세요.
버전 관리를 위해 SemVer를 사용합니다. 사용 가능한 버전은 이 저장소의 태그를 참조하세요.
이 프로젝트에 참여한 기여자 목록도 참조하세요.
이 프로젝트는 GNU GPL 버전 3에 따라 라이선스가 부여됩니다. 자세한 내용은 라이선스 파일을 참조하세요.