Merge pull request #10265 from german77/amiibo-lag
input_common: Make amiibo scanning less demanding
This commit is contained in:
		| @@ -394,6 +394,7 @@ enum class DriverResult { | |||||||
|     InvalidHandle, |     InvalidHandle, | ||||||
|     NotSupported, |     NotSupported, | ||||||
|     Disabled, |     Disabled, | ||||||
|  |     Delayed, | ||||||
|     Unknown, |     Unknown, | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -72,6 +72,11 @@ DriverResult NfcProtocol::StartNFCPollingMode() { | |||||||
| } | } | ||||||
|  |  | ||||||
| DriverResult NfcProtocol::ScanAmiibo(std::vector<u8>& data) { | DriverResult NfcProtocol::ScanAmiibo(std::vector<u8>& data) { | ||||||
|  |     if (update_counter++ < AMIIBO_UPDATE_DELAY) { | ||||||
|  |         return DriverResult::Delayed; | ||||||
|  |     } | ||||||
|  |     update_counter = 0; | ||||||
|  |  | ||||||
|     LOG_DEBUG(Input, "Start NFC pooling Mode"); |     LOG_DEBUG(Input, "Start NFC pooling Mode"); | ||||||
|     ScopedSetBlocking sb(this); |     ScopedSetBlocking sb(this); | ||||||
|     DriverResult result{DriverResult::Success}; |     DriverResult result{DriverResult::Success}; | ||||||
| @@ -87,7 +92,7 @@ DriverResult NfcProtocol::ScanAmiibo(std::vector<u8>& data) { | |||||||
|         result = WaitUntilNfcIsReady(); |         result = WaitUntilNfcIsReady(); | ||||||
|     } |     } | ||||||
|     if (result == DriverResult::Success) { |     if (result == DriverResult::Success) { | ||||||
|         result = StartPolling(tag_data); |         result = StartPolling(tag_data, 7); | ||||||
|     } |     } | ||||||
|     if (result == DriverResult::Success) { |     if (result == DriverResult::Success) { | ||||||
|         result = GetAmiiboData(data); |         result = GetAmiiboData(data); | ||||||
| @@ -129,9 +134,8 @@ DriverResult NfcProtocol::WaitUntilNfcIsReady() { | |||||||
|     return DriverResult::Success; |     return DriverResult::Success; | ||||||
| } | } | ||||||
|  |  | ||||||
| DriverResult NfcProtocol::StartPolling(TagFoundData& data) { | DriverResult NfcProtocol::StartPolling(TagFoundData& data, std::size_t timeout_limit) { | ||||||
|     LOG_DEBUG(Input, "Start Polling for tag"); |     LOG_DEBUG(Input, "Start Polling for tag"); | ||||||
|     constexpr std::size_t timeout_limit = 7; |  | ||||||
|     MCUCommandResponse output{}; |     MCUCommandResponse output{}; | ||||||
|     std::size_t tries = 0; |     std::size_t tries = 0; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -32,6 +32,9 @@ public: | |||||||
|     bool IsEnabled() const; |     bool IsEnabled() const; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|  |     // Number of times the function will be delayed until it outputs valid data | ||||||
|  |     static constexpr std::size_t AMIIBO_UPDATE_DELAY = 15; | ||||||
|  |  | ||||||
|     struct TagFoundData { |     struct TagFoundData { | ||||||
|         u8 type; |         u8 type; | ||||||
|         std::vector<u8> uuid; |         std::vector<u8> uuid; | ||||||
| @@ -39,7 +42,7 @@ private: | |||||||
|  |  | ||||||
|     DriverResult WaitUntilNfcIsReady(); |     DriverResult WaitUntilNfcIsReady(); | ||||||
|  |  | ||||||
|     DriverResult StartPolling(TagFoundData& data); |     DriverResult StartPolling(TagFoundData& data, std::size_t timeout_limit = 1); | ||||||
|  |  | ||||||
|     DriverResult ReadTag(const TagFoundData& data); |     DriverResult ReadTag(const TagFoundData& data); | ||||||
|  |  | ||||||
| @@ -56,6 +59,7 @@ private: | |||||||
|     NFCReadBlockCommand GetReadBlockCommand(NFCPages pages) const; |     NFCReadBlockCommand GetReadBlockCommand(NFCPages pages) const; | ||||||
|  |  | ||||||
|     bool is_enabled{}; |     bool is_enabled{}; | ||||||
|  |     std::size_t update_counter{}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| } // namespace InputCommon::Joycon | } // namespace InputCommon::Joycon | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user