diff options
Diffstat (limited to 'src/input_common/helpers')
5 files changed, 34 insertions, 23 deletions
diff --git a/src/input_common/helpers/joycon_protocol/common_protocol.cpp b/src/input_common/helpers/joycon_protocol/common_protocol.cpp index 2b42a4555..077d72cd0 100644 --- a/src/input_common/helpers/joycon_protocol/common_protocol.cpp +++ b/src/input_common/helpers/joycon_protocol/common_protocol.cpp | |||
| @@ -236,13 +236,13 @@ DriverResult JoyconCommonProtocol::GetMCUDataResponse(ReportMode report_mode, | |||
| 236 | return DriverResult::Success; | 236 | return DriverResult::Success; |
| 237 | } | 237 | } |
| 238 | 238 | ||
| 239 | DriverResult JoyconCommonProtocol::SendMCUData(ReportMode report_mode, SubCommand sc, | 239 | DriverResult JoyconCommonProtocol::SendMCUData(ReportMode report_mode, MCUSubCommand sc, |
| 240 | std::span<const u8> buffer, | 240 | std::span<const u8> buffer, |
| 241 | MCUCommandResponse& output) { | 241 | MCUCommandResponse& output) { |
| 242 | SubCommandPacket packet{ | 242 | SubCommandPacket packet{ |
| 243 | .output_report = OutputReport::MCU_DATA, | 243 | .output_report = OutputReport::MCU_DATA, |
| 244 | .packet_counter = GetCounter(), | 244 | .packet_counter = GetCounter(), |
| 245 | .sub_command = sc, | 245 | .mcu_sub_command = sc, |
| 246 | .command_data = {}, | 246 | .command_data = {}, |
| 247 | }; | 247 | }; |
| 248 | 248 | ||
| @@ -269,8 +269,7 @@ DriverResult JoyconCommonProtocol::WaitSetMCUMode(ReportMode report_mode, MCUMod | |||
| 269 | std::size_t tries{}; | 269 | std::size_t tries{}; |
| 270 | 270 | ||
| 271 | do { | 271 | do { |
| 272 | const std::vector<u8> mcu_data{static_cast<u8>(MCUMode::Standby)}; | 272 | const auto result = SendMCUData(report_mode, MCUSubCommand::SetDeviceMode, {}, output); |
| 273 | const auto result = SendMCUData(report_mode, SubCommand::STATE, mcu_data, output); | ||
| 274 | 273 | ||
| 275 | if (result != DriverResult::Success) { | 274 | if (result != DriverResult::Success) { |
| 276 | return result; | 275 | return result; |
diff --git a/src/input_common/helpers/joycon_protocol/common_protocol.h b/src/input_common/helpers/joycon_protocol/common_protocol.h index 62cae739a..411ec018a 100644 --- a/src/input_common/helpers/joycon_protocol/common_protocol.h +++ b/src/input_common/helpers/joycon_protocol/common_protocol.h | |||
| @@ -156,7 +156,7 @@ public: | |||
| 156 | * @param buffer data to be send | 156 | * @param buffer data to be send |
| 157 | * @returns output buffer containing the response | 157 | * @returns output buffer containing the response |
| 158 | */ | 158 | */ |
| 159 | DriverResult SendMCUData(ReportMode report_mode, SubCommand sc, std::span<const u8> buffer, | 159 | DriverResult SendMCUData(ReportMode report_mode, MCUSubCommand sc, std::span<const u8> buffer, |
| 160 | MCUCommandResponse& output); | 160 | MCUCommandResponse& output); |
| 161 | 161 | ||
| 162 | /** | 162 | /** |
diff --git a/src/input_common/helpers/joycon_protocol/joycon_types.h b/src/input_common/helpers/joycon_protocol/joycon_types.h index dcac0e422..1c8d294b0 100644 --- a/src/input_common/helpers/joycon_protocol/joycon_types.h +++ b/src/input_common/helpers/joycon_protocol/joycon_types.h | |||
| @@ -394,6 +394,7 @@ enum class DriverResult { | |||
| 394 | InvalidHandle, | 394 | InvalidHandle, |
| 395 | NotSupported, | 395 | NotSupported, |
| 396 | Disabled, | 396 | Disabled, |
| 397 | Delayed, | ||
| 397 | Unknown, | 398 | Unknown, |
| 398 | }; | 399 | }; |
| 399 | 400 | ||
| @@ -575,7 +576,6 @@ struct NFCPollingCommandData { | |||
| 575 | static_assert(sizeof(NFCPollingCommandData) == 0x05, "NFCPollingCommandData is an invalid size"); | 576 | static_assert(sizeof(NFCPollingCommandData) == 0x05, "NFCPollingCommandData is an invalid size"); |
| 576 | 577 | ||
| 577 | struct NFCRequestState { | 578 | struct NFCRequestState { |
| 578 | MCUSubCommand sub_command; | ||
| 579 | NFCReadCommand command_argument; | 579 | NFCReadCommand command_argument; |
| 580 | u8 packet_id; | 580 | u8 packet_id; |
| 581 | INSERT_PADDING_BYTES(0x1); | 581 | INSERT_PADDING_BYTES(0x1); |
| @@ -587,6 +587,7 @@ struct NFCRequestState { | |||
| 587 | NFCPollingCommandData nfc_polling; | 587 | NFCPollingCommandData nfc_polling; |
| 588 | }; | 588 | }; |
| 589 | u8 crc; | 589 | u8 crc; |
| 590 | INSERT_PADDING_BYTES(0x1); | ||
| 590 | }; | 591 | }; |
| 591 | static_assert(sizeof(NFCRequestState) == 0x26, "NFCRequestState is an invalid size"); | 592 | static_assert(sizeof(NFCRequestState) == 0x26, "NFCRequestState is an invalid size"); |
| 592 | 593 | ||
| @@ -659,7 +660,10 @@ struct SubCommandPacket { | |||
| 659 | OutputReport output_report; | 660 | OutputReport output_report; |
| 660 | u8 packet_counter; | 661 | u8 packet_counter; |
| 661 | INSERT_PADDING_BYTES(0x8); // This contains vibration data | 662 | INSERT_PADDING_BYTES(0x8); // This contains vibration data |
| 662 | SubCommand sub_command; | 663 | union { |
| 664 | SubCommand sub_command; | ||
| 665 | MCUSubCommand mcu_sub_command; | ||
| 666 | }; | ||
| 663 | std::array<u8, 0x26> command_data; | 667 | std::array<u8, 0x26> command_data; |
| 664 | }; | 668 | }; |
| 665 | static_assert(sizeof(SubCommandPacket) == 0x31, "SubCommandPacket is an invalid size"); | 669 | static_assert(sizeof(SubCommandPacket) == 0x31, "SubCommandPacket is an invalid size"); |
diff --git a/src/input_common/helpers/joycon_protocol/nfc.cpp b/src/input_common/helpers/joycon_protocol/nfc.cpp index eeba82986..14818ae33 100644 --- a/src/input_common/helpers/joycon_protocol/nfc.cpp +++ b/src/input_common/helpers/joycon_protocol/nfc.cpp | |||
| @@ -72,6 +72,11 @@ DriverResult NfcProtocol::StartNFCPollingMode() { | |||
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | DriverResult NfcProtocol::ScanAmiibo(std::vector<u8>& data) { | 74 | DriverResult NfcProtocol::ScanAmiibo(std::vector<u8>& data) { |
| 75 | if (update_counter++ < AMIIBO_UPDATE_DELAY) { | ||
| 76 | return DriverResult::Delayed; | ||
| 77 | } | ||
| 78 | update_counter = 0; | ||
| 79 | |||
| 75 | LOG_DEBUG(Input, "Start NFC pooling Mode"); | 80 | LOG_DEBUG(Input, "Start NFC pooling Mode"); |
| 76 | ScopedSetBlocking sb(this); | 81 | ScopedSetBlocking sb(this); |
| 77 | DriverResult result{DriverResult::Success}; | 82 | DriverResult result{DriverResult::Success}; |
| @@ -87,7 +92,7 @@ DriverResult NfcProtocol::ScanAmiibo(std::vector<u8>& data) { | |||
| 87 | result = WaitUntilNfcIsReady(); | 92 | result = WaitUntilNfcIsReady(); |
| 88 | } | 93 | } |
| 89 | if (result == DriverResult::Success) { | 94 | if (result == DriverResult::Success) { |
| 90 | result = StartPolling(tag_data); | 95 | result = StartPolling(tag_data, 7); |
| 91 | } | 96 | } |
| 92 | if (result == DriverResult::Success) { | 97 | if (result == DriverResult::Success) { |
| 93 | result = GetAmiiboData(data); | 98 | result = GetAmiiboData(data); |
| @@ -129,9 +134,8 @@ DriverResult NfcProtocol::WaitUntilNfcIsReady() { | |||
| 129 | return DriverResult::Success; | 134 | return DriverResult::Success; |
| 130 | } | 135 | } |
| 131 | 136 | ||
| 132 | DriverResult NfcProtocol::StartPolling(TagFoundData& data) { | 137 | DriverResult NfcProtocol::StartPolling(TagFoundData& data, std::size_t timeout_limit) { |
| 133 | LOG_DEBUG(Input, "Start Polling for tag"); | 138 | LOG_DEBUG(Input, "Start Polling for tag"); |
| 134 | constexpr std::size_t timeout_limit = 7; | ||
| 135 | MCUCommandResponse output{}; | 139 | MCUCommandResponse output{}; |
| 136 | std::size_t tries = 0; | 140 | std::size_t tries = 0; |
| 137 | 141 | ||
| @@ -278,7 +282,6 @@ DriverResult NfcProtocol::GetAmiiboData(std::vector<u8>& ntag_data) { | |||
| 278 | 282 | ||
| 279 | DriverResult NfcProtocol::SendStartPollingRequest(MCUCommandResponse& output) { | 283 | DriverResult NfcProtocol::SendStartPollingRequest(MCUCommandResponse& output) { |
| 280 | NFCRequestState request{ | 284 | NFCRequestState request{ |
| 281 | .sub_command = MCUSubCommand::ReadDeviceMode, | ||
| 282 | .command_argument = NFCReadCommand::StartPolling, | 285 | .command_argument = NFCReadCommand::StartPolling, |
| 283 | .packet_id = 0x0, | 286 | .packet_id = 0x0, |
| 284 | .packet_flag = MCUPacketFlag::LastCommandPacket, | 287 | .packet_flag = MCUPacketFlag::LastCommandPacket, |
| @@ -296,13 +299,13 @@ DriverResult NfcProtocol::SendStartPollingRequest(MCUCommandResponse& output) { | |||
| 296 | 299 | ||
| 297 | std::array<u8, sizeof(NFCRequestState)> request_data{}; | 300 | std::array<u8, sizeof(NFCRequestState)> request_data{}; |
| 298 | memcpy(request_data.data(), &request, sizeof(NFCRequestState)); | 301 | memcpy(request_data.data(), &request, sizeof(NFCRequestState)); |
| 299 | request_data[37] = CalculateMCU_CRC8(request_data.data() + 1, 36); | 302 | request_data[36] = CalculateMCU_CRC8(request_data.data(), 36); |
| 300 | return SendMCUData(ReportMode::NFC_IR_MODE_60HZ, SubCommand::STATE, request_data, output); | 303 | return SendMCUData(ReportMode::NFC_IR_MODE_60HZ, MCUSubCommand::ReadDeviceMode, request_data, |
| 304 | output); | ||
| 301 | } | 305 | } |
| 302 | 306 | ||
| 303 | DriverResult NfcProtocol::SendStopPollingRequest(MCUCommandResponse& output) { | 307 | DriverResult NfcProtocol::SendStopPollingRequest(MCUCommandResponse& output) { |
| 304 | NFCRequestState request{ | 308 | NFCRequestState request{ |
| 305 | .sub_command = MCUSubCommand::ReadDeviceMode, | ||
| 306 | .command_argument = NFCReadCommand::StopPolling, | 309 | .command_argument = NFCReadCommand::StopPolling, |
| 307 | .packet_id = 0x0, | 310 | .packet_id = 0x0, |
| 308 | .packet_flag = MCUPacketFlag::LastCommandPacket, | 311 | .packet_flag = MCUPacketFlag::LastCommandPacket, |
| @@ -313,13 +316,13 @@ DriverResult NfcProtocol::SendStopPollingRequest(MCUCommandResponse& output) { | |||
| 313 | 316 | ||
| 314 | std::array<u8, sizeof(NFCRequestState)> request_data{}; | 317 | std::array<u8, sizeof(NFCRequestState)> request_data{}; |
| 315 | memcpy(request_data.data(), &request, sizeof(NFCRequestState)); | 318 | memcpy(request_data.data(), &request, sizeof(NFCRequestState)); |
| 316 | request_data[37] = CalculateMCU_CRC8(request_data.data() + 1, 36); | 319 | request_data[36] = CalculateMCU_CRC8(request_data.data(), 36); |
| 317 | return SendMCUData(ReportMode::NFC_IR_MODE_60HZ, SubCommand::STATE, request_data, output); | 320 | return SendMCUData(ReportMode::NFC_IR_MODE_60HZ, MCUSubCommand::ReadDeviceMode, request_data, |
| 321 | output); | ||
| 318 | } | 322 | } |
| 319 | 323 | ||
| 320 | DriverResult NfcProtocol::SendStartWaitingRecieveRequest(MCUCommandResponse& output) { | 324 | DriverResult NfcProtocol::SendStartWaitingRecieveRequest(MCUCommandResponse& output) { |
| 321 | NFCRequestState request{ | 325 | NFCRequestState request{ |
| 322 | .sub_command = MCUSubCommand::ReadDeviceMode, | ||
| 323 | .command_argument = NFCReadCommand::StartWaitingRecieve, | 326 | .command_argument = NFCReadCommand::StartWaitingRecieve, |
| 324 | .packet_id = 0x0, | 327 | .packet_id = 0x0, |
| 325 | .packet_flag = MCUPacketFlag::LastCommandPacket, | 328 | .packet_flag = MCUPacketFlag::LastCommandPacket, |
| @@ -330,13 +333,13 @@ DriverResult NfcProtocol::SendStartWaitingRecieveRequest(MCUCommandResponse& out | |||
| 330 | 333 | ||
| 331 | std::vector<u8> request_data(sizeof(NFCRequestState)); | 334 | std::vector<u8> request_data(sizeof(NFCRequestState)); |
| 332 | memcpy(request_data.data(), &request, sizeof(NFCRequestState)); | 335 | memcpy(request_data.data(), &request, sizeof(NFCRequestState)); |
| 333 | request_data[37] = CalculateMCU_CRC8(request_data.data() + 1, 36); | 336 | request_data[36] = CalculateMCU_CRC8(request_data.data(), 36); |
| 334 | return SendMCUData(ReportMode::NFC_IR_MODE_60HZ, SubCommand::STATE, request_data, output); | 337 | return SendMCUData(ReportMode::NFC_IR_MODE_60HZ, MCUSubCommand::ReadDeviceMode, request_data, |
| 338 | output); | ||
| 335 | } | 339 | } |
| 336 | 340 | ||
| 337 | DriverResult NfcProtocol::SendReadAmiiboRequest(MCUCommandResponse& output, NFCPages ntag_pages) { | 341 | DriverResult NfcProtocol::SendReadAmiiboRequest(MCUCommandResponse& output, NFCPages ntag_pages) { |
| 338 | NFCRequestState request{ | 342 | NFCRequestState request{ |
| 339 | .sub_command = MCUSubCommand::ReadDeviceMode, | ||
| 340 | .command_argument = NFCReadCommand::Ntag, | 343 | .command_argument = NFCReadCommand::Ntag, |
| 341 | .packet_id = 0x0, | 344 | .packet_id = 0x0, |
| 342 | .packet_flag = MCUPacketFlag::LastCommandPacket, | 345 | .packet_flag = MCUPacketFlag::LastCommandPacket, |
| @@ -355,8 +358,9 @@ DriverResult NfcProtocol::SendReadAmiiboRequest(MCUCommandResponse& output, NFCP | |||
| 355 | 358 | ||
| 356 | std::array<u8, sizeof(NFCRequestState)> request_data{}; | 359 | std::array<u8, sizeof(NFCRequestState)> request_data{}; |
| 357 | memcpy(request_data.data(), &request, sizeof(NFCRequestState)); | 360 | memcpy(request_data.data(), &request, sizeof(NFCRequestState)); |
| 358 | request_data[37] = CalculateMCU_CRC8(request_data.data() + 1, 36); | 361 | request_data[36] = CalculateMCU_CRC8(request_data.data(), 36); |
| 359 | return SendMCUData(ReportMode::NFC_IR_MODE_60HZ, SubCommand::STATE, request_data, output); | 362 | return SendMCUData(ReportMode::NFC_IR_MODE_60HZ, MCUSubCommand::ReadDeviceMode, request_data, |
| 363 | output); | ||
| 360 | } | 364 | } |
| 361 | 365 | ||
| 362 | NFCReadBlockCommand NfcProtocol::GetReadBlockCommand(NFCPages pages) const { | 366 | NFCReadBlockCommand NfcProtocol::GetReadBlockCommand(NFCPages pages) const { |
diff --git a/src/input_common/helpers/joycon_protocol/nfc.h b/src/input_common/helpers/joycon_protocol/nfc.h index 11e263e07..4cb992d1d 100644 --- a/src/input_common/helpers/joycon_protocol/nfc.h +++ b/src/input_common/helpers/joycon_protocol/nfc.h | |||
| @@ -32,6 +32,9 @@ public: | |||
| 32 | bool IsEnabled() const; | 32 | bool IsEnabled() const; |
| 33 | 33 | ||
| 34 | private: | 34 | private: |
| 35 | // Number of times the function will be delayed until it outputs valid data | ||
| 36 | static constexpr std::size_t AMIIBO_UPDATE_DELAY = 15; | ||
| 37 | |||
| 35 | struct TagFoundData { | 38 | struct TagFoundData { |
| 36 | u8 type; | 39 | u8 type; |
| 37 | std::vector<u8> uuid; | 40 | std::vector<u8> uuid; |
| @@ -39,7 +42,7 @@ private: | |||
| 39 | 42 | ||
| 40 | DriverResult WaitUntilNfcIsReady(); | 43 | DriverResult WaitUntilNfcIsReady(); |
| 41 | 44 | ||
| 42 | DriverResult StartPolling(TagFoundData& data); | 45 | DriverResult StartPolling(TagFoundData& data, std::size_t timeout_limit = 1); |
| 43 | 46 | ||
| 44 | DriverResult ReadTag(const TagFoundData& data); | 47 | DriverResult ReadTag(const TagFoundData& data); |
| 45 | 48 | ||
| @@ -56,6 +59,7 @@ private: | |||
| 56 | NFCReadBlockCommand GetReadBlockCommand(NFCPages pages) const; | 59 | NFCReadBlockCommand GetReadBlockCommand(NFCPages pages) const; |
| 57 | 60 | ||
| 58 | bool is_enabled{}; | 61 | bool is_enabled{}; |
| 62 | std::size_t update_counter{}; | ||
| 59 | }; | 63 | }; |
| 60 | 64 | ||
| 61 | } // namespace InputCommon::Joycon | 65 | } // namespace InputCommon::Joycon |