summaryrefslogtreecommitdiff
path: root/src/core/hid/emulated_controller.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hid/emulated_controller.cpp')
-rw-r--r--src/core/hid/emulated_controller.cpp93
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
1185bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) { 1186bool 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
1317bool EmulatedController::AddNfcHandle() {
1318 nfc_handles++;
1319 return SetPollingMode(EmulatedDeviceIndex::RightIndex, Common::Input::PollingMode::NFC) ==
1320 Common::Input::DriverResult::Success;
1321}
1322
1323bool 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
1333bool 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
1344bool 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
1355bool 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
1366bool 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
1379bool 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
1311bool EmulatedController::WriteNfc(const std::vector<u8>& data) { 1390bool 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];