mirror of
https://github.com/afska/gba-link-connection.git
synced 2026-09-14 20:07:08 -05:00
FIX: Making reception more reliable. Tested against the official thing
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user