diff options
Diffstat (limited to 'src/core/hid/emulated_controller.cpp')
| -rw-r--r-- | src/core/hid/emulated_controller.cpp | 93 |
1 files changed, 86 insertions, 7 deletions
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp index 0a7777732..1ebc32c1e 100644 --- a/src/core/hid/emulated_controller.cpp +++ b/src/core/hid/emulated_controller.cpp | |||
| @@ -149,12 +149,16 @@ void EmulatedController::LoadDevices() { | |||
| 149 | 149 | ||
| 150 | camera_params[0] = right_joycon; | 150 | camera_params[0] = right_joycon; |
| 151 | camera_params[0].Set("camera", true); | 151 | camera_params[0].Set("camera", true); |
| 152 | camera_params[1] = Common::ParamPackage{"engine:camera,camera:1"}; | ||
| 153 | ring_params[1] = Common::ParamPackage{"engine:joycon,axis_x:100,axis_y:101"}; | ||
| 154 | nfc_params[0] = Common::ParamPackage{"engine:virtual_amiibo,nfc:1"}; | ||
| 155 | nfc_params[1] = right_joycon; | 152 | nfc_params[1] = right_joycon; |
| 156 | nfc_params[1].Set("nfc", true); | 153 | nfc_params[1].Set("nfc", true); |
| 157 | 154 | ||
| 155 | // Only map virtual devices to the first controller | ||
| 156 | if (npad_id_type == NpadIdType::Player1 || npad_id_type == NpadIdType::Handheld) { | ||
| 157 | camera_params[1] = Common::ParamPackage{"engine:camera,camera:1"}; | ||
| 158 | ring_params[1] = Common::ParamPackage{"engine:joycon,axis_x:100,axis_y:101"}; | ||
| 159 | nfc_params[0] = Common::ParamPackage{"engine:virtual_amiibo,nfc:1"}; | ||
| 160 | } | ||
| 161 | |||
| 158 | output_params[LeftIndex] = left_joycon; | 162 | output_params[LeftIndex] = left_joycon; |
| 159 | output_params[RightIndex] = right_joycon; | 163 | output_params[RightIndex] = right_joycon; |
| 160 | output_params[2] = camera_params[1]; | 164 | output_params[2] = camera_params[1]; |
| @@ -1176,10 +1180,7 @@ void EmulatedController::SetNfc(const Common::Input::CallbackStatus& callback) { | |||
| 1176 | return; | 1180 | return; |
| 1177 | } | 1181 | } |
| 1178 | 1182 | ||
| 1179 | controller.nfc_state = { | 1183 | controller.nfc_state = controller.nfc_values; |
| 1180 | controller.nfc_values.state, | ||
| 1181 | controller.nfc_values.data, | ||
| 1182 | }; | ||
| 1183 | } | 1184 | } |
| 1184 | 1185 | ||
| 1185 | bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) { | 1186 | bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) { |
| @@ -1249,6 +1250,11 @@ Common::Input::DriverResult EmulatedController::SetPollingMode( | |||
| 1249 | const auto virtual_nfc_result = nfc_output_device->SetPollingMode(polling_mode); | 1250 | const auto virtual_nfc_result = nfc_output_device->SetPollingMode(polling_mode); |
| 1250 | const auto mapped_nfc_result = right_output_device->SetPollingMode(polling_mode); | 1251 | const auto mapped_nfc_result = right_output_device->SetPollingMode(polling_mode); |
| 1251 | 1252 | ||
| 1253 | // Restore previous state | ||
| 1254 | if (mapped_nfc_result != Common::Input::DriverResult::Success) { | ||
| 1255 | right_output_device->SetPollingMode(Common::Input::PollingMode::Active); | ||
| 1256 | } | ||
| 1257 | |||
| 1252 | if (virtual_nfc_result == Common::Input::DriverResult::Success) { | 1258 | if (virtual_nfc_result == Common::Input::DriverResult::Success) { |
| 1253 | return virtual_nfc_result; | 1259 | return virtual_nfc_result; |
| 1254 | } | 1260 | } |
| @@ -1308,6 +1314,79 @@ bool EmulatedController::HasNfc() const { | |||
| 1308 | return is_connected && (has_virtual_nfc && is_virtual_nfc_supported); | 1314 | return is_connected && (has_virtual_nfc && is_virtual_nfc_supported); |
| 1309 | } | 1315 | } |
| 1310 | 1316 | ||
| 1317 | bool EmulatedController::AddNfcHandle() { | ||
| 1318 | nfc_handles++; | ||
| 1319 | return SetPollingMode(EmulatedDeviceIndex::RightIndex, Common::Input::PollingMode::NFC) == | ||
| 1320 | Common::Input::DriverResult::Success; | ||
| 1321 | } | ||
| 1322 | |||
| 1323 | bool EmulatedController::RemoveNfcHandle() { | ||
| 1324 | nfc_handles--; | ||
| 1325 | if (nfc_handles <= 0) { | ||
| 1326 | return SetPollingMode(EmulatedDeviceIndex::RightIndex, | ||
| 1327 | Common::Input::PollingMode::Active) == | ||
| 1328 | Common::Input::DriverResult::Success; | ||
| 1329 | } | ||
| 1330 | return true; | ||
| 1331 | } | ||
| 1332 | |||
| 1333 | bool EmulatedController::StartNfcPolling() { | ||
| 1334 | auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; | ||
| 1335 | auto& nfc_virtual_output_device = output_devices[3]; | ||
| 1336 | |||
| 1337 | const auto device_result = nfc_output_device->StartNfcPolling(); | ||
| 1338 | const auto virtual_device_result = nfc_virtual_output_device->StartNfcPolling(); | ||
| 1339 | |||
| 1340 | return device_result == Common::Input::NfcState::Success || | ||
| 1341 | virtual_device_result == Common::Input::NfcState::Success; | ||
| 1342 | } | ||
| 1343 | |||
| 1344 | bool EmulatedController::StopNfcPolling() { | ||
| 1345 | auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; | ||
| 1346 | auto& nfc_virtual_output_device = output_devices[3]; | ||
| 1347 | |||
| 1348 | const auto device_result = nfc_output_device->StopNfcPolling(); | ||
| 1349 | const auto virtual_device_result = nfc_virtual_output_device->StopNfcPolling(); | ||
| 1350 | |||
| 1351 | return device_result == Common::Input::NfcState::Success || | ||
| 1352 | virtual_device_result == Common::Input::NfcState::Success; | ||
| 1353 | } | ||
| 1354 | |||
| 1355 | bool EmulatedController::ReadAmiiboData(std::vector<u8>& data) { | ||
| 1356 | auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; | ||
| 1357 | auto& nfc_virtual_output_device = output_devices[3]; | ||
| 1358 | |||
| 1359 | if (nfc_output_device->ReadAmiiboData(data) == Common::Input::NfcState::Success) { | ||
| 1360 | return true; | ||
| 1361 | } | ||
| 1362 | |||
| 1363 | return nfc_virtual_output_device->ReadAmiiboData(data) == Common::Input::NfcState::Success; | ||
| 1364 | } | ||
| 1365 | |||
| 1366 | bool EmulatedController::ReadMifareData(const Common::Input::MifareRequest& request, | ||
| 1367 | Common::Input::MifareRequest& out_data) { | ||
| 1368 | auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; | ||
| 1369 | auto& nfc_virtual_output_device = output_devices[3]; | ||
| 1370 | |||
| 1371 | if (nfc_output_device->ReadMifareData(request, out_data) == Common::Input::NfcState::Success) { | ||
| 1372 | return true; | ||
| 1373 | } | ||
| 1374 | |||
| 1375 | return nfc_virtual_output_device->ReadMifareData(request, out_data) == | ||
| 1376 | Common::Input::NfcState::Success; | ||
| 1377 | } | ||
| 1378 | |||
| 1379 | bool EmulatedController::WriteMifareData(const Common::Input::MifareRequest& request) { | ||
| 1380 | auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; | ||
| 1381 | auto& nfc_virtual_output_device = output_devices[3]; | ||
| 1382 | |||
| 1383 | if (nfc_output_device->WriteMifareData(request) == Common::Input::NfcState::Success) { | ||
| 1384 | return true; | ||
| 1385 | } | ||
| 1386 | |||
| 1387 | return nfc_virtual_output_device->WriteMifareData(request) == Common::Input::NfcState::Success; | ||
| 1388 | } | ||
| 1389 | |||
| 1311 | bool EmulatedController::WriteNfc(const std::vector<u8>& data) { | 1390 | bool EmulatedController::WriteNfc(const std::vector<u8>& data) { |
| 1312 | auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; | 1391 | auto& nfc_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; |
| 1313 | auto& nfc_virtual_output_device = output_devices[3]; | 1392 | auto& nfc_virtual_output_device = output_devices[3]; |