Remove RealMotionDevice
This commit is contained in:
parent
8e18b61972
commit
0774b17846
7 changed files with 41 additions and 35 deletions
|
@ -119,25 +119,7 @@ using ButtonDevice = InputDevice<bool>;
|
||||||
using AnalogDevice = InputDevice<std::tuple<float, float>>;
|
using AnalogDevice = InputDevice<std::tuple<float, float>>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A motion device is an input device that returns a tuple of accelerometer state vector and
|
* A motion status is an object that returns a tuple of accelerometer state vector,
|
||||||
* gyroscope state vector.
|
|
||||||
*
|
|
||||||
* For both vectors:
|
|
||||||
* x+ is the same direction as LEFT on D-pad.
|
|
||||||
* y+ is normal to the touch screen, pointing outward.
|
|
||||||
* z+ is the same direction as UP on D-pad.
|
|
||||||
*
|
|
||||||
* For accelerometer state vector
|
|
||||||
* Units: g (gravitational acceleration)
|
|
||||||
*
|
|
||||||
* For gyroscope state vector:
|
|
||||||
* Orientation is determined by right-hand rule.
|
|
||||||
* Units: deg/sec
|
|
||||||
*/
|
|
||||||
using MotionDevice = InputDevice<std::tuple<Common::Vec3<float>, Common::Vec3<float>>>;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A real motion device is an input device that returns a tuple of accelerometer state vector,
|
|
||||||
* gyroscope state vector, rotation state vector and orientation state matrix.
|
* gyroscope state vector, rotation state vector and orientation state matrix.
|
||||||
*
|
*
|
||||||
* For both vectors:
|
* For both vectors:
|
||||||
|
@ -160,8 +142,13 @@ using MotionDevice = InputDevice<std::tuple<Common::Vec3<float>, Common::Vec3<fl
|
||||||
* y vector
|
* y vector
|
||||||
* z vector
|
* z vector
|
||||||
*/
|
*/
|
||||||
using RealMotionDevice = InputDevice<std::tuple<Common::Vec3<float>, Common::Vec3<float>,
|
using MotionStatus = std::tuple<Common::Vec3<float>, Common::Vec3<float>, Common::Vec3<float>,
|
||||||
Common::Vec3<float>, std::array<Common::Vec3f, 3>>>;
|
std::array<Common::Vec3f, 3>>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A motion device is an input device that returns a motion status object
|
||||||
|
*/
|
||||||
|
using MotionDevice = InputDevice<MotionStatus>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A touch device is an input device that returns a tuple of two floats and a bool. The floats are
|
* A touch device is an input device that returns a tuple of two floats and a bool. The floats are
|
||||||
|
|
|
@ -251,7 +251,7 @@ void Controller_NPad::OnLoadInputDevices() {
|
||||||
sticks[i].begin(), Input::CreateDevice<Input::AnalogDevice>);
|
sticks[i].begin(), Input::CreateDevice<Input::AnalogDevice>);
|
||||||
std::transform(players[i].motions.begin() + Settings::NativeMotion::MOTION_HID_BEGIN,
|
std::transform(players[i].motions.begin() + Settings::NativeMotion::MOTION_HID_BEGIN,
|
||||||
players[i].motions.begin() + Settings::NativeMotion::MOTION_HID_END,
|
players[i].motions.begin() + Settings::NativeMotion::MOTION_HID_END,
|
||||||
motions[i].begin(), Input::CreateDevice<Input::RealMotionDevice>);
|
motions[i].begin(), Input::CreateDevice<Input::MotionDevice>);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -397,7 +397,8 @@ void Controller_NPad::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8*
|
||||||
std::tie(motion_devices[e].accel, motion_devices[e].gyro,
|
std::tie(motion_devices[e].accel, motion_devices[e].gyro,
|
||||||
motion_devices[e].rotation, motion_devices[e].orientation) =
|
motion_devices[e].rotation, motion_devices[e].orientation) =
|
||||||
device->GetStatus();
|
device->GetStatus();
|
||||||
sixaxis_at_rest = sixaxis_at_rest && motion_devices[e].gyro.Length2() < 1.0f;
|
sixaxis_at_rest =
|
||||||
|
sixaxis_at_rest && motion_devices[e].gyro.Length2() < 0.00005f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -299,9 +299,9 @@ private:
|
||||||
|
|
||||||
struct MotionDevice {
|
struct MotionDevice {
|
||||||
Common::Vec3f accel;
|
Common::Vec3f accel;
|
||||||
Common::Vec3f gyro{};
|
Common::Vec3f gyro;
|
||||||
Common::Vec3f rotation;
|
Common::Vec3f rotation;
|
||||||
std::array<Common::Vec3f, 3> orientation{};
|
std::array<Common::Vec3f, 3> orientation;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NPadEntry {
|
struct NPadEntry {
|
||||||
|
@ -358,9 +358,9 @@ private:
|
||||||
using StickArray = std::array<
|
using StickArray = std::array<
|
||||||
std::array<std::unique_ptr<Input::AnalogDevice>, Settings::NativeAnalog::NUM_STICKS_HID>,
|
std::array<std::unique_ptr<Input::AnalogDevice>, Settings::NativeAnalog::NUM_STICKS_HID>,
|
||||||
10>;
|
10>;
|
||||||
using MotionArray = std::array<std::array<std::unique_ptr<Input::RealMotionDevice>,
|
using MotionArray = std::array<
|
||||||
Settings::NativeMotion::NUM_MOTION_HID>,
|
std::array<std::unique_ptr<Input::MotionDevice>, Settings::NativeMotion::NUM_MOTION_HID>,
|
||||||
10>;
|
10>;
|
||||||
ButtonArray buttons;
|
ButtonArray buttons;
|
||||||
StickArray sticks;
|
StickArray sticks;
|
||||||
MotionArray motions;
|
MotionArray motions;
|
||||||
|
|
|
@ -56,7 +56,7 @@ public:
|
||||||
is_tilting = false;
|
is_tilting = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<Common::Vec3<float>, Common::Vec3<float>> GetStatus() {
|
Input::MotionStatus GetStatus() {
|
||||||
std::lock_guard guard{status_mutex};
|
std::lock_guard guard{status_mutex};
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -76,7 +76,7 @@ private:
|
||||||
|
|
||||||
Common::Event shutdown_event;
|
Common::Event shutdown_event;
|
||||||
|
|
||||||
std::tuple<Common::Vec3<float>, Common::Vec3<float>> status;
|
Input::MotionStatus status;
|
||||||
std::mutex status_mutex;
|
std::mutex status_mutex;
|
||||||
|
|
||||||
// Note: always keep the thread declaration at the end so that other objects are initialized
|
// Note: always keep the thread declaration at the end so that other objects are initialized
|
||||||
|
@ -113,10 +113,19 @@ private:
|
||||||
gravity = QuaternionRotate(inv_q, gravity);
|
gravity = QuaternionRotate(inv_q, gravity);
|
||||||
angular_rate = QuaternionRotate(inv_q, angular_rate);
|
angular_rate = QuaternionRotate(inv_q, angular_rate);
|
||||||
|
|
||||||
|
// TODO: Calculate the correct rotation vector and orientation matrix
|
||||||
|
const auto matrix4x4 = q.ToMatrix();
|
||||||
|
const auto rotation = Common::MakeVec(0.0f, 0.0f, 0.0f);
|
||||||
|
const std::array orientation{
|
||||||
|
Common::Vec3f(matrix4x4[0], matrix4x4[1], -matrix4x4[2]),
|
||||||
|
Common::Vec3f(matrix4x4[4], matrix4x4[5], -matrix4x4[6]),
|
||||||
|
Common::Vec3f(-matrix4x4[8], -matrix4x4[9], matrix4x4[10]),
|
||||||
|
};
|
||||||
|
|
||||||
// Update the sensor state
|
// Update the sensor state
|
||||||
{
|
{
|
||||||
std::lock_guard guard{status_mutex};
|
std::lock_guard guard{status_mutex};
|
||||||
status = std::make_tuple(gravity, angular_rate);
|
status = std::make_tuple(gravity, angular_rate, rotation, orientation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -131,7 +140,7 @@ public:
|
||||||
device = std::make_shared<MotionEmuDevice>(update_millisecond, sensitivity);
|
device = std::make_shared<MotionEmuDevice>(update_millisecond, sensitivity);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<Common::Vec3<float>, Common::Vec3<float>> GetStatus() const override {
|
Input::MotionStatus GetStatus() const override {
|
||||||
return device->GetStatus();
|
return device->GetStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -170,10 +170,18 @@ void Client::OnPadData(Response::PadData data) {
|
||||||
// directions correspond to the ones of the Switch
|
// directions correspond to the ones of the Switch
|
||||||
Common::Vec3f accel = Common::MakeVec<float>(data.accel.x, data.accel.y, data.accel.z);
|
Common::Vec3f accel = Common::MakeVec<float>(data.accel.x, data.accel.y, data.accel.z);
|
||||||
Common::Vec3f gyro = Common::MakeVec<float>(data.gyro.pitch, data.gyro.yaw, data.gyro.roll);
|
Common::Vec3f gyro = Common::MakeVec<float>(data.gyro.pitch, data.gyro.yaw, data.gyro.roll);
|
||||||
|
|
||||||
|
// TODO: Calculate the correct rotation vector and orientation matrix
|
||||||
|
const auto rotation = Common::MakeVec(0.0f, 0.0f, 0.0f);
|
||||||
|
const std::array orientation{
|
||||||
|
Common::Vec3f(1.0f, 0.0f, 0.0f),
|
||||||
|
Common::Vec3f(0.0f, 1.0f, 0.0f),
|
||||||
|
Common::Vec3f(0.0f, 0.0f, 1.0f),
|
||||||
|
};
|
||||||
{
|
{
|
||||||
std::lock_guard guard(status->update_mutex);
|
std::lock_guard guard(status->update_mutex);
|
||||||
|
|
||||||
status->motion_status = {accel, gyro};
|
status->motion_status = {accel, gyro, rotation, orientation};
|
||||||
|
|
||||||
// TODO: add a setting for "click" touch. Click touch refers to a device that differentiates
|
// 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.
|
// between a simple "tap" and a hard press that causes the touch screen to click.
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "common/thread.h"
|
#include "common/thread.h"
|
||||||
#include "common/vector_math.h"
|
#include "common/vector_math.h"
|
||||||
|
#include "core/frontend/input.h"
|
||||||
|
|
||||||
namespace InputCommon::CemuhookUDP {
|
namespace InputCommon::CemuhookUDP {
|
||||||
|
|
||||||
|
@ -30,7 +31,7 @@ struct Version;
|
||||||
|
|
||||||
struct DeviceStatus {
|
struct DeviceStatus {
|
||||||
std::mutex update_mutex;
|
std::mutex update_mutex;
|
||||||
std::tuple<Common::Vec3<float>, Common::Vec3<float>> motion_status;
|
Input::MotionStatus motion_status;
|
||||||
std::tuple<float, float, bool> touch_status;
|
std::tuple<float, float, bool> touch_status;
|
||||||
|
|
||||||
// calibration data for scaling the device's touch area to 3ds
|
// calibration data for scaling the device's touch area to 3ds
|
||||||
|
|
|
@ -29,7 +29,7 @@ private:
|
||||||
class UDPMotionDevice final : public Input::MotionDevice {
|
class UDPMotionDevice final : public Input::MotionDevice {
|
||||||
public:
|
public:
|
||||||
explicit UDPMotionDevice(std::shared_ptr<DeviceStatus> status_) : status(std::move(status_)) {}
|
explicit UDPMotionDevice(std::shared_ptr<DeviceStatus> status_) : status(std::move(status_)) {}
|
||||||
std::tuple<Common::Vec3<float>, Common::Vec3<float>> GetStatus() const override {
|
Input::MotionStatus GetStatus() const override {
|
||||||
std::lock_guard guard(status->update_mutex);
|
std::lock_guard guard(status->update_mutex);
|
||||||
return status->motion_status;
|
return status->motion_status;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue