Renaming queues with more descriptive names and adding developer notes

This commit is contained in:
Rodrigo Alfonso
2024-08-08 09:37:17 -03:00
parent 908c67679c
commit de9c8c79c1
2 changed files with 40 additions and 23 deletions

View File

@@ -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

View File

@@ -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;