From de9c8c79c175a94d09f34c82cab8be78dc470c8e Mon Sep 17 00:00:00 2001 From: Rodrigo Alfonso Date: Thu, 8 Aug 2024 09:37:17 -0300 Subject: [PATCH] Renaming queues with more descriptive names and adding developer notes --- lib/LinkCable.hpp | 37 +++++++++++++++++++++++++++---------- lib/LinkWireless.hpp | 26 +++++++++++++------------- 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/lib/LinkCable.hpp b/lib/LinkCable.hpp index 68de756..ddf5c30 100644 --- a/lib/LinkCable.hpp +++ b/lib/LinkCable.hpp @@ -229,7 +229,7 @@ class LinkCable { LINK_CABLE_BARRIER; for (u32 i = 0; i < LINK_CABLE_MAX_PLAYERS; i++) - move(_state.pendingMessages[i], state.incomingMessages[i]); + move(_state.readyToSyncMessages[i], state.syncedIncomingMessages[i]); LINK_CABLE_BARRIER; isReadingMessages = false; @@ -276,7 +276,7 @@ class LinkCable { * until you *fetch new data* with `sync()`. */ [[nodiscard]] bool canRead(u8 playerId) { - return !state.incomingMessages[playerId].isEmpty(); + return !state.syncedIncomingMessages[playerId].isEmpty(); } /** @@ -284,7 +284,7 @@ class LinkCable { * @param playerId A player ID. * \warning If there's no data from that player, a `0` will be returned. */ - u16 read(u8 playerId) { return state.incomingMessages[playerId].pop(); } + u16 read(u8 playerId) { return state.syncedIncomingMessages[playerId].pop(); } /** * @brief Returns the next message from player #`playerId` without dequeuing @@ -293,7 +293,7 @@ class LinkCable { * \warning If there's no data from that player, a `0` will be returned. */ [[nodiscard]] u16 peek(u8 playerId) { - return state.incomingMessages[playerId].peek(); + return state.syncedIncomingMessages[playerId].peek(); } /** @@ -418,14 +418,14 @@ class LinkCable { private: struct ExternalState { - U16Queue incomingMessages[LINK_CABLE_MAX_PLAYERS]; + U16Queue syncedIncomingMessages[LINK_CABLE_MAX_PLAYERS]; u8 playerCount; u8 currentPlayerId; }; struct InternalState { U16Queue outgoingMessages; - U16Queue pendingMessages[LINK_CABLE_MAX_PLAYERS]; + U16Queue readyToSyncMessages[LINK_CABLE_MAX_PLAYERS]; U16Queue newMessages[LINK_CABLE_MAX_PLAYERS]; int timeouts[LINK_CABLE_MAX_PLAYERS]; bool IRQFlag; @@ -478,7 +478,7 @@ class LinkCable { for (u32 i = 0; i < LINK_CABLE_MAX_PLAYERS; i++) { if (!isReadingMessages) - _state.pendingMessages[i].clear(); + _state.readyToSyncMessages[i].clear(); _state.newMessages[i].clear(); setOffline(i); @@ -511,7 +511,7 @@ class LinkCable { void clearIncomingMessages() { for (u32 i = 0; i < LINK_CABLE_MAX_PLAYERS; i++) - state.incomingMessages[i].clear(); + state.syncedIncomingMessages[i].clear(); } void copyState() { @@ -520,9 +520,9 @@ class LinkCable { for (u32 i = 0; i < LINK_CABLE_MAX_PLAYERS; i++) { if (isOnline(i)) - move(_state.newMessages[i], _state.pendingMessages[i]); + move(_state.newMessages[i], _state.readyToSyncMessages[i]); else - _state.pendingMessages[i].clear(); + _state.readyToSyncMessages[i].clear(); } } @@ -581,4 +581,21 @@ inline void LINK_CABLE_ISR_TIMER() { linkCable->_onTimer(); } +/** + * NOTES: + * For end users: + * - `sync()` fills an incoming queue (`syncedIncomingMessages`). + * - `read(...)` pops one message from that queue. + * - `send(...)` pushes one message to an outgoing queue (`outgoingMessages`). + * Behind the curtains: + * - On each SERIAL IRQ: + * -> Each new message is pushed to `newMessages`. + * - On each VBLANK, SERIAL, or TIMER IRQ: + * -> **If the user is not syncing**: + * -> All `newMessages` are moved to `readyToSyncMessages`. + * -> **If the user is not sending**: + * -> Pops one message from `outgoingMessages` and transfers it. + * - `sync()` moves all `readyToSyncMessages` to `syncedIncomingMessages`. + */ + #endif // LINK_CABLE_H diff --git a/lib/LinkWireless.hpp b/lib/LinkWireless.hpp index ca6a845..c4b627a 100644 --- a/lib/LinkWireless.hpp +++ b/lib/LinkWireless.hpp @@ -602,14 +602,14 @@ class LinkWireless { isAddingMessage = true; LINK_WIRELESS_BARRIER; - sessionState.tmpMessagesToSend.push(message); + sessionState.newOutgoingMessages.push(message); LINK_WIRELESS_BARRIER; isAddingMessage = false; LINK_WIRELESS_BARRIER; if (isPendingClearActive) { - sessionState.tmpMessagesToSend.clear(); + sessionState.newOutgoingMessages.clear(); isPendingClearActive = false; } @@ -1009,10 +1009,10 @@ class LinkWireless { }; struct SessionState { - MessageQueue incomingMessages; // read by user, write by irq&user - MessageQueue outgoingMessages; // read and write by irq - MessageQueue tmpMessagesToReceive; // read and write by irq - MessageQueue tmpMessagesToSend; // read by irq, write by user&irq + MessageQueue incomingMessages; // read by user, write by irq&user + MessageQueue outgoingMessages; // read and write by irq + MessageQueue newIncomingMessages; // read and write by irq + MessageQueue newOutgoingMessages; // read by irq, write by user&irq u32 timeouts[LINK_WIRELESS_MAX_PLAYERS]; u32 recvTimeout = 0; u32 frameRecvCount = 0; @@ -1281,7 +1281,7 @@ class LinkWireless { if (!handleConfirmation(message)) continue; } else { - sessionState.tmpMessagesToReceive.push(message); + sessionState.newIncomingMessages.push(message); } } copyIncomingState(); @@ -1467,11 +1467,11 @@ class LinkWireless { if (isAddingMessage) return; - while (!sessionState.tmpMessagesToSend.isEmpty()) { + while (!sessionState.newOutgoingMessages.isEmpty()) { if (!_canSend()) break; - auto message = sessionState.tmpMessagesToSend.pop(); + auto message = sessionState.newOutgoingMessages.pop(); message.packetId = newPacketId(); sessionState.outgoingMessages.push(message); } @@ -1481,8 +1481,8 @@ class LinkWireless { if (isReadingMessages) return; - while (!sessionState.tmpMessagesToReceive.isEmpty()) { - auto message = sessionState.tmpMessagesToReceive.pop(); + while (!sessionState.newIncomingMessages.isEmpty()) { + auto message = sessionState.newIncomingMessages.pop(); sessionState.incomingMessages.push(message); } } @@ -1574,9 +1574,9 @@ class LinkWireless { this->sessionState.incomingMessages.clear(); this->sessionState.outgoingMessages.clear(); - this->sessionState.tmpMessagesToReceive.clear(); + this->sessionState.newIncomingMessages.clear(); if (!isAddingMessage) - this->sessionState.tmpMessagesToSend.clear(); + this->sessionState.newOutgoingMessages.clear(); else isPendingClearActive = true;