diff --git a/lib/LinkCard.hpp b/lib/LinkCard.hpp index c665116..4eb77f5 100644 --- a/lib/LinkCard.hpp +++ b/lib/LinkCard.hpp @@ -79,10 +79,9 @@ class LinkCard { static constexpr int EREADER_SIO_END = 0xF3F3; static constexpr int EREADER_CANCEL = 0xF7F7; static constexpr int CMD_LINKCARD_RESET = 0; - static constexpr int SLAVE_HIGH_WAIT = 228; - static constexpr int SLAVE_LOW_WAIT = 5; + static constexpr int MODE_SWITCH_WAIT = 228; static constexpr int DEACTIVATION_WAIT = 50; - static constexpr int PRE_TRANSFER_WAIT = 2; + static constexpr int PRE_TRANSFER_WAIT = 2 + 1; public: enum class SendResult { @@ -184,7 +183,7 @@ class LinkCard { linkRawCable.activate(); auto guard = Link::ScopeGuard([&]() { disableMulti(); }); - Link::wait(SLAVE_HIGH_WAIT); + Link::wait(MODE_SWITCH_WAIT); if (cancel()) return SendResult::CANCELED; @@ -205,7 +204,7 @@ class LinkCard { linkSPI.activate(LinkSPI::Mode::MASTER_256KBPS); auto guard = Link::ScopeGuard([&]() { disableNormal(); }); - Link::wait(SLAVE_HIGH_WAIT); + Link::wait(MODE_SWITCH_WAIT); if (cancel()) return SendResult::CANCELED; @@ -229,7 +228,7 @@ class LinkCard { linkRawCable.activate(); auto guard = Link::ScopeGuard([&]() { disableMulti(); }); - Link::wait(SLAVE_HIGH_WAIT); + Link::wait(MODE_SWITCH_WAIT); if (cancel()) return SendResult::CANCELED; @@ -268,8 +267,6 @@ class LinkCard { if (!transferMultiAndExpect(HANDSHAKE_RECV_3, HANDSHAKE_RECV_3, cancel)) return ReceiveResult::CANCELED; - Link::wait(SLAVE_HIGH_WAIT); - // card request if (!transferMultiAndExpect(GAME_REQUEST, HANDSHAKE_RECV_3, cancel)) return ReceiveResult::CANCELED; @@ -291,9 +288,8 @@ class LinkCard { } // start signal - if (transferMulti(GAME_RECEIVE_READY, cancel) != EREADER_SEND_READY) - return ReceiveResult::UNEXPECTED_FAILURE; - Link::wait(SLAVE_HIGH_WAIT); + if (!transferMultiAndExpect(GAME_RECEIVE_READY, EREADER_SEND_READY, cancel)) + return ReceiveResult::CANCELED; if (!transferMultiAndExpect(GAME_RECEIVE_READY, EREADER_SEND_START, cancel)) return ReceiveResult::CANCELED; @@ -307,16 +303,13 @@ class LinkCard { card[i] = Link::lsB16(block); card[i + 1] = Link::msB16(block); checksum += block; - Link::wait(SLAVE_LOW_WAIT); } // checksum if (transferMulti(GAME_RECEIVE_READY, cancel) != Link::lsB32(checksum)) return ReceiveResult::BAD_CHECKSUM; - Link::wait(SLAVE_LOW_WAIT); if (transferMulti(GAME_RECEIVE_READY, cancel) != Link::msB32(checksum)) return ReceiveResult::BAD_CHECKSUM; - Link::wait(SLAVE_LOW_WAIT); // end if (transferMulti(GAME_RECEIVE_READY, cancel) != EREADER_SEND_END)