mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	service: nfc: Ensure controller is in the correct mode
This commit is contained in:
		@@ -1243,10 +1243,12 @@ Common::Input::DriverResult EmulatedController::SetPollingMode(
 | 
				
			|||||||
    auto& nfc_output_device = output_devices[3];
 | 
					    auto& nfc_output_device = output_devices[3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (device_index == EmulatedDeviceIndex::LeftIndex) {
 | 
					    if (device_index == EmulatedDeviceIndex::LeftIndex) {
 | 
				
			||||||
 | 
					        controller.left_polling_mode = polling_mode;
 | 
				
			||||||
        return left_output_device->SetPollingMode(polling_mode);
 | 
					        return left_output_device->SetPollingMode(polling_mode);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (device_index == EmulatedDeviceIndex::RightIndex) {
 | 
					    if (device_index == EmulatedDeviceIndex::RightIndex) {
 | 
				
			||||||
 | 
					        controller.right_polling_mode = polling_mode;
 | 
				
			||||||
        const auto virtual_nfc_result = nfc_output_device->SetPollingMode(polling_mode);
 | 
					        const auto virtual_nfc_result = nfc_output_device->SetPollingMode(polling_mode);
 | 
				
			||||||
        const auto mapped_nfc_result = right_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;
 | 
					        return mapped_nfc_result;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    controller.left_polling_mode = polling_mode;
 | 
				
			||||||
 | 
					    controller.right_polling_mode = polling_mode;
 | 
				
			||||||
    left_output_device->SetPollingMode(polling_mode);
 | 
					    left_output_device->SetPollingMode(polling_mode);
 | 
				
			||||||
    right_output_device->SetPollingMode(polling_mode);
 | 
					    right_output_device->SetPollingMode(polling_mode);
 | 
				
			||||||
    nfc_output_device->SetPollingMode(polling_mode);
 | 
					    nfc_output_device->SetPollingMode(polling_mode);
 | 
				
			||||||
    return Common::Input::DriverResult::Success;
 | 
					    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(
 | 
					bool EmulatedController::SetCameraFormat(
 | 
				
			||||||
    Core::IrSensor::ImageTransferProcessorFormat camera_format) {
 | 
					    Core::IrSensor::ImageTransferProcessorFormat camera_format) {
 | 
				
			||||||
    LOG_INFO(Service_HID, "Set camera format {}", camera_format);
 | 
					    LOG_INFO(Service_HID, "Set camera format {}", camera_format);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -143,6 +143,8 @@ struct ControllerStatus {
 | 
				
			|||||||
    CameraState camera_state{};
 | 
					    CameraState camera_state{};
 | 
				
			||||||
    RingSensorForce ring_analog_state{};
 | 
					    RingSensorForce ring_analog_state{};
 | 
				
			||||||
    NfcState nfc_state{};
 | 
					    NfcState nfc_state{};
 | 
				
			||||||
 | 
					    Common::Input::PollingMode left_polling_mode{};
 | 
				
			||||||
 | 
					    Common::Input::PollingMode right_polling_mode{};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum class ControllerTriggerType {
 | 
					enum class ControllerTriggerType {
 | 
				
			||||||
@@ -370,6 +372,12 @@ public:
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    Common::Input::DriverResult SetPollingMode(EmulatedDeviceIndex device_index,
 | 
					    Common::Input::DriverResult SetPollingMode(EmulatedDeviceIndex device_index,
 | 
				
			||||||
                                               Common::Input::PollingMode polling_mode);
 | 
					                                               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
 | 
					     * Sets the desired camera format to be polled from a controller
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -66,10 +66,6 @@ NfcDevice::~NfcDevice() {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void NfcDevice::NpadUpdate(Core::HID::ControllerTriggerType type) {
 | 
					void NfcDevice::NpadUpdate(Core::HID::ControllerTriggerType type) {
 | 
				
			||||||
    if (!is_initalized) {
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (type == Core::HID::ControllerTriggerType::Connected) {
 | 
					    if (type == Core::HID::ControllerTriggerType::Connected) {
 | 
				
			||||||
        Initialize();
 | 
					        Initialize();
 | 
				
			||||||
        availability_change_event->Signal();
 | 
					        availability_change_event->Signal();
 | 
				
			||||||
@@ -77,12 +73,12 @@ void NfcDevice::NpadUpdate(Core::HID::ControllerTriggerType type) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (type == Core::HID::ControllerTriggerType::Disconnected) {
 | 
					    if (type == Core::HID::ControllerTriggerType::Disconnected) {
 | 
				
			||||||
        device_state = DeviceState::Unavailable;
 | 
					        Finalize();
 | 
				
			||||||
        availability_change_event->Signal();
 | 
					        availability_change_event->Signal();
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (type != Core::HID::ControllerTriggerType::Nfc) {
 | 
					    if (!is_initalized) {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -90,6 +86,17 @@ void NfcDevice::NpadUpdate(Core::HID::ControllerTriggerType type) {
 | 
				
			|||||||
        return;
 | 
					        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();
 | 
					    const auto nfc_status = npad_device->GetNfc();
 | 
				
			||||||
    switch (nfc_status.state) {
 | 
					    switch (nfc_status.state) {
 | 
				
			||||||
    case Common::Input::NfcState::NewAmiibo:
 | 
					    case Common::Input::NfcState::NewAmiibo:
 | 
				
			||||||
@@ -207,11 +214,14 @@ void NfcDevice::Initialize() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void NfcDevice::Finalize() {
 | 
					void NfcDevice::Finalize() {
 | 
				
			||||||
    if (device_state == DeviceState::TagMounted) {
 | 
					    if (npad_device->IsConnected()) {
 | 
				
			||||||
        Unmount();
 | 
					        if (device_state == DeviceState::TagMounted) {
 | 
				
			||||||
    }
 | 
					            Unmount();
 | 
				
			||||||
    if (device_state == DeviceState::SearchingForTag || device_state == DeviceState::TagRemoved) {
 | 
					        }
 | 
				
			||||||
        StopDetection();
 | 
					        if (device_state == DeviceState::SearchingForTag ||
 | 
				
			||||||
 | 
					            device_state == DeviceState::TagRemoved) {
 | 
				
			||||||
 | 
					            StopDetection();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (device_state != DeviceState::Unavailable) {
 | 
					    if (device_state != DeviceState::Unavailable) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user