From ac531aa15f35b2e6584b8b306b5c3258ef66dc73 Mon Sep 17 00:00:00 2001
From: german77 <juangerman-13@hotmail.com>
Date: Sat, 13 May 2023 00:04:18 -0600
Subject: [PATCH] input_common: Make amiibo scanning less demanding

---
 .../helpers/joycon_protocol/joycon_types.h             |  1 +
 src/input_common/helpers/joycon_protocol/nfc.cpp       | 10 +++++++---
 src/input_common/helpers/joycon_protocol/nfc.h         |  6 +++++-
 3 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/input_common/helpers/joycon_protocol/joycon_types.h b/src/input_common/helpers/joycon_protocol/joycon_types.h
index b03143e04..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 {
     InvalidHandle,
     NotSupported,
     Disabled,
+    Delayed,
     Unknown,
 };
 
diff --git a/src/input_common/helpers/joycon_protocol/nfc.cpp b/src/input_common/helpers/joycon_protocol/nfc.cpp
index 77ea6d5cf..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() {
 }
 
 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");
     ScopedSetBlocking sb(this);
     DriverResult result{DriverResult::Success};
@@ -87,7 +92,7 @@ DriverResult NfcProtocol::ScanAmiibo(std::vector<u8>& data) {
         result = WaitUntilNfcIsReady();
     }
     if (result == DriverResult::Success) {
-        result = StartPolling(tag_data);
+        result = StartPolling(tag_data, 7);
     }
     if (result == DriverResult::Success) {
         result = GetAmiiboData(data);
@@ -129,9 +134,8 @@ DriverResult NfcProtocol::WaitUntilNfcIsReady() {
     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");
-    constexpr std::size_t timeout_limit = 7;
     MCUCommandResponse output{};
     std::size_t tries = 0;
 
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:
     bool IsEnabled() const;
 
 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 {
         u8 type;
         std::vector<u8> uuid;
@@ -39,7 +42,7 @@ private:
 
     DriverResult WaitUntilNfcIsReady();
 
-    DriverResult StartPolling(TagFoundData& data);
+    DriverResult StartPolling(TagFoundData& data, std::size_t timeout_limit = 1);
 
     DriverResult ReadTag(const TagFoundData& data);
 
@@ -56,6 +59,7 @@ private:
     NFCReadBlockCommand GetReadBlockCommand(NFCPages pages) const;
 
     bool is_enabled{};
+    std::size_t update_counter{};
 };
 
 } // namespace InputCommon::Joycon