HayBox adalah firmware modular lintas platform untuk pengontrol analog/digital digital atau campuran, terutama ditargetkan pada pengontrol gaya B0XX.
Fitur-fiturnya meliputi:
Jika Anda hanya ingin menggunakan firmware bawaan dengan pemetaan dan konfigurasi pin default, lihat bagian binari bawaan. Jika Anda ingin membuat perubahan apa pun pada kode, lihat bagian bangunan dari sumber.
.uf2
), cukup masukkan ke mode bootsel sambil mencolokkannya ke PC Anda, lalu seret dan lepas file .uf2
ke drive RPI-RP2 yang muncul.hex
), Anda dapat menggunakan program seperti QMK Toolbox untuk mem-flash file .hex
ke dalamnyaSaat ini ada tiga cara utama untuk membangun HayBox:
Baik GitHub Actions maupun GitHub Codespaces mengharuskan Anda membuat akun GitHub, namun tidak mengharuskan Anda menginstal dependensi apa pun di mesin lokal Anda.
Ketergantungan berikut diperlukan saat membangun secara lokal:
Setelah menginstal semua persyaratan, unduh dan ekstrak rilis HayBox terbaru, atau kloning repositori jika Anda telah menginstal git (yang memudahkan Anda melakukan pembaruan).
Setelah itu:
git config --global core.longpaths true
di terminal mana pun (dalam VS Code atau cmd/PowerShell biasa semuanya baik-baik saja)config/<environment>/config.cpp
). Tombol apa pun yang tidak dimiliki pengontrol Anda dapat dihapus begitu saja dari daftar.HayBox/.pio/build/<environment>/firmware.uf2
ke RPI -RP2 drive yang muncul.Ini mungkin cara paling mudah untuk memodifikasi dan membangun kembali HayBox, namun perlu diingat bahwa tingkat gratis GitHub memberikan beberapa batasan pada seberapa banyak Anda dapat menggunakan Codespaces setiap bulannya. Oleh karena itu, pastikan Anda mematikan Codespace saat tidak digunakan, untuk memaksimalkan manfaat yang dapat diperoleh dari kuota Anda.
Pertama, buat akun GitHub atau login saja jika Anda sudah punya, lalu fork repositori ini dan buka fork Anda di Codespace baru dengan mengklik tombol Kode hijau -> Codespaces -> Buat codespace di master. Ini akan membuka VS Code di browser Anda dengan semua ekstensi dan dependensi yang diperlukan sudah diinstal sebelumnya. Dari sini, prosesnya hampir sama dengan membangun secara lokal, hanya saja Anda tidak dapat menggunakan tombol Unggah untuk mem-flash firmware. Anda malah harus mengunduh biner yang dikompilasi dari HayBox/.pio/build/<environment>/
dan mem-flash-nya secara manual (lihat di sini untuk informasi lebih lanjut).
Repositori ini berisi definisi alur kerja Tindakan GitHub yang membangun setiap lingkungan PlatformIO yang ditentukan dalam matriks pada setiap push, dan mengunggah biner firmware sebagai artefak yang dapat Anda unduh dengan mengeklik alur kerja tertentu yang dijalankan dari riwayat. Anda dapat membuat fork dari repositori ini dan mengaktifkan Tindakan dengan mengklik Pengaturan -> Tindakan -> Umum -> Pilih "Izinkan semua tindakan dan alur kerja yang dapat digunakan kembali" -> Simpan.
Cara tercepat untuk melakukan perubahan jika Anda hanya ingin membangun melalui GitHub Actions adalah dengan menggunakan github.dev. Anda dapat melakukannya hanya dengan menekan .
di keyboard Anda saat fork repositori ini terbuka, dan editor VS Code akan terbuka di browser Anda. Ini tidak memberi Anda kemampuan pengembangan yang sama seperti yang Anda dapatkan di Codespace, namun ini memungkinkan Anda membuat perubahan dan menerapkannya langsung dari browser Anda. Ubah apa pun yang Anda suka, lalu gunakan tab Kontrol Sumber di sebelah kiri untuk menambahkan, menerapkan, dan menerapkan perubahan Anda. Terakhir, kembali ke repositori dan klik tab Tindakan, klik alur kerja yang dijalankan, dan tunggu hingga artefak dibuat.
Jika Anda menambahkan konfigurasi perangkat/lingkungan PlatformIO baru, Anda harus menambahkan lingkungan tersebut ke matriks agar dapat dibangun oleh alur kerja GitHub Actions. Anda juga dapat menghapus lingkungan apa pun dari matriks yang tidak Anda pedulikan untuk mengurangi penggunaan sumber daya dan berpotensi mempercepat pembangunan Anda.
Untuk me-reboot pengontrol berbasis Pico ke mode bootel, tahan Mulai pada plugin.
Untuk beralih ke mode papan Brook di GCCPCB2, GCCMX, B0XX R2, atau LBX, tahan B pada plugin.
Backend komunikasi dipilih sedikit berbeda tergantung pada jenis mikrokontroler yang digunakan di pengontrol.
Di Pico/RP2040, USB vs GameCube vs Nintendo 64 terdeteksi secara otomatis. Jika tidak dicolokkan ke konsol, defaultnya adalah XInput , yang dapat digunakan secara plug-and-play dengan sebagian besar game PC. Backend lain dipilih dengan menahan salah satu tombol berikut pada plugin:
Di Arduino/AVR, backend DInput dipilih jika koneksi USB terdeteksi. Jika tidak, defaultnya adalah backend GameCube, kecuali backend lain dipilih secara manual dengan menahan salah satu tombol berikut pada plugin:
Tidak seperti firmware serupa lainnya, HayBox secara default memungkinkan Anda beralih mode dengan cepat tanpa mencabut pengontrol Anda. Ini terutama berguna di PC, dibandingkan dengan konsol di mana Anda biasanya harus me-restart konsol untuk berpindah permainan. Ini juga bertujuan untuk mengurangi jumlah tombol yang harus Anda pegang dengan satu tangan saat mencolokkan daya.
Kombinasi tombol mode pengontrol default adalah:
Kombinasi tombol mode keyboard default (hanya tersedia saat menggunakan backend DInput, bukan dengan XInput):
HayBox memerlukan profil pengontrol Dolphin yang berbeda dari firmware resmi B0XX, karena menggunakan pemetaan DInput berbeda yang lebih masuk akal untuk digunakan di banyak game. Ini dapat ditemukan di folder dolphin
di repo HayBox. File profil diberi nama untuk menunjukkan backend komunikasi dan sistem operasinya:
Untuk menginstal profil:
dolphin
di dalam HayBox ke folder <YourDolphinInstallation>UserConfigProfilesGCPad
(buat jika belum ada)%appdata%Slippi LaunchernetplayUserConfigProfilesGCPad
~/.config/SlippiOnline/Config/Profiles/GCPad/
Cmd + Shift + G
dan masukkan jalur /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 hanya mendukung DInput (dan tidak terlalu baik), jadi jika menggunakan pengontrol berbasis Pico/RP2040 Anda harus memaksakan mode DInput dengan menahan Z pada plugin, dan itupun mungkin tidak berfungsi. Saya tidak bisa berbuat apa-apa terhadap dukungan pengontrol Apple yang buruk (yang tampaknya rusak pada setiap pembaruan lainnya) dan saya tidak memiliki perangkat Apple apa pun, jadi ini juga akan dianggap sebagai penggunaan HayBox yang tidak didukung.
Backend komunikasi (misalnya DInput, GameCube, atau N64) dipilih sebagian melalui deteksi otomatis dan sebagian lagi berdasarkan tombol yang ada pada plugin. Ini ditangani di config/<environment>/config.cpp
, dalam fungsi setup()
. Logikanya cukup sederhana, dan bahkan jika Anda tidak memiliki pengalaman pemrograman, tidak akan terlalu sulit untuk melihat apa yang terjadi dan mengubah keadaan jika Anda mau.
Folder konfigurasi yang sesuai dengan lingkungan Arduino adalah:
config/arduino_nativeusb/
untuk Arduino dengan dukungan USB asli (misalnya Leonardo, Micro)config/arduino/
untuk Arduino tanpa dukungan USB asli (misalnya Uno, Nano, Mega 2560) Untuk konfigurasi perangkat Arduino Anda mungkin memperhatikan bahwa nomor 125 diteruskan ke GamecubeBackend()
. Ini memungkinkan Anda mengubah tingkat polling misalnya jika DIY Anda tidak mendukung USB asli dan Anda ingin menggunakannya dengan adaptor pengontrol GameCube yang di-overclock. Dalam contoh tersebut, Anda dapat memasukkan 1000 untuk menyinkronkan hingga tingkat polling 1000Hz, atau 0 untuk menonaktifkan perbaikan kelambatan ini sepenuhnya. Tingkat polling dapat diteruskan ke konstruktor N64Backend dengan cara yang sama seperti ini.
Anda mungkin memperhatikan bahwa polling rate 1000Hz juga berfungsi di konsol. Sadarilah bahwa meskipun ini berhasil, ini akan menghasilkan lebih banyak kelambatan input. Maksud dari pengaturan polling rate di sini adalah agar backend GameCube dapat menunda hingga sebelum polling berikutnya sebelum membaca masukan, sehingga masukan tersebut segar dan tidak ketinggalan jaman.
Untuk Pico/RP2040, tidak perlu melewati polling rate konsol, karena Pico memiliki kekuatan pemrosesan yang cukup untuk membaca/memproses input setelah menerima polling konsol, sehingga tidak perlu memprediksi kapan polling akan tiba dan mempersiapkan segala sesuatunya di muka.
Untuk mengonfigurasi penahan tombol untuk mode input (mode pengontrol/keyboard), edit fungsi select_mode()
di config/mode_selection.hpp
. Masing-masing pernyataan if
merupakan kombinasi tombol untuk memilih mode input.
Kebanyakan mode input mendukung passing dalam mode pembersihan SOCD, misalnya socd::2IP_NO_REAC
. Lihat di sini untuk mode lain yang tersedia.
Untuk membuat mode masukan baru, ada baiknya jika Anda mengetahui beberapa C++, atau setidaknya memiliki pengalaman pemrograman. Meskipun demikian, Anda seharusnya bisa bertahan bahkan tanpa pengalaman sebelumnya jika Anda mendasarkan mode baru Anda pada mode yang sudah ada dan menjadikannya sebagai contoh.
Ada dua jenis mode input: ControllerMode dan KeyboardMode
Mode keyboard sedikit lebih sederhana jadi mari kita mulai dari sana.
KeyboardMode berperilaku seperti keyboard standar dan dapat berfungsi dengan perangkat apa pun yang mendukung keyboard.
Anda bebas menggunakan logika dan trik pemrograman apa pun yang Anda suka di fungsi UpdateKeys()
untuk menentukan keluaran berdasarkan status masukan. Anda dapat membuat lapisan masukan (seperti lapisan D-Pad dalam mode Melee yang diaktifkan saat menahan Mod X dan Mod Y), atau jenis masukan bersyarat lainnya.
Daftar kode kunci yang tersedia dapat ditemukan di sini.
Ingatlah bahwa mode keyboard hanya dapat diaktifkan ketika menggunakan backend komunikasi DInput ( bukan XInput).
ControllerMode mengambil status input tombol digital dan mengubahnya menjadi status output yang sesuai dengan gamepad standar. ControllerMode apa pun akan berfungsi dengan CommunicationBackend apa pun. CommunicationBackend hanya membaca masukan dari satu atau lebih sumber masukan, menggunakan ControllerMode saat ini untuk memperbarui keluaran berdasarkan masukan tersebut, dan menangani pengiriman keluaran ke konsol atau PC.
Untuk membuat ControllerMode, Anda hanya perlu mengimplementasikan fungsi UpdateDigitalOutputs()
dan UpdateAnalogOutputs()
.
UpdateDigitalOutputs()
sangat mirip dengan fungsi UpdateKeys()
dalam mode keyboard, dengan perbedaan bahwa alih-alih memanggil fungsi Press()
untuk segera mengirim masukan, kita hanya mengatur status keluaran untuk iterasi ini. Sesuai dengan namanya, kami hanya akan menangani keluaran digital dalam fungsi ini.
UpdateAnalogOutputs()
sedikit lebih rumit. Pertama, ia harus memanggil UpdateDirections()
sebelum melakukan hal lain. Fungsi ini mengambil nilai yang menunjukkan apakah stik kiri dan kanan Anda mengarah ke kiri/kanan/atas/bawah. Anda juga meneruskan nilai analog stick minimum, netral (tengah), dan maksimum, sehingga Anda dapat mengonfigurasinya berdasarkan per mode. Semua informasi ini digunakan untuk secara otomatis mengatur nilai analog stick berdasarkan input yang Anda berikan. Ini semua yang perlu Anda lakukan kecuali Anda ingin mengimplementasikan pengubah.
UpdateDirections()
juga mengisi directions
variabel dengan nilai yang menunjukkan arah tongkat saat ini, yang bisa berupa 1, 0, atau -1 untuk sumbu X dan Y untuk kedua tongkat. Nilai-nilai ini mempermudah penulisan logika pengubah.
Setelah memanggil UpdateDirections()
, tambahkan logika penanganan pengubah apa pun yang Anda inginkan. Ingatlah bahwa UpdateDirections()
sudah menyetel nilai stik analog default, jadi saat menangani pengubah, Anda hanya perlu menyetel secara manual nilai untuk sumbu yang sebenarnya sedang dimodifikasi. Selain itu, saya tidak bisa mengajarkan cara menulis logika pengubah Anda, jadi lihat saja contohnya dan mainkan.
Terakhir, tetapkan nilai pemicu analog yang Anda perlukan.
Catatan: Output pemicu analog juga bisa ditangani di UpdateDigitalOutputs()
, tapi menurut saya biasanya terlihat lebih bersih jika disimpan bersama dengan output analog lainnya.
Catatan juga: Anda tidak perlu khawatir tentang mengatur ulang status keluaran atau menghapus apa pun darinya. Ini dilakukan secara otomatis pada awal setiap iterasi.
Di konstruktor setiap mode (untuk mode pengontrol dan mode keyboard), Anda dapat mengonfigurasi pasangan input arah berlawanan untuk menerapkan pembersihan SOCD.
Misalnya, di 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},
};
Ini mengatur kiri/kanan, bawah/atas, C-Kiri/C-Kanan, dan C-Bawah/C-Up sebagai pasangan arah mata angin berlawanan yang mana pembersihan SOCD akan diterapkan. Pembersihan SOCD dilakukan secara otomatis sebelum UpdateDigitalOutputs()
dan UpdateAnalogOutputs()
, dan Anda tidak perlu mengkhawatirkannya lebih jauh dari itu.
Untuk setiap SocdPair
Anda dapat memasukkan SocdType
pilihan Anda. Secara default untuk sebagian besar mode, ini diteruskan sebagai parameter konstruktor tunggal, namun dimungkinkan untuk meneruskan beberapa parameter, atau cukup menggunakan nilai hardcode. Kedua pendekatan ini dicontohkan dalam src/modes/FgcMode.cpp
.
SocdType | Keterangan |
---|---|
SOCD_NEUTRAL | Kiri + kanan = netral - default jika tidak ada SocdType yang ditentukan di SocdPair |
SOCD_2IP | Prioritas masukan kedua - kiri -> kiri + kanan = kanan, dan sebaliknya. Melepaskan arah kedua memberikan arah aslinya |
SOCD_2IP_NO_REAC | Prioritas masukan kedua tanpa pengaktifan kembali - sama seperti di atas, hanya saja melepaskan arah kedua menghasilkan netral. Arah aslinya harus direkonstruksi secara fisik. |
SOCD_DIR1_PRIORITY | Tombol pertama di SocdPair selalu diprioritaskan dibandingkan tombol kedua |
SOCD_DIR2_PRIORITY | Tombol kedua di SocdPair selalu diprioritaskan dibandingkan tombol pertama |
SOCD_NONE | Tidak ada resolusi SOCD - permainan yang memutuskan |
Perhatikan bahwa Anda tidak perlu mengimplementasikan fungsi HandleSocd()
seperti pada mode Melee20Button dan Melee18Button. Ini hanya ditimpa dalam mode ini sehingga kita dapat memeriksa apakah kiri dan kanan keduanya ditahan sebelum pembersihan SOCD, karena ketika keduanya ditahan (tanpa menahan arah vertikal) kita perlu mengesampingkan semua pengubah.
Jika pengontrol Anda tidak memiliki tombol pelindung cahaya, Anda mungkin ingin menggunakan Mod X untuk pelindung cahaya dan memasang kemiringan pelindung pada R. Anda dapat melakukan ini dengan menggunakan mode Melee18Button, bukan Melee20Button.
Mode Melee20Button dan Melee18Button memberikan pilihan koordinat mana yang akan digunakan saat menekan + kanan. Secara default, menahan + kembali akan memungkinkan Anda melakukan pembatalan jab otomatis, yang merupakan teknik berguna untuk beberapa karakter.
Teknik populer lainnya yang menggunakan diagonal bawah + kanan adalah apa yang disebut pilihan-pilihan berjongkok/berjalan. Teknik ini melibatkan menahan + ke depan pada sudut tertentu sambil berjongkok, sehingga setelah berjongkok membatalkan serangan, Anda secara otomatis mulai berjalan ke arah lawan alih-alih kembali berjongkok. Ini bisa sangat berguna untuk tech-chasing, namun koordinat yang digunakan untuk teknik ini tidak memungkinkan Anda melakukan jab-cancel secara otomatis.
Ini dapat dikonfigurasi seperti yang terlihat di config/mode_selection.hpp
dengan mengatur opsi crouch_walk_os
ke true:
new Melee20Button(socd::SOCD_2IP_NO_REAC, { .crouch_walk_os = false })
Anda juga harus mengubahnya di config/<environment>/config.cpp
agar dapat diterapkan pada plugin, karena mode_selection.hpp
hanya mengontrol apa yang terjadi ketika Anda beralih mode.
Mode ProjectM memiliki beberapa opsi tambahan untuk mengonfigurasi perilaku tertentu. Seperti yang terlihat di config/mode_selection.hpp
:
new ProjectM(
socd::SOCD_2IP_NO_REAC,
{ .true_z_press = false, .ledgedash_max_jump_traj = true }
)
Pertama, opsi ledgedash_max_jump_traj
memungkinkan Anda untuk mengaktifkan atau menonaktifkan perilaku yang dipinjam dari mode Melee di mana menahan kiri dan kanan (dan tidak ada arah vertikal) akan menghasilkan 1,0 kardinal terlepas dari pengubah yang ditahan.
Jika Anda mengubah mode SOCD ke 2IP (dengan pengaktifan kembali), Anda juga harus mengubah opsi ini menjadi false jika Anda menginginkan pengalaman bermain game yang lancar.
Kedua, opsi true_z_press
ada karena Project M/Project+ tidak menangani penekanan Z seperti yang dilakukan Melee. Melee mengartikan penekanan Z sebagai lightshield + A, dan karenanya dapat digunakan untuk membatalkan L tanpa mengunci Anda dari teknologi. Di PM/P+, penekanan Z akan memicu teknologi dan menyebabkan penguncian teknologi yang tidak diinginkan jika digunakan untuk membatalkan L. Secara default di HayBox, mode ProjectM diatur untuk menggunakan makro lightshield + A untuk mempertahankan perilaku yang diharapkan dari Melee. Namun, makro ini tidak memungkinkan Anda menggunakan serangan tether/grapple atau mengambil item. Untuk mengatasinya, Anda dapat menekan Mod X + Z untuk mengirimkan input Z yang sebenarnya.
Jika ini mengganggu Anda, dan Anda hanya ingin mengirim input Z yang sebenarnya secara default saat menekan Z, Anda dapat mengatur opsi true_z_press
ke true.
HayBox mendukung beberapa sumber masukan yang dapat dibaca untuk memperbarui status masukan:
GpioButtonInput
- Yang paling umum digunakan, untuk membaca sakelar/tombol yang terhubung langsung ke pin GPIO. Pemetaan input ditentukan oleh array GpioButtonMapping
seperti yang dapat dilihat di hampir semua konfigurasi yang ada.SwitchMatrixInput
- Mirip dengan yang di atas, tetapi memindai matriks sakelar gaya keyboard, bukan sakelar individual. Konfigurasi untuk Model C<=53 Crane disertakan di config/c53/config.cpp
yang berfungsi sebagai contoh cara mendefinisikan dan menggunakan sumber input matriks sakelar.NunchukInput
- Membaca input dari Wii Nunchuk menggunakan i2c. Ini dapat digunakan untuk pengontrol input campuran (misalnya tangan kiri menggunakan Nunchuk untuk pergerakan, dan tangan kanan menggunakan tombol untuk kontrol lainnya)GamecubeControllerInput
- Mirip dengan yang di atas, tetapi dibaca dari pengontrol GameCube. Dapat dipakai mirip dengan GamecubeBackend. Saat ini hanya diterapkan untuk Pico, dan Anda harus menjalankannya pada instance pio yang berbeda (pio0 atau pio1) dari instance GamecubeBackend mana pun, atau pastikan keduanya menggunakan offset memori instruksi PIO yang sama. Setiap sumber masukan memiliki nilai "kecepatan pemindaian" yang menunjukkan kira-kira berapa lama waktu yang diperlukan untuk membaca masukan. Sumber input cepat selalu dibaca pada saat-saat terakhir (setidaknya di Pico), sehingga menghasilkan latensi yang sangat rendah. Sebaliknya, sumber input yang lambat biasanya dibaca cukup lama sebelum dibutuhkan, karena sumber tersebut terlalu lambat untuk dibaca sebagai respons terhadap jajak pendapat. Oleh karena itu, lebih ideal untuk terus-menerus membaca masukan tersebut pada inti yang terpisah. Hal ini tidak dapat dilakukan pada MCU AVR karena semuanya merupakan inti tunggal, namun dapat dilakukan (dan mudah) pada Pico/RP2040. Bagian bawah konfigurasi Pico default config/pico/config.cpp
mengilustrasikan hal ini dengan menggunakan core1 untuk membaca input Nunchuk sementara core0 menangani yang lainnya. Lihat bagian berikutnya untuk informasi lebih lanjut tentang penggunaan core1.
Di setiap fungsi setup()
konfigurasi, kita membuat array sumber input, lalu meneruskannya ke backend komunikasi. Backend komunikasi memutuskan kapan harus membaca sumber masukan yang mana, karena masukan perlu dibaca pada titik waktu yang berbeda untuk backend yang berbeda. Kami juga membangun serangkaian backend komunikasi, yang memungkinkan lebih dari satu backend digunakan secara bersamaan. Misalnya, di sebagian besar konfigurasi, backend penampil input B0XX digunakan sebagai backend sekunder setiap kali backend DInput digunakan. Dalam setiap iterasi, loop utama memberitahu setiap backend untuk mengirimkan laporannya masing-masing. Di masa depan, mungkin ada lebih banyak backend untuk hal-hal seperti menulis informasi ke layar OLED.
Di setiap konfigurasi, terdapat fungsi setup()
dan loop()
, di mana setup()
dijalankan terlebih dahulu, lalu loop()
dijalankan berulang kali hingga perangkat dimatikan.
Pada Pico/RP2040, fungsi setup()
dan loop()
dijalankan pada core0, dan Anda dapat menambahkan fungsi setup1()
dan loop1()
untuk menjalankan tugas pada core1.
Misalnya, untuk membaca input pengontrol GameCube di core1:
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());
}
}
Perulangan while
memastikan kita menunggu hingga setup()
pada core0 selesai menyiapkan backend komunikasi. Kami kemudian membuat sumber input pengontrol GameCube dengan polling rate 2500Hz. Kami juga menjalankannya di pio1
sebagai cara mudah untuk menghindari gangguan dengan backend GameCube/N64 apa pun, yang menggunakan pio0
kecuali ditentukan lain. Di loop1()
kita membuat asumsi bahwa backend utama adalah elemen pertama dari array backends
(yang tetap dikonfigurasi dalam file yang sama, jadi kita tidak benar-benar berasumsi apa pun yang tidak kita ketahui) dan langsung memindai pengontrol GameCube input ke status input backend.
Sebagai contoh hipotetis yang sedikit lebih gila, seseorang bahkan dapat memberi daya pada semua kontrol untuk kabinet arcade dua orang menggunakan satu Pico dengan membuat dua sumber input matriks sakelar masing-masing menggunakan 10 pin, dan dua backend GameCube, keduanya pada inti terpisah. Kemungkinannya tidak terbatas.
Jika Anda menggunakan adaptor resmi dengan pengontrol berbasis Arduino, Anda mungkin harus menahan plugin A on yang menonaktifkan optimasi latensi polling dengan meneruskan tingkat polling 0 ke konstruktor GamecubeBackend.
Jika Anda menggunakan pengontrol berbasis Arduino tanpa rangkaian penguat, Anda memerlukan daya 5V sehingga untuk adaptor Mayflash Anda memerlukan kedua kabel USB terpasang, dan di konsol, saluran gemuruh harus utuh. Pico bekerja secara asli dengan daya 3.3V jadi ini tidak menjadi masalah.
Saya menyambut kontribusi dan jika Anda membuat mode masukan yang ingin Anda bagikan, silakan membuat permintaan tarik. Silakan instal plugin clang-format untuk VS Code dan gunakan untuk memformat kode apa pun yang ingin Anda tambahkan.
Kami menggunakan SemVer untuk pembuatan versi. Untuk versi yang tersedia, lihat tag pada repositori ini.
Lihat juga daftar kontributor yang berpartisipasi dalam proyek ini.
Proyek ini dilisensikan di bawah GNU GPL Versi 3 - lihat file LISENSI untuk detailnya