Improving LinkCard loader error handling

This commit is contained in:
Rodrigo Alfonso 2025-03-18 20:14:12 -03:00
parent 8fe9c5f710
commit 5b20e96321
5 changed files with 17 additions and 19 deletions

View File

@ -42,7 +42,6 @@ const char* MSG_SCAN_CARD = "Scan a card!";
const char* MSG_TRANSFERRING = "Transferring...";
const char* MSG_CARD_SENT = "Card sent!";
const char* MSG_ERROR = "Error!";
const char* MSG_PRESS_A_TRY_AGAIN = "Press A to try again";
const char* MSG_PRESS_B_CANCEL = "Press B to cancel";
#endif
@ -111,17 +110,13 @@ int main() {
print(MSG_SCAN_CARD);
// scan card
while (true) {
if (cancel())
goto abort;
if (!sendAndExpect(EREADER_READY, GAME_READY, cancel))
goto abort;
u32 resultCode = ERAPI_ScanDotCode((u32)card);
if (resultCode == SCAN_SUCCESS) {
break;
} else
goto error;
}
if (cancel())
goto abort;
if (!sendAndExpect(EREADER_READY, GAME_READY, cancel))
goto abort;
u32 resultCode = ERAPI_ScanDotCode((u32)card);
if (resultCode != SCAN_SUCCESS)
goto error;
// "Transferring..."
print(MSG_TRANSFERRING);
@ -164,12 +159,9 @@ int main() {
// "Error!"
ERAPI_ClearRegion(region);
ERAPI_DrawText(region, 0, 0, MSG_ERROR);
ERAPI_DrawText(region, 0, 16, MSG_PRESS_A_TRY_AGAIN);
ERAPI_DrawText(region, 0, 16, MSG_WAITING_GAME);
ERAPI_RenderFrame(1);
while (!tryAgain())
ERAPI_RenderFrame(1);
send(EREADER_CANCEL, cancel);
send(EREADER_ANIMATING, cancel);
send(EREADER_SIO_END, cancel);

View File

@ -107,6 +107,7 @@ class LinkCard {
WRONG_DEVICE,
BAD_CHECKSUM,
UNEXPECTED_FAILURE,
SCAN_ERROR
};
/**
@ -276,7 +277,7 @@ class LinkCard {
EREADER_READY, cancel))
return ReceiveResult::CANCELED;
if (transferMultiAndExpectOneOf(EREADER_ANIMATING, EREADER_ANIMATING,
EREADER_READY, cancel) == -1)
EREADER_READY, cancel) < 0)
return ReceiveResult::CANCELED;
// wait for card
@ -285,6 +286,8 @@ class LinkCard {
if ((received = transferMultiAndExpectOneOf(
GAME_READY, EREADER_READY, EREADER_SEND_READY, cancel)) == -1)
return ReceiveResult::CANCELED;
if (received == -2)
return ReceiveResult::SCAN_ERROR;
if (received == EREADER_SEND_READY)
break;
}
@ -339,8 +342,10 @@ class LinkCard {
u16 received;
do {
received = transferMulti(value, cancel);
if (cancel() || received == EREADER_CANCEL)
if (cancel())
return -1;
if (received == EREADER_CANCEL)
return -2;
} while (received != expected1 && received != expected2);
return received;

View File

@ -33,7 +33,8 @@ typedef enum {
C_LINK_CARD_RECEIVE_RESULT_CANCELED,
C_LINK_CARD_RECEIVE_RESULT_WRONG_DEVICE,
C_LINK_CARD_RECEIVE_RESULT_BAD_CHECKSUM,
C_LINK_CARD_RECEIVE_RESULT_UNEXPECTED_FAILURE
C_LINK_CARD_RECEIVE_RESULT_UNEXPECTED_FAILURE,
C_LINK_CARD_RECEIVE_RESULT_SCAN_ERROR
} C_LinkCard_ReceiveResult;
C_LinkCardHandle C_LinkCard_createDefault();