add support for grip
This commit is contained in:
parent
0d25195f22
commit
ab4a961768
|
@ -46,6 +46,12 @@ void Joycons::Reset() {
|
||||||
}
|
}
|
||||||
device->Stop();
|
device->Stop();
|
||||||
}
|
}
|
||||||
|
for (const auto& device : grip_joycons) {
|
||||||
|
if (!device) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
device->Stop();
|
||||||
|
}
|
||||||
SDL_hid_exit();
|
SDL_hid_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,6 +67,11 @@ void Joycons::Setup() {
|
||||||
PreSetController(GetIdentifier(port, Joycon::ControllerType::Right));
|
PreSetController(GetIdentifier(port, Joycon::ControllerType::Right));
|
||||||
device = std::make_shared<Joycon::JoyconDriver>(port++);
|
device = std::make_shared<Joycon::JoyconDriver>(port++);
|
||||||
}
|
}
|
||||||
|
port = 0;
|
||||||
|
for (auto& device : grip_joycons) {
|
||||||
|
PreSetController(GetIdentifier(port, Joycon::ControllerType::Grip));
|
||||||
|
device = std::make_shared<Joycon::JoyconDriver>(port++);
|
||||||
|
}
|
||||||
|
|
||||||
scan_thread = std::jthread([this](std::stop_token stop_token) { ScanThread(stop_token); });
|
scan_thread = std::jthread([this](std::stop_token stop_token) { ScanThread(stop_token); });
|
||||||
}
|
}
|
||||||
|
@ -129,6 +140,13 @@ bool Joycons::IsDeviceNew(SDL_hid_device_info* device_info) const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case Joycon::ControllerType::Grip:
|
||||||
|
for (const auto& device : grip_joycons) {
|
||||||
|
if (is_handle_identical(device)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -199,6 +217,14 @@ std::shared_ptr<Joycon::JoyconDriver> Joycons::GetNextFreeHandle(
|
||||||
return *unconnected_device;
|
return *unconnected_device;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (type == Joycon::ControllerType::Grip) {
|
||||||
|
const auto unconnected_device = std::ranges::find_if(
|
||||||
|
grip_joycons, [](auto& device) { return !device->IsConnected(); });
|
||||||
|
|
||||||
|
if (unconnected_device != grip_joycons.end()) {
|
||||||
|
return *unconnected_device;
|
||||||
|
}
|
||||||
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -408,6 +434,14 @@ std::shared_ptr<Joycon::JoyconDriver> Joycons::GetHandle(PadIdentifier identifie
|
||||||
return *matching_device;
|
return *matching_device;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (type == Joycon::ControllerType::Grip) {
|
||||||
|
const auto matching_device = std::ranges::find_if(
|
||||||
|
grip_joycons, [is_handle_active](auto& device) { return is_handle_active(device); });
|
||||||
|
|
||||||
|
if (matching_device != grip_joycons.end()) {
|
||||||
|
return *matching_device;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -455,6 +489,9 @@ std::vector<Common::ParamPackage> Joycons::GetInputDevices() const {
|
||||||
for (const auto& controller : right_joycons) {
|
for (const auto& controller : right_joycons) {
|
||||||
add_entry(controller);
|
add_entry(controller);
|
||||||
}
|
}
|
||||||
|
for (const auto& controller : grip_joycons) {
|
||||||
|
add_entry(controller);
|
||||||
|
}
|
||||||
|
|
||||||
// List dual joycon pairs
|
// List dual joycon pairs
|
||||||
for (std::size_t i = 0; i < MaxSupportedControllers; i++) {
|
for (std::size_t i = 0; i < MaxSupportedControllers; i++) {
|
||||||
|
@ -666,8 +703,8 @@ std::string Joycons::JoyconName(Joycon::ControllerType type) const {
|
||||||
return "Left Joycon";
|
return "Left Joycon";
|
||||||
case Joycon::ControllerType::Right:
|
case Joycon::ControllerType::Right:
|
||||||
return "Right Joycon";
|
return "Right Joycon";
|
||||||
case Joycon::ControllerType::Pro:
|
case Joycon::ControllerType::Grip:
|
||||||
return "Pro Controller";
|
return "Joycon grip <- custom driver";
|
||||||
case Joycon::ControllerType::Dual:
|
case Joycon::ControllerType::Dual:
|
||||||
return "Dual Joycon";
|
return "Dual Joycon";
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -106,6 +106,7 @@ private:
|
||||||
// Joycon types are split by type to ease supporting dualjoycon configurations
|
// Joycon types are split by type to ease supporting dualjoycon configurations
|
||||||
std::array<std::shared_ptr<Joycon::JoyconDriver>, MaxSupportedControllers> left_joycons{};
|
std::array<std::shared_ptr<Joycon::JoyconDriver>, MaxSupportedControllers> left_joycons{};
|
||||||
std::array<std::shared_ptr<Joycon::JoyconDriver>, MaxSupportedControllers> right_joycons{};
|
std::array<std::shared_ptr<Joycon::JoyconDriver>, MaxSupportedControllers> right_joycons{};
|
||||||
|
std::array<std::shared_ptr<Joycon::JoyconDriver>, MaxSupportedControllers> grip_joycons{};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace InputCommon
|
} // namespace InputCommon
|
||||||
|
|
|
@ -336,7 +336,7 @@ void SDLDriver::InitJoystick(int joystick_index) {
|
||||||
|
|
||||||
if (Settings::values.enable_joycon_driver) {
|
if (Settings::values.enable_joycon_driver) {
|
||||||
if (guid.uuid[5] == 0x05 && guid.uuid[4] == 0x7e &&
|
if (guid.uuid[5] == 0x05 && guid.uuid[4] == 0x7e &&
|
||||||
(guid.uuid[8] == 0x06 || guid.uuid[8] == 0x07)) {
|
(guid.uuid[8] == 0x06 || guid.uuid[8] == 0x07 || guid.uuid[8] == 0x0e)) {
|
||||||
LOG_WARNING(Input, "Preferring joycon driver for device index {}", joystick_index);
|
LOG_WARNING(Input, "Preferring joycon driver for device index {}", joystick_index);
|
||||||
SDL_JoystickClose(sdl_joystick);
|
SDL_JoystickClose(sdl_joystick);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -164,6 +164,15 @@ void JoyconDriver::InputThread(std::stop_token stop_token) {
|
||||||
void JoyconDriver::OnNewData(std::span<u8> buffer) {
|
void JoyconDriver::OnNewData(std::span<u8> buffer) {
|
||||||
const auto report_mode = static_cast<ReportMode>(buffer[0]);
|
const auto report_mode = static_cast<ReportMode>(buffer[0]);
|
||||||
|
|
||||||
|
std::string out = "";
|
||||||
|
|
||||||
|
for (const u8& bb : buffer) {
|
||||||
|
out += fmt::format("{} ", bb);
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_ERROR(Input, "{}", out);
|
||||||
|
|
||||||
|
|
||||||
// Packages can be a litte bit inconsistent. Average the delta time to provide a smoother motion
|
// Packages can be a litte bit inconsistent. Average the delta time to provide a smoother motion
|
||||||
// experience
|
// experience
|
||||||
switch (report_mode) {
|
switch (report_mode) {
|
||||||
|
|
|
@ -29,9 +29,8 @@ void JoyconPoller::ReadActiveMode(std::span<u8> buffer, const MotionStatus& moti
|
||||||
UpdateActiveRightPadInput(data, motion_status);
|
UpdateActiveRightPadInput(data, motion_status);
|
||||||
break;
|
break;
|
||||||
case Joycon::ControllerType::Pro:
|
case Joycon::ControllerType::Pro:
|
||||||
UpdateActiveProPadInput(data, motion_status);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
|
UpdateActiveProPadInput(data, motion_status);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,9 +53,8 @@ void JoyconPoller::ReadPassiveMode(std::span<u8> buffer) {
|
||||||
UpdatePasiveRightPadInput(data);
|
UpdatePasiveRightPadInput(data);
|
||||||
break;
|
break;
|
||||||
case Joycon::ControllerType::Pro:
|
case Joycon::ControllerType::Pro:
|
||||||
UpdatePasiveProPadInput(data);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
|
UpdatePasiveProPadInput(data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue