Merge pull request #8308 from german77/disablesix
service: hid: Disable correctly motion input
This commit is contained in:
		| @@ -3,7 +3,9 @@ | |||||||
|  |  | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| #include <array> | #include <array> | ||||||
|  | #include <chrono> | ||||||
| #include <cstring> | #include <cstring> | ||||||
|  |  | ||||||
| #include "common/assert.h" | #include "common/assert.h" | ||||||
| #include "common/bit_field.h" | #include "common/bit_field.h" | ||||||
| #include "common/common_types.h" | #include "common/common_types.h" | ||||||
| @@ -529,6 +531,14 @@ void Controller_NPad::OnMotionUpdate(const Core::Timing::CoreTiming& core_timing | |||||||
|         auto& sixaxis_left_lifo_state = controller.sixaxis_left_lifo_state; |         auto& sixaxis_left_lifo_state = controller.sixaxis_left_lifo_state; | ||||||
|         auto& sixaxis_right_lifo_state = controller.sixaxis_right_lifo_state; |         auto& sixaxis_right_lifo_state = controller.sixaxis_right_lifo_state; | ||||||
|  |  | ||||||
|  |         // Clear previous state | ||||||
|  |         sixaxis_fullkey_state = {}; | ||||||
|  |         sixaxis_handheld_state = {}; | ||||||
|  |         sixaxis_dual_left_state = {}; | ||||||
|  |         sixaxis_dual_right_state = {}; | ||||||
|  |         sixaxis_left_lifo_state = {}; | ||||||
|  |         sixaxis_right_lifo_state = {}; | ||||||
|  |  | ||||||
|         if (controller.sixaxis_sensor_enabled && Settings::values.motion_enabled.GetValue()) { |         if (controller.sixaxis_sensor_enabled && Settings::values.motion_enabled.GetValue()) { | ||||||
|             controller.sixaxis_at_rest = true; |             controller.sixaxis_at_rest = true; | ||||||
|             for (std::size_t e = 0; e < motion_state.size(); ++e) { |             for (std::size_t e = 0; e < motion_state.size(); ++e) { | ||||||
| @@ -537,69 +547,55 @@ void Controller_NPad::OnMotionUpdate(const Core::Timing::CoreTiming& core_timing | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         const auto set_motion_state = [&](SixAxisSensorState& state, | ||||||
|  |                                           const Core::HID::ControllerMotion& hid_state) { | ||||||
|  |             using namespace std::literals::chrono_literals; | ||||||
|  |             static constexpr SixAxisSensorState default_motion_state = { | ||||||
|  |                 .delta_time = std::chrono::nanoseconds(5ms).count(), | ||||||
|  |                 .accel = {0, 0, -1.0f}, | ||||||
|  |                 .orientation = | ||||||
|  |                     { | ||||||
|  |                         Common::Vec3f{1.0f, 0, 0}, | ||||||
|  |                         Common::Vec3f{0, 1.0f, 0}, | ||||||
|  |                         Common::Vec3f{0, 0, 1.0f}, | ||||||
|  |                     }, | ||||||
|  |                 .attribute = {1}, | ||||||
|  |             }; | ||||||
|  |             if (!controller.sixaxis_sensor_enabled) { | ||||||
|  |                 state = default_motion_state; | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |             if (!Settings::values.motion_enabled.GetValue()) { | ||||||
|  |                 state = default_motion_state; | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |             state.attribute.is_connected.Assign(1); | ||||||
|  |             state.delta_time = std::chrono::nanoseconds(5ms).count(); | ||||||
|  |             state.accel = hid_state.accel; | ||||||
|  |             state.gyro = hid_state.gyro; | ||||||
|  |             state.rotation = hid_state.rotation; | ||||||
|  |             state.orientation = hid_state.orientation; | ||||||
|  |         }; | ||||||
|  |  | ||||||
|         switch (controller_type) { |         switch (controller_type) { | ||||||
|         case Core::HID::NpadStyleIndex::None: |         case Core::HID::NpadStyleIndex::None: | ||||||
|             UNREACHABLE(); |             UNREACHABLE(); | ||||||
|             break; |             break; | ||||||
|         case Core::HID::NpadStyleIndex::ProController: |         case Core::HID::NpadStyleIndex::ProController: | ||||||
|             sixaxis_fullkey_state.attribute.raw = 0; |             set_motion_state(sixaxis_fullkey_state, motion_state[0]); | ||||||
|             if (controller.sixaxis_sensor_enabled) { |  | ||||||
|                 sixaxis_fullkey_state.attribute.is_connected.Assign(1); |  | ||||||
|                 sixaxis_fullkey_state.accel = motion_state[0].accel; |  | ||||||
|                 sixaxis_fullkey_state.gyro = motion_state[0].gyro; |  | ||||||
|                 sixaxis_fullkey_state.rotation = motion_state[0].rotation; |  | ||||||
|                 sixaxis_fullkey_state.orientation = motion_state[0].orientation; |  | ||||||
|             } |  | ||||||
|             break; |             break; | ||||||
|         case Core::HID::NpadStyleIndex::Handheld: |         case Core::HID::NpadStyleIndex::Handheld: | ||||||
|             sixaxis_handheld_state.attribute.raw = 0; |             set_motion_state(sixaxis_handheld_state, motion_state[0]); | ||||||
|             if (controller.sixaxis_sensor_enabled) { |  | ||||||
|                 sixaxis_handheld_state.attribute.is_connected.Assign(1); |  | ||||||
|                 sixaxis_handheld_state.accel = motion_state[0].accel; |  | ||||||
|                 sixaxis_handheld_state.gyro = motion_state[0].gyro; |  | ||||||
|                 sixaxis_handheld_state.rotation = motion_state[0].rotation; |  | ||||||
|                 sixaxis_handheld_state.orientation = motion_state[0].orientation; |  | ||||||
|             } |  | ||||||
|             break; |             break; | ||||||
|         case Core::HID::NpadStyleIndex::JoyconDual: |         case Core::HID::NpadStyleIndex::JoyconDual: | ||||||
|             sixaxis_dual_left_state.attribute.raw = 0; |             set_motion_state(sixaxis_dual_left_state, motion_state[0]); | ||||||
|             sixaxis_dual_right_state.attribute.raw = 0; |             set_motion_state(sixaxis_dual_right_state, motion_state[1]); | ||||||
|             if (controller.sixaxis_sensor_enabled) { |  | ||||||
|                 // Set motion for the left joycon |  | ||||||
|                 sixaxis_dual_left_state.attribute.is_connected.Assign(1); |  | ||||||
|                 sixaxis_dual_left_state.accel = motion_state[0].accel; |  | ||||||
|                 sixaxis_dual_left_state.gyro = motion_state[0].gyro; |  | ||||||
|                 sixaxis_dual_left_state.rotation = motion_state[0].rotation; |  | ||||||
|                 sixaxis_dual_left_state.orientation = motion_state[0].orientation; |  | ||||||
|             } |  | ||||||
|             if (controller.sixaxis_sensor_enabled) { |  | ||||||
|                 // Set motion for the right joycon |  | ||||||
|                 sixaxis_dual_right_state.attribute.is_connected.Assign(1); |  | ||||||
|                 sixaxis_dual_right_state.accel = motion_state[1].accel; |  | ||||||
|                 sixaxis_dual_right_state.gyro = motion_state[1].gyro; |  | ||||||
|                 sixaxis_dual_right_state.rotation = motion_state[1].rotation; |  | ||||||
|                 sixaxis_dual_right_state.orientation = motion_state[1].orientation; |  | ||||||
|             } |  | ||||||
|             break; |             break; | ||||||
|         case Core::HID::NpadStyleIndex::JoyconLeft: |         case Core::HID::NpadStyleIndex::JoyconLeft: | ||||||
|             sixaxis_left_lifo_state.attribute.raw = 0; |             set_motion_state(sixaxis_left_lifo_state, motion_state[0]); | ||||||
|             if (controller.sixaxis_sensor_enabled) { |  | ||||||
|                 sixaxis_left_lifo_state.attribute.is_connected.Assign(1); |  | ||||||
|                 sixaxis_left_lifo_state.accel = motion_state[0].accel; |  | ||||||
|                 sixaxis_left_lifo_state.gyro = motion_state[0].gyro; |  | ||||||
|                 sixaxis_left_lifo_state.rotation = motion_state[0].rotation; |  | ||||||
|                 sixaxis_left_lifo_state.orientation = motion_state[0].orientation; |  | ||||||
|             } |  | ||||||
|             break; |             break; | ||||||
|         case Core::HID::NpadStyleIndex::JoyconRight: |         case Core::HID::NpadStyleIndex::JoyconRight: | ||||||
|             sixaxis_right_lifo_state.attribute.raw = 0; |             set_motion_state(sixaxis_right_lifo_state, motion_state[1]); | ||||||
|             if (controller.sixaxis_sensor_enabled) { |  | ||||||
|                 sixaxis_right_lifo_state.attribute.is_connected.Assign(1); |  | ||||||
|                 sixaxis_right_lifo_state.accel = motion_state[1].accel; |  | ||||||
|                 sixaxis_right_lifo_state.gyro = motion_state[1].gyro; |  | ||||||
|                 sixaxis_right_lifo_state.rotation = motion_state[1].rotation; |  | ||||||
|                 sixaxis_right_lifo_state.orientation = motion_state[1].orientation; |  | ||||||
|             } |  | ||||||
|             break; |             break; | ||||||
|         default: |         default: | ||||||
|             break; |             break; | ||||||
|   | |||||||
| @@ -37,8 +37,7 @@ namespace Service::HID { | |||||||
| // Period time is obtained by measuring the number of samples in a second on HW using a homebrew | // Period time is obtained by measuring the number of samples in a second on HW using a homebrew | ||||||
| constexpr auto pad_update_ns = std::chrono::nanoseconds{4 * 1000 * 1000};            // (4ms, 250Hz) | constexpr auto pad_update_ns = std::chrono::nanoseconds{4 * 1000 * 1000};            // (4ms, 250Hz) | ||||||
| constexpr auto mouse_keyboard_update_ns = std::chrono::nanoseconds{8 * 1000 * 1000}; // (8ms, 125Hz) | constexpr auto mouse_keyboard_update_ns = std::chrono::nanoseconds{8 * 1000 * 1000}; // (8ms, 125Hz) | ||||||
| // TODO: Correct update rate for motion is 5ms. Check why some games don't behave at that speed | constexpr auto motion_update_ns = std::chrono::nanoseconds{5 * 1000 * 1000};         // (5ms, 200Hz) | ||||||
| constexpr auto motion_update_ns = std::chrono::nanoseconds{10 * 1000 * 1000}; // (10ms, 100Hz) |  | ||||||
|  |  | ||||||
| IAppletResource::IAppletResource(Core::System& system_, | IAppletResource::IAppletResource(Core::System& system_, | ||||||
|                                  KernelHelpers::ServiceContext& service_context_) |                                  KernelHelpers::ServiceContext& service_context_) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user