service/hid: Update console sixaxis to the emulated console
This commit is contained in:
		| @@ -3,6 +3,7 @@ | ||||
| // Refer to the license.txt file included. | ||||
|  | ||||
| #include "common/settings.h" | ||||
| #include "core/core.h" | ||||
| #include "core/core_timing.h" | ||||
| #include "core/hle/service/hid/controllers/console_sixaxis.h" | ||||
|  | ||||
| @@ -10,7 +11,10 @@ namespace Service::HID { | ||||
| constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3C200; | ||||
|  | ||||
| Controller_ConsoleSixAxis::Controller_ConsoleSixAxis(Core::System& system_) | ||||
|     : ControllerBase{system_} {} | ||||
|     : ControllerBase{system_} { | ||||
|     console = system.HIDCore().GetEmulatedConsole(); | ||||
| } | ||||
|  | ||||
| Controller_ConsoleSixAxis::~Controller_ConsoleSixAxis() = default; | ||||
|  | ||||
| void Controller_ConsoleSixAxis::OnInit() {} | ||||
| @@ -38,25 +42,21 @@ void Controller_ConsoleSixAxis::OnUpdate(const Core::Timing::CoreTiming& core_ti | ||||
|     cur_entry.sampling_number2 = cur_entry.sampling_number; | ||||
|  | ||||
|     // Try to read sixaxis sensor states | ||||
|     MotionDevice motion_device{}; | ||||
|     const auto& device = motions[0]; | ||||
|     if (device) { | ||||
|         std::tie(motion_device.accel, motion_device.gyro, motion_device.rotation, | ||||
|                  motion_device.orientation, motion_device.quaternion) = device->GetStatus(); | ||||
|         console_six_axis.is_seven_six_axis_sensor_at_rest = motion_device.gyro.Length2() < 0.0001f; | ||||
|     } | ||||
|     const auto motion_status = console->GetMotion(); | ||||
|  | ||||
|     cur_entry.accel = motion_device.accel; | ||||
|     console_six_axis.is_seven_six_axis_sensor_at_rest = motion_status.is_at_rest; | ||||
|  | ||||
|     cur_entry.accel = motion_status.accel; | ||||
|     // Zero gyro values as they just mess up with the camera | ||||
|     // Note: Probably a correct sensivity setting must be set | ||||
|     cur_entry.gyro = {}; | ||||
|     cur_entry.quaternion = { | ||||
|         { | ||||
|             motion_device.quaternion.xyz.y, | ||||
|             motion_device.quaternion.xyz.x, | ||||
|             -motion_device.quaternion.w, | ||||
|             motion_status.quaternion.xyz.y, | ||||
|             motion_status.quaternion.xyz.x, | ||||
|             -motion_status.quaternion.w, | ||||
|         }, | ||||
|         -motion_device.quaternion.xyz.z, | ||||
|         -motion_status.quaternion.xyz.z, | ||||
|     }; | ||||
|  | ||||
|     console_six_axis.sampling_number++; | ||||
| @@ -70,13 +70,6 @@ void Controller_ConsoleSixAxis::OnUpdate(const Core::Timing::CoreTiming& core_ti | ||||
|     std::memcpy(transfer_memory, &seven_six_axis, sizeof(seven_six_axis)); | ||||
| } | ||||
|  | ||||
| void Controller_ConsoleSixAxis::OnLoadInputDevices() { | ||||
|     const auto player = Settings::values.players.GetValue()[0]; | ||||
|     std::transform(player.motions.begin() + Settings::NativeMotion::MOTION_HID_BEGIN, | ||||
|                    player.motions.begin() + Settings::NativeMotion::MOTION_HID_END, motions.begin(), | ||||
|                    Input::CreateDevice<Input::MotionDevice>); | ||||
| } | ||||
|  | ||||
| void Controller_ConsoleSixAxis::SetTransferMemoryPointer(u8* t_mem) { | ||||
|     is_transfer_memory_set = true; | ||||
|     transfer_memory = t_mem; | ||||
|   | ||||
| @@ -5,10 +5,10 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <array> | ||||
| #include "common/bit_field.h" | ||||
| #include "common/common_types.h" | ||||
| #include "common/quaternion.h" | ||||
| #include "core/frontend/input.h" | ||||
| #include "core/hid/hid_core.h" | ||||
| #include "core/hid/hid_types.h" | ||||
| #include "core/hle/service/hid/controllers/controller_base.h" | ||||
|  | ||||
| namespace Service::HID { | ||||
| @@ -26,9 +26,6 @@ public: | ||||
|     // When the controller is requesting an update for the shared memory | ||||
|     void OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, size_t size) override; | ||||
|  | ||||
|     // Called when input devices should be loaded | ||||
|     void OnLoadInputDevices() override; | ||||
|  | ||||
|     // Called on InitializeSevenSixAxisSensor | ||||
|     void SetTransferMemoryPointer(u8* t_mem); | ||||
|  | ||||
| @@ -47,12 +44,22 @@ private: | ||||
|     }; | ||||
|     static_assert(sizeof(SevenSixAxisState) == 0x50, "SevenSixAxisState is an invalid size"); | ||||
|  | ||||
|     struct CommonHeader { | ||||
|         s64_le timestamp; | ||||
|         s64_le total_entry_count; | ||||
|         s64_le last_entry_index; | ||||
|         s64_le entry_count; | ||||
|     }; | ||||
|     static_assert(sizeof(CommonHeader) == 0x20, "CommonHeader is an invalid size"); | ||||
|  | ||||
|     // TODO(german77): SevenSixAxisMemory doesn't follow the standard lifo. Investigate | ||||
|     struct SevenSixAxisMemory { | ||||
|         CommonHeader header{}; | ||||
|         std::array<SevenSixAxisState, 0x21> sevensixaxis_states{}; | ||||
|     }; | ||||
|     static_assert(sizeof(SevenSixAxisMemory) == 0xA70, "SevenSixAxisMemory is an invalid size"); | ||||
|  | ||||
|     // This is nn::hid::detail::ConsoleSixAxisSensorSharedMemoryFormat | ||||
|     struct ConsoleSharedMemory { | ||||
|         u64_le sampling_number{}; | ||||
|         bool is_seven_six_axis_sensor_at_rest{}; | ||||
| @@ -69,9 +76,7 @@ private: | ||||
|         Common::Quaternion<f32> quaternion; | ||||
|     }; | ||||
|  | ||||
|     using MotionArray = | ||||
|         std::array<std::unique_ptr<Input::MotionDevice>, Settings::NativeMotion::NUM_MOTIONS_HID>; | ||||
|     MotionArray motions; | ||||
|     Core::HID::EmulatedConsole* console; | ||||
|     u8* transfer_memory = nullptr; | ||||
|     bool is_transfer_memory_set = false; | ||||
|     ConsoleSharedMemory console_six_axis{}; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 german77
					german77