mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-11-01 07:16:42 +08:00 
			
		
		
		
	Merge pull request #11006 from german77/nfc_nfc
service: nfc: Ensure controller is in the correct mode
This commit is contained in:
		
						commit
						ef7d44e243
					
				| @ -54,6 +54,7 @@ SPDX-License-Identifier: GPL-3.0-or-later | ||||
|         <activity | ||||
|             android:name="org.yuzu.yuzu_emu.activities.EmulationActivity" | ||||
|             android:theme="@style/Theme.Yuzu.Main" | ||||
|             android:launchMode="singleTop" | ||||
|             android:screenOrientation="userLandscape" | ||||
|             android:supportsPictureInPicture="true" | ||||
|             android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|uiMode" | ||||
|  | ||||
| @ -1243,10 +1243,12 @@ Common::Input::DriverResult EmulatedController::SetPollingMode( | ||||
|     auto& nfc_output_device = output_devices[3]; | ||||
| 
 | ||||
|     if (device_index == EmulatedDeviceIndex::LeftIndex) { | ||||
|         controller.left_polling_mode = polling_mode; | ||||
|         return left_output_device->SetPollingMode(polling_mode); | ||||
|     } | ||||
| 
 | ||||
|     if (device_index == EmulatedDeviceIndex::RightIndex) { | ||||
|         controller.right_polling_mode = polling_mode; | ||||
|         const auto virtual_nfc_result = nfc_output_device->SetPollingMode(polling_mode); | ||||
|         const auto mapped_nfc_result = right_output_device->SetPollingMode(polling_mode); | ||||
| 
 | ||||
| @ -1261,12 +1263,22 @@ Common::Input::DriverResult EmulatedController::SetPollingMode( | ||||
|         return mapped_nfc_result; | ||||
|     } | ||||
| 
 | ||||
|     controller.left_polling_mode = polling_mode; | ||||
|     controller.right_polling_mode = polling_mode; | ||||
|     left_output_device->SetPollingMode(polling_mode); | ||||
|     right_output_device->SetPollingMode(polling_mode); | ||||
|     nfc_output_device->SetPollingMode(polling_mode); | ||||
|     return Common::Input::DriverResult::Success; | ||||
| } | ||||
| 
 | ||||
| Common::Input::PollingMode EmulatedController::GetPollingMode( | ||||
|     EmulatedDeviceIndex device_index) const { | ||||
|     if (device_index == EmulatedDeviceIndex::LeftIndex) { | ||||
|         return controller.left_polling_mode; | ||||
|     } | ||||
|     return controller.right_polling_mode; | ||||
| } | ||||
| 
 | ||||
| bool EmulatedController::SetCameraFormat( | ||||
|     Core::IrSensor::ImageTransferProcessorFormat camera_format) { | ||||
|     LOG_INFO(Service_HID, "Set camera format {}", camera_format); | ||||
|  | ||||
| @ -143,6 +143,8 @@ struct ControllerStatus { | ||||
|     CameraState camera_state{}; | ||||
|     RingSensorForce ring_analog_state{}; | ||||
|     NfcState nfc_state{}; | ||||
|     Common::Input::PollingMode left_polling_mode{}; | ||||
|     Common::Input::PollingMode right_polling_mode{}; | ||||
| }; | ||||
| 
 | ||||
| enum class ControllerTriggerType { | ||||
| @ -370,6 +372,12 @@ public: | ||||
|      */ | ||||
|     Common::Input::DriverResult SetPollingMode(EmulatedDeviceIndex device_index, | ||||
|                                                Common::Input::PollingMode polling_mode); | ||||
|     /**
 | ||||
|      * Get the current polling mode from a controller | ||||
|      * @param device_index index of the controller to set the polling mode | ||||
|      * @return current polling mode | ||||
|      */ | ||||
|     Common::Input::PollingMode GetPollingMode(EmulatedDeviceIndex device_index) const; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Sets the desired camera format to be polled from a controller | ||||
|  | ||||
| @ -66,10 +66,6 @@ NfcDevice::~NfcDevice() { | ||||
| }; | ||||
| 
 | ||||
| void NfcDevice::NpadUpdate(Core::HID::ControllerTriggerType type) { | ||||
|     if (!is_initalized) { | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     if (type == Core::HID::ControllerTriggerType::Connected) { | ||||
|         Initialize(); | ||||
|         availability_change_event->Signal(); | ||||
| @ -77,12 +73,12 @@ void NfcDevice::NpadUpdate(Core::HID::ControllerTriggerType type) { | ||||
|     } | ||||
| 
 | ||||
|     if (type == Core::HID::ControllerTriggerType::Disconnected) { | ||||
|         device_state = DeviceState::Unavailable; | ||||
|         Finalize(); | ||||
|         availability_change_event->Signal(); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     if (type != Core::HID::ControllerTriggerType::Nfc) { | ||||
|     if (!is_initalized) { | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
| @ -90,6 +86,17 @@ void NfcDevice::NpadUpdate(Core::HID::ControllerTriggerType type) { | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     // Ensure nfc mode is always active
 | ||||
|     if (npad_device->GetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex) == | ||||
|         Common::Input::PollingMode::Active) { | ||||
|         npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, | ||||
|                                     Common::Input::PollingMode::NFC); | ||||
|     } | ||||
| 
 | ||||
|     if (type != Core::HID::ControllerTriggerType::Nfc) { | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     const auto nfc_status = npad_device->GetNfc(); | ||||
|     switch (nfc_status.state) { | ||||
|     case Common::Input::NfcState::NewAmiibo: | ||||
| @ -207,11 +214,14 @@ void NfcDevice::Initialize() { | ||||
| } | ||||
| 
 | ||||
| void NfcDevice::Finalize() { | ||||
|     if (device_state == DeviceState::TagMounted) { | ||||
|         Unmount(); | ||||
|     } | ||||
|     if (device_state == DeviceState::SearchingForTag || device_state == DeviceState::TagRemoved) { | ||||
|         StopDetection(); | ||||
|     if (npad_device->IsConnected()) { | ||||
|         if (device_state == DeviceState::TagMounted) { | ||||
|             Unmount(); | ||||
|         } | ||||
|         if (device_state == DeviceState::SearchingForTag || | ||||
|             device_state == DeviceState::TagRemoved) { | ||||
|             StopDetection(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (device_state != DeviceState::Unavailable) { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user