diff --git a/src/input_common/udp/client.cpp b/src/input_common/udp/client.cpp index 3f4eaf4483..7c804e83d1 100644 --- a/src/input_common/udp/client.cpp +++ b/src/input_common/udp/client.cpp @@ -135,6 +135,8 @@ Client::Client(std::shared_ptr status, const std::string& host, u1 u8 pad_index, u32 client_id) : status(std::move(status)) { StartCommunication(host, port, pad_index, client_id); + motion = new InputCommon::MotionInput(0.3f, 0.005f, 0.0f); + motion->SetGyroThreshold(0.0006f); } Client::~Client() { @@ -168,12 +170,22 @@ void Client::OnPadData(Response::PadData data) { packet_sequence = data.packet_counter; // TODO: Check how the Switch handles motions and how the CemuhookUDP motion // directions correspond to the ones of the Switch - Common::Vec3f accel = Common::MakeVec(data.accel.x, data.accel.y, data.accel.z); - Common::Vec3f gyro = Common::MakeVec(data.gyro.pitch, data.gyro.yaw, data.gyro.roll); + const auto now = std::chrono::system_clock::now(); + u64 time_difference = + std::chrono::duration_cast(now - last_motion_update).count(); + last_motion_update = now; + Common::Vec3f rawgyroscope = {data.gyro.pitch, data.gyro.roll, -data.gyro.yaw}; + motion->SetAcceleration({data.accel.x, -data.accel.z, data.accel.y}); + motion->SetGyroscope(rawgyroscope / 312.0f); + motion->UpdateRotation(time_difference); + motion->UpdateOrientation(time_difference); + Common::Vec3f gyroscope = motion->GetGyroscope(); + Common::Vec3f accelerometer = motion->GetAcceleration(); + Common::Vec3f rotation = motion->GetRotations(); + std::array orientation = motion->GetOrientation(); { std::lock_guard guard(status->update_mutex); - - status->motion_status = {accel, gyro}; + status->motion_status = {accelerometer, gyroscope, rotation, orientation}; // TODO: add a setting for "click" touch. Click touch refers to a device that differentiates // between a simple "tap" and a hard press that causes the touch screen to click. diff --git a/src/input_common/udp/client.h b/src/input_common/udp/client.h index b8c6547554..4485b9bc6a 100644 --- a/src/input_common/udp/client.h +++ b/src/input_common/udp/client.h @@ -14,6 +14,7 @@ #include "common/common_types.h" #include "common/thread.h" #include "common/vector_math.h" +#include "input_common/motion_input.h" namespace InputCommon::CemuhookUDP { @@ -30,7 +31,9 @@ struct Version; struct DeviceStatus { std::mutex update_mutex; - std::tuple, Common::Vec3> motion_status; + std::tuple, Common::Vec3, Common::Vec3, + std::array> + motion_status; std::tuple touch_status; // calibration data for scaling the device's touch area to 3ds @@ -57,6 +60,8 @@ private: void OnPadData(Response::PadData); void StartCommunication(const std::string& host, u16 port, u8 pad_index, u32 client_id); + InputCommon::MotionInput* motion = nullptr; + std::chrono::time_point last_motion_update; std::unique_ptr socket; std::shared_ptr status; std::thread thread; diff --git a/src/input_common/udp/udp.cpp b/src/input_common/udp/udp.cpp index 4b347e47e9..d628839c13 100644 --- a/src/input_common/udp/udp.cpp +++ b/src/input_common/udp/udp.cpp @@ -26,10 +26,12 @@ private: std::shared_ptr status; }; -class UDPMotionDevice final : public Input::MotionDevice { +class UDPMotionDevice final : public Input::RealMotionDevice { public: explicit UDPMotionDevice(std::shared_ptr status_) : status(std::move(status_)) {} - std::tuple, Common::Vec3> GetStatus() const override { + std::tuple, Common::Vec3, Common::Vec3, + std::array> + GetStatus() const override { std::lock_guard guard(status->update_mutex); return status->motion_status; } @@ -59,11 +61,11 @@ private: std::shared_ptr status; }; -class UDPMotionFactory final : public Input::Factory { +class UDPMotionFactory final : public Input::Factory { public: explicit UDPMotionFactory(std::shared_ptr status_) : status(std::move(status_)) {} - std::unique_ptr Create(const Common::ParamPackage& params) override { + std::unique_ptr Create(const Common::ParamPackage& params) override { return std::make_unique(status); } @@ -80,13 +82,13 @@ State::State() { motion_factory = std::make_shared(status); touch_factory = std::make_shared(status); - Input::RegisterFactory("cemuhookudp", motion_factory); + Input::RegisterFactory("cemuhookudp", motion_factory); Input::RegisterFactory("cemuhookudp", touch_factory); } State::~State() { Input::UnregisterFactory("cemuhookudp"); - Input::UnregisterFactory("cemuhookudp"); + Input::UnregisterFactory("cemuhookudp"); } std::vector State::GetInputDevices() const { diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 13ecb3dc5c..f3a0c23c12 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -173,6 +173,14 @@ QString ButtonToText(const Common::ParamPackage& param) { return {}; } + if (param.Get("engine", "") == "cemuhookudp") { + if (param.Has("pad_index")) { + const QString motion_str = QString::fromStdString(param.Get("pad_index", "")); + return QObject::tr("UDP Motion %1").arg(motion_str); + } + return GetKeyName(param.Get("code", 0)); + } + return QObject::tr("[unknown]"); }